Skip to content

The adr-0030-notification-event migration has no operator path: no production caller and no os migrate sub-command, while its two sibling attested ids have both #16194

Description

@claude

What is missing

migrateSysNotificationToEvent — the adr-0030-notification-event data migration — has no way to be run. It is exported, tested, documented and now has a ruled sys_migration receipt contract, and there is no path by which an operator can invoke it.

Two independent measurements tonight, from two seats that were not looking for the same thing:

① No production call site. Every non-CHANGELOG reference to the symbol, re-measured on today's origin/main:

site what it is
packages/metadata/src/migrations/migrate-sys-notification-to-event.ts:71 the definition
packages/metadata/src/migrations/migrate-sys-notification-to-event.ts:26-27 its own usage docblock
packages/metadata/src/migrations/index.ts:50 the barrel export
packages/metadata/src/migrations/driver-exec.ts:14 a comment mentioning it, not a call
packages/spec/src/system/migration.zod.ts the id's docblock
migrate-sys-notification-to-event.test.ts, real-driver-exec-surface.test.ts tests

⇒ zero callers in packages / apps / examples. The instrument is alive — the same grep finds the symbol in 13 files — so this is a zero about the production-caller subset, not a dead grep. (Triage on #16100 measured the same thing at a4816a7 and additionally excluded both candidates the card had named: sys_migration occurs **0 times in all of packages/metadata``, and serve.ts`'s only occurrence is an unrelated comment.)

② No os migrate sub-command. packages/cli/src/commands/migrate/ contains apply.ts, duplicates.ts, files-to-references.ts, index.ts, meta.ts, multi-value-columns.ts, plan.ts, recorded-by.ts, resume.ts, summary-nulls.ts, value-shapes.ts — and nothing for this migration. The directory listing is its own control: the two siblings are there.

⭐ The sharpest form of it: CREATION_ATTESTED_MIGRATION_IDS has exactly three members —

FILE_REFERENCES_MIGRATION_ID,      → os migrate files-to-references
VALUE_SHAPES_MIGRATION_ID,         → os migrate value-shapes
NOTIFICATION_EVENT_MIGRATION_ID,   → (nothing)

Two of the three have a sub-command. The third does not. That asymmetry inside a set the spec declares as one class is the finding.

Why it matters now rather than whenever

The sys_migration receipt contract for this id was ruled and landed (a7da4de6f, #15710), and #16100 is implementing the writer. That contract's execution sentence is "after a completed non-error run of the migration, the caller that owns the datastore handle writes…" — ⇒ there is no run to hang it on. The receipt writer will be correct, pinned, and unreachable by any operator on the day it lands.

A third seat measured the same gap from the other side: the #16067 round chose the wording "it never reaches this branch at all" over inventing a remedy sentence for this id precisely because it measured, with a firing control, that no such sub-command exists.

What this card is NOT

The question a maintainer has to answer

Is adr-0030-notification-event meant to be operator-runnable, or is it a migration the platform runs on its own (or never runs again)?

  • Operator-runnable ⇒ it needs an os migrate notification-event sub-command shaped like its two siblings (dry-run default, --apply, the receipt written per the ruled matrix), and that is a domain:cli card.
  • Platform-run ⇒ it needs an invoker somewhere in boot or in os migrate apply, and the ruled receipt matrix tells that invoker exactly what to write.
  • Neither / retired ⇒ then the receipt contract, the ledger pin and its membership in CREATION_ATTESTED_MIGRATION_IDS are all describing something that cannot happen, and that should be said out loud rather than left as three landed artefacts around an unreachable function.

⛔ This card takes no position between the three. It records that the gap exists, that it is measured from three independent directions, and that the receipt work now landing makes it visible.

Provenance

Triage on #16100 (comment 5556315594) measured ① and ②, judged it "an independent defect worth its own card", and left it unfiled with 145 bare cards in the queue, inviting the engine seat to open it. The #16067 round measured ② independently. Both readings re-run on today's origin/main by the PM dispatch seat before filing.

Related: #16100 (the receipt writer, in flight) · #15710 (the ruled contract, landed) · #16067 (the round that measured ② from the other side).


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions