Stage 5 of the report-output migration.
Scope:
- dual-write live simulation create/update traffic into
- dual-write live report create/update traffic into
- keep parent pointers in sync (, )
- lazily bootstrap missing run/spec state so stage 5 can operate before stage 4 has fully backfilled history
- keep legacy API behavior and response shapes stable during the overlap period
Non-goals:
- stage 6 read cutover
- stage 8 rerun rewrite
Acceptance criteria:
- legacy POST/PATCH traffic updates both parent rows and run rows
- existing-row POST paths also repair missing dual-write state
- wrong-country report access is rejected correctly
- dual-write sync is transactionally coupled to parent-row writes
- report-side sync also bootstraps linked simulations so logical report state stays coherent
Stage 5 of the report-output migration.
Scope:
Non-goals:
Acceptance criteria: