Repository navigation
docs(adr): ADR-0030's cut-over step and ADR-0052's rollout note record the retired migration - #19381
Conversation
…d the retired migration `migrateSysNotificationToEvent` was removed from `@objectstack/metadata/migrations` by the retirement ruling in decision batch #88. Two ADR lines still read as live statements about a runner that no longer exists. ADR-0030 `:105` — a prescription in the objectui cut-over list ("Run `migrateSysNotificationToEvent` during the cut-over") — is struck in place and replaced with the withdrawal, the consequence (pre-ADR-0030 `sys_notification` rows are not carried by the platform on this line) and a pointer to the handoff doc's tombstone, which holds the reasoning, the unmeasured-deployment caveat and the reversal path. The cut-over sequence drops its middle step. ADR-0052 `:327` said `sys_notification` "is mid-migration to an event model (`metadata/.../migrate-sys-notification-to-event.ts`, ADR-0030)". Both halves are false: the migration is retired and the file is deleted. The line now records why P0b was deferred and states that the collision reason is gone, without deciding whether the move proceeds — that is a call for that record's owner. ADR-0030's status line gains an `Amended` entry naming the retirement, per Prime Directive #13: a reversal of a recorded decision is itself recorded on the record. ADR-0030 `:80` is deliberately NOT touched. The `P0 — Seams` row states what #1434 shipped, and it did ship; editing it would rewrite history to make a grep pass. Claude-Session: https://claude.ai/code/session_01NcPSwnmJHczmTu6FG7NMjE Co-authored-by: Claude <noreply@anthropic.com>
维护者速读(终稿)
改了什么两个 ADR 文件里的两句话,共 2 个文件、+16 / −7 行,⛔ 无任何代码改动、⛔ 无发布面、⛔ 无生成物。
⛔ 一个字没动、而且是故意的ADR-0030 第 80 行也出现同一个函数名 —— 那是 为什么改被点名的那个函数在 #16194(决策批次 #88)里已经从 ADR-0052 那句危害不同但同源:它给一次推迟提供理由,而那个理由已经蒸发 —— 后来的人可能继续拿一条死掉的理由往后推。 顶部 风险与代价(含回滚)
席位意见建议原样合并,包括那条 PR 正文把那条状态行标为「若要更小的 diff,先划掉这一行」。 席位已逐条核对那条
你要做的读完这 23 行 diff,人工合并 PR #19381(或以授权账户给出 APPROVED 审查,届时由本席位落地)。 ⛔ 它不进合并队列,agent 席位不会翻 ready、不会入队、不会挂 auto-merge、不会批准 —— 这是受管面 Tier H 的规定路径,不是卡住了。 CI 全绿,已核到终态(全部钉在 head
Generated by Claude Code |
Fixes #17193
Clause-②: no
The defect
docs/adr/0030-notification-platform-convergence.mdcarried a live operator prescription formigrateSysNotificationToEvent— a runner the #16194 retirement (decision batch #88) removedfrom
@objectstack/metadata/migrations. An operator following the cut-over list writes animport that does not resolve: a copy-the-example-and-it-fails defect, not a stylistic one.
⭐ The discrimination this card is about — two occurrences, ONE defect
0030§ Remaining work → objectui cut-over — "RunmigrateSysNotificationToEventduring the cut-over…"0030§ Shipped (merged tomain) →P0 — Seamsrow — "…idempotentmigrateSysNotificationToEvent. | #1434"My reading of the file agrees with the card's split, and here is the structural evidence for
it rather than a restatement. The untouched occurrence sits inside the table under the
heading
### Shipped (merged tomain)— one row per phase, each carrying the PR number thatshipped it (
#1434). The corrected occurrence sits under### Remaining work (handed off to a follow-up agent), in an imperative bullet list of steps a follow-up agent is told to perform.Retro-editing the shipped row would be rewriting history to make a grep pass, and it is the
accrete-a-row-per-release pattern the release guardrail exists to stop.
git diffon this branch contains zero hits forP0 — Seams— the row is not in the diffat all.
5611847419) — TAKEN, and declaredThe
CONTRACT_REVIEW_TIERverdict on PR #17194 (finding F2) named a second line of the sameclass in a different ADR. The dispatching seat did not rule it in or out of scope and asked
for the decision to be made out loud. It is taken, and the same test was applied to it
first:
docs/adr/0052-audit-is-not-the-activity-feed.md§ 6. Rollout → P0b read"
sys_notificationis deferred — it is mid-migration to an event model(
metadata/.../migrate-sys-notification-to-event.ts, ADR-0030), so moving it now wouldcollide with that in-flight work."
deleted from disk. That puts it on the
:105side of the test, not the shipped-historyside. Both halves of the sentence are false as of the retirement.
Why take it rather than file it. It is the same defect, from the same retirement, in the
same governed tree, and it needs the same sentence written. Leaving it means a second card, a
second governed-surface PR and a second hand-merge for one sentence. The PM comment that
recorded it declined to file it as a second card for exactly that reason.
What the correction deliberately does NOT do. It records that the stated collision reason
is gone — it does not decide whether the
sys_notificationownership move now proceeds.That disposition is a decision for ADR-0052's own record owner, and the line says so in as many
words. ADR-0052's status line is not amended: no decision of ADR-0052 moved, only one
sentence of rationale was false.
The one judgement call — ADR-0030's amended status line
The card's "Suggested shape" asked for a decision on whether ADR-0030 wants an amended status
line naming the retirement. It does, and the PR writes one (one line, appended to the
existing
**Status**line).Prime Directive #13: reversing a recorded decision is itself a decision, and it needs a new ADR
or an amended status line on the old one. The retirement already happened, elsewhere;
because
docs/adr/**is governed, PR #17194 correctly could not carry the amendment, so thisPR is where it is owed. Without it, the Status line still reads "P0–P3b2 shipped" with no
trace that a shipped P0 item was withdrawn, and a reader who greps the status learns nothing.
The wording follows the register's own precedents for this exact shape — ADR-0005 (
Amended (2026-08-09, #6825 — the Phase-1 overlay-index migration is deleted…)), ADR-0127 and ADR-0045— and closes with an explicit "nothing else moves" so it cannot be read as a wider reversal.
the
:105correction stands on its own without it.Premise re-verified on this branch's base (
32708262d)packages/metadata/src/migrations/holds nomigrate-sys-notification-to-event.ts. Everyremaining occurrence in shipped code is a tombstone or a pin asserting the absence. ⇒ the
premise holds: the prescription names a call that no longer exists.
Local gates — 19 derived, 19 run, 0 NOT MEASURED
Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsagainst the actual changed files, every exit code captured before any pipe, reconciled with
--ranin thecommand :: exit codeform the tool asks for:All 19 exited 0, the ADR-specific ones among them:
check-adr-links.mjs·check-adr-symbol-anchors.mjs·check:adr-anchors·check:doc-authoring·check:pm-governed-merges·check:pm-prior-rulings·check:nul-bytes·@objectstack/lint check:doc-formula-expressions.check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET (@objectstack/formulaand
@objectstack/lintunbuilt). That is not a finding and was not recorded as one: the twopackages were built and the gate re-run, where it exited 0.
Build / test scope. The diff touches no package, so the dependency-closure build is empty
and no package's
test/typecheckis affected. The build above was a gate prerequisite only.Repo-wide eslint — a measured narrowing, not a skipped run. (1) Population, read from
eslint's own config: every
files:block ineslint.config.mjsmatches only{ts,tsx,mts,cts,js,jsx,mjs,cjs}; no block matches Markdown. (2) Count, from--format jsonover both changed files: 2 files, both
File ignored because no matching configuration was supplied, 0 errors. (3) Non-influence: no block setsparserOptions.projectorprojectService, so type-aware linting is not enabled and this diff cannot move the verdict onany untouched file.
Changeset —
skip-changesetis warranted, and is NOT applied by this PRThe repo has a definite answer and it is the label, not an empty changeset:
AGENTS.mdPost-Task Checklist §3 scopes
skip-changesetto "a diff that publishes nothing from anyreleased package", and the empty-changeset route was ruled shut for new files (#5471) — the
Check Changesetjob rejects an empty changeset a PR newly introduces. A docs-onlydocs/adr/diff publishes nothing from any package, so the label is the correct instrument.
⛔ The dispatching seat's write budget names no label, so this dev did not apply it. The
Check Changesetgate will be red until the seat appliesskip-changeset; that red is thegate working, not a finding.
Files changed
docs/adr/0030-notification-platform-convergence.md— status-line amendment; the cut-overprescription struck and replaced.
docs/adr/0052-audit-is-not-the-activity-feed.md— the P0b rollout rationale corrected.Total: 2 files, +16 / −7.
⛔ Landing
docs/adr/**is a governed surface (Prime Directive #14, Tier H). This PR stays draft andtakes no queue: it lands by the maintainer's hand or on an authorised approval, and no agent
seat may flip it ready, enqueue it, arm auto-merge on it, or approve it.
维护者速读(草稿)
改了什么
两个 ADR 文件里的两句话,共 2 个文件、+16 / −7 行,不含任何代码改动。
migrateSysNotificationToEvent把历史铃铛数据迁过来」这条操作指令被划掉,改成记录「该迁移已撤回」,并指向 handoff 文档里已有的墓碑说明;切换步骤从三步变两步。同时在文件顶部的Status行补了一条Amended记录,写明这次撤回。sys_notification「正在迁往事件模型(某某文件,ADR-0030)」——这句话的两半现在都是假的(迁移已退役、文件已从磁盘删除)。改成记录「当初因此推迟」+「该理由已不存在」,但不替记录所有者决定这次搬迁现在要不要做。为什么改
被点名的那个函数在 #16194(决策批次 #88)里已经从
@objectstack/metadata/migrations删掉了。ADR-0030 那条指令是写给「马上要动手的人」看的:照抄它写出来的 import 解析不了。这属于「照着例子做就失败」,不是措辞问题。ADR-0052 那句的危害不同但同源:它给一次推迟提供理由,而那个理由已经蒸发;后来的人可能继续拿一条死掉的理由往后推。
顶部
Status行那条Amended是协议第 13 条要求的:推翻一个已记录的决定本身就是决定,必须记在记录上。撤回发生在别处(#16194),而那个 PR 因为受管面规则不能碰 ADR,所以这笔账落在本 PR。风险与代价(含回滚)
Amended状态行算不算「越界替记录所有者做决定」。本 PR 的判断是「不算 —— 它只是把别处已经做出的裁定记到该记的地方」,但如果您觉得 diff 该更小,先划掉这一行,下面:105的修正独立成立。git revert一个 commit 即可,不牵动任何运行时。席位意见
(留空)
你要做的
读完 diff 的 16 行后,人工合并本 PR(或给出授权批准)—— ⛔ 它不进合并队列,agent 席位不会翻 ready、不会入队。另外请给它挂上
skip-changeset标签,否则Check Changeset会一直红(本 PR 不发布任何包,派发席的写预算里没有标签,所以 dev 没有自行挂)。Generated by Claude Code