I1982 — Plan stamps written before seals existed are re-sealed by a command that keeps their original times
Provide a migration step (for example `plan seal --backfill`) that seals the stamps an older tool wrote, keeping each stamp's original time and recording who sealed it and when. Make the seal cutoff a per-repository value rather than one global constant.
BLOCKED wave 1 · p1 · implementation profile · parallel safe
Blocked. This issue cannot start until I1980 is done. The status is derived from that, not declared.
Objective
Provide a migration step (for example `plan seal --backfill`) that seals the stamps an older tool wrote, keeping each stamp's original time and recording who sealed it and when. Make the seal cutoff a per-repository value rather than one global constant.
Why
OSCILLA had to replay every plan transition with 0.12 to satisfy sealed stamps (34f967a), so its stamps now carry the replay time and the true times survive only in git. This repository excused its own pre-seal stamps by hand with unsealed_stamps (91080bd64f). SEALED_FROM = 2026-10-01T00:00:00Z is hard-coded in lib/project.awk:45 and apps/majordomus-cli/src/plan.rs:122, so a stamp a 0.11 tool wrote after that date can never be excused.
Current state
No command seals or excuses existing stamps; both engines share a fixed cutoff.
Desired state
One command, run by `migrate --layer` from I1980, that seals or excuses every unsealed stamp with provenance and leaves the times unchanged. Both engines read the cutoff from the repository.
Scope
- lib/plan.sh
- lib/project.awk
- apps/majordomus-cli/src/plan.rs
- docs/PLANNING.md
- test/cases
Dependencies
Acceptance criteria
- A fixture with stamps written before sealing passes plan validate after the backfill, with every stamp's time unchanged
- Both engines agree on the cutoff read from the repository; case 582_the_done_guard_holds_in_both_engines still passes
Validation
- bin/majordomus plan validate
- MJ_TEST_JOBS=4 bash test/run.sh <the case this issue adds>
Evidence required
- reseal_keeps_times_case
- cutoff_per_repository
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1982.yaml. Read it back with majordomus plan show I1982.