Seam card (target repo unreachable from the filing seat — falls to objectstack per the cross-repo rule, repo:cloud + named reader). Named reader: the cloud lane seat — this card is its dispatch input; the objectstack consumer half (#13457) is pm:blocked on this card.
⚠️ The Blocked-by: #14865 line has been REMOVED — that blocker is discharged. #14865 closed 2026-09-03 via merged PR #14992, and cloud's pin e581457baaaf carries it: packages/spec/src/system/environment-artifact.zod.ts:173 declares grantedPermissions: z.record(z.string(), PluginPermissionsSchema).optional(). The line is removed rather than struck through because it is a machine-grepped reverse index and a stale entry pollutes it. Unlock reading recorded in the 2026-09-07 comment below.
The ruling this executes
Maintainer, 2026-09-01, PM chat channel, director decision batch A, verbatim 「同意。」 on the presented recommendation for #13457:
裁「grant 由 artifact 契约承载」⇒ #11333 Phase 1 重切为 cloud 先行 + objectstack 消费卡 Blocked-by 排后;materialize 缝归 ADR-0025 设计。
Architecture direction, as presented and adopted: the granted-permissions set rides the plugin artifact contract. cloud (the owner of the install-consent flow) compiles the consented structured set {services, hooks, network, fs} into the artifact/manifest carrier it produces; objectstack's loader later consumes it from the environment-local carrier at materialize time. This follows ADR-0003 (revised by cloud ADR-0007): sys_package_installation is control-plane desired state, never read on any runtime path — runtime truth lives with the environment's own carrier.
First deliverable is a measurement, not code
Does the artifact cloud compiles today already carry the granted set?
⇒ Measured by the repo:cloud seat on 2026-09-07: NO. grantedPermissions appears in packages/service-cloud/src/ only in two forward-looking comments (cloud-artifact-helpers.ts:679, routes/cloud.ts:752, both saying it "is next"). Positive control: granted_permissions is written in routes/package-install.ts. ⇒ The second branch applies — add the field to the envelope and write it at consent-compile time. ⛔ Re-verify this on the dispatch head rather than inheriting it; the file has moved twice since.
Contract-first: the field's shape is the four-class structured set the consent flow already parses (plugin-consent.ts's own header states the intent verbatim: "the environment runtime later feeds it to the framework's PluginPermissionEnforcer (F4) to gate the plugin at load time").
Boundaries
Refs: #11333 (parent ruling, option A 2026-08-30 「同意」) · #13457 (consumer half, blocked on this) · #13458 (Phase 2, blocked behind #13457) · #14865 (the spec half, landed and pinned) · ADR-0003 / cloud ADR-0007 · ADR-0025.
Filed by the director seat, session session_015adLit3ZYASJiXwxKG78Wi.
Seam card (target repo unreachable from the filing seat — falls to objectstack per the cross-repo rule,
repo:cloud+ named reader). Named reader: the cloud lane seat — this card is its dispatch input; the objectstack consumer half (#13457) ispm:blockedon this card.The ruling this executes
Maintainer, 2026-09-01, PM chat channel, director decision batch A, verbatim 「同意。」 on the presented recommendation for #13457:
Architecture direction, as presented and adopted: the granted-permissions set rides the plugin artifact contract. cloud (the owner of the install-consent flow) compiles the consented structured set
{services, hooks, network, fs}into the artifact/manifest carrier it produces; objectstack's loader later consumes it from the environment-local carrier at materialize time. This follows ADR-0003 (revised by cloud ADR-0007):sys_package_installationis control-plane desired state, never read on any runtime path — runtime truth lives with the environment's own carrier.First deliverable is a measurement, not code
Does the artifact cloud compiles today already carry the granted set?
⇒ Measured by the
repo:cloudseat on 2026-09-07: NO.grantedPermissionsappears inpackages/service-cloud/src/only in two forward-looking comments (cloud-artifact-helpers.ts:679,routes/cloud.ts:752, both saying it "is next"). Positive control:granted_permissionsis written inroutes/package-install.ts. ⇒ The second branch applies — add the field to the envelope and write it at consent-compile time. ⛔ Re-verify this on the dispatch head rather than inheriting it; the file has moved twice since.Contract-first: the field's shape is the four-class structured set the consent flow already parses (
plugin-consent.ts's own header states the intent verbatim: "the environment runtime later feeds it to the framework's PluginPermissionEnforcer (F4) to gate the plugin at load time").Boundaries
SecurePluginContextwiring) is NOT this card — it belongs to the ADR-0025 install-flow design work and to Phase 1 of #11333: wire granted_permissions into PluginPermissionEnforcer (F4) as the load-time gate #13457 once this lands.Refs: #11333 (parent ruling, option A 2026-08-30 「同意」) · #13457 (consumer half, blocked on this) · #13458 (Phase 2, blocked behind #13457) · #14865 (the spec half, landed and pinned) · ADR-0003 / cloud ADR-0007 · ADR-0025.
Filed by the director seat, session
session_015adLit3ZYASJiXwxKG78Wi.