v2.7.0 is a MINOR, additive release: it hardens the phase engine, the learning loop, the renderer's write path, and the self-lint, and completes the #203 audit-trail epic. It groups 13 merged PRs (#204–#218) across issues #194–#202 + the epic children #213/#214/#215. No breaking changes; a legacy manifest renders unchanged.
Added
- Phase-state transitions are enforced — a
delivery-state-consistentcheck rejects phase-skips (#199).delivery_state.checkpointsmust be a legal, contiguous chain ending at the current phase, withconfirmed_byon human-gated moves; a hallucinating agent can no longer setphase: scaffoldwithout the intervening checkpoints. - Fail-closed phase gates under
--strict; the dead--linksplumbing dropped (#200). Gate marks distinguishskipped(not applicable) fromneeds-input(a checkable input was withheld);--strictfails the phase onneeds-input, so a gate can't be satisfied by omission. - Interview provenance is enforced complete, not just well-shaped (#201). Every answer-bearing section needs a provenance entry (+
questionnaire_version), so a partial block no longer silently starves the learning loop. - The
agent-registryself-lint is now bidirectional (#202). A dead index link (a renamed/deleted persona) is caught, not just a missing persona. - Live
gate_resultsin a transition's checkpoint — the phase audit trail (#213). The checkpoint records the runner's own live evaluation of the deterministic gates, and — withat/confirmed_by— is the phase-tagged action record for every transition. - Optimistic concurrency for the manifest —
manifest_rev+--expect-rev(#214). Parallel sessions can no longer silently lose an update; a stale write is refused with aCONFLICT. - Learning-loop coverage (#215). A refactor-phase
--failurechannel + phase-tagged records, a corpus-scaledautotuneconfidence floor, and redaction of sensitive override values.
Fixed
yamlminirejects folded>block scalars instead of silently dropping the body (#194) — the fix also recovered thenotesbodies in every language profile.- A second same-day run record no longer requires falsifying its date (#197).
- The learning-loop miners skip a malformed record instead of aborting the analysis (#198).
Security
- The renderer refuses to clobber pre-existing files — additive by default,
--forceto regenerate (#195). - A
.gitpath segment is rejected at validation time, not just at write time (#196).
Verified on main: 16 self-lint checks green (incl. version-lockstep + i18n-freshness), 44/44 test scripts pass. Full detail in CHANGELOG.md.