You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Escalated from #7576 / PR #7886, which fixed the block's false surfaceReason but deliberately did not move the surface. Filed unassigned by the domain:spec-tooling seat (session session_01WocN37om5bw81JDoEEMA2e); ⛔ grading and routing are the triage seat's — this spans at least three lanes and likely wants a contract-first split.
What is owed
12 of validateSecurityPosture's 13 rules are enforced at no runtime door while os build/os lint refuse the same shapes — and the runtime publish path is the only door a Studio tenant, a REST /meta client or an AI author has. The registry now says this honestly (PR #7886) instead of claiming phantom coverage; the move itself remains.
Measured facts to inherit (PR #7886, all re-runnable via packages/lint/src/validate-security-posture.runtime-surface.test.ts)
Blocker A — object half is a strictness rollout: declaring object in runtimeTypes makes security-owd-unset refuse the platform's own minimal create body. METADATA_CREATE_SEEDS.object (packages/spec/src/kernel/metadata-create-seeds.ts) carries no sharingModel; measured fallout is 26 refusals → 48 failing tests across 8 files of @objectstack/metadata-protocol's suite, all from that single rule id. Repair sites: the spec seed (a packages/spec/src semantic-face change — the authoritative create body gains an authored OWD or an explicit decision not to) + those 8 test files.
Blocker B — permission/book need a fuller snapshot: RuntimeStackContext carries objects only, so the three cross-collection rules judge against a missing collection (measured: 38 phantom security-master-detail-ungranted findings per-write vs 4 whole-stack). This is the existing RUNTIME_NEEDS_FULL_SNAPSHOT gap, already tracked as [runtime/metadata] 作者时规则只存在于 CLI:Studio/REST/MCP 的运行时授权面是第四扇门,26 条规则一条不跑——#4409 修完后最大的敞口 #4463 P2 — reference it, do not duplicate it. permission/book also have no TYPE_TO_STACK_KEY entries (pinned).
Ready first slice: the ADR-0091 seed pair (security-grant-expired-at-authoring, security-delegation-missing-reason) reads only stack.data[], trips nothing, and the seed → data stack key was corrected under fix(lint): make validateSecurityPosture's surfaceReason a measured claim (#7576) #7886 — a one-line runtimeTypes: ['seed'] edit crosses the whole sub-family. Deliberately left here so the block crosses by one decision, not by drift.
The PM premise correction from fix(lint): make validateSecurityPosture's surfaceReason a measured claim (#7576) #7886's measurement: the gate's plumbing reaches non-object collections (generic snapshot builder, allowRuntimeCreate on all six types); what it lacks is the sibling collections three rules compare against. Inherit the corrected premise.
Shape (suggestion, not a decision)
Likely a contract-first split: ① spec-side decision on METADATA_CREATE_SEEDS.object gaining a sharingModel (or an explicit default-OWD ruling) — semantic face; ② metadata-protocol suite repair + snapshot enrichment (#4463 P2); ③ the runtimeTypes/split registration edit in packages/lint last, blocked by ① and ②, with the seed-pair slice available as an early independent step.
Escalated from #7576 / PR #7886, which fixed the block's false
surfaceReasonbut deliberately did not move the surface. Filed unassigned by thedomain:spec-toolingseat (sessionsession_01WocN37om5bw81JDoEEMA2e); ⛔ grading and routing are the triage seat's — this spans at least three lanes and likely wants a contract-first split.What is owed
12 of
validateSecurityPosture's 13 rules are enforced at no runtime door whileos build/os lintrefuse the same shapes — and the runtime publish path is the only door a Studio tenant, a REST/metaclient or an AI author has. The registry now says this honestly (PR #7886) instead of claiming phantom coverage; the move itself remains.Measured facts to inherit (PR #7886, all re-runnable via
packages/lint/src/validate-security-posture.runtime-surface.test.ts)blanktemplate — zeroerrorfindings at both surfaces (13-rule table in PR fix(lint): makevalidateSecurityPosture'ssurfaceReasona measured claim (#7576) #7886). The 未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 rollout pattern is engaged by the platform's own write path, not by shipped apps.objecthalf is a strictness rollout: declaringobjectinruntimeTypesmakessecurity-owd-unsetrefuse the platform's own minimal create body.METADATA_CREATE_SEEDS.object(packages/spec/src/kernel/metadata-create-seeds.ts) carries nosharingModel; measured fallout is 26 refusals → 48 failing tests across 8 files of@objectstack/metadata-protocol's suite, all from that single rule id. Repair sites: the spec seed (apackages/spec/srcsemantic-face change — the authoritative create body gains an authored OWD or an explicit decision not to) + those 8 test files.permission/bookneed a fuller snapshot:RuntimeStackContextcarriesobjectsonly, so the three cross-collection rules judge against a missing collection (measured: 38 phantomsecurity-master-detail-ungrantedfindings per-write vs 4 whole-stack). This is the existingRUNTIME_NEEDS_FULL_SNAPSHOTgap, already tracked as [runtime/metadata] 作者时规则只存在于 CLI:Studio/REST/MCP 的运行时授权面是第四扇门,26 条规则一条不跑——#4409 修完后最大的敞口 #4463 P2 — reference it, do not duplicate it.permission/bookalso have noTYPE_TO_STACK_KEYentries (pinned).security-grant-expired-at-authoring,security-delegation-missing-reason) reads onlystack.data[], trips nothing, and theseed → datastack key was corrected under fix(lint): makevalidateSecurityPosture'ssurfaceReasona measured claim (#7576) #7886 — a one-lineruntimeTypes: ['seed']edit crosses the whole sub-family. Deliberately left here so the block crosses by one decision, not by drift.security-role-wordwiring: it judges six collections; wiring onlyposition/appsplits one rule id across the wall (the [finding] The fourviews[]visibility-predicate rules are CLI-only — a Studio/REST/MCPviewwrite bypasses all of them; if they move to runtime-publish, they must move together #7220 failure shape).validateSecurityPosture'ssurfaceReasona measured claim (#7576) #7886's measurement: the gate's plumbing reaches non-object collections (generic snapshot builder,allowRuntimeCreateon all six types); what it lacks is the sibling collections three rules compare against. Inherit the corrected premise.Shape (suggestion, not a decision)
Likely a contract-first split: ① spec-side decision on
METADATA_CREATE_SEEDS.objectgaining asharingModel(or an explicit default-OWD ruling) — semantic face; ② metadata-protocol suite repair + snapshot enrichment (#4463 P2); ③ theruntimeTypes/split registration edit inpackages/lintlast, blocked by ① and ②, with the seed-pair slice available as an early independent step.Pointers
validateSecurityPosture'sCLI_ONLYsurfaceReason claims coverage the ADR-0094objectauthoring gate does not give it — it covers 1 of the block's 13 rules #7576 (the measurement card) · PR fix(lint): makevalidateSecurityPosture'ssurfaceReasona measured claim (#7576) #7886 (the honesty fix + executable measurements) · [runtime/metadata] 作者时规则只存在于 CLI:Studio/REST/MCP 的运行时授权面是第四扇门,26 条规则一条不跑——#4409 修完后最大的敞口 #4463 P2 (RUNTIME_NEEDS_FULL_SNAPSHOT) · 未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 (strictness-rollout pattern) · [finding] The fourviews[]visibility-predicate rules are CLI-only — a Studio/REST/MCPviewwrite bypasses all of them; if they move to runtime-publish, they must move together #7220 / PR feat(lint): move the views[] visibility-predicate family to the runtime publish gate (#7220) #7479 (the axis's prior six-rule move) ·assertControlledByParentWriteanswers a metadata defect and a missing row with the same403 PERMISSION_DENIED"requires edit access to its master record" #7474 (the runtime refusal proving the gap is real)