Skip to content

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

@objectstack-fleet

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 the domain:cli execution seat (#6024, session session_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_OVERRIDABLE and this sentence (packages/metadata-protocol/src/protocol.ts, saveMetaItem's package door, about :16134 at origin/main d2b188fb):

Metadata item 'flow/NAME' is provided by a code package and the type has not opted into per-org overlay writes (allowOrgOverride=false). Edit the source artifact and redeploy, or set OS_METADATA_WRITABLE to grant a runtime escape hatch. See docs/adr/0005-metadata-customization-overlay.md.

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 (flow among them):

the packaged base is locked — in-place edit refused loudly at the write door, the refusal naming the sanctioned path; each packaged behavioral artifact carries an enable/disable switch … customization is authoring an ordinary sibling artifact (clone or from scratch; new machine name mandatory …

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 by packages/runtime/src/domains/automation.ts once PR #20817 lands.

Not decided here

Dedupe (closed included)

Semantic search in objectstack-ai/objectstack, open and closed:

  • "packaged flow refusal NOT_OVERRIDABLE sentence should name clone sanctioned path instead of redeploy OS_METADATA_WRITABLE": 22 hits.
  • "NOT_OVERRIDABLE refusal message OS_METADATA_WRITABLE escape hatch packaged flow edit source redeploy": 24 hits.

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 message


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:enginepm:queuepriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions