• v3.3.1 7693777b55

    v3.3.1 - the close stops lying about what it closed
    All checks were successful
    test / node-test (git, 22) (push) Successful in 22s
    test / node-test (git, 24) (push) Successful in 25s
    test / node-test (other, 22) (push) Successful in 18s
    test / node-test (other, 24) (push) Successful in 18s
    test / node-test (planning, 22) (push) Successful in 1m27s
    test / node-test (planning, 24) (push) Successful in 1m19s
    test / node-test (prose, 22) (push) Successful in 30s
    test / node-test (prose, 24) (push) Successful in 29s
    test / node-test (review, 22) (push) Successful in 17s
    test / node-test (review, 24) (push) Successful in 20s
    test / node-test (routing, 22) (push) Successful in 31s
    test / node-test (routing, 24) (push) Successful in 39s
    test / self-verify (push) Successful in 17s
    test / typecheck (push) Successful in 22s
    Stable

    john released this 2026-08-15 15:30:21 +00:00 | 782 commits to main since this release

    Signed by john
    GPG key ID: 693AB15F91734B0C

    First micro-release of the rolling cadence. Both fixes are cmdMilestonePrune, so this is one surgery on one function.

    Fixed

    milestone-prune stops reporting a half-finished close as a finished one. (#128)

    A phase whose directory could not be moved or deleted was collected as a warning and the loop continued, after which ROADMAP.md and REQUIREMENTS.md were pruned for every completed phase anyway and the envelope answered ok:true, action:"pruned". The comment above that loop promised the opposite, that a rename which throws leaves both documents untouched. It never did, because the throw never left the loop.

    The directory pass now runs first and only the phases it actually cleared reach the documents, so the tree and the docs still agree. A partial application returns ok:false, reason:"partial-prune" naming the phases that did not clear, and /cad-milestone halts on it instead of committing the disagreement. Re-running picks up only what is left.

    An _archive-<label> that is a symlink can no longer redirect the archive out of the planning root. (#138)

    The containment check was lexical, so a pre-existing link resolved inside the tree, mkdirSync succeeded silently against it, and renameSync followed it. The path is now classified with lstat before anything moves, and a per-phase destination left behind by an interrupted close is refused rather than clobbered.

    Verification

    1799 tests pass, self-verify reports no problems, typecheck clean. Four new seam tests, each shown red against the pre-fix seam.

    Full changelog: https://git.jcrenshaw.dev/crenshawdev/cadence/compare/v3.3.0...v3.3.1

    Downloads