docs(adr): ADR-0128 Status is Accepted — the maintainer's reply of 2026-09-07 is the acceptance act (ruling A, third record) - #16647
Conversation
…26-09-07 is the acceptance act Ruling A on this card's last outstanding record, recorded by the director seat 2026-09-07 (comment 5572010837, decision batch #1 of summon #17, maintainer's verbatim reply 「同意」): the Status line becomes Accepted (2026-09-07) — accepted by the maintainer's reply of 2026-09-07 (objectstack#15453, decision batch #1 of director summon #17) Dated to the ruling, not to the 2026-08-28 landing: that landing PR (#12839, commit bbf88be) was merged by the seat account os-sales, and the earlier ruling A of 2026-09-05 (5548576472) explicitly does not cover a seat merge — so "the merge that landed it on main" is NOT the acceptance clause here, and the sibling records' (ADR-0130, ADR-0131) merge clause is deliberately absent. The whole Status field is replaced, not only its state sentence, following the ADR-0130 (#15704) and ADR-0131 (#16590) flights: the field carries the state and the act and nothing else. The tail this drops is flagged in the PR body as a judgment call a reviewer can reject. Claude-Session: https://claude.ai/code/session_018dxq7YqsLDMeZDZ5AzsgJX Co-authored-by: Claude <noreply@anthropic.com>
|
ACCEPT — flight K, PR #16647 at head Own readings (review worktree detached at
Review checklist:
Implemented-by: os-dev subagent 维护者速读改了什么: 一份 ADR( 为什么改: 这是本卡三条状态行里的最后一条。ADR-0130、ADR-0131 靠「落到 main 的那次合并即接受」写好了;ADR-0128 那次合并是席位账号 os-sales 执行的,9-05 的裁决明说不算,所以搁到 9-07 你回「同意」补上了接受行为,状态行据此写 9-07 而不是 8-28。 风险与代价(含回滚): 唯一请你过目的点:整段 Status 被换成一行,顺带删掉了三句仍然成立的尾句;其中 2026-08-27 方向裁决的原话「其他同意」在本记录里没有第二份(只剩指向评论 5434987411 的链接),其余两句在第 4、7、8、118–124、130 行都还在。若你要把这句原话留在状态行里,回 B:改成只替换第一句、其余保留,一次 XS 重飞。回滚 = revert 这一行,无代码、无发布面。 席位意见: 席位复核通过,建议 A(照裁决整行替换,与两份姊妹记录同形;那句原话有链接可追)。 你要做的: 认可 A 就直接手动合并本 PR(受管面,⛔ 不走队列、不挂 auto-merge);合并即关卡,ruling A 的三条记录全部执行完毕。A 还是 B? Generated by Claude Code |
Fixes #15453
Ruling A's third and last record. ADR-0130 landed in PR #15704 and ADR-0131 in PR #16590; this one was held back since 2026-09-05 because the earlier ruling's precondition did not hold for it, and the director seat has now recorded the maintainer's acceptance directly.
The ruling being executed
Director seat, summon #17, decision batch #1, comment 5572010837, 2026-09-07T14:22Z. Provenance in that comment: maintainer, live PM chat with the director seat, batch #1 item 4, verbatim and untranslated reply 「同意」. Quoted:
The change — one field on one file
docs/adr/0128-producer-discriminated-aad-for-cryptocontext.md, source line 3, +1 / −1.Before (one source line, 663 bytes — the field is not soft-wrapped here, unlike both sibling records):
After (one line):
Nothing else moved: ADR-0126's
**Original status**:history line untouched, no other record touched,content/docs/releases/**untouched, no changeset (skip-changeset).Why this line does not carry the siblings' merge clause
ADR-0130 and ADR-0131 both end with "accepted by the merge that landed it on
main(…), which is itself the acceptance act for a governed surface (Prime Directive #14)". That clause is deliberately absent here, on the ruling's own words. This record's landing PR #12839 (commitbbf88be85, 2026-08-28) hasmerged_by=os-sales, a seat account. Ruling A of 2026-09-05 (5548576472) says a seat merge is exactly the case it does not cover, which is why this record sat outstanding while its two siblings landed. The 2026-09-07 ruling supplies a different acceptance act — the maintainer's reply — and dates the line to it. Somerged_byis not re-run here as a gate: it is the reason the clause and the date differ, and it is recorded rather than tested.The 2026-08-28 seat merge itself is recorded by the ruling as a governed-merge audit row for the maintainer's recognition list, not as a new finding card, so nothing is filed from this PR.
Judgment calls — a reviewer can reject either
1. The whole field is replaced, so three still-true trailing sentences are dropped. The two precedent flights each dropped a trailing sentence with the field, and in both cases that sentence had become false on acceptance (「Nothing below is settled until this record merges」). That is not true here: all three of this field's trailing sentences remain true. What is dropped, and where each survives:
**Deciders**, line 8**Surfaced by**(which links the ruling comment 5434987411 directly), line 130 References**Consumers** (at implementation time; none today)The middle row is the real cost, and it is the reason this is flagged rather than assumed: a verbatim maintainer quotation leaves the record. The case for dropping it anyway is the precedent's stated principle — the Status field carries the state and the act, and nothing else — plus the fact that the ruled replacement text is complete on its own and the ruling instructs no appendix. If a reviewer prefers the quotation kept, the minimal alternative is to replace only the first sentence and leave the rest of the field standing; say so and it will be re-flown.
2. No terminal period. The ruled text is quoted in the ruling as ending at
). Both sibling lines end with.. This PR keeps the ruled bytes exactly, no period added. Purely a punctuation call.3.
objectstack#15453is kept as ruled — the cross-repo spelling rather than a bare#15453or a full link. It is the ruling's own byte, andcheck:adr-links/check:adr-anchors/check:adr-symbol-anchorsall pass over it.Mechanism assumptions, as measured
Proposed (2026-08-28) — awaiting the maintainer's hand-merge…, may be soft-wrapped**Deciders**.git log origin/main -- docs/adr/0128-*shows the landingbbf88be85and no later Status change--shallow-since=2026-08-25(1905 commits), after which the path's log is exactly one commit:bbf88be85 2026-08-28.git diff bbf88be85 origin/mainscoped to that one path is empty, so the file is byte-identical to its landing state and no Status change ever followed. Ancestrygit merge-base --is-ancestor bbf88be85 origin/mainexits 0 (a positive reading, self-proving); control lega7c14cdf3also exits 0.git ls-remote --heads origin= 1059 heads, zero naming0128or15453. Open-PR searchis:pr is:open 0128 in:title= 0 results, with a control leg on the same channel: the same query withoutis:openreturns PR #12839, so the empty result is a reading and not a broken channel. The dispatch's own open-PR list at 14:5xZ agrees (none of the 14 open PRs is ondocs/adr/**).merged_byis not a preconditionmerged_byisos-sales, recorded above with why it no longer decides this line.Gates — 17 derived, 17 run, 0 NOT MEASURED
Derived from the real change set, never a hand list:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, stderr: "gate list derived from the tree of 'objectstack-ai/objectstack' at commit 8bf8a03", "change set derived from git — 1 path(s) vs merge base 4d72868 of 'origin/main' and HEAD (three-dot semantics)". Reconciled with--ran: "✓ dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED." Every exit captured by redirect-then-capture, before any pipe. All atHEAD=8bf8a032e, the final commit.node scripts/check-adr-links.mjsnode scripts/check-adr-links.mjs --self-testnode scripts/check-adr-symbol-anchors.mjsnode scripts/check-adr-symbol-anchors.mjs --self-testnode scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:adr-anchorspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:refd-timer-probepnpm check:watch-hint-literalRow 9's first exit 3 was
PREREQUISITE NOT MET(@objectstack/formulaand@objectstack/lintnot built) — not a measurement. The prerequisite was built under the shared lock (OS_VERIFY_LOCK_SLOT=issue-15453; "os-verify-lock: VERDICT command-exit 0 · held the lock 17s · waited 0s") and the gate re-run; the table reports the re-run.Verdict lines quoted from the gates themselves — the three the ruling names:
✅ check-adr-links: 679 relative link destination(s) under docs/adr/ resolve✅ check-adr-symbol-anchors: 2063 anchors across 139 records resolve — 277 symbol (251 declaration, 26 literal), 1761 file-level, 25 cross-repo, 6 exempt, 3 continuation. 0 line anchors survive.check-adr-anchors: OK (53 anchored file(s), every governing ADR still referenced; 133 decision number(s), each naming one decision or an allowlisted pair; 33780 citation(s) across 4292 file(s) resolve; 997 decision-letter citation(s) on the anchored surface name a decision the record makes).and two more:
check-nul-bytes: OK (scanned 8197 text file(s) -- 8197 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).✓ check:doc-formula-expressions (spec TSDoc, #6763): 9 @example(s) judged clean across 1301 packages/spec/src files(the re-run)Governed predicate, as the ruling asks:
node scripts/pm/check-governed-merges.mjs --test docs/adr/0128-…md→ exit 3,⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime).,docs/adr/** ×1.pnpm lintis a MEASURED NARROWING, not a skip, all three evidences at the final commit:eslint.config.mjshas zero markdown entries —grep -niE 'markdown|\.md|mdx'over it returns nothing.--format json:eslint --no-inline-config --format jsonon the one changed file returns 1 result, errorCount 0, single warningFile ignored because no matching configuration was supplied.eslint.config.mjs, which never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file, test or not" — so a one-line change in a file eslint is not configured to read cannot move any untouched file's verdict.No ablation and no reverse verification. A one-field docs edit has no behaviour to mutate, no build output, and no cross-package type surface; there is nothing whose removal could turn a diagnostic red. Stating that rather than manufacturing a ritual.
Serial probe before opening:
git fetch origin main && git merge-tree --write-tree --name-only origin/main HEADagainstorigin/mainbc0ac1d1f→ exit 0, treef825afe7d, no conflicted path.Governance
docs/adr/**is a governed surface (Prime Directive #14). This PR is a draft: not readied, not enqueued, no auto-merge, no reviewers requested, no review submitted. The maintainer merges by hand.skip-changesetapplies because the diff publishes nothing from any released package.维护者速读(草稿)
改了什么 — 一份 ADR(
docs/adr/0128-…)的状态行,一行换一行。原来写「Proposed(2026-08-28)—— 等维护者手动合并」,现在写「Accepted(2026-09-07)—— 接受行为是维护者 2026-09-07 的回复(objectstack#15453,总监召集 #17 决策批次 #1)」。除这一行外,整个仓库没有第二处改动。为什么改 — 这是本卡三条状态行里最后一条。另外两条(ADR-0130、ADR-0131)已在 PR #15704、#16590 落地,靠的是「落到 main 的那次合并即接受」。ADR-0128 用不了这个理由:它 2026-08-28 那次合并的执行者是席位账号
os-sales,不是人;2026-09-05 的裁决明说这种情况不在它覆盖范围内,所以它被搁置了两天。9-07 你在 PM 对话里回的「同意」补上了这个缺口 —— 现在的接受行为是你那句回复本身,状态行也据此写成 9-07,而不是 8-28。姊妹记录那半句「由合并接受」在这里被有意去掉了。风险与代价(含回滚) — 风险只有一个,已在正文表格里逐条列清:整个 Status 字段被换掉,连带删掉了三句仍然成立的尾句,其中一句是 2026-08-27 那次方向裁决的逐字原文「其他同意」。这句原话在本记录里、乃至全仓针对那次裁决,都没有第二份拷贝(只剩指向评论 5434987411 的指针)。另外两句(方向裁决的出处、以及「本记录未实现任何东西、不改变任何行为」)在第 4、7、8、118–124、130 行都还在。⛔ 这一条正是请你拍板的地方:若你认为那句原话必须留在状态行里,只需说一声,改成「只替换第一句、保留其余」重飞即可,成本是一次 XS 飞行。回滚成本接近零:单文件单行,
git revert即可,没有代码、没有生成物、没有发布面。席位意见 — (留空,待席位 ACCEPT 时填写)
你要做的 — 一个动作:确认这条状态行的措辞可以接受(尤其是上一段那个删除),然后手动合并本 PR。⛔ 不要用合并队列、不要 arm auto-merge ——
docs/adr/**是受管面,手动合并本身就是评审记录。合并后本卡关闭,ruling A 的三条记录全部执行完毕。Generated by Claude Code