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
AGENTS.md Prime Directive #13 把「按编号找到决策」定为硬要求:「在改动 docs/adr/ 治理的行为前,grep the ADRs for the surface you are touching」,以及*「当你实现某个 ADR 的决策时,leave its id in the code」*。这两条都以「编号 ⇒ 唯一决策」为前提,而上面三个编号不满足它。
scripts/adr-anchors.json 的锚点条目按裸字符串记录,例如 { "file": "packages/objectql/src/lifecycle/lifecycle-service.ts", "adrs": ["ADR-0057"], … }。
这个文件存在的目的正是告诉下一位作者「你正站在哪个决策上」(PD [WIP] Add Chinese version of the documentation #13 原话:a decision nobody can find is a decision that will be reversed),而它给出的 id 恰好指向两个决策。
Ruling (maintainer, 2026-08-07): C first, B to finish. A is rejected.
C (uniqueness assertion in check:adr-anchors, with the three existing collisions on an explicit allowlist) lands immediately: it stops new collisions and is the shared prerequisite of every other route, so it is un-regrettable. B (slug-qualified references for the three existing pairs) follows and can be amortised as those files are touched. The broken ./0010-metadata-protection.md link is fixed regardless of route.
A (renumbering the later ADR of each pair with tombstones) is rejected: 296+ bare references would have to migrate, and it would set the precedent that an accepted ADR's number can move — a bigger cost than the navigation tax it removes.
This is pure agent-navigation debt with no user path, but it is paid daily: PD #13 assumes number ⇒ unique decision, and an agent grepping ADR-0057 today gets two unrelated accepted decisions with no way to tell them apart. A gate remembers that; a person doesn't.
Operator: PM session session_01GcjbQLUQKysMU9uXB34iyv; maintainer ruling 2026-08-07 (decision-inbox round 2). Veto window open — comment or reopen to overturn.
Claim: PM loop round 1 (devx seat, new tenure)
Session: session_01F8q5J1MQyocgtNspb15fSn
Branch: claude/issue-5992-adr-number-uniqueness
Worktree: objectstack-issue-5992
Domain: domain:devx
File surface: scripts/check-adr-anchors.mjs, docs/adr/0057-erp-authorization-core-business-units-and-scope-depth.md, plus a changeset. scripts/adr-anchors.json only if the allowlist lands there.
Container: S — mode:subagent, shared container.
Serial constraints cleared: scripts/check-adr-anchors.mjs last touched by 82bf47b (#6471, merged); scripts/adr-anchors.json by 94e749b (#6516, merged). No open in-lane claim on either. Dispatched scope is route C only per the maintainer ruling below.
Dispatching on the maintainer ruling of 2026-08-07 in this thread: C first (uniqueness assertion + explicit allowlist of the three existing collisions), B to finish, A rejected. The dev implements C and does not re-open the route choice.
⚠️Correction to this card, measured at origin/maina36db28. The body says the broken ./0010-metadata-protection.md link is in 0057-system-data-lifecycle-and-retention.md, and the triage comment repeats that attribution. It is actually in 0057-erp-authorization-core-business-units-and-scope-depth.md:5:
0057-system-data-lifecycle-and-retention.md contains no 0010 reference at all. Both sources agree because the second inherited the first's reading — agreement between them is not corroboration. The dev verifies the location itself before editing.
What shipped, route C exactly as ruled: check:adr-anchors now audits number uniqueness over docs/adr/ — a fourth collision goes red with a message that computes the next free number; the three existing pairs (0010/0019/0057) sit on a shrink-only allowlist whose stale entries also go red, so a resolved collision cannot return under its own grandfather clause. A third record joining an allowlisted pair is a distinct failure. Route B untouched, nothing renumbered, all 328 bare references untouched — the ruling's boundaries held.
Review notes:
0006 is handled structurally (same stem + .vN = version, different stem = collision), not special-cased by name — pinned by self-test cases in both directions, including .vN-on-a-different-stem laundering.
Red path proven three ways: a real probe collision in the working tree (red, then green after removal), allowlist ablation against the live tree (predicted red, observed red — the entries are load-bearing), and a permanent --self-test with named assertions and a guarded body wired into the pnpm script, so CI exercises the red path on every PR.
The gate's own inventory blind spot closed: unparseable filenames under docs/adr/ are now errors (with NON_RECORD_FILES for declared non-records) instead of being silently invisible.
Broken link fixed at the corrected location (0057-erp-authorization…md:5) — the dev independently confirmed the card + triage comment shared a wrong attribution, and additionally measured that the issue body's "已接受" description holds only for the 0057 pair (recorded, behaviour-neutral).
Ready + auto-merge armed 06:17Z. Route B remains open on this issue per the ruling ("B to finish, amortised as those files are touched") — the gate's success-path note prints the 4 ambiguous anchor refs, keeping that debt visible.
Activity
claude commentedon Aug 6, 2026
发现分诊:转维护者决策箱 —— 摘
finding,改needs-user-decision+domain:devx(并摘掉无消费方的repo:objectstack)判级 — 不晋级入队,升决策箱。缺陷本身已复核成立,但三条处置路线的分歧点是治理取舍,不是实现细节:
ADR-0057引用,重编号意味着一次全仓引用迁移,且「已发布的决策编号可以改」本身就是一条需要维护者认可的先例;ADR-0057-lifecycle)+ 门禁校验唯一性 —— 动的是引用惯例(AGENTS.md PD [WIP] Add Chinese version of the documentation #13 的原文措辞要跟着改),存量 328 处逐步消歧;三条的代价落在不同的人身上(A 落在一次性迁移,B 落在此后每一次引用,C 落在此后每一个读者),这类取舍归维护者。
域 —
docs/adr/(编号现状)+scripts/adr-anchors.json+pnpm check:adr-anchors(门禁)⇒domain:devx(域表:scripts/门禁类)。过时前提检查(
origin/main44106d9)—— 三处冲突逐一复核命中,git ls-tree docs/adr/输出:立单人对
0006的排除(同一决策的.v2/.v4版本,不算冲突)也复核采信。PM 倾向(供参考,维护者可直接否决) — C 先行,B 收尾:唯一性断言是那条止血且各方向都要的公共前置(本仓反复付费的「declared ≠ enforced」形状 —— PD #13 声明了「编号可定位决策」却无门校验),可以先单独落地而不锁死后续路线;A 的全仓 328 处迁移在没有独立拉力时性价比最低。⚠️ 若裁 A,建议同时明确「已接受 ADR 可否重编号」的一般规则,否则下次同样的问题还要再裁一次。
顺带一处断链(与主裁决可脱钩,任何路线下都该修):
0057-system-data-lifecycle-and-retention.md头部的[ADR-0010](./0010-metadata-protection.md)指向不存在的文件(实际是0010-metadata-protection-model.md)—— 而0010恰是冲突编号之一。标签清理说明 — 摘掉
repo:objectstack:主 backlog 仓的 issue 不需要回指本仓的路由标签(repo:*只用于把落点路由到姊妹仓),该标签无任何查询消费,留着会被后续 sweep 反复当作路由信息读。同型清理前例:#5535。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
claude commentedon Aug 7, 2026
Ruling (maintainer, 2026-08-07): C first, B to finish. A is rejected.
C (uniqueness assertion in
check:adr-anchors, with the three existing collisions on an explicit allowlist) lands immediately: it stops new collisions and is the shared prerequisite of every other route, so it is un-regrettable. B (slug-qualified references for the three existing pairs) follows and can be amortised as those files are touched. The broken./0010-metadata-protection.mdlink is fixed regardless of route.A (renumbering the later ADR of each pair with tombstones) is rejected: 296+ bare references would have to migrate, and it would set the precedent that an accepted ADR's number can move — a bigger cost than the navigation tax it removes.
This is pure agent-navigation debt with no user path, but it is paid daily: PD #13 assumes number ⇒ unique decision, and an agent grepping
ADR-0057today gets two unrelated accepted decisions with no way to tell them apart. A gate remembers that; a person doesn't.Operator: PM session
session_01GcjbQLUQKysMU9uXB34iyv; maintainer ruling 2026-08-07 (decision-inbox round 2). Veto window open — comment or reopen to overturn.Generated by Claude Code
os-project-manager commentedon Aug 8, 2026
Claim: PM loop round 1 (devx seat, new tenure)
Session:
session_01F8q5J1MQyocgtNspb15fSnBranch:
claude/issue-5992-adr-number-uniquenessWorktree:
objectstack-issue-5992Domain:
domain:devxFile surface:
scripts/check-adr-anchors.mjs,docs/adr/0057-erp-authorization-core-business-units-and-scope-depth.md, plus a changeset.scripts/adr-anchors.jsononly if the allowlist lands there.Container: S —
mode:subagent, shared container.Serial constraints cleared:
scripts/check-adr-anchors.mjslast touched by82bf47b(#6471, merged);scripts/adr-anchors.jsonby94e749b(#6516, merged). No open in-lane claim on either. Dispatched scope is route C only per the maintainer ruling below.Dispatching on the maintainer ruling of 2026-08-07 in this thread: C first (uniqueness assertion + explicit allowlist of the three existing collisions), B to finish, A rejected. The dev implements C and does not re-open the route choice.
origin/maina36db28. The body says the broken./0010-metadata-protection.mdlink is in0057-system-data-lifecycle-and-retention.md, and the triage comment repeats that attribution. It is actually in0057-erp-authorization-core-business-units-and-scope-depth.md:5:0057-system-data-lifecycle-and-retention.mdcontains no0010reference at all. Both sources agree because the second inherited the first's reading — agreement between them is not corroboration. The dev verifies the location itself before editing.Generated by Claude Code
os-project-manager commentedon Aug 8, 2026
ACCEPT — PR #6593 (devx seat review, round 1).
What shipped, route C exactly as ruled:
check:adr-anchorsnow audits number uniqueness overdocs/adr/— a fourth collision goes red with a message that computes the next free number; the three existing pairs (0010/0019/0057) sit on a shrink-only allowlist whose stale entries also go red, so a resolved collision cannot return under its own grandfather clause. A third record joining an allowlisted pair is a distinct failure. Route B untouched, nothing renumbered, all 328 bare references untouched — the ruling's boundaries held.Review notes:
0006is handled structurally (same stem +.vN= version, different stem = collision), not special-cased by name — pinned by self-test cases in both directions, including.vN-on-a-different-stem laundering.--self-testwith named assertions and a guarded body wired into the pnpm script, so CI exercises the red path on every PR.docs/adr/are now errors (withNON_RECORD_FILESfor declared non-records) instead of being silently invisible.0057-erp-authorization…md:5) — the dev independently confirmed the card + triage comment shared a wrong attribution, and additionally measured that the issue body's "已接受" description holds only for the 0057 pair (recorded, behaviour-neutral).lint.yml:186, ESLint job, required set since 红的 ESLint job 没有拦住合并:PR #5584 在 ESLint 已红 19 分钟的情况下过队合入 —— main 的 required-status-check 集需要维护者核查 #5617.docs/adr/is outside theCheck Linksscan surface — ADR cross-links are unverified, and the obvious widening goes red on ADR-0046's illustrative links #6592 (docs/adr/outside theCheck Linksscan surface, with the measured reason a naive widening goes red) — verified it exists.skip-changesetjustified: private script + wiring + one docs link, nothing published.Ready + auto-merge armed 06:17Z. Route B remains open on this issue per the ruling ("B to finish, amortised as those files are touched") — the gate's success-path note prints the 4 ambiguous anchor refs, keeping that debt visible.
Generated by Claude Code
fix(devx): teach `check:adr-anchors` that a tombstone is not a decisi…
docs(spec): cite the cloud decision as `cloud ADR-0025`, not a bare n…