Filed unassigned by the dev executing #15710 (branch claude/issue-15710-notification-event-migration-ledger-claims), as an out-of-scope observation. ⛔ Not fixed in that PR: it is a different defect class from the card (a remedy-text mapping, not the ledger-claim matrix), so it is filed rather than ridden.
What was observed
packages/platform-objects/src/system/migration-flag.ts, attestFreshDatastore: when this boot has already admitted a value that contradicts a migration's contract, the id is not attested and the operator is told how to close the gate on real evidence:
'Fix the data, then run `os migrate ' + (id === FILE_REFERENCES_MIGRATION_ID ? 'files-to-references' : 'value-shapes') + ' --apply` to close it on real evidence (ADR-0104).'
The remedy is a two-way ternary over an array that, after #15710, has three members: adr-0030-notification-event now iterates through the same loop, and for it the ternary would name os migrate value-shapes --apply — a command that has nothing to do with that migration. The ADR-0030 cut-over has no os migrate command and no self-check; what a run of it may claim is documented on NOTIFICATION_EVENT_MIGRATION_ID in packages/spec/src/system/migration.zod.ts.
Why it is not a live defect today (measured on 35819dff2)
The contradiction branch is entered only when engine.valueShapeViolationsAdmitted() carries the id. The engine (packages/objectql/src/engine.ts) tallies admitted violations keyed by FILE_REFERENCES_MIGRATION_ID and VALUE_SHAPES_MIGRATION_ID only, so the third id never reaches the ternary. It is a wrong answer sitting on an unreachable path — an observation, not a regression, hence finding and no priority.
What would make it reachable, and the shape of a fix
Any future tally keyed by another id, or a fourth creation-attested member that does have its own os migrate command. Suggested shape: replace the ternary with an explicit id → remedy mapping that is total over the ids that CAN be contradicted (today the two ADR-0104 ids), and have the loop treat an id without a value-shape contract as never-contradictable instead of falling into the value-shapes arm — so a new member cannot inherit a remedy by default. A pin that feeds a contradiction for a non-ADR-0104 id and asserts the warning does not name value-shapes would hold it.
Re-check
git grep -n "files-to-references' : 'value-shapes'" -- packages/platform-objects/src/system/migration-flag.ts
git grep -n "valueShapeViolationsAdmitted" -- packages/objectql/src/engine.ts
git grep -n "NOTIFICATION_EVENT_MIGRATION_ID" -- packages/spec/src/system/migration.zod.ts
Dedup: REST /search/issues answers 403 through this container's proxy (by design), so this was one targeted MCP search_issues, with a control on the same channel returning #15710 first for its own title. Nearest neighbours, neither this: #4891 (showcase seed data: URIs blocking attestation, closed), #15490 (value-shapes finding detail text). Related: #15710 (the ruling that added the third member), #4769 (the contradiction path itself).
Generated by Claude Code
Filed unassigned by the dev executing #15710 (branch
claude/issue-15710-notification-event-migration-ledger-claims), as an out-of-scope observation. ⛔ Not fixed in that PR: it is a different defect class from the card (a remedy-text mapping, not the ledger-claim matrix), so it is filed rather than ridden.What was observed
packages/platform-objects/src/system/migration-flag.ts,attestFreshDatastore: when this boot has already admitted a value that contradicts a migration's contract, the id is not attested and the operator is told how to close the gate on real evidence:The remedy is a two-way ternary over an array that, after #15710, has three members:
adr-0030-notification-eventnow iterates through the same loop, and for it the ternary would nameos migrate value-shapes --apply— a command that has nothing to do with that migration. The ADR-0030 cut-over has noos migratecommand and no self-check; what a run of it may claim is documented onNOTIFICATION_EVENT_MIGRATION_IDinpackages/spec/src/system/migration.zod.ts.Why it is not a live defect today (measured on
35819dff2)The contradiction branch is entered only when
engine.valueShapeViolationsAdmitted()carries the id. The engine (packages/objectql/src/engine.ts) tallies admitted violations keyed byFILE_REFERENCES_MIGRATION_IDandVALUE_SHAPES_MIGRATION_IDonly, so the third id never reaches the ternary. It is a wrong answer sitting on an unreachable path — an observation, not a regression, hencefindingand no priority.What would make it reachable, and the shape of a fix
Any future tally keyed by another id, or a fourth creation-attested member that does have its own
os migratecommand. Suggested shape: replace the ternary with an explicit id → remedy mapping that is total over the ids that CAN be contradicted (today the two ADR-0104 ids), and have the loop treat an id without a value-shape contract as never-contradictable instead of falling into thevalue-shapesarm — so a new member cannot inherit a remedy by default. A pin that feeds a contradiction for a non-ADR-0104 id and asserts the warning does not namevalue-shapeswould hold it.Re-check
Dedup: REST
/search/issuesanswers 403 through this container's proxy (by design), so this was one targeted MCPsearch_issues, with a control on the same channel returning #15710 first for its own title. Nearest neighbours, neither this: #4891 (showcase seed data: URIs blocking attestation, closed), #15490 (value-shapes findingdetailtext). Related: #15710 (the ruling that added the third member), #4769 (the contradiction path itself).Generated by Claude Code