💥 Changed
- Op record schema v2 (WP01, do-dispatch-open-op-lifecycle): the dual-purpose
InvocationRecordmodel is split into frozenOpStartedEvent/
OpCompletedEventPydantic v2 models. Completed events now requireoutcome
andclosed_byand carry no started-only fields; blank-default records are
unrepresentable. Readers ofkitty-ops/*.jsonlwarn-and-skip legacy (pre-v2)
lines, pointing atspec-kitty upgrade;parse_op_eventraises a catchable
LegacyRecordErrorfor them.spec-kitty invocations listnow shows
outcomeandclosed_byfor closed Ops.artifact_link,commit_link, and
glossary_checkedevent shapes are unchanged. - Breaking —
spec-kitty dono longer auto-closes its Op asdone
(do-dispatch-open-op-lifecycle):do/ask/advisenow only OPEN the
Op and load governance context; the working agent closes it via
spec-kitty profile-invocation complete --invocation-id <id> --outcome <done|failed|abandoned>(completed-event schema v2:outcome
required, newclosed_byfield). Newspec-kitty doctor ops --close-stale
sweeps stale open Ops closed asabandoned(closed_by: doctor_sweep).
Legacykitty-opsrecords are migrated (rewrite-or-delete) by
spec-kitty upgrade. Claude Code session presence now lists open Ops at
session start, a newStophook (spec-kitty session-stop) reminds at
session end, and the doctrine skill pack / standalone command templates
document the open→work→close contract.
🐛 Fixed
- Hardened the v2 Op migration and readers:
spec-kitty invocations listskips
danglingops-index.jsonlrows after unsalvageable Op files are deleted, and
migration idempotency now treats only v2-parseablemode_of_work/closed_by
values as already migrated. - Preserved machine-readable output for
do,ask, andadvise --jsonby
suppressing post-payload inline glossary notices on JSON paths; rich output
still shows the notices. - Updated the rich
ask/adviseclose hint to include the now-required
--outcome <done|failed|abandoned>flag. - Replaced stale short profile aliases in shipped mission-runtime templates
(researcher,architect,planner,implementer,reviewer) with the
canonical shipped profile IDs, preventing freshsoftware-devruns from
blocking on missing invocation profiles. spec-kitty mergenow skips empty post-merge bookkeeping commits after a
successful lane merge instead of failing the command after the target branch
has already been updated.