Skip to content

docs(adr): mark ADR-0135's Until then passage as history and state its grep recipe's scope - #18399

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-18345-adr-0135-until-then-and-recipe-scope
Sep 16, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-18345-adr-0135-until-then-and-recipe-scope

Conversation

@os-elon-musk

Copy link
Copy Markdown
Collaborator

Fixes #18345

ADR-0135 carried two stale artefacts, and neither would have survived on its own: both were
tied to work tracked by card #14361, which PR #18344 retired on 2026-09-16. This card exists
to outlive that retirement, and this PR is the whole of it — two passages, nothing else in the
file touched.

1. The Until then bullet is MARKED as history, not rewritten

The Consequences bullet described a transition that has ended. Following the seat's direction,
the four original lines are kept byte-identical — rewriting a mirror record's Consequences
prose is the governance judgment the approver makes, not a dev edit. The bullet gains a history
marker above them and the reading below them, so a reader cannot reach the stale sentences
without first being told they are historical.

One correction to the dispatch's suggested wording, measured rather than assumed. The
re-pointing did NOT land together with card #14361's retirement on 2026-09-16. It landed on
2026-09-14 in PR #18228 (merge commit 0f95f434, merged 2026-09-14T23:02:43Z). Card #14361
itself then stayed open two more days and was retired by PR #18344 at 2026-09-16T06:27:30Z. The
text I added names the landing, not the card's retirement, because the landing is what made
the Until then state end.

Reading, taken on objectstack-ai/objectstack at 8b81ab60 (the branch point):

measurement count
ADR-0024 occurrences in packages/plugins/plugin-auth/src + packages/platform-objects/src/identity 14
of those, occurrences carrying the cloud ADR-0024 qualifier 14
bare, unqualified occurrences — the ones the bullet is about 0
firing control: ADR-0135 occurrences in the same two trees 62
dark control: a string that must not exist there 0

The card's own reading was ADR-0024 ② = 0 with ADR-0135 D6 = 12 files as the firing control;
both reproduce here. The occurrence-level measurement above is stronger than the marker count:
it shows there is no bare citation left at all, not merely that one spelling is gone. Every one
of the 14 was checked with its left context, so the count does not rest on a line filter — which
is exactly the instrument error item 2 is about.

2. The grep recipe is UNCHANGED and gains one sentence of scope

The recipe in Provenance point 3 is true in its own sentence and is not edited. What it lacked
was its range, so it read like a per-site population filter and was reused as one twice. One
sentence now states what it counts (LINES, on the one historical commit that introduced this
record) and why the shape cannot be reused as a census of citation sites: a line can carry two
citations and a citation can wrap across two lines, so sorting lines by the cloud ADR-0024
spelling mis-sorts in both directions.

Acceptance notes

  • The card declared one gap unmeasured; it is now measured. The card said it had never
    checked whether a THIRD stale conditional sits elsewhere in this file. Swept on e29b3af7
    for transition-shaped prose — Until then, for now, not yet, once #, pending,
    in the meantime, temporarily, soon — with a dark control. The only hits are the bullet
    this PR already marks. There is no third occurrence in this file.
  • The card's other unmeasured item — where else the line-vs-occurrence error has skewed
    readings OUTSIDE docs/adr/ — is still unmeasured, and this PR does not touch it.
  • turbo ls --affected was run and is NOT cited as evidence anywhere here: it printed all 81
    packages rather than narrowing, so it carries no information about this diff.
  • No other citation in the file is touched. The diff is 11 insertions, 1 deletion, one file.

Verification

All 18 gate families derived for this diff, green, run with the exit code captured before any
pipe. Derivation is mechanical, not copied from the dispatch: dispatch-gates.mjs --commands
against this tree at e29b3af7, reconciled afterwards with --ran.

18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN  (a DERIVED zero - all 18 recorded an exit code)

check-adr-links · check-adr-links --self-test · check-adr-symbol-anchors ·
check-adr-symbol-anchors --self-test · check-ci-filter-parity · check-closing-keyword-parity ·
check-closing-keyword-parity --self-test · check-comment-mask-corpus · check:doc-formula-expressions ·
check:adr-anchors · check:cross-package-test-inputs · check:doc-authoring · check:driver-memory-census ·
check:nul-bytes · check:pm-governed-merges · check:pm-prior-rulings · check:refd-timer-probe ·
check:watch-hint-literal — all exit 0.

check:doc-formula-expressions first answered exit 3, PREREQUISITE NOT MET, which its own text
declares measures nothing. It was re-run to exit 0 after building @objectstack/formula and
@objectstack/lint, and only the re-run is recorded as a result.

Governed-surface assertion: check-governed-merges.mjs --test on the file answers exit 3,
GOVERNED
docs/adr/**, rules layer.

Repo-wide lint is not owed here, and that is a measurement rather than a skip. Three pieces:

  1. Population, read from eslint's own config: every files: block in eslint.config.mjs
    declares only {ts,tsx,mts,cts,js,jsx,mjs,cjs}, and the config mentions markdown zero times.
  2. Count, read from eslint's own --format json: run against the one changed file, eslint
    answers File ignored because no matching configuration was supplied — 0 of 1 changed files
    are inside its population.
  3. Invariance for untouched files: no parserOptions.project and no projectService, so
    type-aware linting is not enabled and this diff cannot move any untouched file's verdict.

No package is affected: the workspace globs are packages/*, apps/*, examples/* and
friends, and docs/ is under none of them — so no build, no package test and no typecheck is
owed, and this PR declares none.

skip-changeset is measured, not assumed: of 77 package manifests, 0 ship docs/ or adr
in files[], against a positive control of 70 that ship dist. Nothing published moves.

维护者速读(草稿)

改了什么 — 一个文件、两段话、11 行加 1 行减。① Consequences 里那条描述"过渡期"的
bullet:原来的四行一个字节都没动,只在它上面加了一行历史标记、下面加了一句实测读数。
② Provenance 里那条 grep 配方:配方本身一个字符都没改,只在它后面补了一句说明它数的是什么。
文件里其它任何引用都没碰。

为什么改 — 这两处都是 #14361 完工之后留下的过期物,而且留不住:它们原本挂在
#14361 上,那张卡已经被 PR #18344 收掉了,不单独接出来就会一起消失。①的问题是读者会读到一个
今天已经不存在的过渡状态,并信以为真;②的问题更实:那条配方读起来像一个通用的"逐站点筛选器",
已经被两个席位、三份文档当成筛选器复用过,而它在这个文件上两个方向都会数错。

风险与代价(含回滚) — 风险极低。这是纯散文改动,不含任何代码、schema、行为或已发布内容;
77 个包里没有一个把 docs/adr 放进 files[],所以对 npm 消费者零影响。18 个门禁族全绿。
回滚就是 revert 这一个 commit,没有任何下游产物需要一起回退、也没有迁移要撤。唯一的判断题在①:
本 PR 选择"标注为历史"而不是"改写成现在时" —— 因为改写一份镜像记录的 Consequences 属于治理判断,
应当由批准人来做,不该由 dev 塞进来。若您认为应当直接改写成现在时,那是您的判断,不是本 PR 的缺口。

席位意见 — (留空,待席位定稿)

你要做的 — 读①的那条 bullet 和②的那句量程说明,确认措辞。特别请确认一处事实修正:
派发建议的措辞写的是"#14361 于 2026-09-16 落地",实测是不对的 —— 真正的重指工作是
2026-09-14 由 PR #18228 落的地,#14361 这张卡本身多开了两天、2026-09-16 才由 PR #18344 收掉。
本 PR 的正文写的是落地日。确认无误后,这是治理面(docs/adr/**),需要您本人批准并由您合入;
⛔ 本席不翻 ready、不入队、不武装 auto-merge。


Generated by Claude Code

…s grep recipe

Two stale artefacts in the identity mirror record, neither of which survives on
its own: the Consequences bullet still describes a transition that ended, and
the Provenance grep recipe reads like a per-site population filter it never was.

The Until then sentence is kept byte-identical and marked as history. Rewriting
a mirror record's Consequences prose is a governance judgment for the approver,
not a dev edit, so the two original sentences stand as the record of the state
this decision was taken in, with the marking above them and the reading below.
The reading: #14361's re-pointing landed 2026-09-14 in #18228, and on 8b81ab6
all 14 ADR-0024 occurrences left in packages/plugins/plugin-auth/src and
packages/platform-objects/src/identity carry the cloud ADR-0024 qualifier -
firing control ADR-0135 62 occurrences in the same two trees, dark control zero.

The recipe itself is unchanged - it is true in its own sentence - and gains one
sentence of scope: it counts LINES on the one historical commit that introduced
this record, and a line can carry two citations while a citation can wrap across
two lines, so the shape mis-sorts in both directions the moment it is reused as
a census of citation sites. That reuse already happened twice.

No other citation in the file is touched.

Claude-Session: https://claude.ai/code/session_01Bz6hxDBqK62NP2W1LATvnt
Co-authored-by: Claude <noreply@anthropic.com>
@os-elon-musk os-elon-musk added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 16, 2026 — with Claude
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 16, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e29b3af794d8fc0f0c901c822ccf7fb89ecb92ae

① Derived judgments

② Semver level

skip-changeset — nothing published moves.

③ Boundary flags

  • History MARKING over a present-tense rewrite: accepted — the rewrite of a mirror record's Consequences is the approver's governance judgment (the seat's own direction); the marker is placed above the stale sentences so a partial reader cannot take them as present tense.
  • The card's second declared gap (by-line vs by-occurrence counting outside docs/adr/) stays unmeasured and carrier-less: noted, no card — nothing reads it today.
  • turbo ls --affected printing all 81 packages on a docs-only diff: reported by the dev without a repro or contract text; not filed, watched.

Implemented-by: claude/issue-18345-adr-0135-until-then-and-recipe-scope
Reviewed-by: session_01Bz6hxDBqK62NP2W1LATvnt

VERDICT: PASS

维护者速读(终稿)

改了什么 — 一个文件、两段话(+11 / −1)。① Consequences 里那条描述过渡期的 bullet:原来四行一个字节没动,上面加一行「Historical — 过渡已结束」的标记,下面加一句实测读数(两棵树里 14 处 ADR-0024 引用全带 cloud 限定,没有一处再指向 MCP-connectors 那份记录)。② Provenance 里那条 grep 配方:配方一个字符没改,后面补一句它数的是什么(某个历史提交上的行数,不是逐站点筛选器,按行分拣两个方向都会错)。文件里其它引用一处没碰。

为什么改 — 这两处都是 #14361 完工后留下的过期物:①让读者读到一个今天已不存在的过渡态;②那条配方已被两个席位、三份文档当成总体筛复用过,而它在这个文件上数不准。

风险与代价(含回滚) — 极低:纯散文,不进任何发布产物;18 个门禁族全绿,ADR 三个门禁本席复跑全绿。回滚 = revert 一个 commit。

席位意见 — 席位达档复核 PASS。dev 纠正了本席派发令里的一个日期:重指工作是 2026-09-14 由 PR #18228 落地的,#14361 这张卡 2026-09-16 才被 PR #18344 收掉;PR 正文写的是落地日,正确。①选「标注为历史」而非改写现在时,是本席的定级方向,留给你裁:若你更想直接改写成现在时,批准时说一句,本席补一轮。建议批准。

你要做的 — 在本 PR 上给一次 APPROVED(os-zhuang 或 hotlong 任一);之后由本席按裁决 C 落地(清标、ready、auto-merge SQUASH);⛔ 席位不自行批。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 16, 2026 08:59
@os-zhuang
os-zhuang enabled auto-merge September 16, 2026 08:59
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 16, 2026
Merged via the queue into main with commit 7358c1c Sep 16, 2026
41 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-18345-adr-0135-until-then-and-recipe-scope branch September 16, 2026 09:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants