Skip to content

Releases: purpleeddy/cladding

v0.10.1 — Runs on Node 16, and says so honestly

Choose a tag to compare

@qwerfunch qwerfunch released this 11 Sep 06:51
2d456db

In one line: A global install on Node 16 used to die inside Node's own module loader before printing anything; the command-line entry point now loads on every release, and the supported floor drops from Node 20 to Node 16 because the dependency that was holding it up has been removed.

Heads-up: nothing changes if you are on Node 18 or newer — that already worked. If you are on Node 16 or 17, cladding now runs where it previously refused or crashed. Below Node 16 it stops with one sentence naming the version it needs instead of a stack trace. Two things stay outside the floor: the model-assisted onboarding path needs the network client built into Node 18, so on an older release it names that one missing capability and leaves every other command working; and a check that delegates to your own linter or type-checker still depends on what those tools require, which is reported as a tool finding, not a crash.

Fixed

  • A global install on Node 16 crashed before producing any message. The published entry file had no file extension, and the module loader refuses such a file in a package that declares modules. The failure happened inside Node, before a single line of cladding ran, so nothing could explain it. The entry file now carries an extension and loads on every release. This was never specific to Windows — the same rejection reproduces on Linux.
  • The supported floor was higher than anything actually required. It had been set from a dependency's own declaration rather than from measurement. Measured against running releases, the published engine already worked on Node 18, and exactly four runtime surfaces stood between it and Node 16 — three of them from a single dependency used only to launch external commands, and one promise-flavoured module import of our own. Because the engine ships as one bundled file, that dependency's requirement had silently become the whole tool's requirement.
  • External commands now go through one small launcher of our own, which keeps the behaviour the old dependency provided: the Windows resolution of commands that are really batch files, a single trailing newline trimmed from captured output, a capture limit large enough that a verbose tool's output is not truncated, and an absent exit status when a command could not be started at all. Getting any of those wrong changes a check's verdict silently, so each was measured against the old behaviour before the swap.
  • One interactive prompt no longer decides whether the whole tool loads. It imported a promise-flavoured module that only exists from Node 17, and that single import made the entire bundle unloadable on Node 16.

Added

  • A check that the supported floor cannot quietly rise again. It reads every runtime module the published bundle imports and confirms each one exists on the release being tested. That is how the original problem shipped unnoticed, so continuous integration now runs the check on the floor release itself, alongside a real install from a packed archive on several releases and on Windows.

Changed

  • The contributor and user requirements are now stated separately. Running cladding needs Node 16; working on cladding needs Node 20, because its test runner and linter do.

v0.10.0

Choose a tag to compare

@qwerfunch qwerfunch released this 10 Sep 02:56
8303073

In one line: Spec schema 0.2 — a feature says what it is for before what it does, every acceptance criterion has an address you can point at, a test claims a criterion by naming it in its own title, one compiled model answers questions about how the pieces relate, each level of assurance has a named check profile recorded in a new attestation format, and a reviewed path carries an old project across.

Heads-up: a project still on the old spec format should commit its work first — the migration refuses to touch a path with uncommitted changes on it — then run clad migrate --to 0.2 to preview the rewrite, apply it once the decisions it lists have been reviewed, and re-prove the tree with clad check --tier=pre-push. One of those decisions asks whether your already-completed features may carry their existing proof forward. Answer no and they carry nothing: each finished feature stays red until one of its test titles names the criterion it covers. That answer is recorded once — changing your mind means undoing the migration and applying it again. The headless loop is gone — start the server with clad serve and let your AI host work the feature cycle. Moving the generated files into one folder is opt-in through clad relocate-generated; leave it alone and the existing layout keeps working. And the pre-push check rewrites the sealed record of what was verified every time it passes, so commit those files along with your change. One detail worth knowing before you write tests: the tag that says which acceptance criterion a test covers has to come at the very start of the test's title — a tag placed anywhere else in the title is not read, and the criterion it names is still counted as unproven.

Added

  • Spec schema 0.2. A feature states its purpose first, every acceptance criterion carries an address you can point at, and a test claims a criterion by naming it in the test title. Behind that: a compiler with typed registries and a typed reader, transactional spec editing, a preview of the migration from 0.1, a kernel that carries proof and portable evidence, and five verification profiles — feedback, checkpoint, completion, push, release — recorded in a third-generation attestation file.
  • One compiled model now answers the questions that used to be asked of four, with layers for what the spec declares, what the documents link, what the source references, and which tests the current gate actually observed. The gate now hands the graph a sealed record of test cases instead of raw report bytes.
  • The count sync covers feature counts too. node scripts/test-count.mjs --write refreshes the README feature totals alongside the test totals.
  • clad relocate-generated moves the generated files under spec/generated/. It previews the move by default; --apply performs it as one recoverable transaction. This is opt-in — the layout you have today stays fully supported.
  • A schema 0.2 workspace explains its own generated files. spec/generated/README.md is projected from the registry of generated artifacts and names where each one lives now and where relocation would put it.
  • A release gate for the 0.2 validation work. The validation ledger declares which scenarios block the 0.10.0 release, and npm run validate:spec-0.2:release exits nonzero while any of them lacks discriminating evidence. Evidence produced on a reference host counts only when its recorded receipt is signed by an issuer registered in the trust snapshot stored beside it. Both reference-host cycles for this release — one on Claude Code, one on Codex — were driven by automation rather than by a person working at a keyboard, and the confirmation step before each sign-off was answered by that automation on the maintainer's instruction. The signatures and the offline verification are real; what was not exercised, and so is not claimed, is either host's own confirmation form.
  • The release was measured against the engine it replaces, and against no engine at all. Three arms ran the same task on the same host and the same model, three times each: an assistant with no engine, released 0.9.4, and this build. On the deterministic table, 0.9.4 lets a warning-level drift finding through a gate that was not asked to be strict, accepts an acceptance criterion with no statement, and accepts the binding field this release no longer reads — this release refuses all three, and lowers the depth ceiling on graph questions, refusing requests above it. Live, both engines carried the work to an honest finish 3 of 3, at a median estimated $1.00 against $1.23 and 21 turns against 27; those are list-price estimates, not amounts billed. Code quality, coverage and a hidden oracle came out the same across all three arms, so this release claims no better code. The record is docs/ab-evaluation/case-version-abc-094-vs-0100.md.

Changed

  • Completeness is judged from structure alone. Scope and closure derive from structural relations; an unresolved piece of evidence or an oracle reference that does not resolve stays a visible negative fact about its own criterion instead of making every verification profile unresolved.
  • The authoritative profiles block on warnings. Completion, push and release refuse on warn-level drift findings; --strict remains an explicit escalation on top.
  • A project's own instructions now say how a test claims a criterion. The managed sections in AGENTS.md and CLAUDE.md, the gate's report of a criterion nothing has proven, the guidance it prints when tests are missing, and the message that refuses the old way of binding all name the same thing: on the new spec format, a test claims a criterion by carrying that criterion's tag at the very start of its own title. Until now those surfaces still described the previous format's way of doing it, so a project on the new format was being told to do something the gate no longer reads. A project still on the old format sees its wording unchanged, byte for byte.
  • An archived feature whose successor is not done yet reports its surviving modules as information rather than a problem, until that successor completes.
  • clad done reports how independently the work was verified. In a schema 0.2 workspace it states the independence label recorded for that completion. By default the label only annotates; set independence_policy: require and it decides — a sign-off by the person who implemented the feature no longer counts as independent review, and a completion whose authors cannot be identified is refused rather than passed. The old spec format keeps its previous label unchanged.

Removed

  • The experimental headless loop and its run command. Nothing ever ran it — three and a half months of recorded sessions contain zero runs — and it never learned to write code, so it could only report honest failure. Start the server with clad serve and let your AI host work the feature cycle instead; that is the path everything else already used.
  • The parts that existed only to serve that loop: the agent adapters, the crash-postmortem recorder, and the progress-line renderer. The host transport the onboarding scan uses is untouched, and so is the Anthropic SDK dependency behind its API-key fallback.
  • The run skill, and its copies in the Claude Code, Codex, and Antigravity plugin folders.

Fixed

  • The host support table was refreshed against live runs for this release. Claude Code, Codex and Cursor answered every check — Cursor, which the readme had not claimed before, is now recorded as working. Gemini still fails, and Antigravity — which the table previously recorded as working — now times out on every check, so the readme no longer claims it as verified.
  • Graph code no longer reaches into gate code, restoring the architecture rule that keeps the two apart.
  • A renamed test keeps its binding. Bindings carried forward by the migration and then invalidated by a title edit are promoted to live tokens instead of failing silently.
  • Patched dependencies. The MCP SDK's transitive fast-uri, qs, and side-channel packages move to their patched releases, so npm audit reports no known vulnerabilities. A later batch, reported on 2026-09-09, moves the web framework the MCP server carries and the YAML reader and test runner used by the development tools to their patched releases as well, so the audit stays clean.
  • A workspace holding a signed review could never record a verification. The gate sealed the record of what it verified without counting the reviews on disk, while the writer counted them, so the two never matched: the check finished green, wrote nothing, said nothing, and clad done refused with a cause it could not name. Both now read the same set, the freshness check reads it too, and a refusal names the guard that refused.
  • Asking for a different level of assurance for one run now says why it was refused. Requesting a level the project does not allow — anything below the level it is set to, or a stronger one anywhere except a single feature's completion check — used to end in a red result with no cause printed anywhere, every check apparently green. The refusal now names its reason before anything runs; a run without the option is untouched.
  • A receipt imported on the command line is now checked against the project's registered signers, exactly the way it is when your AI host imports one. Until now every receipt was filed as an unverified claim, whether it was genuine, altered, or signed by someone the project never registered — an altered one is now refused and nothing is stored.
  • An attestation stamped on a working machine now matches the one a clean checkout computes. A desktop metadata file left behind by a file browser, or an ignored fixture sitting inside a sealed folder, used to be sealed alongside the project's own files, so the record a green local check wrote was already stale on e...
Read more

0.9.4 — The gate judges the sources on disk

Choose a tag to compare

@qwerfunch qwerfunch released this 26 Aug 13:48
cde9cf6

In one line: the gate now reads the code that is actually in your repository — projects it used to misjudge pass honestly, and checks it cannot run tell you exactly how to turn them on.

Why this release exists

If your product's language differed from its build files — a C++ SDK built through Gradle, a Rust core shipped via npm — cladding insisted your spec was wrong, and the only way to a green gate was to write the wrong language into it. We measured the damage before fixing it: across 32 realistic project shapes, 12 of the 25 normal ones were wrongly blocked, and on the motivating shape an honest green could not be reached at all. This release fixes the judgment itself, not the symptom.

What changed for you

  • The language check reads your sources, not your build manifest. A language cladding does not know, or too little evidence to judge, now means silence instead of a false alarm. A spec that genuinely contradicts the code still blocks — with the evidence in the message. After the fix: 0 of those 25 shapes blocked, no real drift missed, and the honest green that was impossible now completes 3 out of 3 times at about 20% lower cost (blinded A/B, n=3, with a control showing no change where nothing was broken).

  • The unclaimed-file scan now works for any language. On C++, Java, or C# projects it used to scan nothing and pass — quietly. It now learns what "source" means from your tree and your spec: claim one file of any language and its unclaimed siblings become visible. An empty scan says so instead of looking like a pass.

  • Your gate settings finally travel with the repo. The file that tunes the gate could never be committed — an ignore rule made it structurally impossible — so CI silently ran a different gate than you did. New projects get it committable out of the box; existing projects get a doctor notice, never a silent rewrite of your files.

  • Skipped checks name their exit. When checks skip because cladding cannot run your language's tools, the result ends with the one declaration that turns them on. A quiet skip no longer reads like a verification.

  • Cladding now watches itself. clad doctor proves the editor hooks actually fired instead of trusting the config text, every blocked stop and completed feature leaves evidence, generated CI is pinned to your release line, and each verified tree records which engine and which checks verified it.

Also

  • Security: the MCP transport dependency chain was refreshed; both npm audits report zero known vulnerabilities.
  • Every number above has a receipt: the full record lives in CHANGELOG.md, and the blinded experiment that decides what this page may claim lives in docs/ab-evaluation/case-version-ab-093-vs-next.md.

0.9.3 — the architecture check stops flagging your build output

Choose a tag to compare

@qwerfunch qwerfunch released this 04 Aug 04:42
23ea6be

The architecture check looked at your dist/ folder. Bundled output is full of files importing each other — that is what bundling does — so the check found import loops that exist in nothing you wrote, and stopped the gate. Then it told you only that there was a loop, never which files. One project hit this five times and spent two weeks looking in the wrong place.

Nothing to do on upgrade, unless you keep hand-written source in a top-level build/, out/ or target/ — those directories are no longer checked for import loops.

What stopped being scanned

dist, coverage, .next, .nuxt, .output, .svelte-kit and .vite, anywhere in the tree — a monorepo package or a front end keeps its bundle one level down. And build, out and target at the top level only, since those three are ordinary source directory names often enough that skipping them deeper would hide your own code. Output under apps/*/out or packages/*/build is still scanned.

Checks that used to stop the gate now pass. To scan everything exactly as before, put a pattern that matches nothing in a .madgerc at your project root:

{ "excludeRegExp": ["$^"] }

If you already set excludeRegExp — in a .madgerc, in package.json, or as a madge_excludeRegExp variable — this release changes nothing for you. madge replaces exclusions rather than merging them, so cladding only supplies its own when you have none. Your rules stay the only ones in force.

When a loop does stop you, you get the files

The whole message used to be:

The code has an import loop or crosses a layer boundary the design forbids

The file list existed the entire time. It went to one stream while the message was built from the other, and what survived was cut at 200 characters. It now prints under that sentence, four lines at a time, with the rest in clad check --json.

Given only the old sentence, every agent we handed it to "fixed" the gate by deleting its own build output.

The review packet shows when a requirement was rewritten

clad report now compares each acceptance criterion against its earlier version and marks it new, rewritten, removed or unchanged, along with the entry's status change.

This closes a blind spot. Reword a requirement to match the code you just wrote and the spec and the code agree — so every drift check passes, and nothing is reported. The packet is where that becomes visible.

Added

  • Acceptance-criterion changes in clad report, with each entry's status transition and any change in the requirement's EARS pattern.
  • Declared tests marked as changed, unchanged, or missing from disk. It grades nothing — whether a test really checks its criterion is not something a tool can decide.
  • The packet names the commit it compared against: the merge base, which on a branch that forked a while ago is not the tag you passed it.

Fixed

  • Criteria are compared on action and response as well as the statement. Leaving out the obligation itself hid 31 rewrites in cladding's own history.
  • A review range that forked earlier no longer charges the base branch's commits to it.
  • The EARS rules ship with the package. docs/ is not published, so nothing you install said which trigger word each pattern needs. The table is in the generated AGENTS.md now, with an example per pattern.
  • Spec entries have a documented language — English by default, following the entries already in your spec where you have them. Only when, while, if and where are fixed, and only as the first word of a condition.
  • The review packet described itself as having four sections while printing six.

Known limits

  • /etc/madgerc and Windows path resolution were not exercised.

Full changelog: v0.9.2...v0.9.3

v0.9.2

Choose a tag to compare

@qwerfunch qwerfunch released this 25 Jul 16:36
6d0ea30

When one AI writes the code and its tests, passing tests prove nothing. The tests get shaped around the code that was just written, the bug survives, and everything goes green. 0.9.2 makes that visible.

Every finished feature now says who checked it

independent — something checked the work without being able to see the code.
self-certified — the same hand built it and checked it, or nothing checked it separately.

self-certified isn't a criticism. It means no separate check is on record. Most features will say it, cladding's own included.

Nothing is blocked by default. If you want the mark to bite, you can tell cladding to stop counting unchecked work as finished — then anything self-certified goes back to unfinished, the same as a failed check.

Two limits, said plainly. Earning independent only works through your AI tool right now; from the terminal there's no way to record it, so turning on the strict setting there will leave you stuck. And you can't record your own sign-off as a human yet — reviewing something yourself won't earn the mark. Both are known gaps, written down rather than glossed over.

Upgrading: nothing breaks. Your finished features stay finished and your checks pass as before. The only difference is a mark next to each feature when you look at status — and most will read self-certified.

Added

  • An independence mark on every completion, computed from the evidence the work actually recorded. It never records which agents you used, or how many.
  • An optional strict policy that refuses to keep unchecked work marked as finished. Off by default.
  • A diagram of how a feature gets its mark, in all four languages.

Changed

  • cladding no longer tells you how to run your agents. The coordinator prompt used to name five agents, map requests to them, and say when to run things in parallel. It now states only what has to be true for work to count as finished — agent count, models and ordering are yours.
  • The specialist prompts became briefs any agent can pick up, rather than a cast you're expected to staff.
  • The Multi-Agent section of the README was rewritten to lead with the problem rather than the vocabulary.
  • Plainer wording in more of the AI-facing text.

Fixed

  • A false claim about human sign-off. The README said a person approving a review earns independent. Nothing records that, so the sentence was removed rather than softened.
  • Stale counts on the front page and status table.
  • A broken card layout in the HTML READMEs, where a before/after pair rendered as one narrow card with two-thirds of the row empty.

Verified before shipping

The change to the coordinator prompt was run against the old version — six runs, three each, differing only in that prompt — to check nothing got worse. A planted bug was caught in every run of both. Nothing regressed. We're not claiming it got better either; the numbers weren't strong enough to say that.

Full changelog: v0.9.1...v0.9.2

v0.9.1

Choose a tag to compare

@qwerfunch qwerfunch released this 21 Jul 03:40
cb52ac0

A small patch with one real fix.

The fix — your approved capabilities are no longer lost during setup

When you add cladding to a project that already has code, part of setup is approving the project's list of capabilities (its high-level features). That approved list now gets saved to your spec exactly as you approved it.

Before this release it was quietly discarded — replaced by your README's section headings, or left empty if the project had no README. So if you set cladding up on an existing codebase and your capabilities came out wrong or empty, this is why, and it's fixed.

Also in 0.9.1

  • Better handling of non-JavaScript projects. Formatting problems now list every affected file (not just the first), Python test suites run once per check instead of twice (faster), and the style check recognizes more comment styles.
  • New gentle reminders — they never block a check. cladding now nudges you when code is written with no matching spec, when your checks aren't set to run automatically, and when setup should steer you to writing your first spec instead of jumping straight into code.
  • Plainer wording in more messages.

v0.9.0 — Conversational onboarding, one project at a time

Choose a tag to compare

@qwerfunch qwerfunch released this 20 Jul 09:25
d84d061

Onboarding is now conversational — bring Cladding into a project just by talking to your AI, with no setup command in the chat. And it's safer: a read-only preview and an exact approval phrase mean nothing is written to your project until you approve.

One thing to know: setup is now per project. Run clad setup once in each project where you want Cladding; projects you don't set up stay untouched. Your existing CLAUDE.md is never changed — Cladding uses AGENTS.md.

Highlights

  • Onboard from a sentence, a doc, or existing code — say what you're building; Cladding drafts the spec and asks up to three questions only when a real decision is open.
  • See it before it's written — a preview plus the exact approval phrase; cancel, restart, or a bad draft leaves your project exactly as it was.
  • Nothing leaks between projects — setup wires only the AI hosts you actually have installed, and only for that project.

Verified

Installed the real 0.9.0 package in a clean sandbox and ran onboarding through all five AI CLIs — every host that ran refused to skip the approval step, even with permissions off. typecheck · lint · 2,561 tests all pass.

Full changelog: CHANGELOG.md → [0.9.0].

v0.8.3 — Agent loops that stop honestly, a guard against unverified "done", and a faster check

Choose a tag to compare

@qwerfunch qwerfunch released this 13 Jul 04:57
804d90c

This release helps you build AI agent loops that stop when the work is genuinely finished, closes a hole where a feature could look done without its tests ever running, makes the pre-push check faster, and ships native Japanese and Chinese documentation.

If you build your own agent loop, cladding now gives that loop an honest "are we actually done?" answer and a clear "here's what's still broken" list. These loop features are for loop engineering — they harden when the loop may stop and what it fixes next, not the AI's code quality (cladding's own A/B testing is the receipt: this kind of governance is separate from code correctness).

Heads-up — two things to know when you upgrade:

  • The strict check now flags any feature marked done whose declared tests don't actually run. A feature that looked green but was never truly verified will surface after upgrade.
  • Setting up a project now also writes an AGENTS.md from your spec, so AGENTS.md-aware AI tools pick up your project's context on their own. Your existing files aren't touched.

Added

  • Tell your agent loop when it's genuinely finished — a read-only check answers "is this actually done?" using the very same gate as a real completion; it only reports, it never changes anything.
  • The loop gives up gracefully instead of spinning — when repeated attempts stop making progress, it escalates rather than looping forever.
  • The loop remembers what already failed to build — past build failures are fed back in, so the AI stops resubmitting the same broken fix.
  • Errors come back as exact file-and-line pointers, so the loop fixes them in one pass instead of re-running just to find where the problem was.
  • New projects get an AGENTS.md generated from their spec (closes #199), so any AGENTS.md-aware AI tool inherits the project's intent; cladding's own copy is protected from being overwritten.
  • More toolchains detected — Swift, Flutter, Dart, plus TypeScript-with-Jest and mixed-file-extension projects.
  • Native Japanese and Chinese READMEs — written natively, not machine-translated, with translated diagrams. The docs switch between English · 한국어 · 日本語 · 中文.

Changed

  • The pre-push check runs your tests once, not twice (closes #215) — about 28% faster, with the "did the tests really run?" guard fully intact.
  • Tidier evidence bookkeeping — some spec entries record their supporting material more accurately, and the self-check emits a standard test report.
  • The tool self-checks its own advertised detector count, so the docs can't quietly drift from the code.

Fixed

  • clad check no longer crashes when its output is piped into something that stops reading early — like head (closes #221).

Security

  • Closed a "looks green but was never verified" hole — a feature marked done whose tests don't actually run is now caught. cladding treats a check that can be tricked into a false pass as a trust issue, and this closes one way it could be tricked.

v0.8.2 — Human-first diagnostics + init/scan correctness

Choose a tag to compare

@qwerfunch qwerfunch released this 07 Jul 05:07
d0a5420

[0.8.2] — Human-first diagnostics + init/scan correctness (2026-07-07)

The "speak the user's language" UX pass, plus three init/scan fixes found while reproducing an onboarding bug.

Heads-up: An A/B against 0.8.1 found all three fixes correct but with no measured user-facing gain under a capable AI host — they ship as correctness, not user wins. The real beneficiary is the bare-terminal first-timer.

Added

  • Plain-language findings — the four human surfaces lead with what drifted and what to do; machine detail (id · path) trails. JSON/SARIF/MCP/events byte-unchanged.
  • Speak the user's language — cladding ships one English source and the host agent renders the user's language; no locale detected or stored. clad init/setup/clarify output moved to it too.

Changed

  • Spec-first window stopped shouting — an unbuilt module on a planned/in-progress feature is an info note, not a block; done/archived keep the hard error.
  • Cards speak human — session/prompt cards and block reasons drop internal ids and tool names; impact cards say "N features depend on this."

Fixed

  • First-run no longer bricks the spec — an empty layers: (null, schema-invalid) now renders layers: [], so a small project's first init stays governable.
  • Scanned globs match real files — layer globs gained the source root (src/api/**) and flat projects stop leaking the project directory name.
  • Docs match detector behavior — the feature-cycle doc and detector catalog now record the status-aware untested-AC / missing-implementation severity.

Net: a correctness release, not a capability leap.

0.8.1 — Adoption Proof + Friction Diet

Choose a tag to compare

@qwerfunch qwerfunch released this 05 Jul 17:05
a633378

Parallel work stops conflicting, every save gets ~12× faster, and the numbers stop lying.

Heads-up: everything migrates on its own — the attestation file at your first green gate, sync stamps at the next sync, the CLAUDE.md section at the next clad update. Just update the npm engine and the editor plugin together: an older plugin reads the new attestation file as "missing entries" until it catches up. Noisy, harmless, gone after the update.

Added

  • An adoption verdict. clad measure --sessions now answers a question we couldn't: does the agent actually pull context, or does it just receive what we push? Pushes score nothing, empty lookups score nothing, and silence is shown rather than hidden. Our own first number: 64 cycles, 0 pulls — embarrassing, and exactly what decides 0.9.
  • Mid-merge guards. A half-merged tree can never be stamped as verified — clad done refuses, the gate holds its write until the merge settles.
  • One merge rule. Conflict in a derived file? Keep either side, finish the merge, run the gate. The gate rewrites the truth; your hands never should.

Changed

  • The verification record keys one line per file, not per feature. Branches that touch different files now merge clean — in the GitHub PR view too. This was the root of most conflicts.
  • Every save: ~6s → ~0.5s. The two subprocess scanners moved to turn-end and commit gates. Nothing skipped, just later.
  • The README promises only what the record keeps — corrected in all four language variants.
  • One name per concept. Old docs deleted or shrunk to abstracts; the glossary settles the confusions that kept coming back — check vs gate, the card family, slice vs working set.

Fixed

  • Sync no longer stamps a date nobody reads into spec.yaml — and no longer causes a merge conflict with it.
  • No message recommends a removed command anymore, and a tripwire keeps it that way.

Shipped only after A/B-testing the whole cycle against the published 0.8.0 — same violations, same merges, live agents on both engines. The old engine really did stamp a half-merged tree; this one refused. Full verdict: docs/ab-evaluation/case-081-cycle-conformance.md.