Skip to content

v0.44.1

Choose a tag to compare

@yahor-punko yahor-punko released this 13 Aug 18:48
· 8 commits to main since this release

[0.44.1] — 2026-08-13

Fixed

  • A gate-review mechanism (DR-008) got its first real test against this project's own publish gates, and kept every one of them (T-643, T-647) — DR-008 requires any blocking gate with zero real fires since the last stable release to get an explicit keep/demote/retire review, not sit unexamined. The review covered the publish-overlay's seven "tiers" (checks limiting how much of the shipped tree a sync can delete) plus the manifest-classification advisory, and retired none, for three reasons: a ledger claim that some tiers made others redundant had quietly gone false through ordinary growth — the floor a tier compares against only moves on deliberate re-seeding, while the real count it competes against keeps climbing on its own, so a "redundant" tier can end up the stricter, load-bearing one, and the gap widens every wave that adds a script; one tier exists purely to be lenient, forgiving file moves/renames, so removing it would make the remaining checks stricter and noisier — the opposite of what "retiring complexity" usually means; and the manifest advisory's firings are invisible by design, visible only in an agent's own transcript, so "it never fires" could not be verified either way. The lesson: zero recorded catches is a prompt to look closer, not evidence it's safe to remove.
  • The session-start "must read" list now catches uncommitted and even untracked work from a session that ended abnormally, not only work that was already committed (T-644) — previously, the list of "what changed since we last formally wrapped up" was built purely by comparing git commits, so if a session crashed or was cut off before running its own close-out step, any notes or edits it had made — including its own log of what it had just done — simply vanished from the next session's reading list, because they were never committed in the first place. The fix makes the same computation also look at your working tree's uncommitted edits and any new files git doesn't yet track (skipping anything covered by .gitignore), and combines all of that with the usual commit history. Under the hood, the three git lookups that feed this now fail independently of one another — a problem reading one no longer wipes out results the other two already found — and a generous 32 MiB memory ceiling was set explicitly so a very large batch of new files can't silently overflow the default and quietly return nothing.
  • The end-of-session close-out no longer overwrites the wave's stated goal and working notes just because you closed a session mid-wave, and no longer erases them either (T-648) — closing a session used to always reset two fields tracked in the project's state file: a short note describing what the current wave is working toward, and a longer scratch note holding in-progress context. Previously, the goal note would silently carry over into the next wave once the current one actually finished (so a new wave could start already displaying an old, unrelated goal), while the scratch note was wiped on every single close — including an ordinary pause partway through a wave that was still very much in progress, discarding context that wave still needed. Both fields now only reset when a wave genuinely completes and the next one opens; if you're just pausing mid-wave, both are preserved exactly as you left them. If you or your tooling depend on the previously documented behavior — this project's own guidance said the scratch note "persists until the next close-out" — that description no longer holds; it now persists across any close that doesn't finish the wave, and clears only when the wave advances.
  • The reminder to bump the framework's version number after a session no longer fires just because a file got reclassified between "shipped" and "not shipped" in the publish manifest (T-649) — that reminder is driven purely by whether anything under the tooling folder (scripts/) changed since the version was last bumped, and one specific kind of change there — moving an entry between the shipped and excluded lists in the manifest that decides what gets published — doesn't itself change what any adopter's copy of the tooling actually does, so it shouldn't have been prompting a bump. That one file is now excluded from the check, and when the reminder does fire for a genuine reason, it now also names the specific file(s) that changed, rather than only saying "something in scripts/ changed." Note the residual: if that same manifest file's entries change what actually ships in the published file tree (not just how one entry is classified), that's still covered by this project's other release safeguards — it just no longer double-counts as its own version-bump trigger.
  • Framework version bumped 0.44.0 → 0.44.1 in both scripts/mavp-version.js and package.json (T-650) — a patch bump: wave 80 corrects existing behavior and adds no new command, flag, field, or schema.

The 0.44.0 release notes are included below: that version was tagged on the mirror but never got a GitHub Release, so this entry carries both.

[0.44.0] — 2026-08-13

Added

  • Non-interactive --close-session now proposes booking for shipped-but-unbooked work (T-637) — when a task sits at qa_passed and the commit: hash in its TASK_STATUS.md Evidence is already reachable from HEAD, the non-interactive close prints one advisory line naming the task and the exact command to book it (./scripts/mavp-operator --set-status <id> merged). This is propose-only by design: it never writes state itself, and it complements — never replaces — the existing "Wave N stays open" line, so wave-hold semantics are unchanged. On a shallow clone, where commit reachability cannot be answered, the advisory stands down by name and deliberately carries no --set-status suggestion; when git is unavailable it stays silent. The commit-reachability helpers (extractCommitHashesFromEvidence, buildReachableHashIndex, isHashReachable) moved from mavp-validator.js into the shared mavp-operator-lib.js, with the validator keeping re-exports so no consumer changes.

Fixed

  • --worktree-report / --prune-worktrees now refuse an unresolvable main ref instead of silently classifying every worktree unintegrated with an inert prune (T-633) — on a repo whose default branch is master, or with a mistyped --main-ref, the report previously asserted falsehoods about every worktree's integration state. A classifier that gates git branch -D must refuse when it cannot check.
  • The shipped test suite no longer depends on git's init.defaultBranch (T-632, T-634) — every fixture git init call is now pinned to an explicit initial branch, plus a new static guard test that fails naming the file and line for any future unpinned fixture init.
  • test-close-session-mode.js teardown ENOTEMPTY race on Node 22 (T-636) — fixed by converging fixture cleanup on the file's shared helper, with maxRetries/retryDelay.

Docs

  • The shipped-but-unbooked advisory is documented in docs/core/TASK_LIFECYCLE.md and CLAUDE.md (T-638).