rungs versions and changelog

Versions
Versions & changelog
Latest
0.5.0 · published 2026-09-13
Next
nothing pending · fragments accumulate in changelog.d/
Updated
2026-09-06
Release history · assembled from changelog fragments
v0.5.02026-09-07 · minor · npm latest
addedeject keeps its promise: the ejected runner is one esbuild bundle carrying every engine and runtime dependency, gate tables are frozen as substituted JSON beside the raw module metadata, and .ai/rungs.mjs becomes a local forwarder — node .ai/rungs.mjs check runs with no npm, no package and no rungs checkout, with the same tiers, output, ledger and exit codes. A repeat eject is byte-idempotent; an edited launcher or a foreign .rungs/ refuses before anything is written.
addedThe shell-safety hook reaches consumers: instructions-shell-backticks has an engine, a dispatch command (rungs hook <gate-id>: exit 2 blocks, 0 permits, 1 never blocks) and a delivery path — one PreToolUse entry merged into .claude/settings.json naming the pinned launcher for the claude harness, a degradation row in .ai/render-report.md for every other, and the hook retained after ejection (ADR-0010).
addedInstruction diagnostics, built the way the oracle allows: instructions-imperatives is an explain-only evidence surface (surface = "explain") listing every line that states a rule with no verdict on enforcement (ADR-0011), shaped by a hand-classified oracle and measured at 0% false positives on four repositories and 15.6% on the fifth; instructions-stale-commands is a real gate checking npm-script and rungs-command references against the surfaces that define them.
addedfast_budget_ms is finally read: ledger rows carry ADR-0005's full schema (run id and tier beside date, id, status, wall-clock and examined count) and doctor reports the fast tier's observed serial wall-clock over the last ten runs beside the declared budget — a measurement, never a verdict.
addedAn interrupted install is visible and completable: add and init journal under .ai/ before the first write, write every module file atomically, and clear the journal only after the record and renderings are saved; a retry of the same modules finishes it and keeps the files the interrupted run created as rungs-owned, a different module set is refused until then, and doctor reports the in-flight install.
fixedEvery shipped self-test fixture executes through its real engine, and an engine that throws on its own fixture is a gate failure, not a coverage gap. Running them implemented the table rules nothing had read (sections when and required_subsections, frontmatter field_shape, register requires_note, population exempt_marker and similarity, register-row ids, index currency and never-rendered detection) and surfaced three shipped defects: a reasonless exemption marker that exempted anyway, a findings-closure row pattern that matched no real row, and two gates sharing one table entry.
fixedworktrees never calls an unreadable tree prunable: a worktree whose status cannot be read is listed as status UNKNOWN with Git's reason and withheld from the prunable count.
fixedA fresh decision index passes its own gate: adr-index-current no longer counts the template's placeholder row as a record, render emits the same placeholder for zero sources, and the shipped template is byte for byte what render writes. Found by a disposable Arena Lab canary, which failed 1 of 24 gates on an untouched scaffold (adr 1.2.1).
fixedThe eject summary names every retained command — it said only check survived one release after hook did too.
fixedadd after init extends the install record instead of rewriting it with that run's modules, so doctor, upgrade and eject keep seeing everything that was installed; the packed journey now runs add after init.
fixedcheck [path] [tier] is one grammar on the CLI and the ejected runner: a lone positional that is not an existing directory is the tier, an unknown tier is reported as one, and the ejected runner refuses a path that is not its own repository.
fixedA failing assertion can no longer take the machine down: every test file imports a guarded assert that refuses to diff two large differing values, the tests-guard-large-equality gate holds that import and a heap cap on the test script, and npm test runs files serially under it.
fixedThe repository's private inline-interpreter hook stops blocking honest multi-line commands: it judges the interpreter's own argument segment only and ignores heredoc bodies that feed no interpreter (private to this repository, not a shipped module).
fixeddesign-sync no longer ships a gate that checks nothing: design-mirror-not-edited, which declared a detection no engine implements and a command that never existed, is retired; module-commands-exist now reads generated_by values as command claims (design-sync 1.1.0).
v0.4.02026-09-05 · minor · published
addedGenerated repositories share one managed .ai/rungs.mjs launcher pinned to an exact @rungs/cli version — local instructions and generated CI run the same one, and upgrade --to an exact version is the bounded path for advancing the pin.
addedModule provenance can state that work was designed rather than extracted, with a first-person rationale instead of an invented source incident.
addedThe package suite runs a packed CLI against an isolated existing Git repository: authority preservation, origin-only stable refs, repeated checks, same-version upgrades and rollback.
fixedModule emission, upgrade and harness rendering preflight one canonical consumer-repository boundary before writing. Traversal, outward aliases, unpaired surrogates, hard-linked leaves, reserved-sink impersonation, cross-phase collisions and leaf-symlink redirects fail closed with no partial install, and missing-path comparison applies the same NFKD, full-case storage key as managed refs so APFS cannot collapse an alias past it.
fixedrungs land refuses before locks, gates or ref updates when any worktree holds the integration branch, names every holding path, and parks a verified merge when a holder appears mid-gate.
fixedrungs land advances integration and green in one no-dereference, expected-old transaction or writes neither, and a refusal parks the work on a collision-free recovery branch it never overwrites.
fixedrungs land proves inherited red against a clean detached checkout at the exact integration commit: a gate that passes only with the invoking checkout's ignored runtime is reported unverified and cannot advance.
fixedrungs backlog archive validates its root, move sources, destinations and every Markdown rewrite as one contained mutation set, so a forged or stale plan fails closed before anything is written.
fixedBoth release-fragment gates now execute the contracts they declare — shipping code needs a fragment changed by the same branch or a same-line reasoned exemption, and stale versioned fragments reach the production runner through one strict table selector.
fixedchangelog.d/CONSUMED_THROUGH records the version whose fragments were assembled, so an equal-version fragment left behind after a cut fails rather than reading as unreleased work.
fixedA release-note exemption counts only when the branch needing it wrote it. An inherited, duplicated, moved or copied changelog-ok: reason can remain as history but cannot waive unrelated work.
fixedrelease-version-consistent reads dotted values from JSON and TOML plus the configured XML element in Directory.Build.props, fails explicitly on a matched source that is malformed, missing or unsupported, and takes a real release.version_exclude parameter for independently versioned manifests.
fixedConsumer text gates and neutral-rule rendering read LF, CRLF and lone-CR checkouts with the same semantics; re-registering an unchanged managed gate block preserves surrounding bytes and line endings, and a semantic no-op no longer rewrites the install record.
fixedDeclared module conflicts are enforced symmetrically and propagate through dependency edges; an explicit override names what it overruled.
fixedA freshly generated findings register passes its own schema instead of reading its visible empty placeholder as a malformed finding.
fixedBacklog branch reconciliation resolves a local stable branch, an exact origin ref or a sole remote-tracking ref deterministically, and fails closed on absence or ambiguity.
v0.3.12026-08-17 · patch · published
fixedbacklog-merged-status had never worked on Linux or macOS — it passed a git format string through a shell, where the parentheses are a syntax error. It ships in four of five profiles.
fixedThree more gates read the module set through a path that only resolved on Windows, so a legitimate opt-in read as a non-spec key and gates with fixtures read as having none.
fixedCRLF checkouts defeated the anchors in emitted module content, so a rule that was present read as missing.
changedrungs runs its own gates in CI across ubuntu, macos and windows. Its first runs found every fix above in under a minute.
changedThe release runbook now opens its irreversible section by reading the CI run for the commit being tagged. 0.3.0 was published on a red build.
v0.3.02026-08-17 · minor · published
addedThe concurrency loop: session start, preflight, land and worktrees — four commands the module had documented for weeks without any of them existing.
addedland attributes each failure against the merge base — inherited never blocks, INTRODUCED does, and anything unattributable blocks too.
addedrungs runs its own gates in CI across ubuntu, macos and windows on node 22.18 and 22. It had none.
addedmodule-commands-exist: every command a module tells a repo to run must be one the CLI dispatches, both sides derived from the dispatch itself.
fixedThe ci module shipped a workflow that failed on every run in three of five profiles, blaming the repo for it.
fixedbacklog archive could never archive an epic whose children had landed, and skipped any item named like the template.
fixedsetup wrote git config into the current directory while reporting success about the repo you named.
fixed--set confirmed overrides it had not applied, so a mistyped parameter installed the default and said otherwise.
changedrelease-version-consistent takes an exclude list, and this repo's site is versioned in lockstep rather than excluded.
v0.2.02026-08-17 · minor · published
addeddoctor --explain runs the detectors on a repo that never installed rungs, and plain doctor says the analysis exists.
addedDetection treats an external issue tracker as a different paradigm, and add stops rather than installing over it.
addedrungs backlog archive, and a self-test runner that executes each gate's fixtures on every check.
addedThe skill-extension opt-in, so a repo can extend a module's skill and keep it through upgrade.
addedrelease-fragment-current: a changelog fragment below the version being prepared was consumed by an earlier release and should have been deleted.
changedA gate tier is an ordered level, not a tag (ADR-0008): full is a superset of fast, and an undeclared tier is refused instead of passing empty. Breaking for a consumer using tiers as disjoint sets.
changedDetector applicability is declared per gate with no default (ADR-0007).
changedThe site derives its structural counts from the registry and refuses to build when they drift.
fixedupgrade re-registers a module's gates and updates the install record without touching diverged files.
fixedLink checking resolves file.ts:387 code references, and the REAL OUTPUT label only sits above captured output.
fixedA tier that matches no gate now names the tier and exits non-zero, instead of asking whether this is a rungs repo. The cut-release skill gated on it.
v0.1.32026-08-15 · patch · published
addedThe design-system Versions & changelog page and release-history surface.
changedThe shared footer now links Versions, npm, and GitHub without stale phase or namespace claims.
changedPackage metadata, README, roadmap, and site navigation agree on the next release.
v0.1.22026-08-15 · patch · published
changedPackage metadata and the public homepage now point to docs.rungscli.com.
v0.1.12026-08-15 · patch · published
addedA bundled JavaScript rungs executable for clean Node 22 consumers.
addedThe self-declared-finding-closure gate and regression coverage.
changedThe static site moved to Astro 7.2.2 with a clean consumer smoke journey.
Nothing pending

v0.5.0 is tagged, deployable from release/0.5.0, and on npm as latest. Work for the next release lands on main through rungs land, and the version it becomes is decided from the fragments in changelog.d/ at cut time — not from this sentence, and not from a branch name. (This sentence used to name a candidate branch; every candidate so far drifted tens of commits behind main with nothing on it.)

Status · what exists alongside the version
32 gates register, plus 1 hook that fires on a tool call and 1 explain-only detector · 2026-09-06 · npx @rungs/cli check32 pass0 fail0 unimplemented · 15 modules
The release model · defined before the first release

candidate-and-release-lines pattern-catalog §H keepscandidate/<version> integrating the next release, main stable, and release/<version> deployable and rollbackable. The version is chosen from the fragments at release time; branch names are prefixes, not promises.

cut-release: initialize boundary → decide from fragments → gate
             → assemble/delete + advance boundary → bump → final gate
             → tag → cut release/<version> → open next candidate
hotfix:      fix + fragment → same prepare/bump/final gate → patch tag
             → merge stable + forward into candidate
rollback:    point deploy at previous release/<version>; never revert commits

Summarised from modules/release/skills/cut-release/SKILL.md. Not command output.

Changelog discipline · fragments, not memory
Entries land with the change

Each release-worthy change adds one fragment to changelog.d/ on the same branch. The next version is decided from those fragments, not reconstructed at tag time. After assembly, CONSUMED_THROUGH advances with the version so an equal-version fragment left behind cannot look unreleased.

gated release-changelog-fragment · change-requires-file
gated release-fragment-current · changelog-freshness, boundary-backed in 0.4.0
The version agrees with itself

release-version-consistent compares configured JSON, TOML and XML version sources rather than trusting the releaser. TOML participation shipped in 0.4.0, which is why this sentence no longer holds it back; a matched source that is malformed, missing or unsupported fails explicitly rather than dropping out of the comparison and leaving a green built on fewer files than you think.

gated release-version-consistent · computed-claim
Module versions · what rungs records

Installed modules are pinned in .ai/rungs.toml, while managed regions carry the module version that wrote them. doctor reports divergence and upgrade leaves overridden regions alone.

<!-- rungs:begin backlog@1.0.0 -->
…managed content…
<!-- rungs:end backlog@1.0.0 -->
moduleversionstatus
instructions1.4.0authored
adr1.2.1authored
backlog1.2.0authored
ci1.2.0authored
findings1.2.0authored
gates1.1.0authored
session1.3.0authored
audit1.1.0authored
skills1.1.0authored
specs1.1.0authored
workflows1.2.0authored
design-sync1.1.0authored
release1.6.0authored
doc-authority1.1.0authored
concurrency1.4.0authored
Note
Published versions are immutable. The next release is assembled from its fragments, tagged, and published once; it is never rewritten in place after users can install it.