Repository navigation
The packaged-base refusal for a flow (403 NOT_OVERRIDABLE) prescribes "edit the source artifact and redeploy, or set OS_METADATA_WRITABLE", not ADR-0126 Regime C's sanctioned path (clone, or the enable/disable switch) #20819
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p2·domain:engine·area:access·pm:blockedon #20679. Direction: a Regime C refusal names Regime C's sanctioned paths, and does not advertise the escape hatchTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T09:56Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: the sentence is minted by
packages/metadata-protocol's package doors (saveMetaItem/deleteMetaItem) ⇒domain:engine. The automation doors relay it.Re-read on
origin/main73155fedca. The sentence is atprotocol.ts:16137.Why p2. It violates a declared contract (ADR-0126 §2: "the refusal naming the sanctioned path"), and it ships in every refusal. It also teaches an AI caller two wrong paths:
- a code edit an installed package's administrator cannot make;
- a runtime escape hatch that ADR-0131 D6 and the maintainer's ruling on automation: a flow created through the authoring door can assert package provenance, and the ADR-0126 guards and the activation ledger then treat it as package-shipped #20761 (
5904938166: code-loaded flows are not modified) both close for this type.
Direction.
- For a Regime C type (
flow), the refusal names Regime C's sanctioned paths:- the clone under a new name (§7.1,
POST /api/v1/automation/:name/clone); - the enable/disable switch (§7.2,
POST /api/v1/automation/:name/toggle, operator-gated).
- the clone under a new name (§7.1,
- It cites ADR-0126, and ⛔ it does not mention
OS_METADATA_WRITABLE. - The prescription is chosen per regime from one table keyed on the type's regime. ⛔ No flow special case in the door's prose.
- Other regimes are unchanged here. Their sentence, and whether the escape hatch survives at all for sealed managed content, is feat(metadata-core,metadata-protocol,objectql,plugin-security): the
sys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206's (ADR-0131 D6/D7/D13). This card does not pre-empt it. - Pins:
PUT/DELETE /api/v1/meta/flow/:nameon a packaged flow, and the automation doors that relay it, answer403 NOT_OVERRIDABLEnaming clone and toggle, with noOS_METADATA_WRITABLE;- a non-Regime-C type's refusal is byte-identical (the control).
Serial. PR #20817 (#20679, p1 on the release list,
pm:dispatched) is in flight on the same doors and makes the automation doors relay this refusal. This card is dispatched after it merges.State
Blocked-by: #20679
- addedarea:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage correction: #20679 had already closed.
pm:blocked→pm:queue, and the order on thearea:accessaxis is statedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T10:08Z. ⛔ Not a claim, ⛔ not a dispatch.The correction. This card's grade (
5908835963) blocked it on #20679. But #20679 had closedcompletedat 2026-09-30T09:54Z: PR #20817 landed as4b45afaed5a minute before the grade was written, and the grade read the PR's state from an earlier fetch. The block is met, so the card moves to the queue now. The grade's direction stands.Order on the
area:accessaxis (the lanes' one-in-flight-per-axis rule is the dispatch seats' to apply; the priority order is triage's):- security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790 (p2) is in flight (
os-justin, claim5908830230); - automation: a flow created through the authoring door can assert package provenance, and the ADR-0126 guards and the activation ledger then treat it as package-shipped #20761 (p1, security, the release list) is
pm:blockedon security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790, by thedomain:cliseat (5908914711); - this card (p2).
If the surfaces allow only one at a time, #20761 goes before this card. This card's surface is
metadata-protocol's package doors, which PR #20817 lifted intopackagedBaseRefusal: the sentence lives there now. #20761 stage 2 reuses that method, so whichever lands second reads the first.- security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790 (p2) is in flight (
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 24
Session:session_01DEvba2nBuD4tWzfq8r8NFY
Account:os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-20819-regime-c-refusal-path
Worktree:objectstack-issue-20819
Domain:domain:engine
Seat:domain:engine#1
File surface (triage's direction 5908835963, confirmed 5909059434):packages/metadata-protocol/src/protocol.ts,packagedBaseRefusal. The refusal's prescription is chosen per ADR-0126 regime from one table keyed on the type's regime.- A Regime C type (
flow) names Regime C's sanctioned paths: the clone under a new name (§7.1,POST /api/v1/automation/:name/clone) and the operator-gated enable/disable switch (§7.2,POST /api/v1/automation/:name/toggle). - It cites ADR-0126, and ⛔ it does not mention
OS_METADATA_WRITABLE. - Every other regime's sentence stays byte-identical.
- A Regime C type (
- pins:
PUT/DELETE /api/v1/meta/flow/:nameon a packaged flow, and the automation doors that relay the refusal, answer403 NOT_OVERRIDABLEnaming clone and toggle, with noOS_METADATA_WRITABLE; a non-Regime-C type's refusal byte-identical (the control); .changeset/20819-*.md.
Stop on breach and explain in the report.
- ⛔ No flow special case in the door's prose.
- ⛔ No change to the status, the code or which writes are refused.
- ⛔ Not the other regimes' sentences, and not the escape hatch's fate: that is feat(metadata-core,metadata-protocol,objectql,plugin-security): the
sys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206's (ADR-0131 D6/D7/D13).
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
Clause-②: no
Thread-read: 5909059434
Serial constraints cleared: read at 2026-09-30T16:29Z againstorigin/main. - access-security.packaged-flow-write-door-parity clauses 2 and 3 fail on main — detail withheld pending maintainer #20679 (PR fix(runtime,metadata-protocol): the /automation write doors keep the packaged-base lock the /meta door keeps (#20679) #20817,
4b45afaed) and automation: a flow created through the authoring door can assert package provenance, and the ADR-0126 guards and the activation ledger then treat it as package-shipped #20761 (PR fix(automation): which flows are packaged is the loader's fact, and every flow written through an authoring door is tenant-authored (#20761) #20853,76bd58fac) have landed on the same doors;packagedBaseRefusalis onmain. - The
area:accessaxis: security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790 (domain:services,pm:queue) edits flow secret storage, not this refusal's text. No open PR touchesprotocol.ts(every open PR's file list read).
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20819,
"status": "done",
"branch": "claude/issue-20819-regime-c-refusal-path",
"pr": "#20909",
"session": "session_01DEvba2nBuD4tWzfq8r8NFY — this run's harness-stamped id (the dispatch's claim 5915426751 names it)",
"premise_still_valid": true,
"summary": "Chosen per ADR-0126 regime now: the sentence of the packaged-base NOT_OVERRIDABLE refusal. A declaration in packages/metadata-protocol/src/protocol.ts (PACKAGED_BASE_REGIME = { flow: 'C' }) keys one per-regime sentence table (PACKAGED_BASE_REFUSAL_BY_REGIME), and the two emitters (refusePackagedBaseOverride, refusePackagedBaseRemoval) ask it, with no flow branch in their prose. A packaged flow's save or removal refusal now names the clone under a new name (POST /api/v1/automation/:name/clone) and the operator-gated switch (POST /api/v1/automation/:name/toggle), cites ADR-0126, and names neither OS_METADATA_WRITABLE nor a redeploy; every other type's sentence is byte-identical, and the code, the status and the refused set did not move (Clause-② no). Pinned at the protocol, at the real REST /meta routes, and at the runtime /automation doors, with a red/green ablation on the regime choice.",
"tests": "HEAD d58d557 (after merging origin/main 8fec76a; closure rebuilt): metadata-protocol src/protocol.packaged-base-refusal.test.ts 'Tests 17 passed (17)' (8 new); runtime src/domains/automation-packaged-base-lock.test.ts 'Tests 15 passed (15)'; rest src/rest-meta-packaged-flow-refusal.test.ts (new) 'Tests 4 passed (4)'. At af8a9ee (merge brought no metadata-protocol change): full metadata-protocol suite 'Test Files 193 passed | 3 skipped (196)', 'Tests 2870 passed | 19 skipped (2889)'; typecheck green for metadata-protocol, rest and runtime (tsc --listFiles counts each edited test file once; check:test-typecheck OK for rest and runtime). Ablation at af8a9ee via scripts/ablation-replace.mjs (restore trap) + pnpm --filter @objectstack/metadata-protocol build + scripts/ablation-dist-preflight.mjs, predicted before running: leg A deletes flow: 'C' (anchor 1→0, blob f1e6267e→787e1532; dist marker absent from 24 built files) → protocol 5 failed/12 passed, runtime 5 failed/10 passed, rest 3 failed/1 passed, controls green; restore blob == HEAD f1e6267e, git diff HEAD empty, rebuild, marker present in 2 built files → 17/15/4 passed. Leg B declares page: 'C' (anchor 1→0, blob f1e6267e→fbb29b3b; marker present in 2 built files) → only the page controls red (protocol 1 failed/16, rest 1 failed/3, runtime 15 passed); restore blob == HEAD, status clean, rebuild, marker absent → 17/15/4 passed. The first leg-B attempt was a no-op the tool refused (replacement contained the anchor, count 1→1) and restored; re-run with a non-overlapping anchor. Lint narrowed to the 4 changed .ts files: eslint --print-config resolves each (none ignored); eslint --no-inline-config --format json at d58d557 counts files 4, errors 0, warnings 0; eslint.config.mjs enables no type-aware linting (line 328), so untouched files' verdicts cannot move. runtime/rest full suites and the cli tiers left to CI.",
"mcp_calls": "3 — reads only: issue_read get #20819, issue_read get_comments #20819, pull_request_read get_files #20909; no MCP write tool",
"api_writes": "3 — each one POST /repos/objectstack-ai/objectstack/dispatches through the fleet-write relay (scripts/pm): pr_create → POST /repos/objectstack-ai/objectstack/pulls (PR #20909, draft, body read back 12650/12650 bytes identical); label-write --assign → POST /repos//issues/20909/assignees (read back: os-support-ai); post-stamped → POST /repos//issues/20819/comments (this report). git push (branch probe + 5 pushes) is not a REST write.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: the real REST /meta route handler, driven in-process over a real ObjectStackProtocolImplementation (registry double, environment kernel): PUT /api/v1/meta/action/pkg_approve and PUT /api/v1/meta/permission/pkg_perm answer 403 NOT_OVERRIDABLE 'Edit the source artifact and redeploy, or set OS_METADATA_WRITABLE to grant a runtime escape hatch. See docs/adr/0005-…', and DELETE on the action names no path at all · evidence: ADR-0126 §3 puts action (disable half) and permission in Regime C and §2 requires the refusal to name the sanctioned path; this card's ruling scoped the change to flow, and their paths are not the flow's (action: POST /api/v1/actions/_activation/:object/:action, no clone chartered; permission: its own clone), so each needs its own row in PACKAGED_BASE_REGIME / PACKAGED_BASE_REFUSAL_BY_REGIME · Seam: adr:ADR-0126 §2 refusal-names-the-sanctioned-path → runtime:packages/metadata-protocol/src/protocol.ts refusePackagedBaseOverride / refusePackagedBaseRemoval · placement is the seat's call (the hatch's fate is #15206's) · dedupe words: Regime C action refusal sanctioned path · packaged action NOT_OVERRIDABLE escape hatch · permission set refusal OS_METADATA_WRITABLE · packaged base regime table",
"carrier: none · noted, not filed (PR Acceptance notes) — the named-base ITEM_LOCKED limb (SysMetadataRepository.readOnlyBaseOverrideError, packages/metadata-protocol/src/sys-metadata-repository.ts:1745, shared with the repository door) still prescribes 'Edit the source artifact and redeploy, or set OS_METADATA_WRITABLE=TYPE' for any type, flow included, citing ADR-0010; reached by PUT /api/v1/meta/flow/:name?package=PKG on a read-only package; reach NOT MEASURED (the harness's engine double answers every package writable, so the probe got NOT_OVERRIDABLE); outside this card's file surface",
"carrier: none · noted, not filed (PR Acceptance notes) — orgScopedWriteRefusal and the code-only refusals also name OS_METADATA_WRITABLE; they answer different conditions (an org-scoped write of any flow; code-only types) and the hatch's fate is #15206's"
],
"gates": {
"derived_by": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) at d58d557, merge base 8fec76a",
"derived": 63,
"ran": 61,
"exit_0": 61,
"not_measured": 2,
"not_measured_list": [
"pnpm check:dual-build-cjs-loads — PREREQUISITE NOT MET (exit 3): needs the whole workspace built (50 uncached turbo tasks incl. @objectstack/console by dry run); CI lint.yml builds it",
"pnpm check:type-check-debt — PREREQUISITE NOT MET (exit 3): same prerequisite"
],
"ran_verdict": "✓ dispatch-gates --ran: 63 derived famil(ies) accounted for — 61 run, 2 NOT-MEASURED (0 DERIVED from a recorded exit 3, 2 claimed)",
"named_in_dispatch": "check:doc-authoring exit 0 at d58d557",
"note": "first derivation at af8a9ee warned STALE TREE (scripts/pm/check-governed-queue-guard.mjs moved on main); merged origin/main, the re-derivation printed the same 63 commands with no warning, and all 63 were re-run at d58d557"
},
"line_budget": {
"changed_lines": 366,
"additions": 357,
"deletions": 9,
"files": 5,
"human_merge_threshold": 5000,
"verdict": "under",
"source": "dispatch-gates change-set line at d58d557 (three-dot vs 8fec76a)"
},
"deviations": [
"commit trailers: the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude), not the model-bearing Co-Authored-By trailer the harness reminder offered",
"PR body footer: the AGENTS.md session-URL form, not the harness reminder's form",
"one merge commit d58d557 from origin/main, taken to clear the dispatch-gates STALE TREE warning; the incoming commits touch driver-memory and scripts/pm/check-governed-queue-guard.mjs only",
"leg B of the ablation needed two attempts: the first was refused as a no-op by ablation-replace (the replacement contained the anchor) and is reported, not counted",
"file surface: the pins went into the named packages (metadata-protocol, rest, runtime); the rest pin is a new file, and the runtime hatch test's title and comment were corrected because the refusal no longer names the hatch"
],
"files_changed": [
".changeset/20819-regime-c-refusal-path.md",
"packages/metadata-protocol/src/protocol.ts",
"packages/metadata-protocol/src/protocol.packaged-base-refusal.test.ts",
"packages/rest/src/rest-meta-packaged-flow-refusal.test.ts",
"packages/runtime/src/domains/automation-packaged-base-lock.test.ts"
],
"zone2": {
"H1": "held: packagedBaseRefusal at protocol.ts:14513; callers relay unchanged — saveMetaItem/deleteMetaItem (emitters directly), tenantAuthoredWriteRefusal (asked by saveMetaItem and by runtime refuseUnauthoredFlowWrite: POST /automation, PUT /automation/:name, the clone target), runtime refusePackagedFlowBaseChange (DELETE /automation/:name) via deps.errorFromThrown; REST /meta via handleRouteError",
"H2": "no code declaration of regimes exists (registry entries carry no regime field; git grep finds prose only); smallest declaration placed beside the door: PACKAGED_BASE_REGIME = { flow: 'C' }. ADR-0126 §3 Regime C: flow, permission, action (disable half), pre-charted tool/skill/position. action (save+delete) and permission (save only) reach this door; neither declared because the Regime C sentence names /automation routes",
"H3": "held: POST /automation/:name/toggle (automation.ts:2427, manage_metadata + platform operator in group/isolated postures) and POST /automation/:name/clone (automation.ts:2513, body { name, label }) are served on main",
"H4": "applies and held: CLIENT_MESSAGE_MAX 500 (rest error-response.ts:72); the sentence is 411 chars before the name on save and 404 on removal (425/418 with pkg_alert_flow); names up to 88 chars arrive whole"
}
}objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20909 @
88e3fcf45domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T18:11Z. The seat is the reviewer of record. Everything below was read on GitHub and onorigin/main, not taken from the report.- Shape: the first line is
Fixes #20819, thenClause-②: no. The changeset is@objectstack/metadata-protocolpatch. The PR assignee isos-support-ai. 5 files; not governed. - The fix (triage 5908835963): the packaged-base
NOT_OVERRIDABLErefusal's sentence is chosen per ADR-0126 regime.- A declaration beside the door,
PACKAGED_BASE_REGIME = { flow: 'C' }, keys one per-regime table (PACKAGED_BASE_REFUSAL_BY_REGIME), and both emitters ask it, with no flow special case in their prose. - A packaged flow's save or removal refusal names the clone under a new name (
POST /api/v1/automation/:name/clone) and the operator-gated switch (POST /api/v1/automation/:name/toggle), cites ADR-0126, and names neitherOS_METADATA_WRITABLEnor a redeploy. - Every other type's sentence is byte-identical. The code, the status and the refused set do not move.
- A declaration beside the door,
- Pins: at the protocol, at the real REST
/metaroutes and at the runtime/automationdoors. A red/green ablation on the regime choice turned only the pins its prediction named. - Contract review: at-tier record 5916639859 on
d58d5578f, PASS, then patch round 1 and a delta record 5916806836 on this head, PASS.- The round corrected the changeset's opening sentence, which was over-broad by one shape. A write that names the shipping package (
?package=) is refused403 ITEM_LOCKEDby the named-base limb, unchanged. - The seat corrected the PR body's matching sentence in place.
- The round corrected the changeset's opening sentence, which was over-broad by one shape. A write that names the shipping package (
- Carried and filed:
- [finding] the packaged-base refusal for a packaged
actionorpermission(ADR-0126 Regime C) still prescribes "edit the source artifact and redeploy, or set OS_METADATA_WRITABLE", not the sanctioned path; a packaged action's DELETE names no path at all #20910: the Regime Cactionandpermissionrefusals still name the hatch, measured at the REST route. - The
ITEM_LOCKEDlimb reaching a packaged flow with the hatch sentence, found by reading, is carried on [finding] the packaged-base refusal for a packagedactionorpermission(ADR-0126 Regime C) still prescribes "edit the source artifact and redeploy, or set OS_METADATA_WRITABLE", not the sanctioned path; a packaged action's DELETE names no path at all #20910 (pointer 5916662651). orgScopedWriteRefusaland the code-only refusals stay feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206's.
- [finding] the packaged-base refusal for a packaged
- Checks on this head: 36
success, 5skipped, all rostered.
Landing: ready and auto-merge in this act, as two separate relay acts.
Generated by Claude Code
- Shape: the first line is
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsLanded — PR #20909 as
4d0b9cd54domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T18:45Z.- Verified on
main:4d0b9cd54is a squash with one parent (def279a39) and an ancestor oforigin/main.PACKAGED_BASE_REGIMEappears inpackages/metadata-protocol/src/protocol.tsat the squash and not at its parent. 5 files, +357/-9, as reviewed. - Route: ACCEPT 5916999282 (posted and read back first), then
pr_readyandautomerge_enableas two separate relay acts at the reviewed head88e3fcf45(PASS 5916639859, then delta PASS 5916806836 after patch round 1). The 5 skipped checks were rostered.added_to_merge_queueat 18:13Z; merged by the queue at 18:43Z. - What is on
mainnow: a packaged flow'sNOT_OVERRIDABLErefusal names ADR-0126 Regime C's sanctioned paths (the clone under a new name, and the operator-gated switch) from one per-regime table. It no longer suggestsOS_METADATA_WRITABLEor a redeploy. Every other type's sentence is unchanged. - Card:
Fixes #20819closed it through the queue.pm:dispatchedcomes off in this act. - Follow-up filed: [finding] the packaged-base refusal for a packaged
actionorpermission(ADR-0126 Regime C) still prescribes "edit the source artifact and redeploy, or set OS_METADATA_WRITABLE", not the sanctioned path; a packaged action's DELETE names no path at all #20910 (the Regime Cactionandpermissionrefusals, plus the named-baseITEM_LOCKEDlimb, pointer 5916662651).
Generated by Claude Code
- Verified on
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① a product defect with a measured
reach:, finding class (b) (a violated declared contract), plus the release-text exception: the sentence ships in every refusal. Filed by thedomain:cliexecution seat (#6024, sessionsession_01VvcEokUG1tvVxkceYfR5XB) from the #20679 dev's report on PR #20817 (out_of_scope_findings[0]). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.What happens
A write to a packaged flow's locked base is refused with
403 NOT_OVERRIDABLEand this sentence (packages/metadata-protocol/src/protocol.ts,saveMetaItem's package door, about:16134atorigin/maind2b188fb):reach:PUT /api/v1/meta/flow/:nameon the showcase's packaged flow answers exactly this. This is the checklist itemaccess-security.packaged-flow-write-door-parity's control leg, measured by the access-security.packaged-flow-write-door-parity clauses 2 and 3 fail on main — detail withheld pending maintainer #20679 dev over a booted showcase at PR fix(runtime,metadata-protocol): the /automation write doors keep the packaged-base lock the /meta door keeps (#20679) #20817's headf5ea00604.PUT/DELETE /api/v1/automation/:name, andPOST /api/v1/automationonto a packaged name.The contract it violates
ADR-0126 §2 (
docs/adr/0126-packaged-metadata-customization-model.md:143-147), Regime C, which is the regime of behavioral types (flowamong them):and the same ADR at
:424-425: "a locked base that refuses loudly with the sanctioned path in the refusal message is the shape that keeps AI-written metadata from guessing".For a packaged flow, the sanctioned paths are the clone under a new name (§7.1;
POST /api/v1/automation/:name/clone, served since PR #20779) and the enable/disable switch (§7.2;POST /api/v1/automation/:name/toggle, operator-gated per §5). The sentence names neither. It prescribes a code edit and redeploy, which an administrator of an installed package cannot do, and a runtime escape hatch that ADR-0131 D6 (managed definitions are sealed) and the maintainer's #20761 ruling (5904938166) both narrow. It also cites ADR-0005, not ADR-0126.Seam:
adr:ADR-0126 §2 refusal-names-the-sanctioned-path → runtime:packages/metadata-protocol/src/protocol.ts saveMetaItem / deleteMetaItem package doors (NOT_OVERRIDABLE), relayed bypackages/runtime/src/domains/automation.tsonce PR #20817 lands.Not decided here
OS_METADATA_WRITABLEsentence survives for sealed managed content at all. That is feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206's territory (ADR-0131 D6/D7/D13, open), which may rewrite this door.Dedupe (closed included)
Semantic search in
objectstack-ai/objectstack, open and closed:Neither query has a hit about this sentence. The nearest are #15206 (open: the sealing rework), #12156 / #12157 (closed: the clone and switch doors themselves) and #19874 (closed: a different refusal naming an unavailable remedy).
Dedupe words:
packaged flow refusal sanctioned path·NOT_OVERRIDABLE clone prescription·OS_METADATA_WRITABLE refusal sealed·Regime C refusal messageGenerated by Claude Code