[2.0.1] - 2026-07-29
Changed
-
ROADMAP.mdstill saidCurrent version: 1.0.1two releases later, and the
Definition of Done for v2.0.0 stood almost entirely unchecked — after v2.0.0
had shipped and every P0 and P1 block below it was marked Done. A roadmap that
disagrees with its own blocks is worse than no roadmap: it makes finished work
look outstanding.The version is now 2.0.0 and the Definition of Done is closed against the tree,
each box naming the test or document that proves it so the next reader can
re-run the proof instead of trusting a checkmark. Everything cited runs in CI.Seven boxes stay unchecked on purpose. Five claim that
mq-agent,mq-mcp,
mqobsidian,repo-signal, andmq-halstill own their responsibilities —
claims about other repositories' trees, which this one cannot verify and must
not assert. Two namecontract-checkandstack-preflight, neither of which
is amqlaunchcommand; both returnUnknown command. The reasons are written
into the roadmap next to the boxes rather than left for someone to rediscover.
Fixed
-
release.shpushedmaindirectly while.mq/repo-contract.jsondeclared
release_mode: pull_request.maincarries no branch protection on GitHub,
so nothing outside the contract would have refused the push — and v2.0.0 was
in fact released through PR #106 plus a hand-made tag, meaning the script was
the one part of the flow that disagreed with how releases actually happen.The mode now comes from the contract rather than a flag; a flag would have
left./release.sh <version>working as a direct-push path in a repo whose
contract forbids one. Underpull_requestthe bump lands on a
release/v<version>branch, the branch is pushed, a PR is opened viagh
when available, the checkout returns tomain, and no tag is created —
tagging is a printed post-merge step, because the tag belongs on the merge
commit.release_mode: directkeeps the previous behaviour for repos whose
contract asks for it.tests/release-pull-request-mode-smoke.shproves it against a real bare
origin rather than a command log:main's SHA is unchanged, the release
branch exists and carries the bump, no tag was pushed, and the checkout is
back onmain. Dry-run is asserted to leave no branch, no commit, and a
clean tree;directis asserted to still advancemainand push its tag. -
release.shpromised in its usage text that "if the script aborts before
commit, VERSION, README.md and the contract are restored" — and never did so
for any of its gates. Bash does not run anERRtrap for an explicitexit,
and every gate exits rather than failing a command, so the CHANGELOG check,
the contract re-gate, and the tag checks all skipped the rollback. Driving
./release.sh --dry-run 2.0.1against this repo found it: three bumped files
left on disk, no rollback line, no failure line.An
EXITtrap now covers whatERRcould not. It is guarded on a mutation
flag rather than running unconditionally: before the first bump the tree still
holds the operator's own work, andgit checkout --there would discard it
rather than restore anything — mistyping a flag must not clean the tree. The
fix ships with therelease_modechange rather than after it, because a gate
tripping after the release branch is cut would otherwise strand the checkout
on that branch. -
docs/AUTHORITY_MAP.mdlisted
terminal/menus/mq-hal-menu.sh.bak.20260519-115142under Dead — DEPRECATED
as a file awaiting deletion. It is not in the repository and never has been.
.gitignorehas matchedterminal/menus/*.bak.*since 2026-04-12 and the file
is dated 2026-05-19, so it could not have been committed:git log --allon
the path is empty, and the path returns 404 onmain. It is an untracked
editor backup in a local working copy.The 2.0.0 entry that introduced the claim stays as written — a published
changelog records what was believed then — and this is the correction. The
error was reading a working directory and calling it the repository.
git ls-filesanswers that question and was not asked.