Fixed
spec-kitty init/ any CLI command no longer dirties the git repo — every CLI invocation that touched status was unconditionally rewritingkitty-specs/*/status.json, even when nothing had changed, leaving ~60 files modified ingit status. Root cause:materialize()stamped a freshdatetime.now(UTC)intomaterialized_aton every call. Fixed inreducer.py(3.1.1a1):materialized_atis now derived deterministically from the last event'sattimestamp (or""for features with no events), and a content-equality guard skips the write when the file is already up to date. Closes #524.
Added
- Migration
3.1.1_normalize_status_json— one-shot upgrade migration that normalises all existingkitty-specs/*/status.jsonfiles to the new deterministic format. Runs automatically onspec-kitty upgradefor any project where the committed files still carry old wall-clock timestamps or the legacyfeature_slugfield. After the migration the skip-write guard inmaterialize()keeps all status snapshots stable indefinitely.
Changed
StatusSnapshotandProgressResultserialisation no longer emitsfeature_slug—with_tracked_mission_slug_aliasespreviously injected a redundantfeature_slugalias into every serialised snapshot. Now onlymission_slugis written. Reading still accepts both keys for backward compat with existing files.