Skip to content

Release v0.10.0: spec schema 0.2, one compiled model, portable attestation - #264

Merged
qwerfunch merged 110 commits into
mainfrom
develop
Sep 10, 2026
Merged

qwerfunch merged 110 commits into
mainfrom
develop

Conversation

@qwerfunch

Copy link
Copy Markdown
Owner

2026-09-10 · develop → main · release v0.10.0

Spec schema 0.2: a feature says what it is for before what it does, every acceptance criterion has an address, and a test claims a criterion by naming it at the start of its own title. One compiled model answers the questions that used to be asked of four, each level of assurance has a named check profile recorded in a new attestation format, and a reviewed migration carries an old project across.

Heads-up: merge this with "Create a merge commit" — never squash or rebase, so the next release does not report phantom conflicts — then tag v0.10.0 on the merge commit and back-merge main into develop. A project still on the old spec format should commit its work first, then run clad migrate --to 0.2 to preview, apply once the listed decisions are reviewed, and re-prove with clad check --tier=pre-push. On 0.2 a test's covers tag must be the very first thing in its title, or the criterion counts as unproven. The pre-push check rewrites the sealed attestation on every pass; commit it with the change. The attestation now describes what the repository tracks, not what happens to sit in the working copy, so a check that passes locally passes on a fresh clone.

Added

▸ Spec schema 0.2. Purpose-first features, addressable criteria, test-title binding, a compiler with typed registries, transactional spec editing, a migration preview from 0.1, a proof and evidence kernel, and five verification profiles from feedback to release.

▸ One compiled graph model with layers for what the spec declares, what the documents link, what the source references, and which tests the gate actually observed.

▸ clad relocate-generated previews and, with --apply, moves the generated files under spec/generated/ as one recoverable transaction. Opt-in; the current layout stays supported, and a 0.2 workspace explains its generated files in spec/generated/README.md.

▸ A release gate for the 0.2 validation work. The validation ledger names the scenarios that block this release; the release validator exits nonzero while any lacks discriminating evidence, and reference-host evidence counts only when its receipt is signed by a registered issuer.

▸ The release was measured, three ways. Against no engine and against released 0.9.4 on the same host, model and task (docs/ab-evaluation/case-version-abc-094-vs-0100.md); and every change in this section has a recorded scenario row in a 44-row deterministic table locked on the shipped build, with a CI guard that fails when a release-note item has no row (docs/ab-evaluation/case-0100-feature-scenarios.md). Host probes on Claude Code, Codex and Cursor completed read and write cycles; Antigravity fails for a host-side reason recorded there.

Changed

▸ Completeness is judged from structure alone, and the completion, push and release profiles now block on warning-level drift findings.

▸ A project's own instructions say how a test claims a criterion — the managed AGENTS.md and CLAUDE.md sections, the gate's unproven-criterion report, the missing-test guidance, and the refusal of the old binding field all name the same rule; 0.1 wording is unchanged.

▸ clad done reports how independently the work was verified, and independence_policy: require turns that label into a decision.

Removed

▸ The experimental headless loop and its run command, the adapters that served only it, and the run skill. Nothing ever ran it.

Fixed

▸ An attestation stamped on a working machine now matches the one a clean checkout computes. This PR's first CI run went red on every completed feature because the sealed record had been stamped from a working copy that held desktop metadata files and ignored fixtures inside sealed folders. The record now enumerates directory contents and runner configuration from what git tracks (plus untracked files git does not ignore), never from stray files; files inside a nested repository or a submodule are treated as absent rather than sealed. A new scenario row stamps a record on a deliberately messy copy, clones the commit, and checks it there.

▸ A workspace holding a signed review could never record a verification; the gate and the writer now read the same set, and a refusal names its cause.

▸ Two command-line paths found by the scenario battery: asking for a one-run assurance level the project cannot grant now says why instead of failing quietly, and a receipt imported on the command line is checked against the project's registered signers the same way the host tool checks it.

▸ A renamed test keeps its binding, graph code no longer reaches into gate code, the host support table was refreshed against live runs, and transitive dependency advisories are patched (npm audit clean as of 2026-09-09).

Verification at the tip: a clean clone on node:22 (non-root, the CI sequence, no re-stamp) rebuilds dist/clad.js byte-for-byte, passes 336 test files / 3,835 tests, passes the strict pre-commit gate with the committed attestation untouched, and passes the release profile; the 0.2 release validator and conformance suite pass; the 44-row scenario table is locked on the shipped build; the tarball carries no harness directories or key material.

🤖 Generated with Claude Code

feat(spec): establish Spec 0.2 design baseline
qwerfunch and others added 29 commits September 7, 2026 14:55
…a 0.2 completion (F-8e7f399b)

A schema 0.2 completion now reports the independence label its own assurance
receipt attested instead of the evidence-ledger label, which reads any human
sign-off as independent and so lets an implementer flip their own label.
Under independence_policy: require the attested label decides: self-certified
and unobserved are refused with the shard bytes untouched, independent and
not-applicable are kept. The completion event seals no independence label,
because the attested one exists only after the gate that consumes it.
Schema 0.1 keeps its ledger label, its event payload, and its wording.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Completion ran the pre-push profile scoped to the feature and stamped its
attestation row; the shard is done, the index and README counts follow, and
the sibling receipts were re-attested by a full strict pre-push run.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bump the version across all eleven sites and refresh the lockfile.
Move the status row of all six README variants to the released form,
and update the pins that hold those claims in place.
Rewrite the 0.10.0 changelog body as release notes: a heads-up on
migration, the retired headless loop, opt-in relocation and the sealed
verification record, then plain-language bullets in place of internal
names.
The version-bump script now also accepts the unquoted `version:` the
0.2 spec writer emits, which had made it refuse the bump outright.
A GREEN pre-push reissued all 285 attestation rows under the new
version identity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The MCP SDK pulls fast-uri through ajv and qs through express; both had
open advisories (fast-uri host confusion and SSRF, qs array-limit bypass
and denial of service). A lock-only patch refresh moves fast-uri to
3.1.7, qs to 6.16.0, side-channel to 1.1.1 and es-object-atoms to 1.1.2,
and npm audit now reports zero vulnerabilities.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The committed mirror was built before the lockfile picked up the patched
fast-uri, qs, and side-channel releases, so a clean `npm ci` build no longer
reproduced it and CI compared two different bundles.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ompletion and staleness (F-a0bd9c5a)

The completion gate's run authority sealed a receipt-free verification
closure while the attestation writer sealed a receipt-carrying one, so a
schema 0.2 workspace holding a single verified receipt could never record a
verification: every seal comparison failed, the gate finished green without
writing or reporting anything, and `clad done` refused with a cause it could
not name.

Both now read one shared receipt census, and so does STALE_ATTESTATION, which
reports an attested row as uncheckable when the evidence census cannot be
proved safe instead of comparing it against an empty receipt set. The
expected-digest producer and the independence inputs keep their receipt-free
closure, so a receipt never depends on itself or on its siblings. A refused
row now names the guard that refused it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Records the completion of the receipt-inclusive verification seal and syncs
the README test and feature counts to the tree it was verified on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tures (F-a0bd9c5a)

Only a done feature is owed an attestation row, so only a done feature's
refusal is worth a line: a workspace that has completed nothing was getting a
note on every push gate for features that are not supposed to have a row yet.
The note now names each done feature it could not record, up to five, and
summarizes the rest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the reference-host runbook

Adds the 2026-09-07 packed-tarball E2E record for RC 22c1d24: the six
deterministic cells, the three defects round 1 found and this branch fixed,
the behavioral observations that are not defects, and what the campaign did
not verify.

Corrects the MCP11 runbook against what the dry-run actually did: the 0.2
binding is a [covers:] token in the it() title rather than test_refs, the
runner scripts must throw instead of touching process, coverage needs a
src-only scope, the MCP spec-edit call shape carries operations plus
input_revisions, and the issuer name must equal git config user.name or the
independence label reads independent for one person wearing two hats. Section
8 now separates what the dry-run confirmed, what it repaired, and the three
claims that still need a real host.

The changelog entry gains the two facts an adopter meets first: commit before
migrating, and answering no to the completed-feature baseline decision leaves
those features red until a test title names the criterion it covers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…release boundary

Record both MCP11 reference-host cycles (Claude Code 2.1.263, Codex 0.153.0)
against the 0.10.0 release candidate: L4 fixtures, signed audit/UAT receipts,
completion rows, and the copied evidence under docs/dogfood/mcp11-0.10.0/.
The validation ledger now carries the two evidence records, J13 and MCP11 are
validation-active, and the validator holds the reference-host label to the
recorded evidence in both directions while requiring a resolving test
reference from every other validation-active MCP row.

Restate two criteria whose wording pinned the pre-evidence boundary
(F-182eaa53/AC-6d69273c, F-c2d7dc78/AC-36842395), refresh the live host
matrix (Cursor verified, Antigravity timing out), and correct the runbook
where the L4 pre-push tier and the covers-token placement were described
wrongly. The cycles were driven by automation at the maintainer's
instruction, including the sign-off confirmations; the runbook, the evidence
documents and the changelog say so.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…-6349870d)

Managed AGENTS.md and CLAUDE.md render per schema, with the 0.1 bytes
pinned so the older workspaces stay byte-identical. Gate output now names
the covers token for unbound criteria, the create-feature refusal names
the replacement instead of only rejecting the old key, and the
MISSING_TESTS remedy covers both schemas. `clad update` refreshes a
workspace already migrated to 0.2. Catalog pin 140,498.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Strict pre-push gate GREEN, so the entry moves to done. Sibling
attestations re-verified and the README counts refreshed to 287 done
of 302 features across 3,811 tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…it its harness

Three arms on one task: no engine, 0.9.4 from npm, and the 0.10.0 candidate
packed from this branch. The deterministic side-tables were locked 2026-09-08
against the frozen engines — 16 rows, 0 mismatches — before any comparison cell
ran, so the rules cannot follow the numbers.

Registered here: hypotheses G1-G6 (honesty delta, completion, cost
non-regression, migration, context parity, the default path), refutation rules
R1-R6 with the action each one forces, and the decision rules that classify a
mismatch. The campaign ledger caps spend at $40 and is checked before each cell
is spawned.

The harness lives under scripts/ab-abc: the cell builder, the live runner, the
budget ledger, the scorer, the renderer, the agent-free side-table runner and
its locked expectations, the stdio MCP client, and the fixture template every
arm starts from. No live comparison cell has been recorded yet; the single run
described in the case document is the instrumentation pass, and it is written
as such.

Also pins which catalogue byte count is authoritative: the release pin is the
140 498 B compact stableJson({tools, resources, prompts}) that
`npm run validate:spec-0.2` measures over 27 tools, while the harness's 158 700 B
and 60 135 B are the pretty-printed whole result and its compact `tools/list`
slice — three serialisations of one catalogue.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…pair the harness reporting

13 live cells (12 counted; the instrumentation pilot excluded per
pre-registration), same-task n=3 medians C/B cost 0.81x turns 0.78x wall 0.71x,
honest finish 3/3 vs 3/3, quality/coverage/oracle tied across all arms (NULL as
pre-registered), all GO hypotheses met and no STOP condition fired; harness:
mismatch file refresh, rescore.sh reproducibility, render over the campaign
root; changelog gains the adopter-guidance Changed bullet and the campaign Added
bullet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…uild

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ters

An assurance level the project refuses now names its reason before the run starts.
A receipt imported on the command line is verified against the registered signers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
43 deterministic rows covering the release's adopter-visible surfaces.
A static coverage test over the release notes and the features added since 0.9.4.
Host probes for four hosts, recorded alongside the deterministic table.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…t probes

All 43 side-table rows are classified and pinned on the build that ships, so any difference in an exit code, byte count or literal now fails the run.
The two rows that found product faults were repaired by F-18a5883a and re-run against the repacked engine before being locked on that run.
The host probes ran on four hosts, with Antigravity's cause written down.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Attestation seals now enumerate directory modules and runner controls from
git membership (tracked plus untracked-not-ignored) minus desktop metadata files.
The receipt census skips desktop metadata as well.
An ignored but directly referenced file now reads as absent, the way a clean checkout sees it.
The scenario battery gains the pre-registered row S-C5.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
289 of 304 features done; attestation re-issued over the verified tree.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…urth build

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
0.10.0 — Spec schema 0.2: every acceptance criterion has an address a test can claim
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@qwerfunch
qwerfunch merged commit 8303073 into main Sep 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant