@@ -287,8 +287,8 @@ substrate above.
287287
288288## Governance: how "declared = enforced" is kept true
289289
290- Four CI-time mechanisms make the security posture a ** checked artifact **
291- rather than a belief:
290+ Five mechanisms — four CI-time, one runtime — make the security posture a
291+ ** checked artifact ** rather than a belief:
292292
293293- ** Security publish linter** (ADR-0090 D7, ` validateSecurityPosture ` in
294294 ` @objectstack/lint ` , gating ` os compile ` ): unset OWD on custom objects,
@@ -298,6 +298,19 @@ rather than a belief:
298298 security identifiers, and the ADR-0091 grant-lifecycle rules (a seed grant
299299 already expired at authoring time; a delegation row missing its mandatory
300300 ` reason ` ) — every error rule mirrors a runtime gate.
301+ - ** Runtime OWD posture gate** (#3050 , ` objectPostureGate ` in
302+ ` @objectstack/plugin-security ` , registered on the metadata protocol's
303+ pre-persistence ` registerAuthoringGate ` seam): the two OWD rules the CLI
304+ linter can only check at build time are also enforced on every
305+ runtime-authored object body — Studio drafts, REST saves, AI builders.
306+ An environment overlay of a ** packaged** object may only * tighten*
307+ ` sharingModel ` / ` externalSharingModel ` , never widen them beyond the
308+ packaged declaration (` 403 owd_widening_forbidden ` — widen it in the
309+ package source and publish instead; this closes the
310+ ` OS_METADATA_WRITABLE=object ` escape hatch as an unvalidated widening
311+ path, ADR-0086 D1), and ` externalSharingModel ≤ sharingModel ` (ADR-0090
312+ D11) is rejected at save time (` 403 owd_external_wider ` ). Write-path
313+ only: stored metadata keeps loading unchanged.
301314- ** Access-matrix snapshot** (ADR-0090 D6, ` buildAccessMatrix ` /
302315 ` diffAccessMatrix ` ): with ` access-matrix.json ` committed next to the config,
303316 ` os compile ` fails on any capability drift with semantic lines
0 commit comments