You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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.
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.
(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/main05a30e6e. 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.
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 kept ·
domain:spec· 2026-11-05T23:54Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
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 asGET /useranswers it; the card's assignee)Branch:
claude/issue-30724-disable-refused-dependent-rule-codeWorktree:
objectstack-issue-30724Domain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/api/error-code-ledger.zod.ts: one new code inERROR_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 inpackages/spec/src/api/**that a new code must join by the ledger's own rule.error-code-ledger.test.ts,api-error-code-type.test.ts) where they enumerate codes.content/docs/references/**), if any.⛔ Not in scope:
packages/runtime/**(the disable-door scan is [Decision] A package can be disabled while an enabled package's validation rule reads one of its extension fields, and then every write to that object is refused #30379,domain:server#4, a serial follower that uses this code once it lands).retired-error-codes.ts.skills/**,docs/adr/**,.claude/**,AGENTS.md.(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: mediumClause-②: 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 new409code 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 onThread-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*_DISABLEDre-spelling.Premise: holds, read at
origin/main05a30e6e.ERROR_CODE_LEDGER(error-code-ledger.zod.ts) holdsPACKAGE_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 is409with a new error code (the ledger entry is adomain:speccard)". 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.tsor 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
objectstack-fleet commentedon Nov 6, 2026
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" ] }objectstack-fleet commentedon Nov 6, 2026
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
ACCEPT → PR #30775 comment 6675369300 · head
2efc7b56d9b756146e70ba928f2d3a4b0d8d61c5· contract review PASS 6675075253 (2efc7b56) · 2026-11-06T02:39ZGenerated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
Landed · PR #30775 · merge
9bdeed2d3f5f7bc55ecca24b8d0988dc5ff423ed· 2026-11-06T03:28ZGET /repos/objectstack-ai/objectstack/issues/30775/timelineadded_to_merge_queue02:40:55Z →removed_from_merge_queue03:27:33Z,merged03:27:33Zorigin/mainby content (ledger row)git grep -n -F "'PACKAGE_DISABLE_RESTRICTED_BY_VALIDATION_RULE'" origin/main -- packages/spec/src/api/error-code-ledger.zod.tsorigin/mainby content (reference page)git grep -c -F "PACKAGE_DISABLE_RESTRICTED_BY_VALIDATION_RULE" origin/main -- content/docs/references/api/error-code-ledger.mdxState: the card is closed
completedbyFixes #30724, andpm:dispatchedis 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), andNotify: landed · #30724goes to its seat's mailbox in this round. Nothing else is owed.Generated by Claude Code