Skip to content

fix(metadata): close out the adr-0030-notification-event retirement residue - #18389

Merged
os-support-ai merged 4 commits into
mainfrom
claude/issue-17281-adr-0030-retirement-residue
Sep 16, 2026
Merged

os-support-ai merged 4 commits into
mainfrom
claude/issue-17281-adr-0030-retirement-residue

Conversation

@os-support-ai

@os-support-ai os-support-ai commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Fixes #17281

Clause-②: no — this PR puts no new key on a published payload. It adds one changeset row, removes a dead workspace dependency (a narrowing, never a widening) and corrects stale prose; triage's grading 5692961190 states it directly: "nothing widens an accept set or a public surface". Declared by the dispatching seat in claim 5693760798.

Residue from the adr-0030-notification-event retirement (#16194 / PR #17194, merged d64bcb6377). Four items, four commits, item 1 first and alone as the triage grading 5692961190 directed, then re-cut on the maintainer's ruling 5698965201.

Item 1 — the platform-objects release note (re-cut on ruling 5698965201)

797caf0c first put '@objectstack/platform-objects': minor on the existing
.changeset/retire-adr-0030-notification-event-migration.md. d2544585 undoes that and
takes route B instead. Two acts, one commit:

  • The base note is restored byte-for-byte. Measured, not asserted:
    git rev-parse 8b81ab60d:.changeset/retire-adr-0030-notification-event-migration.md and
    git hash-object on the restored working-tree file both read
    2ae652749b40dec974fdfb5fcf5fe0990267fe53, and git diff 8b81ab60d HEAD on that path
    prints nothing. The file is no longer in this PR's diff at all.
  • The bump moves to a new, issue-scoped changeset
    .changeset/17281-platform-objects-attest-fresh-datastore.md, declaring exactly
    '@objectstack/platform-objects': minor, named the way the gate itself prescribes
    (.changeset/{issue}-{slug}.md).

The note is written for a release reader rather than for this PR: a datastore created from
empty now attests two creation-attested migration ids instead of three, because
attestFreshDatastore (packages/platform-objects/src/system/migration-flag.ts) defaults
to CREATION_ATTESTED_MIGRATION_IDS and that tuple lost 'adr-0030-notification-event' in
the retirement. No row is written under the retired id any more; a deployment that already
holds one keeps it, and NOTIFICATION_EVENT_MIGRATION_ID survives as that row's name.

The bump is owed at all because that operator-visible half lives in
@objectstack/platform-objects, a package with no private: true, and the retirement's own
release note never declared it.

The ruling, and its one declared cost

Maintainer ruling 5698965201 chose B: open a new changeset file for
platform-objects, and do not touch the release note that already exists on the merge base.
That is the confirmed which check:empty-changeset's DELIBERATE CORRECTION class asks for
— and what it authorises is this route, not an edit in place.

⚠️ The cost, named rather than hidden: the CHANGELOG will carry a separate
platform-objects entry
instead of a row under the adr-0030 retirement note. The same
release semantics, told in two places instead of one.

Two premises the ruling asked to be falsified before acting

Both were put to a measurement that could have come out the other way. Neither broke.

  1. "Restoring the base note republishes a sentence that is now false." It does not.
    Every claim in that note is about the retirement itself — the deleted runner, its three
    types, CREATION_ATTESTED_MIGRATION_IDS going from three members to two,
    NOTIFICATION_EVENT_MIGRATION_ID being kept. This PR's diff touches
    packages/metadata and packages/plugins/plugin-audit and no file under
    packages/platform-objects, packages/spec or packages/metadata/src/migrations's
    deleted runner. The control that could have falsified it: grepping the base note for
    this PR's own subject matter — platform-objects, dependen, vitest, tsconfig,
    package.json, alias, paths — returns zero hits, so there is no sentence in it
    that this diff could have made false. The note is under-declared, not false: the
    platform-objects half moved in the original retirement (d64bcb6377, PR refactor(metadata,spec)!: retire the adr-0030-notification-event migration — no operator door, no platform invoker #17194), whose
    file list carries packages/platform-objects/src/system/migration-flag.ts,
    migration-flag.test.ts and plugin.test.ts.
  2. "A changeset naming a package this diff does not move is refused by another gate."
    It is not — measured for minor specifically, not inferred from the patch assertion.
    check-changeset-no-major.mjs run against a synthesised pull_request payload carrying
    this PR's real Clause-②: no exits 0, printing
    ✓ LEVEL AXIS: this PR declares clause-② 'no'. The firing control, the same command on
    the same tree with the payload flipped to Clause-②: yes, exits 1 — so the axis was
    live and capable of failing, and what it then prints is the sharper reading: the only
    package it lists is @objectstack/metadata: patch, because
    packages/platform-objects/src/** is not in this diff. A minor on a package the diff
    does not move is invisible to that gate in both directions — never refused, and never
    credited either.

⚠️ Item 2 — the dead dependency (bccdf6c1b)

@objectstack/metadata no longer declares @objectstack/platform-objects. Three files, removed together because all three exist only to serve one dead edge: the dependencies entry, the @objectstack/platform-objects/system alias in vitest.config.ts, and — not named in the card, found while measuring — the matching paths mapping in tsconfig.json, which pointed at the same dead specifier.

The card required that no consumer resolving the dependency transitively be established before removing it. Established, not assumed:

reading result
@objectstack/platform-objects specifiers under packages/metadata zero in src, tests and scripts — only the three config/manifest sites removed here
occurrences of platform-objects in @objectstack/metadata's built dist/ (30 files, 10 declaration files) zero
positive control: the nine other declared deps, same dist/ present in 4–12 files each
workspace packages carrying a real platform-objects module specifier 23, and all 23 declare it themselves
of those, resolving it transitively zero
example apps referencing it zero

⇒ No runtime import and no type reference reaches platform-objects through anything @objectstack/metadata publishes, so no consumer can arrive at it via this package. check:undeclared-dep-imports is the standing gate that keeps the in-repo half true for non-test src/**, and it is green here.

Residual, declared rather than hidden: an external consumer that installs @objectstack/metadata, imports @objectstack/platform-objects without declaring it, and relies on npm's flat hoist would lose that accidental resolution. That is unmeasurable from here; it is also the class this repo's own gate treats as a defect, and @objectstack/platform-objects publishes on its own, so the supported spelling exists. The changeset states the one-line fix.

pnpm-lock.yaml travels in the same commit, regenerated with pnpm install --lockfile-only and never hand-edited. Its entire diff is the three lines of the one removed edge under the packages/metadata importer. An earlier push carried the manifest edit without it and failed ERR_PNPM_OUTDATED_LOCKFILE at every job's install step; that is fixed here, and it is ⛔ not evidence about whether the removal itself is safe — the readings above are.

Graded patch — no export moves, no accept-set widens, no behaviour changes — and deliberately not skip-changeset: package.json is shipped by npm pack, and a consumer's install tree is what changes.

Items 3 and 4 — the two stale prose lines (466593dc0)

Comment-only; no assertion, harness or gate input moves.

  • plugin-audit/src/read-audit-view-instant-preservation.integration.test.ts cited migrate-sys-notification-to-event.test.ts and packages/runtime/src/notification-migration-audit-preservation.integration.test.ts as files a reader could open. Both measured absent, with a sibling that IS present as the positive control. Marked retired; the first citation is kept because the SHAPE it demonstrated is the paragraph's point.
  • metadata/src/migrations/raw-exec-operator-detail-16657.test.ts said "at the three err?.message ?? String(err) sites". Two, measured rather than carried: the directory holds two catch (err: any) sites recording through operatorFacingErrorText and one catch (error) site, matching the docblock's own two-expression split. The third is visible in the pre-merge tree of d64bcb6377, in the deleted runner, as { outcome: 'failed', reason: err?.message ?? String(err) }.

⚠️ Commit shas corrected after the fact. This body cited 063efde2 and fd28ee6f, and git merge-base --is-ancestor puts NEITHER on this branch (control: the merge base 8b81ab60d exits 0 in the same checkout, so the negative is real). The branch was re-cut after that text was written. The live commits are bccdf6c1b (item 2) and 466593dc0 (items 3 and 4), each mapped by its own file list. Found by the delivering agent and corrected by the dispatching seat.

Gates

Derived from the actual changed files with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on head
d2544585e, each run with its exit code written to disk before anything read it, then
reconciled by feeding the codes back:

Run reconciliation — 75 derived, 75 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 75 derived famil(ies) accounted for — 75 run, 0 NOT-MEASURED
  (a DERIVED zero — all 75 recorded an exit code and none of them is 3).

74 of 75 green, plus pnpm lint — the full repo-wide union, which the derivation does
not name and therefore never asks for — at exit 0 on d2544585e.

check:empty-changeset is the point of this commit, and it has turned over. On
466593dc0 it exited 1:

This PR changes a changeset it did not add:
   .changeset/retire-adr-0030-notification-event-migration.md
     present on the merge base and CHANGED by this PR

On d2544585e it exits 0:

✓ No empty-frontmatter changeset introduced by this diff (2 declaring changeset(s) added).
✓ No changeset from the merge base modified or deleted by this diff (#17712).

check-changeset-no-major.mjs exits 0 on the same head, on both of its axes.

The one family that is not green is not a defect introduced here:

⚠️ Six gates first read exit 3 PREREQUISITE NOT MET — neither pass nor failure —
because they load built output. After turbo run build --filter=!@objectstack/docs all six
are green: check:dts-closure, check:dual-build-cjs-loads, check:i18n,
check:lean-entry-closure, check:sourcemap-no-sources-content, check:type-check-debt.

⚠️ The derivation printed a STALE TREE warning: this branch is at least 31 commits
behind origin/main, and 10 of the files the families are derived from moved across that
range. Discharged by measurement rather than by argument — the same derivation, run in a
throwaway worktree checked out at origin/main (8fe5cb8e5) with this branch merged in
uncommitted, derives the same 8 paths and a byte-identical 75-command list (diff exit
0). The staleness does not move the family set for these paths.

Package-level test and typecheck readings are unchanged from 466593dc0
(@objectstack/metadata 53 files / 788 tests, @objectstack/plugin-audit 24 files / 346
tests, typecheck green for both): d2544585e adds nothing on top of that head but two
.changeset/*.md files, which no test or typecheck program reads.

Acceptance notes

  • packages/metadata/vitest.config.ts keeps one platform-objects mention, deliberately: the comment on the @objectstack/spec namespace rule contrasts spec's uniform export map with the FILE-shaped @objectstack/platform-objects/plugin subpath. That prose is still accurate and load-bearing about spec, and is not residue.
  • .changeset/operator-facing-raw-exec-cause-text.md is untouched — another PR's changeset, as the card directs.
  • docs/adr/0052-audit-is-not-the-activity-feed.md:327 is untouched — governed surface, and ADR-0030 still prescribes migrateSysNotificationToEvent, a call the #16194 retirement removed — an operator copying step 2 gets an unresolvable import #17193 is its route.
  • Neither changeset this PR adds carries a Clause-② line, and the restored base note does not carry one either; 4 of the 334 changesets in the tree do. Noted, not filed — out of scope here.

Claim: 5693760798. Triage: 5692961190.


Generated by Claude Code

… @objectstack/platform-objects

The operator-visible half of that retirement — a fresh datastore attests two
creation-attested migration ids, not three — is delivered by
`attestFreshDatastore` in `packages/platform-objects/src/system/migration-flag.ts`,
in a package that publishes (no `private: true`). The changeset named
`@objectstack/metadata` and `@objectstack/spec` only, so the fixed group bumped
platform-objects without giving its CHANGELOG the sentence an upgrading operator
greps.

One row added to the existing changeset; the body already states the behaviour
(`attestFreshDatastore` no longer includes it) and is unchanged.

Time-boxed on purpose: once a release consumes this changeset the row cannot be
added retroactively, and `content/docs/releases/` is release-owned and is never
the place to patch it up.

Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tests tooling labels Sep 16, 2026
@github-actions

github-actions Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 3 changed file(s) yielded no anchor (packages/metadata/package.json, packages/metadata/tsconfig.json, packages/metadata/vitest.config.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 3 changed file(s) yielded no anchor (packages/metadata/package.json, packages/metadata/tsconfig.json, packages/metadata/vitest.config.ts) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 16 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 8fe5cb8e51863d0a19509487058c477531280c08packageMentionDocs.

Copy link
Copy Markdown
Collaborator Author

CI triage — 11 red checks, one cause, and it is this PR's

domain:cli execution PM seat, session session_01DvvamiacK328idtBYJBxV3, 2026-09-16T08:11Z. Head fd28ee6f7851. A patch round is dispatched to the same dev; this comment is the record, ⛔ not the fix.

The reading

Taken from the job logs, ⛔ not from the check names and ⛔ not from the aggregate rollup — Validate Package Dependencies (job 104715976917) and Build Core (job 104716057059) print it identically:

ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because
pnpm-lock.yaml is not up to date with <ROOT>/packages/metadata/package.json
  Failure reason:
  specifiers in the lockfile don't match specifiers in package.json:
* 1 dependencies were removed: @objectstack/platform-objects@workspace:*

⇒ every job dies at the install step, before any test body runs. That is why Build Core, all four Type Check jobs, Lint & Repo Gates, Check Changeset, all three Dogfood Regression Gate shards and Dogfood Verify CLI all went red inside one minute. 11 symptoms, 1 defect.

Attribution — ⛔ not the base, ⛔ not a flake

The failure names packages/metadata/package.json, which is in this diff (+0/-1, the item-2 dependency removal), and pnpm-lock.yaml is absent from the PR's 7 changed files. A lockfile that disagrees with a manifest this PR edited cannot be inherited from main. ⇒ ⛔ no re-run is warranted and none was spent: 「flake」 is not a root cause, and this one is already rooted.

What was asked for

Regenerate pnpm-lock.yaml with the repo's own tooling and commit it alongside the manifest change. ⛔ Never hand-edited, ⛔ never --no-frozen-lockfile (the CI note suggesting it addresses a different situation; here it would hide the very drift this gate exists to catch), and ⛔ no test skipped, disabled or quarantined.

⚠️ The lockfile drift is a mechanical consequence of item 2, ⛔ not evidence that item 2 is safe. The card requires establishing that no consumer resolves @objectstack/platform-objects transitively before the dependency comes out. That reading is still owed, and reverting item 2 and shipping items 1 + 3 + 4 with the reason is an acceptable outcome — a declared, evidenced non-removal beats a speculative removal.

⏳ Item 1 (the changeset row, commit 797caf0c, taken first and alone as triage 5692961190 directed) is unaffected and stays untouched while this is fixed.

domain:cli execution PM seat · #6024 · session session_01DvvamiacK328idtBYJBxV3 · R76 · CI triage · reading time 2026-09-16T08:11Z


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

⛔ Correction to my own CI triage above — two defects, not one

domain:cli execution PM seat, session session_01DvvamiacK328idtBYJBxV3, 2026-09-16T08:21Z. Correcting 5694239223, which said 「11 symptoms, 1 defect」. That was wrong about one check, and the error was mine: I read two job logs, found ERR_PNPM_OUTDATED_LOCKFILE in both, and generalised to the rest instead of reading the one check whose name should have made me look — Check Changeset has nothing to do with a lockfile.

The second defect

Check Changeset (job 104715976824) is red because this PR body carries no line-initial Clause-②: declaration. Measured on the stored body, ⛔ not inferred: the phrase occurs once, inside prose (「The changeset edited for item 1 carries no Clause-② line…」), and ⛔ no line starts with it. The gate reads only line-initial.

⭐ It is independent in both directions: it ⛔ does not clear when the lockfile is fixed, and the gate states it 「clears with no push and no re-run」 — a body edit fires it. ⇒ the two defects need two different acts.

The declaration itself was already made by this seat at claim time (5693760798, Clause-②: no) and is backed by triage 5692961190: 「nothing widens an accept set or a public surface」. The PR body simply never carried it. The exact line has been handed to the delivering dev.

The remedy is the declaration, never the deletion — the gate names dropping the changeset or regrading the package as the wrong fix, and this seat endorses that: it would change what ships in order to quiet a gate. ⏳ Item 1's changeset row is the whole point of this card's deadline and ⛔ is not negotiable against a red check.

What stands from the earlier comment

The lockfile diagnosis is unchanged and still explains every other red check on this head. Re-verified since: Test Core (1/6) prints 「No test log — the test step did not get far enough to produce one.」 ⇒ ⛔ no test body ran there either.

⚠️ One reading correction worth recording, because it nearly misled this seat a second time: the Test Core shards log ~9,330 lines against Build Core's 383, which looks like they ran much further and failed on their own merits. They did not — the bulk is workflow setup echo. Log length is ⛔ not evidence of progress; the 「did not get far enough」 line is the reading.

domain:cli execution PM seat · #6024 · session session_01DvvamiacK328idtBYJBxV3 · R76 · triage correction · reading time 2026-09-16T08:21Z


Generated by Claude Code

…dency

The retired `adr-0030-notification-event` migration runner was the only consumer.
Nothing under `packages/metadata/src` carries a `@objectstack/platform-objects`
specifier any more, so the manifest declared an edge the package no longer has.

Removed together, because all three exist only to serve that one dead edge:
  - `package.json`  — the `dependencies` entry
  - `vitest.config.ts` — the `@objectstack/platform-objects/system` alias, whose
    own comment cited the retired migration's receipt cases as its reason
  - `tsconfig.json` — the matching `paths` mapping

`pnpm-lock.yaml` travels in this commit, regenerated with `pnpm install
--lockfile-only` rather than hand-edited. Its entire diff is the three lines of
the one removed edge under the `packages/metadata` importer; a manifest edit
without it fails `ERR_PNPM_OUTDATED_LOCKFILE` at every job's install step.

Dropping a published package's dependency is a public-surface change, so it was
established rather than assumed that nothing resolves it through this package:

  - `@objectstack/metadata`'s built `dist/` (30 files, 10 declaration files)
    contains ZERO occurrences of `platform-objects`, against a positive control
    in which all nine other declared dependencies appear in 4-12 dist files
    each. No runtime import and no type reference reaches it.
  - Of the 23 workspace packages carrying a real `@objectstack/platform-objects`
    module specifier, all 23 declare it themselves; zero resolve it
    transitively. `check:undeclared-dep-imports` is the standing gate that keeps
    that true for non-test `src/**`.
  - Zero example apps reference it at all.

`@objectstack/platform-objects` publishes on its own, so a consumer that wants
it declares it directly — the supported spelling, unchanged.

Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
Co-authored-by: Claude <noreply@anthropic.com>
Both are comment-only; no assertion, no harness and no gate input moves.

`plugin-audit/src/read-audit-view-instant-preservation.integration.test.ts`
named `migrate-sys-notification-to-event.test.ts` and
`packages/runtime/src/notification-migration-audit-preservation.integration.test.ts`
as files a reader could go open. Both are absent from the tree (measured, with a
sibling that IS present as the positive control). They are now marked retired;
the first is kept because the SHAPE it demonstrated is the paragraph's point.

`metadata/src/migrations/raw-exec-operator-detail-16657.test.ts` said "at the
three `err?.message ?? String(err)` sites". Two remain. Measured rather than
carried: the directory holds two `catch (err: any)` sites recording through
`operatorFacingErrorText` and one `catch (error)` site, matching the docblock's
own two-expression split; and the pre-merge tree of `d64bcb6377` shows the third
in the deleted `migrate-sys-notification-to-event.ts`, which returned
`{ outcome: 'failed', reason: err?.message ?? String(err) }`.

Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator Author

Check Changeset — the declaration this gate asks for, and it is RED BY DESIGN until a human confirms

domain:cli execution PM seat, session session_01DvvamiacK328idtBYJBxV3, 2026-09-16T08:25Z. Head 466593dc0395ad6dfb11d376097147a2bcbd44aa. ⚠️ This is not a failure awaiting a fix. It is a decision awaiting a person, and this comment is the input that gate asks for.

The two earlier defects are CLOSED — measured on this head, ⛔ not assumed

defect state
stale pnpm-lock.yaml fixedpnpm-lock.yaml is now in the diff (+0/-3)
missing line-initial Clause-② fixed — the body now carries exactly 1 such line, and ⛔ no duplicate footer came with the edit

Check runs on this head: 14 success · 19 in progress · 2 failure, and ⛔ both failures are this one gate (two runs of it). ⇒ every other red from the first push is gone. ⭐ The 19 in_progress rows mean this PR is ⛔ not cleared yet — that is an honest reading, not a green one.

Which class this is, and why the COLLISION remedy must NOT be run

The gate names two classes with opposite remedies. This is the DELIBERATE CORRECTION class, and the gate's own source says what follows (scripts/check-empty-changeset.mjs:599-606), verbatim:

For the DELIBERATE CORRECTION class there is no second command to run, and step 1 above is the one thing not to do … say so on the PR, naming the note and what changed under it, and get it confirmed. That is the existing human path; this gate stays red either way, and staying red is what puts the decision in front of a person instead of routing around it.

git checkout <merge-base> -- .changeset/retire-adr-0030-notification-event-migration.md must not be run here, and neither must a rename: both are the COLLISION remedy, and either one deletes item 1 — the single item on this card carrying a release deadline.

The declaration — naming the note and what changed under it

⇒ The note as it stands is incomplete rather than false, which is why this is an addition and not a rewrite. ⚠️ It is still a change to a pending release note authored by another PR, so the gate is right to stop and ask.

⏳ The clock, stated plainly because it decides the cost of waiting

Once a release consumes this changeset the row can never be added — the card itself prescribes closing item 1 as missed at that point, and ⛔ content/docs/releases/ is release-owned and is never the place to patch it up. PR #17076 (chore: version packages) is open and awaiting a human merge, so the window closes the moment it lands.

What this seat is and is not doing

  • ⛔ This seat does not self-confirm a release decision. 〈红线〉: 「⛔ 永不跑版本发布、不合并 Version Packages PR」, and the manual floor covers release actions.
  • ⛔ The delivering dev has been told to stop touching this check; there is nothing it can do from its side.
  • No re-run was spent — a re-run cannot change a by-design verdict.
  • ✅ The maintainer has been asked for the confirmation this gate requires.

⭐ Recorded for the enqueue decision, since this red may have to ride: the gate does ⛔ not run on merge_group.github/workflows/pr-automation.yml declares on: pull_request with types [opened, synchronize, reopened, labeled, unlabeled, edited] and ⛔ no merge_group trigger — and its source self-describes as staying red for this class. ⇒ two of the three 「by-design red」 conditions are established by reading, and this comment is the third.

domain:cli execution PM seat · #6024 · session session_01DvvamiacK328idtBYJBxV3 · R76 · changeset-gate declaration · reading time 2026-09-16T08:25Z


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

裁定 — 维护者选 B:另开新 changeset,⛔ 不动既有发布说明

维护者原话(逐字):

b

对应本席在 2026-09-16T14:16Z 之前提出的三选一,B 的原文是:

B —— 授权改开一个新的 changeset 文件给 platform-objects,⛔ 不动那份既有发布说明。

⇒ 这是 check-empty-changeset 自己那句 「say so on the PR, naming the note and what changed under it, and get it confirmed」 里的 confirmed,由唯一有资格给的人给出。⛔ 本席不代拟、不扩解。

这条裁定改变了什么

之前 现在
既有的 .changeset/retire-adr-0030-notification-event-migration.md 被本 PR 加了一行 一个字节都不动,还原成 merge-base 的样子
@objectstack/platform-objects: minor 这个升级 挂在那份说明里 一份新的、按卡号命名的 changeset
Check Changeset by design 红,无解 预期变绿——本 PR 不再触碰任何 merge-base 上已存在的 changeset
落地路径 只能维护者手合(落地前检 ③ 无 by-design 豁免,见 #18404) 正常队列
发布结果 platform-objects 在本轮拿到 minor 不变,仍是本轮拿到 minor

⚠️ 唯一的代价,明说而不掩盖:CHANGELOG 里 platform-objects 会是独立一条,而不是挂在 adr-0030 退役说明那一行下面。语义相同,叙事分成两处。

⛔ 两条前提,交付方必须先证伪,⛔ 不得假定

  1. 还原 base 那份说明是否会「republish 一句现在为假的话」。 闸门对 DELIBERATE CORRECTION 类的整段警告都压在这一点上。本席的读法是 不会:那份说明是漏报(少了 platform-objects,而它是在原始退役 PR refactor(metadata,spec)!: retire the adr-0030-notification-event migration — no operator door, no platform invoker #17194 里变的),而本 PR ⛔ 根本不碰 packages/platform-objects。⇒ base 上那句是不完整,⛔ 不是这是前提,不是结论 —— 若实测发现它确实被本 PR 弄假了,⛔ 立刻停手上报,B 就不安全,裁定要重新交回维护者。
  2. 声明一个 diff 未触碰的包,会不会被别的闸门拒。 本席只读到 scripts/check-changeset-no-major.mjs:2697 的自测断言 「patch for a package the diff does not move under packages/**/src/** is not refused」。⚠️ 那一行说的是 patch,我们要的是 minor —— 两者不是一回事,必须对 minor 实跑一遍,⛔ 不得由 patch 推。

顺带更正本席自己的一处读数

此前本席报本 PR 「40 绿 + 3 条 by-design 红」。重读 head 466593dc 的 49 条 check run:failure 只有 Check Changeset 一个 check,出现 3 次是同一 check 被 labeled/edited 重触发的 3 次运行。⇒ 一条红,⛔ 不是三条。其余全为 success 或 skipped;PR 正文里写的 check:cross-package-test-inputs 红落在 Lint & Repo Gates 内部,而那一条 CI 上是 success

Ruling recorded and readings taken 2026-09-16T14:16Z.


Generated by Claude Code

…tirement note is restored

Ruling `5698965201` on PR #18389 chose route B: do not edit a changeset that
exists on the merge base. `.changeset/retire-adr-0030-notification-event-migration.md`
is restored byte-for-byte to its merge-base blob (2ae6527), and the
`@objectstack/platform-objects: minor` bump it was carrying moves to a new,
issue-scoped changeset.

The new note is written for a release reader rather than for this PR's reviewer:
a datastore created from empty now attests two creation-attested migration ids
instead of three, because `attestFreshDatastore` defaults to
`CREATION_ATTESTED_MIGRATION_IDS` and that tuple lost
`'adr-0030-notification-event'` in the retirement.

Declared cost of route B, named by the ruling: the CHANGELOG gets a separate
`platform-objects` entry rather than a row on the retirement note.

Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m and removed size/s labels Sep 16, 2026
@os-support-ai
os-support-ai marked this pull request as ready for review September 16, 2026 14:57
@os-support-ai
os-support-ai added this pull request to the merge queue Sep 16, 2026
Merged via the queue into main with commit b6471ba Sep 16, 2026
51 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-17281-adr-0030-retirement-residue branch September 16, 2026 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] Trailing edges of the adr-0030-notification-event retirement — a changeset row, a dead dependency, and two stale prose lines

2 participants