Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
74a6c6e
feat(spec): establish Spec 0.2 design baseline
qwerfunch Aug 28, 2026
05f0c64
fix(test): make MCP host smoke fixture-independent
qwerfunch Aug 28, 2026
ac92d9b
Merge pull request #262 from qwerfunch/feature/spec-0.2-design
qwerfunch Aug 28, 2026
2758615
wip(spec-0.2): checkpoint V0-F7 implementation and proof repair
qwerfunch Aug 31, 2026
e042b8f
test(spec-0.2): checkpoint exact legacy proof bindings
qwerfunch Aug 31, 2026
c53f223
test(spec-0.2): prove live external contracts
qwerfunch Aug 31, 2026
18e72a2
feat(spec-0.2): restore onboarding and convention contracts
qwerfunch Aug 31, 2026
4a0e4e7
feat(spec-0.2): complete F7 semantic proof batch B1
qwerfunch Aug 31, 2026
33b107c
feat(spec-0.2): complete F7 semantic proof batch B2
qwerfunch Aug 31, 2026
bd28cf8
feat(spec-0.2): complete F7 semantic proof batch B3
qwerfunch Aug 31, 2026
a66d9b5
feat(spec-0.2): complete F7 semantic proof batch B4
qwerfunch Aug 31, 2026
31c90f8
chore(spec-0.2): resolve F7 design review
qwerfunch Aug 31, 2026
2e39294
docs: sync public test count to 3606
qwerfunch Aug 31, 2026
c488b21
fix(spec-0.2): preserve Vitest suite identity in proof matching
qwerfunch Aug 31, 2026
87cdb46
docs(spec-0.2): define transparent L2 migration baseline
qwerfunch Aug 31, 2026
702b834
fix(spec-0.2): repair legacy proof carriers
qwerfunch Aug 31, 2026
01d6321
feat(spec-0.2): bind F7 legacy L2 migration receipt
qwerfunch Aug 31, 2026
44dac75
feat(spec-0.2): reduce F7 migration baseline rows
qwerfunch Aug 31, 2026
e2cd13c
chore(spec): sync F7 checkpoint inventory
qwerfunch Aug 31, 2026
81101b8
feat(spec-0.2): persist F7 migration baseline attestations
qwerfunch Aug 31, 2026
3d95d91
fix(spec-0.2): emit alias-free migration baseline receipts
qwerfunch Aug 31, 2026
f853b58
fix(spec-0.2): reserve clean-tree proof for release
qwerfunch Sep 1, 2026
eb8738c
fix(spec-0.2): preserve exact migration observations
qwerfunch Sep 1, 2026
aa104ec
test(spec-0.2): preserve exact migration bindings
qwerfunch Sep 1, 2026
b561762
feat(spec-0.2): complete F7 self-migration
qwerfunch Sep 1, 2026
1a64f09
spec(spec-0.2): author F8 GraphIR v2 cutover
qwerfunch Sep 1, 2026
e080bfd
fix(spec-0.2): tighten F8 contract evidence
qwerfunch Sep 1, 2026
7ef23c6
feat(spec-0.2): add GraphIR v2 query kernel
qwerfunch Sep 1, 2026
3ca0aa2
fix(spec-0.2): harden GraphIR v2 kernel
qwerfunch Sep 1, 2026
3c8404e
fix(spec-0.2): preserve GraphIR v2 fidelity
qwerfunch Sep 1, 2026
3275835
feat(spec-0.2): add GraphIR workspace query boundary
qwerfunch Sep 1, 2026
26816e7
fix(spec-0.2): retain blocked reason in GraphIR projection
qwerfunch Sep 1, 2026
738c2e3
feat(graph): add authored covers workspace facts
qwerfunch Sep 1, 2026
e98442e
fix(graph): stabilize artifact fact merge
qwerfunch Sep 1, 2026
e6b6554
feat(graph): add document fact layer
qwerfunch Sep 1, 2026
4f9c5f7
fix: harden document graph facts
qwerfunch Sep 1, 2026
c5e5afc
feat(graph): anchor document reference facts
qwerfunch Sep 1, 2026
1ca1bfb
test: align declared doc link severity
qwerfunch Sep 1, 2026
8b85e36
feat(graph): add bounded source reference facts
qwerfunch Sep 1, 2026
5c73756
test(graph): strengthen source reference facts
qwerfunch Sep 1, 2026
6ce0fff
fix(graph): reconcile bounded source references
qwerfunch Sep 1, 2026
44c1f98
feat: validate authored source references in drift
qwerfunch Sep 1, 2026
84d83fa
test: fix source reference fixture assertions
qwerfunch Sep 1, 2026
0875416
feat(graph): add current-gate testcase observations
qwerfunch Sep 1, 2026
8b8048c
fix(graph): retain CRLF source-reference carriers
qwerfunch Sep 1, 2026
6e573a6
chore: sync F8 public counts and source census
qwerfunch Sep 1, 2026
8fd2245
feat(graph): materialize schema 0.2 oracle and evidence declarations
qwerfunch Sep 2, 2026
883d7c5
fix(graph): seal the current-gate testcase ledger at the stage seam
qwerfunch Sep 2, 2026
a20d391
fix(assurance): derive scope and closure completeness from structural…
qwerfunch Sep 2, 2026
c43ddd3
test(spec-0.2): bind F4/F6 criteria and cascaded reviewed bindings to…
qwerfunch Sep 2, 2026
cfbbc09
feat(spec-0.2): complete F1–F5 through the completion gate
qwerfunch Sep 2, 2026
1da9588
feat(assurance): let the declared profile own warn-class blocking
qwerfunch Sep 2, 2026
ed0cc7b
docs(spec-0.2): split the change log and record the 0.10.0 in-flight …
qwerfunch Sep 2, 2026
c75c040
feat(spec-0.2): complete F6 assurance profiles and attestation v3
qwerfunch Sep 2, 2026
48bb7b0
test: promote migration-baseline test selectors to live [covers:] tokens
qwerfunch Sep 2, 2026
cf5f651
feat(graph): add the GraphIR v2 public wire and bounded packer
qwerfunch Sep 2, 2026
f7a1c7f
feat(graph): observe portable receipts as GraphIR evidence facts
qwerfunch Sep 2, 2026
b3c5a3c
feat(graph): read every consumer through one GraphIR facade and retir…
qwerfunch Sep 2, 2026
2b39bfc
feat(graph): present GraphIR v2 in the shape the renderers and viewer…
qwerfunch Sep 2, 2026
90e92ca
feat(graph): cut the public graph surfaces over to GraphIR v2
qwerfunch Sep 2, 2026
9eacea2
feat(spec-0.2): complete F8 GraphIR v2 cutover and the three graph fe…
qwerfunch Sep 2, 2026
fcd7aca
feat(init): scaffold and refine schema 0.2 workspaces by default
qwerfunch Sep 3, 2026
3274cc1
feat(spec-0.2): complete the schema 0.2 native onboarding feature
qwerfunch Sep 3, 2026
7db1446
fix(assurance): persist attestation v3 rows as set digests
qwerfunch Sep 3, 2026
1803942
feat(optimizer): add the cycle context envelope (F9a)
qwerfunch Sep 3, 2026
d90fe85
feat(spec-0.2): complete F9a context envelope
qwerfunch Sep 3, 2026
3c85a6f
fix(optimizer): keep ownership fan-out lazy in implement packets
qwerfunch Sep 3, 2026
692c3b4
fix(oracle): read directory modules without EISDIR in the blind payload
qwerfunch Sep 3, 2026
2c407db
feat(tests): add the A–E topology invariance suite (F9b)
qwerfunch Sep 3, 2026
141b37d
test(topology): bind the J11 carrier with a literal title
qwerfunch Sep 3, 2026
a141f39
feat(spec-0.2): complete F9b topology invariance suite
qwerfunch Sep 3, 2026
ff9a4b1
feat(proof): add the file-key issuer and committed trust registry (F9d)
qwerfunch Sep 3, 2026
bd8a0f2
feat(spec-0.2): complete F9d file-key issuer and trust registry
qwerfunch Sep 3, 2026
d56eea5
feat(spec-0.2): retire the headless drive loop and defer the F9c sche…
qwerfunch Sep 5, 2026
d12ec16
feat(spec-0.2): complete F-9fcdd0a0 drive retirement
qwerfunch Sep 5, 2026
517d998
docs: sweep the last drive-loop references and guard the doc surfaces
qwerfunch Sep 5, 2026
25486a1
fix(hook): label feature-execution prompts as feature work and close …
qwerfunch Sep 5, 2026
212810d
feat(spec): resolve generated artifacts by layout and add opt-in clad…
qwerfunch Sep 7, 2026
e3a5096
feat(spec-0.2): complete F-0dafcf9d relocate-generated lite
qwerfunch Sep 7, 2026
c01b9b8
feat(spec-0.2): declare the 0.10.0 release boundary in the validation…
qwerfunch Sep 7, 2026
64f4cdf
feat(spec-0.2): complete F-c2d7dc78 release ledger
qwerfunch Sep 7, 2026
8f064b0
fix(cli): report and enforce the attested independence label on schem…
qwerfunch Sep 7, 2026
1167026
feat(spec-0.2): complete F-8e7f399b done independence label
qwerfunch Sep 7, 2026
da39cd9
chore(release): prepare the 0.10.0 release candidate
qwerfunch Sep 7, 2026
782747e
fix(deps): pick up the patched fast-uri, qs, and side-channel releases
qwerfunch Sep 7, 2026
7dd4540
build: refresh the plugin bundle from the locked dependency tree
qwerfunch Sep 7, 2026
e5464f1
fix(assurance): seal the receipt-inclusive verification closure for c…
qwerfunch Sep 7, 2026
9124178
feat(spec-0.2): complete F-a0bd9c5a receipt attestation seal
qwerfunch Sep 7, 2026
22c1d24
fix(assurance): report unrefreshed attestation rows only for done fea…
qwerfunch Sep 7, 2026
0578818
docs(release): record the 0.10.0 packed-tarball evidence and correct …
qwerfunch Sep 7, 2026
04002d6
feat(release): land the reference-host evidence and close the 0.10.0 …
qwerfunch Sep 7, 2026
ae4ce57
chore(release): date the 0.10.0 changelog entry
qwerfunch Sep 7, 2026
33c8d3b
docs(design): state what the 0.10.0 reference-host records prove
qwerfunch Sep 7, 2026
56f3cb9
feat(init): tell schema 0.2 adopters how a test claims a criterion (F…
qwerfunch Sep 8, 2026
b8fcb62
feat(spec-0.2): complete F-6349870d adopter binding guidance
qwerfunch Sep 8, 2026
f39c497
docs(ab): pre-register the vanilla / 0.9.4 / 0.10.0 campaign and comm…
qwerfunch Sep 8, 2026
d80863e
docs(ab): record the vanilla / 0.9.4 / 0.10.0 campaign results and re…
qwerfunch Sep 8, 2026
616b866
chore: re-attest after the changelog update
qwerfunch Sep 8, 2026
f867a6d
docs(release): record the shipped build's lineage against the MCP11 b…
qwerfunch Sep 8, 2026
e32c694
fix(cli): relay kernel decisions in the check and ingest-receipt adap…
qwerfunch Sep 9, 2026
72d0820
docs(ab): add the 0.10.0 feature-scenario battery and coverage ledger
qwerfunch Sep 9, 2026
b317d05
feat(spec-0.2): complete F-18a5883a CLI adapter kernel parity
qwerfunch Sep 9, 2026
3b06352
docs(ab): lock the 0.10.0 feature-scenario battery and record the hos…
qwerfunch Sep 9, 2026
a38210f
fix(deps): patch the transitive advisories reported on 2026-09-09
qwerfunch Sep 9, 2026
b37d174
fix(assurance): seal only the files a clean checkout has (F-71da4292)
qwerfunch Sep 9, 2026
bdddb9c
feat(spec-0.2): complete F-71da4292 portable closure membership
qwerfunch Sep 9, 2026
e32e0f4
docs(ab): lock S-C5, re-pin S-D5 after the seal repair, record the fo…
qwerfunch Sep 9, 2026
61384cf
docs(ab): refresh the case index status after the lock round
qwerfunch Sep 9, 2026
5f15ed4
Merge pull request #263 from qwerfunch/feature/spec-0.2-0.10.0
qwerfunch Sep 10, 2026
095cf5c
docs(release): date the 0.10.0 release notes 2026-09-10
qwerfunch Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "claude-code",
"source": "./plugins/claude-code",
"description": "Reference implementation of the Ironclad standard — multi-agent dev harness for Claude Code.",
"version": "0.9.4",
"version": "0.10.0",
"author": {
"name": "qwerfunch"
},
Expand Down
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
spec/index.yaml merge=union
plugins/claude-code/dist/clad.js whitespace=-trailing-space
11 changes: 6 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# AGENTS.md

This file is the cross-tool entry point for any AI coding agent working on cladding (OpenAI Codex, Cursor, Cline, Aider, Continue, GitHub Copilot, Gemini CLI, JetBrains Junie, Windsurf, and the other tools that read the [agents.md](https://agents.md/) standard). Claude Code reads this too — there is no separate CLAUDE.md.
This file is the shared cross-tool entry point for AI coding agents working on cladding (OpenAI Codex, Cursor, Cline, Aider, Continue, GitHub Copilot, Gemini CLI, JetBrains Junie, Windsurf, and other [agents.md](https://agents.md/) hosts). [`CLAUDE.md`](CLAUDE.md) is the Claude Code maintainer addendum; it does not replace this shared contract or `GOVERNANCE.md`.

## 1. Project

Expand Down Expand Up @@ -41,11 +41,11 @@ Comment policy in one paragraph: *why* over *what*, full doc-tag set on every ex

## 5. PR policy

Branch off `develop`, never `main`. Open the PR against `develop`. The maintainer fast-forwards `main` only at explicit release time. Full contract: `GOVERNANCE.md` §4.3.
Branch off `develop`, never `main`, and open ordinary PRs against `develop`. A release uses a `develop → main` PR merged with a merge commit, followed by the mandatory `main → develop` back-merge. Full contract: `GOVERNANCE.md` §3–4.3 and `CLAUDE.md`.

## 6. Agent personas

cladding ships five persona definitions under `src/agents/`. **Planning intents** (deciding scope · drafting acceptance criteria · drawing a roadmap) are planner-territory (the persona formerly named `librarian`) and surface through natural language to the host AI tool, not through a fixed CLI verb. `clad run` (formerly `drive`) is for *executing* an already-defined plan as a feature group, not for *making* a plan.
cladding ships five persona definitions under `src/agents/`. **Planning intents** (deciding scope · drafting acceptance criteria · drawing a roadmap) are planner-territory (the persona formerly named `librarian`) and surface through natural language to the host AI tool, not through a fixed CLI verb. Execution itself is no longer a cladding verb: 0.10.0 retired the headless loop, so `clad serve` publishes the spec and the gates over MCP and the host AI owns carrying an already-defined plan out.

Each file is markdown with a YAML frontmatter that declares two parallel keys:

Expand All @@ -58,19 +58,20 @@ Non-Claude-Code hosts (Cursor, Cline, Continue, …) should map `capabilities:`

cladding does **not** require an API key by default. The default agent dispatch mode is `host` — cladding runs inside the user's existing AI tool (Claude Code with the Max/Pro subscription, Cursor, Cline, Continue, generic-MCP, …) and the host environment handles the LLM call.

SDK adapters (Anthropic / OpenAI / Gemini) read their respective environment variable (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GOOGLE_API_KEY`) only when explicitly selected via `agent.mode = sdk` in `.cladding/config.yaml` or the `CLADDING_AGENT_MODE` env var. Full roadmap: `docs/multi-provider-roadmap.md`.
The only place cladding itself reads a provider key is the onboarding scan fallback: `src/cli/scan/dispatcher.ts` lazily requires `@anthropic-ai/sdk` with `ANTHROPIC_API_KEY` when no host sampling server is registered. Every other execution path is owned by the host AI. Full roadmap: `docs/multi-provider-roadmap.md`.

## 8. Soft Shell rule

User-facing output uses business language: feature titles ("Login flow"), stage names ("Drift", "UAT"), plain sentences. Internal identifiers (`F-NNN`, `AC-NNN`, `stage_X.Y`, `HUMAN_REQUIRED` and the rest of the halt enum) belong in the audit log and behind `--internal` / `--json` flags.

Convert every internal id at the user surface boundary via `src/ui/softShell.ts`: `featureLabel(featureId, spec)`, `haltMessage(haltReason, spec)`, `gateLabel(stageId)`. Background: `ironclad-design/03-ux-routing.md` §1.2 and `docs/ux-routing-coverage.md`.
Convert every internal id at the user surface boundary via `src/ui/softShell.ts`: `featureLabel(featureId, spec)` and `gateLabel(stageId)`. Background: `ironclad-design/03-ux-routing.md` §1.2 and `docs/ux-routing-coverage.md`.

## 9. Where to look

- `GOVERNANCE.md` — sync policy, versioning, contributor policy, PR contract, v1.0 graduation criteria.
- `CONTRIBUTING.md` — first-PR walkthrough.
- `CODE_OF_CONDUCT.md`, `SECURITY.md` — community standards + private security reports.
- `docs/design/spec-0.2.md` — accepted 0.10.0 continuation router; read it, then load only the task-routed canonical file under `docs/design/spec-0.2/` (implementation is still pending).
- `docs/code-style.md` — per-language Google Style Guides table + comment policy in full.
- `docs/ux-routing-coverage.md` — applied-status of `ironclad-design/03-ux-routing.md` prescriptions.
- `docs/multi-provider-roadmap.md` — host vs sdk adapter model + adapter matrix + how to add one.
Expand Down
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,47 @@ All notable changes to Cladding are documented here.
Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/).
Versioning: [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).

## [0.10.0] — Every acceptance criterion has an address a test can claim (2026-09-10)

**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 every other machine — most visibly in continuous integration, where the same commit came back red. The record now covers what the repository actually tracks, so a check that passes on your machine passes on a fresh clone. Files kept inside a nested repository or a submodule are not part of that tracked content either, so a module pointing into one is now treated as absent and the check refuses rather than sealing foreign files.

## [0.9.4] — The gate judges the sources on disk (2026-08-26)

**In one line:** the language check reads your sources instead of your build manifest — projects it wrongly blocked now pass honestly — the module-honesty scan works for any language your spec teaches it, the gate config survives a fresh clone, and cladding now proves its own host hooks fired, records stop and completion outcomes, pins generated CI, and stamps every verified tree with the policy that earned it.
Expand Down
10 changes: 6 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ When adding a new spec entry to `spec/features/` or `spec/scenarios/`:

- **DO NOT** create `spec/features/F-NNN.yaml` (the legacy sequential format) by hand.
- **DO** use the hash-based model:
- Filename: `<slug>-<hash>.yaml` (e.g. `auth-bypass-c4d108e9.yaml`)
- Inside the yaml: `id: F-<hash>` plus `slug: <slug>`
- Filename: `<slug>-<hash8>.yaml` (e.g. `auth-bypass-c4d108e9.yaml`)
- Inside the yaml: `id: F-<hash8>` plus `slug: <slug>`
- The hash is an 8-character hex string since 0.6.0 (legacy 6-char ids stay valid). Generate with:
```bash
node -e "console.log('F-' + require('node:crypto').randomBytes(4).toString('hex'))"
Expand Down Expand Up @@ -101,8 +101,10 @@ implements; whoever authors a unit must not sign off on it (anti-self-cert).
**Feature cycle — one at a time** — One feature end-to-end before the next:
author its spec entry (`acceptance_criteria` + `modules`) → implement → author tests
in a separate context → `clad done <featureId>` (sets `status: done` only when
`clad check --tier=pre-push --strict` is GREEN). Never author spec entries ahead of
their code, or hand-write `status: done`. See `docs/feature-cycle.md`.
`clad check --tier=pre-push --strict` is GREEN). A test claims a criterion by
starting its title with `[covers:F-…/AC-…]`; `test_refs` are not accepted on
schema 0.2. Never author spec entries ahead of their code, or hand-write
`status: done`. See `docs/feature-cycle.md`.

**Hash-based IDs** — Never hand-author `F-NNN` filenames; use the `clad` CLI
(or `/cladding:init`). Model in `docs/spec-ids-multi-dev.md`.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Thanks for your interest in helping make code iron-clad.
```
When you change a stage, a detector, or the conformance contract, also run `npm run conformance` to re-verify the 26 fixtures. The runner is a contributor self-audit tool — it depends on dev-only toolchain binaries (`tsc` / `eslint` / `madge` / `secretlint` / `vitest`), so it works after a contributor install (`npm install`), **not** after the end-user install (`npm install -g cladding`).
5. **Add a CHANGELOG entry** under the next-release heading, in the right [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) section (`Added` / `Changed` / `Deprecated` / `Removed` / `Fixed` / `Security`).
6. **Open the PR against `develop`.** The maintainer fast-forwards `main` only at release time.
6. **Open the PR against `develop`.** Releases use a `develop → main` merge-commit PR followed by a mandatory `main → develop` back-merge; see `GOVERNANCE.md` §3.

## What kind of contributions land easily

Expand Down
Loading
Loading