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
docs(adr): ADR-0070 D2 addendum — a type: module sub-package of an installed app may be disabled by an admin (#28117 item 6) #28285
Filing gate: ③ — carries item 6 of #28117; #28117 keeps items 1–5 (the code PR). ⛔ Not a claim.
Why split:docs/adr/** is Tier H. Kept in #28117's code PR, this one line would hold the whole runtime and objectql change for the maintainer's approval, so the server seat routed it to its own card.
The line, verbatim from #28117 item 6: add to ADR-0070 D2 (docs/adr/0070-package-first-authoring.md): "a type: module sub-package of an installed app may be disabled (not authored into) by an admin; ruling 2026-10-30".
Ruling: the maintainer's words, quoted on #28117: 「大包 + 设置里启用模块」, then 「同意」 (2026-10-30 13:05Z).
When: dispatch after #28117's PR merges, so the addendum describes shipped behaviour. That PR's head will name the exact tie it measured ("belongs to an installed app"); the line should name that tie too.
Blocker #28117's code half merged in PR #28308 (7abe151b): a type: 'module' package of an installed app may now be disabled, not authored into. This card's ADR line describes behaviour that is on main. pm:blocked → pm:queue. docs/adr/** is Tier H, so the PR stays for the maintainer's approval.
Claim: PM loop round 3 · card thread · cross-lane · 2026-10-31T15:12Z
Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01FEkQ5nCt4UPJjChW4GyQxQ
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-a2g9zi (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
Worktree: the card thread's own container checkout
Domain: domain:skills (the card's lane, kept); dispatched cross-lane by domain:server#2
Seat: domain:server#2
Ruling-ref: cross-lane dispatch under the maintainer's 「座位之间可以协调,你有空你就可以派」 (2026-10-31), with no domain:skills seat online. Triage 6538699446 (p2, Tier H); the maintainer's 「大包 + 设置里启用模块」 / 「同意」 (2026-10-30, quoted on #28117); the line, verbatim from #28117 item 6, names the tie PR #28308 shipped.
File surface: docs/adr/0070-package-first-authoring.md (one dated D2 addendum). ⛔ No code, no other ADR.
Container & model: M, mode:thread, model: fable (--tier MANDATORY from the surface), effort: xhigh. Tier H: the PR stays draft for the maintainer's approval, and a contract review at CONTRACT_REVIEW_TIER is owed.
Clause-②: no (governed prose only, no accept set moves; the dev declares)
Metadata-protocol: none
Responsibility: the code is ADR-0070 D2 (package writability) · no platform path covers it (the governed prose follow-up of PR #28308) · reached by every later card cut from ADR-0070
Thread-read: none
Premise: holds (PR #28308 merged as 7abe151b; isDisableableAppModule is on main)
Serial constraints cleared: no open PR touches docs/adr/0070-package-first-authoring.md at this read
Resume-from: none — fresh from origin/main
State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim.
domain:server#2 · os-project-manager · session_01FEkQ5nCt4UPJjChW4GyQxQ
os-dev-report
{
"issue": 28285,
"status": "done",
"branch": "claude/project-thread-a2g9zi",
"pr": "#28430",
"session": "session_01FEkQ5nCt4UPJjChW4GyQxQ — this card thread (harness Claude-Session line); dispatching seat session_0186vfjHHMsRXC9EUT9hTFMo (claim 6545211287)",
"premise_still_valid": true,
"summary": "Premise held on origin/main 5da3a8c: PR #28308 is merged (7abe151), isDisableableAppModule is in packages/runtime/src/domains/packages.ts, and ADR-0070 D2 carried no line about disabling. ADR-0146's supersession of ADR-0070 covers D3's prompt and D5's destination only (its pointer on ADR-0070 says D1, D2, D4 and D6 stand), so D2 is not the superseded part and the amendment proceeds. One file changed, docs/adr/0070-package-first-authoring.md: (1) a dated amendment note under D2 in the registry's blockquote form (ADR-0087 / ADR-0005), quoting the maintainer verbatim (「大包 + 设置里启用模块」, then 「同意」, 2026-10-30), stating that read-only in D2 means may-not-be-authored-into and not may-not-be-switched-off, naming the tie the disable door reads as shipped (manifest.type 'module'; manifest.dependencies directly naming an installed type 'app' package, ADR-0141 D1; own manifest.scope not system/cloud), what does not move (isWritablePackage unchanged, writable false for a module, edit/publish/revert/delete/overwrite still 422 WRITABLE_PACKAGE_REQUIRED, the disableable served verdict beside it computed by the same predicate), what disabled means for the module (404 OBJECT_PACKAGE_DISABLED on the data plane and by-name reads, nav contributions dropped by applyNavContributions, record-change flows withheld for in-process writes, enable restores, data kept), and the in-process ctx.api question recorded as NOT decided here, with the maintainer as decision letter 6538936519 on #28117; (2) the dated Amended pointer on the Status line that ADR-0146's Status-line pointers convention requires, nothing else on it moved, D3–D6 untouched. Five new symbol anchors, all resolving. Clause-②: no, Metadata-protocol: none, skip-changeset on the create. Tier H: the PR is draft and stays draft for the maintainer.",
"tests": "n/a — a decision record; no tested behaviour changes, so no package suite and no ablation. Verification is the derived gate set: each of the 21 commands run on head c2b0e3a with its exit code captured before any pipe, all exit 0 (table in the PR body). Readings: check-adr-symbol-anchors '2952 anchors across 148 records resolve — 691 symbol (663 declaration, 28 literal), 2214 file-level'; check-adr-links '962 relative link destination(s) under docs/adr/ resolve'; adr-index --check 'OK — docs/adr/README.md is current and every record parsed' (so the generated index is not touched); check:doc-authoring '✓ doc authoring guard … no growth, no burn-down unrecorded'; check:nul-bytes OK and grep -naP for control bytes on the file: 0. Scoped lint: pnpm exec eslint --no-inline-config docs/adr/0070-package-first-authoring.md exit 0 with 'File ignored because no matching configuration was supplied' (Markdown is outside the eslint config).",
"gates": "Head c2b0e3a: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 21 commands (the ADR families among them: check:adr-anchors, check:adr-index, check:adr-links, check:adr-symbol-anchors, check:doc-authoring, check:pm-governed-merges). First pass: 20 exit 0, 1 exit 3 — pnpm --filter @objectstack/lint run check:doc-formula-expressions, PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built); built both under the verify lock (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, VERDICT command-exit 0, held 96s), reran: exit 0, '✓ check:doc-formula-expressions: 25 record-scoped formula example(s) across 547 files / 1820 TS blocks judged clean'. --ran reconciliation on the corrected record: '21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3)'. Governed predicate: node scripts/pm/check-governed-merges.mjs --test docs/adr/0070-package-first-authoring.md exit 3 — '⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime) … ⚖️ landing tier: H(人合) — the maintainer's hand, or an authorized APPROVED review (GOVERNED_APPROVERS) and then the owning seat lands it. docs/adr/** ×1'. Tier: dispatch-gates --tier on the path 'Model tier — MANDATORY: claude-fable-5-1 … effort floor at xhigh'; this session: claude-fable-5-1, effort xhigh (get_session). CI check-runs on PR #28430 are the seat's to read; none re-run locally.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "7 — mcp__github__issue_read (get #28285; get_comments #28285 twice; get #28117; get_comments #28117), mcp__github__pull_request_read (get #28308; get #28430 for the body read-back). No MCP write tool.",
"api_writes": "2 — relay pr_create (fleet-write run 41215034086, PR #28430, read-back identical 13748 bytes, labels skip-changeset + documentation stored, assignees none); relay comment of this report on #28285 (post-stamped). git push x1 to claude/project-thread-a2g9zi is not a REST write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #28117 · noted, not filed: the in-process ctx.api access to a disabled module's objects is recorded in the amendment as not decided; it waits on decision letter 6538936519 (option A recommended there). If the maintainer rules B or C, the note's last sentence is the one to amend, in a later ADR PR."
],
"deviations": "Commit trailers are model-free (Co-authored-by: Claude) per os-dev.md and the pre-push hook, not the harness's model-named line. PR body: the harness attribution block (two lines) is first as the project requires, the seat signature line follows it, then Fixes #28285. PR opened with no assignees and no reviewer request, and no subscribe_pr_activity, per the order (the session's best-effort assignee/reviewer MCP writes were skipped: no MCP writes). The card-thread checkout was shallow with a stale origin/main: unshallowed and fetched before deriving; worktree built by detaching the shared checkout (memory recipe)."
}
Activity
objectstack-fleet commentedon Oct 31, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:skills·area:devpath·pm:blockedon #28117 · 2026-10-31T03:56Z⛔ Not a claim.
Blocked-by: #28117is added to the body; the backticked one does not reach the unlock scan.pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Unblocked · 2026-10-31T05:25Z · ⛔ not a claim
Blocker #28117's code half merged in PR #28308 (
7abe151b): atype: 'module'package of an installed app may now be disabled, not authored into. This card's ADR line describes behaviour that is onmain.pm:blocked→pm:queue.docs/adr/**is Tier H, so the PR stays for the maintainer's approval.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Claim: PM loop round 3 · card thread · cross-lane · 2026-10-31T15:12Z
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01FEkQ5nCt4UPJjChW4GyQxQAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-a2g9zi(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:skills(the card's lane, kept); dispatched cross-lane bydomain:server#2Seat:
domain:server#2Ruling-ref: cross-lane dispatch under the maintainer's 「座位之间可以协调,你有空你就可以派」 (2026-10-31), with no
domain:skillsseat online. Triage6538699446(p2, Tier H); the maintainer's 「大包 + 设置里启用模块」 / 「同意」 (2026-10-30, quoted on #28117); the line, verbatim from #28117 item 6, names the tie PR #28308 shipped.File surface:
docs/adr/0070-package-first-authoring.md(one dated D2 addendum). ⛔ No code, no other ADR.Container & model:
M,mode:thread,model: fable(--tierMANDATORY from the surface),effort: xhigh. Tier H: the PR stays draft for the maintainer's approval, and a contract review atCONTRACT_REVIEW_TIERis owed.Clause-②: no (governed prose only, no accept set moves; the dev declares)
Metadata-protocol: none
Responsibility: the code is ADR-0070 D2 (package writability) · no platform path covers it (the governed prose follow-up of PR #28308) · reached by every later card cut from ADR-0070
Thread-read: none
Premise: holds (PR #28308 merged as
7abe151b;isDisableableAppModuleis onmain)Serial constraints cleared: no open PR touches
docs/adr/0070-package-first-authoring.mdat this readResume-from: none — fresh from
origin/mainState:
pm:queue→pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:server#2 · os-project-manager · session_01FEkQ5nCt4UPJjChW4GyQxQ
os-dev-report
{
"issue": 28285,
"status": "done",
"branch": "claude/project-thread-a2g9zi",
"pr": "#28430",
"session": "session_01FEkQ5nCt4UPJjChW4GyQxQ — this card thread (harness Claude-Session line); dispatching seat session_0186vfjHHMsRXC9EUT9hTFMo (claim 6545211287)",
"premise_still_valid": true,
"summary": "Premise held on origin/main 5da3a8c: PR #28308 is merged (7abe151), isDisableableAppModule is in packages/runtime/src/domains/packages.ts, and ADR-0070 D2 carried no line about disabling. ADR-0146's supersession of ADR-0070 covers D3's prompt and D5's destination only (its pointer on ADR-0070 says D1, D2, D4 and D6 stand), so D2 is not the superseded part and the amendment proceeds. One file changed, docs/adr/0070-package-first-authoring.md: (1) a dated amendment note under D2 in the registry's blockquote form (ADR-0087 / ADR-0005), quoting the maintainer verbatim (「大包 + 设置里启用模块」, then 「同意」, 2026-10-30), stating that read-only in D2 means may-not-be-authored-into and not may-not-be-switched-off, naming the tie the disable door reads as shipped (manifest.type 'module'; manifest.dependencies directly naming an installed type 'app' package, ADR-0141 D1; own manifest.scope not system/cloud), what does not move (isWritablePackage unchanged, writable false for a module, edit/publish/revert/delete/overwrite still 422 WRITABLE_PACKAGE_REQUIRED, the disableable served verdict beside it computed by the same predicate), what disabled means for the module (404 OBJECT_PACKAGE_DISABLED on the data plane and by-name reads, nav contributions dropped by applyNavContributions, record-change flows withheld for in-process writes, enable restores, data kept), and the in-process ctx.api question recorded as NOT decided here, with the maintainer as decision letter 6538936519 on #28117; (2) the dated Amended pointer on the Status line that ADR-0146's Status-line pointers convention requires, nothing else on it moved, D3–D6 untouched. Five new symbol anchors, all resolving. Clause-②: no, Metadata-protocol: none, skip-changeset on the create. Tier H: the PR is draft and stays draft for the maintainer.",
"tests": "n/a — a decision record; no tested behaviour changes, so no package suite and no ablation. Verification is the derived gate set: each of the 21 commands run on head c2b0e3a with its exit code captured before any pipe, all exit 0 (table in the PR body). Readings: check-adr-symbol-anchors '2952 anchors across 148 records resolve — 691 symbol (663 declaration, 28 literal), 2214 file-level'; check-adr-links '962 relative link destination(s) under docs/adr/ resolve'; adr-index --check 'OK — docs/adr/README.md is current and every record parsed' (so the generated index is not touched); check:doc-authoring '✓ doc authoring guard … no growth, no burn-down unrecorded'; check:nul-bytes OK and grep -naP for control bytes on the file: 0. Scoped lint: pnpm exec eslint --no-inline-config docs/adr/0070-package-first-authoring.md exit 0 with 'File ignored because no matching configuration was supplied' (Markdown is outside the eslint config).",
"gates": "Head c2b0e3a: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 21 commands (the ADR families among them: check:adr-anchors, check:adr-index, check:adr-links, check:adr-symbol-anchors, check:doc-authoring, check:pm-governed-merges). First pass: 20 exit 0, 1 exit 3 — pnpm --filter @objectstack/lint run check:doc-formula-expressions, PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built); built both under the verify lock (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, VERDICT command-exit 0, held 96s), reran: exit 0, '✓ check:doc-formula-expressions: 25 record-scoped formula example(s) across 547 files / 1820 TS blocks judged clean'. --ran reconciliation on the corrected record: '21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3)'. Governed predicate: node scripts/pm/check-governed-merges.mjs --test docs/adr/0070-package-first-authoring.md exit 3 — '⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime) … ⚖️ landing tier: H(人合) — the maintainer's hand, or an authorized APPROVED review (GOVERNED_APPROVERS) and then the owning seat lands it. docs/adr/** ×1'. Tier: dispatch-gates --tier on the path 'Model tier — MANDATORY: claude-fable-5-1 … effort floor at xhigh'; this session: claude-fable-5-1, effort xhigh (get_session). CI check-runs on PR #28430 are the seat's to read; none re-run locally.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "7 — mcp__github__issue_read (get #28285; get_comments #28285 twice; get #28117; get_comments #28117), mcp__github__pull_request_read (get #28308; get #28430 for the body read-back). No MCP write tool.",
"api_writes": "2 — relay pr_create (fleet-write run 41215034086, PR #28430, read-back identical 13748 bytes, labels skip-changeset + documentation stored, assignees none); relay comment of this report on #28285 (post-stamped). git push x1 to claude/project-thread-a2g9zi is not a REST write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #28117 · noted, not filed: the in-process ctx.api access to a disabled module's objects is recorded in the amendment as not decided; it waits on decision letter 6538936519 (option A recommended there). If the maintainer rules B or C, the note's last sentence is the one to amend, in a later ADR PR."
],
"deviations": "Commit trailers are model-free (Co-authored-by: Claude) per os-dev.md and the pre-push hook, not the harness's model-named line. PR body: the harness attribution block (two lines) is first as the project requires, the seat signature line follows it, then Fixes #28285. PR opened with no assignees and no reviewer request, and no subscribe_pr_activity, per the order (the session's best-effort assignee/reviewer MCP writes were skipped: no MCP writes). The card-thread checkout was shallow with a stale origin/main: unshallowed and fetched before deriving; worktree built by detaching the shared checkout (memory recipe)."
}
Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Landing record · #28285 · PR #28430
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-10-31T21:05Zgit ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28430-*'git merge-base --is-ancestor 8e6acf4b origin/maingit grep -c isDisableableAppModule origin/main -- docs/adr/0070-package-first-authoring.md8e6acf4bafter the maintainer's approval (Tier H). ADR-0070's Status line and a dated note under D2 record the packages: an admin cannot disable a type:module sub-package of an installed app (422 WRITABLE_PACKAGE_REQUIRED), and a disabled package's nav contributions stay in the app #28117 ruling: an admin may disable atype: modulepackage of an installed app, but may not author into it. The note names the tie as PR feat(runtime): an admin can disable a type:module package of an installed app; its nav contributions and record-change flows stop (#28117) #28308 shipped it.isWritablePackage. The in-processctx.apiquestion stays open with the maintainer (decision letter6538936519on packages: an admin cannot disable a type:module sub-package of an installed app (422 WRITABLE_PACKAGE_REQUIRED), and a disabled package's nav contributions stay in the app #28117).Release: claim
6545211287(session_0186vfjHHMsRXC9EUT9hTFMo, branchclaude/project-thread-a2g9zi) · landed.pm:dispatchedremoved; the card is closed.Generated by Claude Code