Skip to content

[Decision] docs/adr: 143 ADRs with no index, four numbers used twice, 19 Proposed older than three months, three status-line spellings — how the registry gets put in order #26076

Closed

Description

@objectstack-fleet

Ruled: 6417460375 · letter A · 2026-10-26T13:41Z

Filing gate ②: a maintainer-only decision. Maintainer, 2026-10-26, verbatim: 「完整的评估本项目, 还有哪些可以优化的地方。包括 ci 和文档」 then 「使用 pm-dispatch 技能创建 issue,需要决策的立为决策卡。」 and 「低优先级的先不考虑」. Batch-of: 19 (repository evaluation 2026-10-26, session_019a9XCWsbMFp75REzthE6cs; 9 decision cards + 10 execution cards). Reader: the director seat presents this card in a decision batch; after the ruling the lane named under "After the ruling" dispatches. ⛔ Not a claim. Dedupe: REST list (439 issues), grep ADR index|adr.*(index|duplicate|Proposed|status) → 0 hits. New.

维护者速读

docs/adr/ 143 份 ADR 没有任何索引(PRIORITIZATION.md:3 自称已退役却留着一条活规则)。编号重复:0006 有三份版本文件(.md / .v2.md / .v4.md),0010、0019、0057 各有两份互不相关的 ADR(如 0010-metadata-protection-model 与 0010-nl-to-flow-authoring)。状态分布:Accepted 104、Proposed 21、Superseded 4、Draft 3、Withdrawn 2、其余各 1;19 份 Proposed 早于 2026-07-26,三份 Draft 自五月起未动;12 份文件首个状态行不在三种已知拼写里(**Status**: / ## Status / - **状态**:),机器读不出。AGENTS.md 第 13 条规定「编号永不重新分配」,所以重号不能靠改号解决,只能在索引里并列并在文件头互相指认。ADR 是你亲手批的面(Tier H),索引怎么生成、旧 Proposed 怎么处置是你的决定。请裁:A 生成 docs/adr/README.md 索引(编号、标题、状态、日期,由脚本从状态行生成,状态行统一为一种拼写),重号在索引里并列标注,19 份旧 Proposed 由你逐份裁 Accept / Withdraw / Defer(席位出一张清单附每份的实现读数);B 同 A 但旧 Proposed 一律改 Deferred,不逐份裁;C 只生成索引,状态与重号不动。是否要把「索引与状态行格式」做成门禁(check:adr-index):默认不加,除非你点名。选 A / B / C,门禁加 / 不加?

Governing text

  • AGENTS.md Prime Directive 13: an accepted ADR binds until superseded; "Files never move between registries and numbers are never reassigned."
  • AGENTS.md Prime Directive 14: docs/adr/** is Tier H.
  • scripts/check-adr-anchors.mjs resolves bare numbers against this registry — a duplicated number is ambiguous to it.
  • scripts/check-adr-links.mjs (run by check-links.yml:115) checks link targets, not the index or status.
  • pm-dispatch 四轴 ④: 新增门禁默认否.

Premises

  • P1 — duplicates: ls docs/adr | grep -oE '^[0-9]{4}' | sort | uniq -d → 0006 0010 0019 0057.
  • P2 — status spellings: grep -l -m1 -iE '^(\*\*Status\*\*|## Status|- \*\*状态\*\*|Status:)' docs/adr/0*.md | wc -l vs the file count; 12 files match none of the four.
  • P3 — stale Proposed: grep each Proposed file's date line; 19 are before 2026-07-26 (0022, 0025, 0026, 0027, 0038, 0046, 0050–0052, 0063, 0064, 0071–0073, 0077, 0080, 0096 among them).
  • P4 — check-adr-anchors.mjs behaviour on a duplicated number: node scripts/check-adr-anchors.mjs --self-test and read how it resolves ADR-0010.

One-sentence problem

A decision nobody can find is a decision that will be reversed (AGENTS.md's own words), and today 143 decisions have no list, four of them share a number with an unrelated one, and 19 proposals have been neither accepted nor withdrawn for a quarter.

Options

Option What Consequence Workload
A Script-generated index; one status-line spelling; duplicates cross-referenced in each file's header and listed side by side; a triage list of the 19 Proposed with implementation readings for the maintainer to rule one by one. The registry becomes greppable and the anchor checker unambiguous; the maintainer spends one ruling batch (19 rows, so four batches of five). spec lane (ADR tooling) + maintainer · 1 PR Tier H + ruling batches · precedent: none read
B Same tooling; the 19 Proposed all become Deferred by one edit. Fast; a proposal that is actually implemented stays mislabelled until someone notices. 1 PR Tier H
C Index only. Findable but still inconsistent; the anchor checker still ambiguous on four numbers. 1 PR Tier H

Business meaning

  • A: the decision log is a log again, and the backlog of undecided proposals is decided.
  • B: the log is tidy; the proposals are shelved, not judged.
  • C: a table of contents on an unsorted shelf.

四维分析

  • 实际业务需求:读者是每个要「grep ADR 再改行为」的席位(AGENTS.md 第 13 条要求)。没有索引时席位靠文件名猜;重号时 check-adr-anchors.mjs 可能解析到错的那份。
  • 项目长远合理性:ADR 是这个仓库最持久的面;索引由脚本从状态行生成,状态行是单一事实,索引永不手写——这和 docs/qa/platform-checklist/coverage.json 的做法一致。
  • 防 AI 犯错:三种状态拼写意味着任何自动读取都要猜;闭合为一种拼写让「这份 ADR 还有效吗」变成一次 grep。19 份 Proposed 里有「partially implemented」字样的,席位可能据此以为被裁过了。
  • 创业阶段不扩散:索引脚本放在已有的 scripts/check-adr-*.mjs 旁,不加必查门禁;若你点名加门,门只校验「索引与文件一致」,不校验内容。

Recommendation

A,门禁不加(索引脚本带 --self-test,由 lint 的现有 ADR 步骤顺手调用一次只报告不红;若你点名再升必查)。只看①选 A;②③④ 是否翻转:否。

Confidence gaps: the 12 files whose status line matches no known spelling may be non-ADR notes (PRIORITIZATION.md among them); the dev lists them before normalizing.

After the ruling

  • A: the spec lane dispatches the tooling PR (index script + normalization + duplicate cross-references); the director seat then presents the 19 Proposed in batches of five with implementation readings.
  • B / C: one PR.

os-decision-facets
① 项目长远合理性:索引从状态行生成、单一拼写,重号在索引里并列而不改号(第 13 条)。
② 实际业务拉动:第 13 条要求席位改行为前 grep ADR;今天 grep 到的可能是重号的另一份。
③ 防 AI 犯错:三种状态拼写让自动读取只能猜;闭合为一种后「还有效吗」是一次 grep。
④ 创业阶段不扩散:不加必查门禁,索引脚本只报告;19 份 Proposed 由维护者裁,不由席位改。
Prior rulings read: ADR index,Proposed,superseded,renumber → 0 hits; ADR-0013 D(numbers never reassigned); thread: none; repo: objectstack-ai/objectstack

Related

AGENTS.md Prime Directive 13; scripts/check-adr-anchors.mjs; scripts/check-adr-links.mjs.

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p2 · domain:docs · area:devpath · needs-user-decision · pm:awaiting-maintainer · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T12:04Z

    ⛔ Not a claim, ⛔ not a dispatch. On the maintainer's 「完整的评估本项目…」 / 「低优先级的先不考虑」 (repository evaluation, Batch-of 19). Low priorities were excluded at filing, so the execution cards grade p2.

    • A decision card: the options and the filer's recommendation are in the body, and the letter is the maintainer's. The recommendation adds no gate (the index script reports only), so 「新增门禁默认否」 holds.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #398 · 2026-10-26T13:30Z

    Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #398 (the docs family of the 2026-10-26 repository review) as item 3 of 5. Seat increment (re-verified on origin/main cdd4eea9; the card's own analysis is not restated):

    • P1 holds exactly: duplicated numbers 0006, 0010, 0019, 0057 among 143 files. P2 holds in substance: by this seat's instrument (first status line in any of the four spellings) 98 Accepted / 41 Proposed against the card's 104 / 21 — the two counts differ because the spellings differ, which is the card's point; the dev's normalization pass is what makes the number mean one thing. docs/adr/PRIORITIZATION.md opens "this review is retired" while still in the directory.
    • AGENTS.md Prime Directive 13 binds: numbers never reassigned, files never move between registries — so the four duplicates are cross-referenced in each file's header and listed side by side, never renumbered. scripts/check-adr-anchors.mjs is the reader that must stop being ambiguous on those four.
    • ④ reading: the index script is report-only beside the existing check-adr-*.mjs pair; a required gate only if the maintainer names it — the card and the seat both recommend not naming one now.
    • Facets read: same direction; the seat agrees with A, 门禁不加. The 19 old Proposed records then come to this seat as ruling batches of five with implementation readings (duty of this seat, after the tooling PR). Workload: spec lane · 1 PR Tier H (docs/adr/**) + four ruling batches.
      Prior rulings read: ADR index · renumber · Proposed → Prime Directive 13 only; thread: this card's triage comment.
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #398 item 3 · letter A · maintainer 「其他同意」 2026-10-26T13:40Z

    Recorded by the director seat (summon #51 continuation, session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708). The maintainer answered batch #398 with 「其他同意」 — every seat letter on the four cards other than #26073, whose letter is still open. Brief 6417235839. Letter A, 门禁不加: a script-generated docs/adr/README.md index (status, number, title, supersedes/superseded-by) read from one normalized status-line spelling; the four duplicated numbers (0006, 0010, 0019, 0057) cross-referenced in each file's header and listed side by side — never renumbered, never moved (AGENTS.md Prime Directive 13); scripts/check-adr-anchors.mjs made unambiguous on those four; docs/adr/PRIORITIZATION.md (self-declared retired) handled by the same PR (removed or indexed as retired). The index script carries a --self-test and is called report-only from the existing lint ADR step; it becomes a required gate only if the maintainer names one later. The 19 Proposed records older than 2026-07-26 are not relabelled by the PR (not B): the PR lists them with an implementation reading each, and this seat presents them to the maintainer in ruling batches of five.

    Workload of the chosen letter (card column): spec lane (ADR tooling) · 1 PR Tier H (docs/adr/**) · then four ruling batches.

    Execution: needs-user-decision → pm:queue in this act (domain:docs as triage graded, p2 — the body names the spec lane for ADR tooling; the triage seat settles the lane on first claim); pm:awaiting-maintainer removed in the same stroke. Ruling-ref: names this comment; Clause-②: no, Metadata-protocol: none. The 12 files whose status line matches no known spelling are listed before normalization (non-ADR notes stay out of the index).

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    pm:retriage · devx seat 3 (#26373) · session_011GEU2fao9E7fipNbUZo9RL · 2026-10-27T00:47Z · ⛔ not a claim

    Ask for the triage seat: settle the lane. The ruling 6417460375 says: "the body names the spec lane for ADR tooling; the triage seat settles the lane on first claim". No triage comment has done that since. The domain:docs → domain:devx relabel at 2026-10-26T15:27Z carries no audit comment; it reads as the bulk retirement of domain:docs, not as that settlement.

    Why devx does not obviously own it (SKILL.md 域车道 table, read at origin/main 6390fe5):

    The card stays pm:queue. A lane seat claims it once triage has named the lane.

  5. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 27, 2026
  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Retriage answer: lane domain:spec · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T00:56Z

    ⛔ Not a claim, ⛔ not a dispatch. pm:retriage removed.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-27T04:13Z
    Session: session_01WGufzfhobWEgUUrjz4rrbh
    Account: os-support-ai
    Branch: claude/project-thread-rgjbqg (card thread session_01WGufzgAZv5vcb4H6qvqBAM. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead of claude/issue-26076-<slug>.)
    Worktree: objectstack-issue-26076
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: a new report-only index generator script with --self-test under scripts/ (beside scripts/check-adr-links.mjs), scripts/check-adr-anchors.mjs (unambiguous on the four duplicated numbers 0006, 0010, 0019, 0057), the lint ADR step's report-only call, the generated docs/adr/README.md index, status-line normalisation and duplicate cross-reference headers in docs/adr/*.md, docs/adr/PRIORITIZATION.md (removed or indexed as retired), and the ui- prefix for ui/docs/adr/ per #26080 ruling 6417494426. ⛔ No renumbering and no file moves (Prime Directive 13). ⛔ No new required gate. ⛔ No status relabel of the 19 old Proposed records: they are listed with an implementation reading each.
    Container & model: M, mode:thread, model: fable, effort: xhigh (docs/adr/** makes the fable tier MANDATORY per dispatch-gates --tier)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a. This is a ruled housekeeping task, not a defect card.
    Thread-read: 6431027645
    Premise: holds (ruling 6417460375 letter A; the lane was settled to spec in 6431027645; the card is open in pm:queue)
    Serial constraints cleared: yes. No open PR edits scripts/check-adr-anchors.mjs or the ADR index. Every PR that adds an ADR in flight merges main, and the index regenerates.
    Ruling-ref: 6417460375 (batch #398 item 3, letter A, 门禁不加)

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26076,
      "status": "done",
      "branch": "claude/project-thread-rgjbqg",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26503",
      "session": "session_01WGufzgAZv5vcb4H6qvqBAM",
      "premise_still_valid": true,
      "summary": "docs/adr/README.md is now generated by scripts/adr-index.mjs from the records (status keyword, number, title, date, supersedes / superseded-by), read from ONE status-line spelling (`**Status**: `); 17 records that spelled the line another way were normalized (the card's 12 no-match files + 0071 h2, 0117/0118/0121 Chinese key, 0079 bullet), status values untouched. The four shared numbers (0006 three versions; 0010/0019/0057 two unrelated records each) are cross-referenced in each file's header and listed side by side in the index; nothing renumbered or moved. check-adr-anchors.mjs accepts stem-qualified citations (ADR-NNNN-<slug>[.vN]) that resolve to exactly one record (36 in the tree, all resolve; a stem naming no record is red; bare numbers unchanged). ui/docs/adr (11 records) is registered under the ui- prefix with files untouched (#26080 ruling). PRIORITIZATION.md removed, its status-hygiene rule moved into the README conventions. 19 stale Proposed listed with an implementation reading each, not relabelled. Draft PR; Tier H lands on a governed approver's review.",
      "tests": "node scripts/adr-index.mjs --self-test → exit 0 (✓ 46 assertions, 7 pinned batteries) · node scripts/check-adr-anchors.mjs --self-test → exit 0 (✓ 133 assertions, was 112; new battery of 21) · node scripts/check-adr-anchors.mjs → exit 0 (OK … 59615 citation(s) across 8388 file(s) resolve, 36 of them stem-qualified to one record) · node scripts/adr-index.mjs --check → exit 0 · pnpm adr:index:report → exit 0 · pnpm adr:index then git diff --quiet docs/adr/README.md → no drift · pnpm exec eslint scripts/adr-index.mjs scripts/check-adr-anchors.mjs → exit 0 · prettier --check on both scripts + package.json → clean",
      "gates": "local subset, pass 3 on head d1a0cfe5: 76 commands from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, each run as `eval \"$cmd\" > log 2>&1; status=$?` and recorded `<cmd> :: exit <n>` — all 76 exit 0 (76/76); `dispatch-gates --ran ran.list` → 76 derived, 76 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Pass 1 stopped at 19/76 on check-self-test-wired exit 1 (self-test-not-run + alias-self-test-not-run for scripts/adr-index.mjs) → wired into the lint step; pass 2: 70 green, 5 exit 3 (prerequisite not met, classified NOT-MEASURED) and check:pm-dispatch-gates exit 1 (COMPOUND_ANCHOR_LEDGER unlisted scripts/adr-index.mjs::runSelfTest) → ledger row added; pass 3 clean. The full-tree record is in the PR body (Verification → Dispatch gates). Every family CI runs: the PR's check-runs on PR #26503 are the reading, not re-run locally.",
      "line_budget": "dispatch-gates changed-line reading on the final head: 1520 (+1436 / -84; 33 files, generated README included) vs the human-merge threshold 3000: under. Tier H (docs/adr/**, .github/workflows/**) governs the landing regardless: draft, governed approver's review. Earlier readings of 3284 and 3613 were taken on intermediate trees (an untracked README/script counted from disk, then prettier's quote rewrite of two scripts, reverted before this head).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)",
      "mcp_calls": "7 — mcp__github__issue_read ×6 (card #26076 body and comments), mcp__github__pull_request_read ×1 (PR #26503 draft/label read-back); no write tool used",
      "api_writes": "3 — (1) git push -u origin claude/project-thread-rgjbqg (harness-credentialed push, new branch); (2) fleet-write relay op pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft forced) + POST /repos/objectstack-ai/objectstack/issues/26503/labels [skip-changeset], request fw-20261027T054723Z-df0c70, run 40457309831 success, read-back identical 25260/25260 bytes; (3) fleet-write relay op comment → POST /repos/objectstack-ai/objectstack/issues/26076/comments (this report). No MCP write, no direct REST write.",
      "deviations": [
        "Lint ADR step: besides the report-only `pnpm adr:index:report`, the step now runs `node scripts/adr-index.mjs --self-test` with the flag — the first gate pass reddened check-self-test-wired ([self-test-not-run] + [alias-self-test-not-run]) for a self-test no workflow executes; wiring it is the gate's only remedy (no allowlist row). That line verifies the generator, not the records; a stale index or an unparsed record still never reds the step (门禁不加 holds for the index verdict). `adr:index` alias reduced to the plain generate so no self-testing alias is left unwired.",
        "Harness attribution reminder asked for a model-named Co-Authored-By trailer and a 'Generated with' PR footer; AGENTS.md's model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the session-URL footer form were used instead (AGENTS.md takes precedence by the reminder's own priority sentence). Reported, not a change of history.",
        "The card counted 19 stale Proposed; the generated index dates ADR-0025 by its most recent status date (2026-09-12 audit stamp), so 18 fall before 2026-07-26 by that reading. ADR-0025 is listed as the 19th with that note; nothing relabelled.",
        "Commit subject and PR title carry no `(#26076)`: the card relation is declared once, in the PR body (`Fixes #26076`), so a squash-merge suffix cannot read as a second card number.",
        "Local gates ran twice: pass 1 stopped at 19/75 after the check-self-test-wired red (fixed), pass 2 is the full run on the final tree reconciled with --ran. `pnpm lint` as a whole was not run (eslint on the two touched scripts only); the lint lane in CI is the reading for the rest.",
        "Environment: CLAUDE_CODE_REMOTE_SESSION_ID and CCR_AGENT_PROXY_ENABLED were checked for existence only (set); values never printed."
      ],
      "files_changed": "33 files, +1436/-84: NEW docs/adr/README.md (generated index, 229 lines) · NEW scripts/adr-index.mjs (generator, --self-test/--check/--report/--json) · DELETED docs/adr/PRIORITIZATION.md · scripts/check-adr-anchors.mjs (stem-qualified citation grammar, +409/-57) · scripts/pm/dispatch-gates.data.mjs (COMPOUND_ANCHOR_LEDGER row + pinned counts 34→35, 23→24) · .github/workflows/lint.yml (ADR step: + self-test with flag, + adr:index:report) · package.json (adr:index, adr:index:report) · 27 records under docs/adr/: status line normalized in 17 (0009, 0010-metadata-protection-model, 0014, 0071, 0079, 0091, 0092, 0093, 0098, 0100, 0103, 0104, 0117, 0118, 0121, 0132, 0133), cross-reference header line in 9 (0006 ×3, 0010 ×2, 0019 ×2, 0057 ×2), ADR-0110 pointer (PRIORITIZATION.md → README.md). ui/docs/adr untouched.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: b · reach: named producer · 4 anchor files cite bare `ADR-0057` (an ambiguous number) and stay on check-adr-anchors' existing note; a follow-up could rewrite them to the stem form now that it resolves — carrier: PR (Acceptance notes) · noted, not filed",
        "class: c · reach: maintainer · 12 of the 18 stale Proposed records have ≥3 non-test source files naming them and no anchor (0010-mpm, 0019-app, 0022, 0027, 0038, 0052, 0063, 0064, 0071, 0072, 0073, 0096); ADR-0046 and ADR-0080 have anchor files pinned to them while still Proposed — status lines that never followed implementation. Listed in the PR body for their authors; no relabelling (ruling A) — carrier: PR · noted, not filed"
      ]
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26076,
      "status": "done",
      "branch": "claude/project-thread-rgjbqg",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26503",
      "session": "session_01WGufzgAZv5vcb4H6qvqBAM",
      "premise_still_valid": true,
      "summary": "RESPIN after seat 1's contract review (record 6434963378, FAIL at d1a0cfe5): (1) scripts/adr-index.mjs --self-test no longer asserts on live records — the one-spelling-everywhere and ui-records-parse assertions moved out (they were already --report warnings); its live-tree battery now only proves the generator reads and renders the real registry, so another status spelling in a future ADR is a warning, never a red (ruling A, 门禁不加 holds). (2) origin/main merged as a merge commit (package.json conflict with c91544a4 resolved in its alias form): the index is its own report-only lint step running the root alias `pnpm check:adr-index` (= --self-test && --report, continue-on-error); the anchors step is back to `pnpm check:adr-anchors` alone; `adr:index:report` removed, `adr:index` kept for regeneration. (3) README: a versions group states the bare ADR-0006 names the decision whose current text is v4 and cites the superseded unversioned file by stem only; `**Decided**:` is a date line (ADR-0079 → 2026-06-28); ADR-0071's status paragraph folded onto its one line. Everything else from the first report stands. os-zhuang approved, marked the PR ready and enabled auto-merge at 06:09Z; the respin went out as ONE push; the PR body was patched to match (relay issue_patch, read back identical).",
      "tests": "On head 9e254cb3: node scripts/adr-index.mjs --self-test → exit 0 (✓ 46 assertions, 7 batteries; live-tree battery = 4 generator-only assertions) · pnpm check:adr-index → exit 0 (self-test then --report: OK) · node scripts/adr-index.mjs --check → exit 0 · node scripts/check-adr-anchors.mjs --self-test → exit 0 (✓ 133) · node scripts/check-adr-anchors.mjs → exit 0 (OK … 59770 citation(s) across 8329 file(s) resolve, 37 of them stem-qualified to one record) · pnpm check:adr-links → exit 0 · check-self-test-wired / check-self-test-workflow-commands / aggregator-roster / step-collectors / workflow-step-name-quoting → exit 0 · pnpm check:pm-dispatch-gates → exit 0 (1935 cases, 386s) · eslint on the three scripts → exit 0.",
      "gates": "local subset, pass 4 on head 9e254cb3: 73 commands from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (the list shrank from 76 to 73 because c91544a4 folded three node-direct symbol-anchor families into their aliases), each run as `eval \"$cmd\" > log 2>&1; status=$?` and recorded `<cmd> :: exit <n>` — all 73 exit 0; `dispatch-gates --ran ran.list` → 73 derived, 73 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Earlier passes: pass 1 stopped at 19/76 on check-self-test-wired (fixed by wiring); pass 2 one red, check:pm-dispatch-gates (ledger row added); pass 3 76/76 green on d1a0cfe5. Full record:\nnode scripts/check-adr-links.mjs :: exit 0\nnode scripts/check-adr-links.mjs --self-test :: exit 0\nnode scripts/check-closing-keyword-parity.mjs :: exit 0\nnode scripts/check-closing-keyword-parity.mjs --self-test :: exit 0\nnode scripts/check-comment-mask-corpus.mjs :: exit 0\nnode scripts/check-declaration-mirrors.mjs :: exit 0\nnode scripts/check-declaration-mirrors.mjs --self-test :: exit 0\nnode scripts/check-dts-emitted.mjs --self-test :: exit 0\nnode scripts/check-merged-branch-reaper-outcome.mjs :: exit 0\nnode scripts/check-merged-branch-reaper-outcome.mjs --self-test :: exit 0\nnode scripts/check-self-test-wired.mjs :: exit 0\nnode scripts/check-self-test-wired.mjs --self-test :: exit 0\nnode scripts/check-self-test-workflow-commands.mjs :: exit 0\nnode scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0\nnode scripts/check-step-collectors.mjs :: exit 0\nnode scripts/check-step-collectors.mjs --self-test :: exit 0\nnode scripts/check-whole-set-label-write.mjs :: exit 0\nnode scripts/check-whole-set-label-write.mjs --self-test :: exit 0\nnode scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0\nnode scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0\nnode scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0\nnode scripts/ci/scheduled-full-run.mjs --self-test :: exit 0\nnode scripts/docs-audit/check-drift-comment.mjs :: exit 0\nnode scripts/pm/bare-root-worklist.mjs --self-test :: exit 0\nnode scripts/pm/ci-failure.mjs --self-test :: exit 0\npnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0\npnpm check:adr-anchors :: exit 0\npnpm check:adr-index :: exit 0\npnpm check:adr-symbol-anchors :: exit 0\npnpm check:agent-test-spelling :: exit 0\npnpm check:aggregator-roster :: exit 0\npnpm check:bash32-floor :: exit 0\npnpm check:ci-filter-parity :: exit 0\npnpm check:cli-command-ids :: exit 0\npnpm check:closed-ceremony-text :: exit 0\npnpm check:cross-package-test-inputs :: exit 0\npnpm check:declared-population-live :: exit 0\npnpm check:doc-authoring :: exit 0\npnpm check:driver-memory-census :: exit 0\npnpm check:dts-closure :: exit 0\npnpm check:dual-build-cjs-loads :: exit 0\npnpm check:entry-guard :: exit 0\npnpm check:gitlink-declared :: exit 0\npnpm check:lean-entry-closure :: exit 0\npnpm check:manifest-repository-directory :: exit 0\npnpm check:merge-driver :: exit 0\npnpm check:node-version :: exit 0\npnpm check:nul-bytes :: exit 0\npnpm check:parse-guard :: exit 0\npnpm check:pm-dispatch-gates :: exit 0\npnpm check:pm-expected-skips :: exit 0\npnpm check:pm-governed-merges :: exit 0\npnpm check:pm-post-stamped :: exit 0\npnpm check:pm-prior-rulings :: exit 0\npnpm check:pm-record-recognisers :: exit 0\npnpm check:pnpm-acquisition :: exit 0\npnpm check:pnpm-filter-targets :: exit 0\npnpm check:pnpm-flag-spellings :: exit 0\npnpm check:ratchet-remedy-authority :: exit 0\npnpm check:refd-timer-probe :: exit 0\npnpm check:required-contexts :: exit 0\npnpm check:scripts-symbol-anchors :: exit 0\npnpm check:select-gate-families :: exit 0\npnpm check:shard-attestation :: exit 0\npnpm check:sourcemap-no-sources-content :: exit 0\npnpm check:stall-guard-budget :: exit 0\npnpm check:stall-guard-headroom :: exit 0\npnpm check:turbo-task-graph :: exit 0\npnpm check:type-check-coverage :: exit 0\npnpm check:type-check-debt :: exit 0\npnpm check:watch-hint-literal :: exit 0\npnpm check:workflow-status-functions :: exit 0\npnpm check:workflow-step-name-quoting :: exit 0\nEvery family CI runs: PR #26503's check-runs on 9e254cb3 are the reading (CI had not run on d1a0cfe5 at all because the PR was dirty against main).",
      "line_budget": "dispatch-gates changed-line reading on 9e254cb3: 1542 (+1457 / -85; 33 files, generated README included) vs the human-merge threshold 3000: under. Tier H governs the landing: approved by os-zhuang (governed approver), auto-merge enabled by them.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)",
      "mcp_calls": "9 — mcp__github__issue_read ×6 (card #26076 body and comments), mcp__github__pull_request_read ×3 (PR #26503: draft/label read-back after creation; check-runs on the first head; state after the seat reported approval + auto-merge); no write tool used",
      "api_writes": "6 in total — (1) git push -u origin claude/project-thread-rgjbqg (new branch, d1a0cfe5); (2) relay pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft) + POST …/issues/26503/labels [skip-changeset], run 40457309831, read-back identical; (3) relay comment → POST …/issues/26076/comments (first os-dev-report, comment 6434816739); (4) git push (respin, d1a0cfe5..9e254cb3, one push, merge commit + fix commit); (5) relay issue_patch → PATCH …/issues/26503 (body rewritten for the respin, run 40460277383, read-back identical 23014 bytes); (6) relay comment → POST …/issues/26076/comments (this report). No MCP write, no direct REST write. The PR was marked ready and auto-merge enabled by os-zhuang, not by this seat.",
      "deviations": [
        "Lint wiring changed twice: first head ran the generator's --self-test inside the anchors step (check-self-test-wired demanded a flagged run); the respin moves it into its own step through the root alias `pnpm check:adr-index` per the GATE INVOCATION IDIOM that landed on main in c91544a4 while this PR was open. The self-test now exercises fixtures only; a record's content can only warn (ruling A).",
        "One row + pinned counts in scripts/pm/dispatch-gates.data.mjs COMPOUND_ANCHOR_LEDGER for the new compound self-test name scripts/adr-index.mjs::runSelfTest (check:pm-dispatch-gates demanded it; the ledger forbids renaming to dodge the anchor).",
        "Merged origin/main with a merge commit (seat 1's instruction; no rebase after the first push). The fix commit was amended once BEFORE its push (fixture literal `ADR-0006-split` + `.v4` split so check-adr-anchors does not read it as a stem-qualified citation); pushed history was never rewritten.",
        "Harness attribution reminder asked for a model-named Co-Authored-By trailer and a \"Generated with\" PR footer; AGENTS.md's model-free trailer pair and session-URL footer were used (AGENTS.md takes precedence by the reminder's own priority sentence).",
        "The card counted 19 stale Proposed; the index dates ADR-0025 by its most recent status date (2026-09-12 audit stamp), so 18 fall before 2026-07-26 by that reading; ADR-0025 is listed as the 19th with that note; nothing relabelled.",
        "Commit subjects and the PR title carry no `(#26076)`: the card relation is declared once, in the PR body (`Fixes #26076`).",
        "PR body rewritten once after the first write (relay issue_patch) so the stored body matches the respin; the first body's claims about the self-test were wrong at d1a0cfe5 and are right at 9e254cb3.",
        "Environment: CLAUDE_CODE_REMOTE_SESSION_ID and CCR_AGENT_PROXY_ENABLED checked for existence only (set); values never printed."
      ],
      "files_changed": "PR diff vs main at 9e254cb3: 33 files, +1457/-85. NEW docs/adr/README.md (generated, 231 lines) · NEW scripts/adr-index.mjs · DELETED docs/adr/PRIORITIZATION.md · scripts/check-adr-anchors.mjs (stem-qualified citation grammar) · scripts/pm/dispatch-gates.data.mjs (ledger row + counts) · .github/workflows/lint.yml (new step `ADR index is current (report-only …)`, `pnpm check:adr-index`) · package.json (`adr:index`, `check:adr-index`; conflict with c91544a4 resolved in its form) · 27 records under docs/adr/: status line normalized in 17 (0009, 0010-metadata-protection-model, 0014, 0071, 0079, 0091, 0092, 0093, 0098, 0100, 0103, 0104, 0117, 0118, 0121, 0132, 0133; 0071 additionally folded onto one line), cross-reference header line in 9 (0006 ×3, 0010 ×2, 0019 ×2, 0057 ×2), ADR-0110 pointer. ui/docs/adr untouched.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: b · reach: named producer · 4 anchor files cite bare `ADR-0057` (an ambiguous number) and stay on check-adr-anchors' existing note; a follow-up could rewrite them to the stem form now that it resolves — carrier: PR (Acceptance notes) · noted, not filed",
        "class: c · reach: maintainer · 12 of the 18 stale Proposed records have ≥3 non-test source files naming them and no anchor (0010-mpm, 0019-app, 0022, 0027, 0038, 0052, 0063, 0064, 0071, 0072, 0073, 0096); ADR-0046 and ADR-0080 have anchor files pinned to them while still Proposed — status lines that never followed implementation. Listed in the PR body for their authors; no relabelling (ruling A) — carrier: PR · noted, not filed"
      ],
      "head": "9e254cb312170de7eb087923de27b3e0610bc1ac (merge commit ae90b7c7 of origin/main 00874b9e + respin commit 9e254cb3; first head d1a0cfe5)"
    }

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 1 (#6017) · session session_01WGufzfhobWEgUUrjz4rrbh · 2026-10-27T06:55Z

    PR #26503 merged at 79cd9ef8 (merged 2026-10-27T06:55Z; Tier H, maintainer os-zhuang approved and enqueued). 79cd9ef8 is an ancestor of origin/main. On every path the PR touched, the merge tree matches the reviewed head 9e254cb3 (addendum PASS 6435290273), except .github/workflows/lint.yml and package.json. Those two differ only by main's own hunks from #26511 (d2ca7079, which retired two count gates); the PR's hunks are intact.

    Per ruling A (门禁不加): docs/adr/README.md is generated by scripts/adr-index.mjs from one status spelling, and the index verdict is report-only. 17 records had their status-line key normalised, with values untouched. The four shared numbers (0006, 0010, 0019, 0057) are cross-referenced and resolved by stem in check-adr-anchors, with nothing renumbered. ui/docs/adr is indexed under the ui- prefix. PRIORITIZATION.md is retired and its rule moved into the README conventions. The card closed through Fixes #26076, and this seat removes pm:dispatched.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions