Skip to content

v2.0.1

Latest

Choose a tag to compare

@MCamner MCamner released this 29 Jul 12:15
v2.0.1
3648379

[2.0.1] - 2026-07-29

Changed

  • ROADMAP.md still said Current version: 1.0.1 two 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, and mq-hal still own their responsibilities —
    claims about other repositories' trees, which this one cannot verify and must
    not assert. Two name contract-check and stack-preflight, neither of which
    is a mqlaunch command; both return Unknown command. The reasons are written
    into the roadmap next to the boxes rather than left for someone to rediscover.

Fixed

  • release.sh pushed main directly while .mq/repo-contract.json declared
    release_mode: pull_request. main carries 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. Under pull_request the bump lands on a
    release/v<version> branch, the branch is pushed, a PR is opened via gh
    when available, the checkout returns to main, and no tag is created —
    tagging is a printed post-merge step, because the tag belongs on the merge
    commit. release_mode: direct keeps the previous behaviour for repos whose
    contract asks for it.

    tests/release-pull-request-mode-smoke.sh proves 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 on main. Dry-run is asserted to leave no branch, no commit, and a
    clean tree; direct is asserted to still advance main and push its tag.

  • release.sh promised 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 an ERR trap for an explicit exit,
    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.1 against this repo found it: three bumped files
    left on disk, no rollback line, no failure line.

    An EXIT trap now covers what ERR could 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, and git checkout -- there would discard it
    rather than restore anything — mistyping a flag must not clean the tree. The
    fix ships with the release_mode change 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.md listed
    terminal/menus/mq-hal-menu.sh.bak.20260519-115142 under Dead — DEPRECATED
    as a file awaiting deletion. It is not in the repository and never has been.
    .gitignore has matched terminal/menus/*.bak.* since 2026-04-12 and the file
    is dated 2026-05-19, so it could not have been committed: git log --all on
    the path is empty, and the path returns 404 on main. 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-files answers that question and was not asked.