Part of #14122 · blocks #14512 · Blocked-by: #15004 (the acceptance probe).
Reader half of the program ruled on #14512 (comment 5528589044, maintainer 2026-09-03, batch #23). The artifact stays additive through this card.
The site
One reader, one line:
| Reader | file:line |
|---|
| app default permission set | packages/plugins/plugin-security/src/app-default-permission-set.ts:122 — reads config.permissions |
Reached from packages/cli/src/commands/serve.ts:3710 via appSecurityPluginOptions(config).
Why it is its own card despite being one line
This is the site that both earlier enumerations missed, and it is the reason the program is scoped the way it is. The first pass scoped itself to "@objectstack/runtime and @objectstack/cli" and stated that as its boundary; this reader is in neither. It was found only by the second, wider measurement (comment 5523741937).
It is separated rather than folded into card 3/4 because the ruling requires each site to be separately reviewable and revertible, and because a third package in the blast radius is exactly the fact a reviewer should see rather than have buried in a cli-scoped diff.
⚠️ The ADR-0056 D7 permission surface this feeds is also fed from the artifact side by createStandaloneStack (packages/runtime/src/standalone-stack.ts:791, card #15005). The two paths must agree: fixing one and not the other leaves a multi-package artifact with a permission surface that depends on which entry path booted it. The probe pin (#15004) covers both, which is why it lands first.
Acceptance
Sibling cards: #15004 (probe, blocks this), #15005@objectstack/runtime, #15006@objectstack/cli. Emitter half: #14512.
Part of #14122 · blocks #14512 · Blocked-by: #15004 (the acceptance probe).
Reader half of the program ruled on #14512 (comment 5528589044, maintainer 2026-09-03, batch #23). The artifact stays additive through this card.
The site
One reader, one line:
file:linepackages/plugins/plugin-security/src/app-default-permission-set.ts:122— readsconfig.permissionsReached from
packages/cli/src/commands/serve.ts:3710viaappSecurityPluginOptions(config).Why it is its own card despite being one line
This is the site that both earlier enumerations missed, and it is the reason the program is scoped the way it is. The first pass scoped itself to "
@objectstack/runtimeand@objectstack/cli" and stated that as its boundary; this reader is in neither. It was found only by the second, wider measurement (comment 5523741937).It is separated rather than folded into card 3/4 because the ruling requires each site to be separately reviewable and revertible, and because a third package in the blast radius is exactly the fact a reviewer should see rather than have buried in a cli-scoped diff.
createStandaloneStack(packages/runtime/src/standalone-stack.ts:791, card #15005). The two paths must agree: fixing one and not the other leaves a multi-package artifact with a permission surface that depends on which entry path booted it. The probe pin (#15004) covers both, which is why it lands first.Acceptance
resolveArtifactPackageOrder(@objectstack/core, since fix(metadata): register a packages[] artifact per package at the metadata door so every object has one owner across every door (#14599) #14643).composeStacks,packages/spec/src/stack.zod.ts, or what any command emits. Artifact stays additive.config.permissions,config.objects,bundle.<collection>reads) across all ofpackages/, not by a package list. If another package turns up, file it as 5/4 rather than folding it in here.Sibling cards: #15004 (probe, blocks this), #15005
@objectstack/runtime, #15006@objectstack/cli. Emitter half: #14512.