v4.2.10-beta
Pre-releaseFixed — typed-legacy backlog projects could never leave compatibility mode
A project whose product tree used typed backlog folders (backlog/stories/,
backlog/debt/, …) with legacy work-item prefixes (STORY-, DEBT-, BL-, …)
was classified typed_legacy_backlog and parked in compatibility mode
permanently. The migrator for that layout was supported: false, graduation
required zero legacy prefixes (impossible for the shape), and recovery only
re-stabilized — so update, doctor, migrate, and recover could never get
the project out. Running them again did nothing, because the framework was built
to park it. This release builds and wires the missing migrator end to end.
- A real typed-legacy → unified
ISSUE-NNNmigrator.migrate_taxonomy
recognizes typed backlog dirs (including nesteddone/subdirs), top-level
legacy-prefix files, spike reports, and the bespokestories/EPIC-NNN/and
stories/BL-NNN/user-story trees. It produces a reviewable dry-run plan
(global ISSUE renumbering,EP-NNNepics,migrated_from, aMIGRATION-MAP,
and reference rewrites), then executes behind a snapshot with byte-for-byte
rollback and auto-rollback on failure. - The guard now offers the migrator.
migrate.typed_legacy_backlogis
supported; the recovery guard, doctor maintenance route, and bootstrap route a
typed-legacy project tosupported-migration-availableinstead of a no-action
compatibility mode. Projects with real (non-backup) duplicate IDs are routed
to a resolvable step, not a wall. - No project shape is a dead end — a test now asserts every guard status
routes to an offered action.
Bugs found and fixed while validating against a real corpus:
- The migrator crashed when run as a CLI (
No module named 'recovery') — i.e.
exactly howsweetclaude:migrateinvokes it; the test suite had masked it. - Migration left items behind: nested
backlog/stories/done/and
stories/BL-NNN/story dirs weren't scanned, so the project stayed
typed-legacy after "migrating." - Versioned draft documents (
BL-005-product-brief-draft-v1.0-….md) were
miscounted as work items, leaving the project reading asflat_bl_backlogand
faking duplicate-ID blockers. - Tool backups (
*.bold-backup-*) were counted as duplicate IDs and used to
justify refusing migration. - Recovery forbade the now-safe migration: the stabilize postcondition required
doctor to recommend no migration; it now fails only on unsupported migration. - Interrupted (
incomplete) migrations got stuck in recovery; stabilize now
normalizesincomplete → deferredso recover-then-migrate completes.
Fixed — dashboard detail-panel dates now show their timezone
Detail-panel date fields rendered as 2026-05-21 00:00:00.000Z because an
over-escaped regex in fmtDate was emitted literally into the page JS and never
matched. They now read 2026-05-21 00:00:00 UTC.