|
| 1 | +--- |
| 2 | +'@objectstack/spec': major |
| 3 | +'@objectstack/rest': minor |
| 4 | +'@objectstack/plugin-security': minor |
| 5 | +'@objectstack/lint': minor |
| 6 | +'@objectstack/metadata': minor |
| 7 | +'@objectstack/platform-objects': patch |
| 8 | +--- |
| 9 | + |
| 10 | +ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed. |
| 11 | + |
| 12 | +- **rest**: `/meta/book`, `/meta/doc`, and `/meta/book/:name/tree` now ENFORCE |
| 13 | + the ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security |
| 14 | + properties): anonymous callers see only `public` books/docs; |
| 15 | + `{ permissionSet }`-gated books require the caller to hold the named set; |
| 16 | + a doc's effective audience is the union over the books that CLAIM it |
| 17 | + (unclaimed docs default to `org`; orphan rendering never inherits `public`). |
| 18 | + Gated evaluation fails CLOSED when holdings cannot be resolved. `doc`/`book` |
| 19 | + single-item reads bypass the shared meta cache (per-caller gate vs shared ETag). |
| 20 | +- **spec**: new pure helpers powering that gate — `audienceAllows`, |
| 21 | + `resolveDocAudiences`, `docAudienceAllows`, `resolveBookClaimedDocs` |
| 22 | + (+ `AudienceCaller`/`AudienceBook` types). BREAKING (launch window): |
| 23 | + `METADATA_FORM_REGISTRY` keys `role`/`profile` are gone — `position` is the |
| 24 | + registered form (the `position` type had LOST its form layout in the P1 |
| 25 | + rename); `EnvironmentArtifactMetadataSchema` declares `positions` instead of |
| 26 | + retired `roles`/`profiles`. |
| 27 | +- **plugin-security**: the `security` service exposes |
| 28 | + `resolvePermissionSetNames(ctx)` — the same resolution as data-plane |
| 29 | + enforcement, for the docs gate. |
| 30 | +- **metadata**: artifact ingestion maps `positions → 'position'` (the stale |
| 31 | + `roles → 'role'` mapping matched nothing since the P1 rename, silently |
| 32 | + dropping compiled positions from metadata registration). |
| 33 | +- **lint**: books join the D3 role-word scan (their `audience` is a |
| 34 | + permission-model reference now), and a new advisory rule |
| 35 | + `security-book-audience-unknown-set` flags a `{ permissionSet }` audience |
| 36 | + naming a set the stack does not declare (runtime fails closed — the typo |
| 37 | + cost is "nobody can read the book", so say it at author time). |
| 38 | +- **platform-objects**: metadata-form translations regain `position` (all four |
| 39 | + locales) and drop the retired `role`/`profile` groups, with a vocabulary |
| 40 | + regression test. |
0 commit comments