Skip to content

spec: ledger the error code the package disable door answers when an enabled package's validation rule reads a field the disabled package adds (#30379 ruling A) #30724

Closed

Description

@objectstack-fleet

domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

Filing gate: ③ a maintainer-directed task. It carries item 3 of the ruling recorded on #30379 in comment 6670643454 (domain:server#2; the maintainer 「同意」 to letter A, 2026-11-05T21:56Z): "The refusal is 409 with a new error code (the ledger entry is a domain:spec card)." #30379 keeps the disable-door scan (domain:server, claimed by domain:server#4) and the ADR-0141 line.

Business reason

When an administrator disables a package while another enabled package's validation rule reads a field the first one adds, every write to that object starts failing. Ruling A makes the disable door refuse instead, naming the package, object and rule. A client (the Settings page, an agent, a script) can only branch on that refusal if it carries a stable, ledgered code. Without this card the server half would answer an unledgered code or a generic one.

Ask

  • One new semantic code in ERROR_CODE_LEDGER (packages/spec/src/api/error-code-ledger.zod.ts) for "the disable is refused because an enabled package's validation rule reads a field this package adds through objectExtensions", answered 409. The spec lane picks the name by the ledger's naming rule.
  • The ledger row's guidance says the remedy: disable or change the reading rule first, or keep the package enabled. The refusal may name several package · object · rule triples.
  • Nothing else. The server half (packages/runtime/src/domains/packages.ts) uses the code after this lands.

Reader who acts

domain:spec. A new code is Clause-②: yes and gets the spec lane's review. Then domain:server#4 builds #30379 against it, as a serial follower.

Dedupe (issue search, open and closed): disable validation rule extension field error code and package disable refused dependent rule 409. The only hit is #30379. New.

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:spec · 2026-11-05T23:54Z

    ⛔ Not a claim.

    • Ledger the error code the package disable door answers when an enabled package depends on the one being disabled. It ledgers a code already served and adds no new key.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Claim: PM loop round 6 · 2026-11-06T00:39Z
    Session: session_01L6bhgVugtCCwBs98FeR27P (seat; mode:subagent, so the dev shares this session id and is identified by the branch)
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30724-disable-refused-dependent-rule-code
    Worktree: objectstack-issue-30724
    Domain: domain:spec
    Seat: domain:spec#2
    File surface:

    • packages/spec/src/api/error-code-ledger.zod.ts: one new code in ERROR_CODE_LEDGER, in its alphabetical place, with the row comment that says when it is answered (409), what the refusal names (one or more package · object · rule triples) and the remedy (disable or change the reading rule first, or keep the package enabled). Plus any status or guidance table in packages/spec/src/api/** that a new code must join by the ledger's own rule.
    • The ledger's pins (error-code-ledger.test.ts, api-error-code-type.test.ts) where they enumerate codes.
    • Regenerated spec artifacts (content/docs/references/**), if any.
    • One changeset.

    ⛔ Not in scope:

    (Stop on breach and explain it in the report.)
    Container & model: S (one ledger row and its pins), mode:subagent, model: default (no path-derived mandate; packages/spec/src/** non-test file ⇒ the seat runs a CONTRACT_REVIEW_TIER review before the queue), effort: medium
    Clause-②: yes (widening)
    Metadata-protocol: none
    Responsibility: packages/spec (the ledger has no code for "this disable is refused because an enabled package's validation rule reads a field this package adds") | ruling A on #30379 made the disable door refuse with a new 409 code and routed the ledger entry here | an administrator, the Settings page, an agent or a script that disables a package another enabled package depends on, and needs a stable code to branch on
    Thread-read: 6672694111
    Decision of record (the card leaves the name to the spec lane): the dev proposes the name by the ledger's naming rule (the scope rule and its *_DISABLED / PACKAGE_* neighbours), and the seat confirms it before the PR opens. The code names WHY the disable is refused, not that something is disabled, so it is not a *_DISABLED re-spelling.
    Premise: holds, read at origin/main 05a30e6e. ERROR_CODE_LEDGER (error-code-ledger.zod.ts) holds PACKAGE_DELETE_FAILED, PACKAGE_DELETE_PARTIAL, PACKAGE_MANIFEST_INVALID, PACKAGE_PUBLISH_FAILED (L263-266) and no code for a refused disable. The ruling (#30379 comment 6670643454, maintainer 「同意」 to letter A) says "The refusal is 409 with a new error code (the ledger entry is a domain:spec card)". Triage 6672694111 keeps p2.
    Serial constraints cleared: none of the 65 open PRs touches packages/spec/src/api/error-code-ledger.zod.ts, retired-error-codes.ts or their tests (file lists read at 2026-11-06T00:39Z). #30379 (domain:server#4, claimed) builds on this code and lands after it.


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
    os-dev-report

    {
      "issue": 30724,
      "status": "done",
      "branch": "claude/issue-30724-disable-refused-dependent-rule-code",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30775",
      "session": "session_01L6bhgVugtCCwBs98FeR27P",
      "premise_still_valid": true,
      "summary": "One ERROR_CODE_LEDGER row under @objectstack/runtime: PACKAGE_DISABLE_RESTRICTED_BY_VALIDATION_RULE, the 409 the package disable door answers when a validation rule of a package that stays enabled reads a field the package being disabled adds through objectExtensions. The row comment says when it is answered, that the refusal names each package · object · rule triple, and the remedy (disable or change the reading rule first, or keep the package enabled). It is registered ahead of its producer; the disable-door scan of #30379 stamps it. The name was proposed by the dev and confirmed by the seat (claim Decision of record). Pins in error-code-ledger.test.ts and api-error-code-type.test.ts, three regenerated reference pages, one patch changeset. Draft PR head 2efc7b56d9 (two commits plus a merge of origin/main 3214615d7a).",
      "tests": "At 2efc7b56d9 after pnpm install --frozen-lockfile, a full pnpm build (118/118) and removal of packages/runtime/.objectstack: pnpm --filter @objectstack/spec test exit 0 (817/817 files, 25827 tests, 1 todo); pnpm --filter @objectstack/spec typecheck exit 0 (check:test-typecheck OK; tsc --listFiles shows both pin files compiled with 0 errors). Ablation (scripts/ablation-replace.mjs, WRAP, on 48bb8d5f3e, whose three touched src files are blob-identical to the head): row anchor x1 -> x0, blob 21e349e0da32 -> 2acbdf4d1b72; vitest on the two pin files exit 1 with exactly the two new cases failing; check:test-typecheck exit 1 (1 type error in src/api/api-error-code-type.test.ts); restore proved blob == HEAD, git diff HEAD empty; rerun 28/28 green and check:test-typecheck OK.",
      "gates": "Local at 2efc7b56d9: dispatch-gates --commands --repo objectstack-ai/objectstack derived 105 commands; all 105 exit 0; --ran: 105 derived, 105 run, 0 NOT-MEASURED, 0 UNRUN. Included check:dispatcher-error-vocabulary, check:error-code-casing, check:error-code-provenance, check:error-status-conformance, check:doc-authoring, check:nul-bytes, check-changeset-no-major. Extra: spec check:generated exit 0 (14/14 current); check-changeset-no-major --event with the PR body exit 0, level axis at patch; eslint --no-inline-config on the three .ts files exit 0; local-only check:dev-prereqs exit 0 and check:skill-frame-freshness exit 0. CI on the PR head when this report was written: 33 check-runs, 2 success (incl. Governed Surface Queue Guard), 7 skipped, 24 queued or in_progress; Build Core and Live E2E UI queued. in_progress is the honest value.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — the fleet-write relay's pr_create stroke (repository_dispatch, executed as POST /repos/objectstack-ai/objectstack/pulls, PR 30775, body read back byte-identical), and this comment (POST /repos/objectstack-ai/objectstack/issues/30724/comments via post-stamped.mjs). git push is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: none (a triage sentence, not a defect) · the triage note on this card says the code is already served; on origin/main the disable branch of packages/runtime/src/domains/packages.ts runs no dependent scan and stamps no such code · carrier: none · noted in the PR's Acceptance notes, not filed",
        "deviation, seat-accepted: the changeset is patch, not the dispatch's minor; check-changeset-no-major grades a declared Metadata-protocol: none at patch · carrier: none · noted in the PR's Acceptance notes"
      ]
    }
  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    ACCEPT → PR #30775 comment 6675369300 · head 2efc7b56d9b756146e70ba928f2d3a4b0d8d61c5 · contract review PASS 6675075253 (2efc7b56) · 2026-11-06T02:39Z


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Landed · PR #30775 · merge 9bdeed2d3f5f7bc55ecca24b8d0988dc5ff423ed · 2026-11-06T03:28Z

    Reading Probe Answer
    Queue membership GET /repos/objectstack-ai/objectstack/issues/30775/timeline added_to_merge_queue 02:40:55Z → removed_from_merge_queue 03:27:33Z, merged 03:27:33Z
    origin/main by content (ledger row) git grep -n -F "'PACKAGE_DISABLE_RESTRICTED_BY_VALIDATION_RULE'" origin/main -- packages/spec/src/api/error-code-ledger.zod.ts L515
    origin/main by content (reference page) git grep -c -F "PACKAGE_DISABLE_RESTRICTED_BY_VALIDATION_RULE" origin/main -- content/docs/references/api/error-code-ledger.mdx 1

    State: the card is closed completed by Fixes #30724, and pm:dispatched is removed in this stroke. The review had no findings. #30379 (domain:server#4, serial 6675459283) is the producer and builds on this code; the review's four carry items are on #30379 (6675092387), and Notify: landed · #30724 goes to its seat's mailbox in this round. Nothing else is owed.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions