Repository navigation
AssertLedger 1.2.0
1.2.0 — 2026-09-25
An explicitly authored bun:test regression candidate can now produce attributed AssertLedger
evidence on the qualified Bun 1.4.2 runtime. The built-in v3 adapter wraps bun:test callbacks
before test files load and identifies only errors thrown by the packaged assertSame helper.
Native Bun expect failures stay non-attributed. Bun's JUnit totals check completeness; they
never decide whether a failure is an assertion.
- Add verification request/evidence manifest v3, Bun initialization v2, and Bun runtime doctor v2.
Historical v1/v2 schema bytes and replay remain unchanged; the new schemas extend the additive
schema lock. The manifest binds Bun executable, driver, preload, helper, and preflight identity. - Pin Bun 1.4.2 on the Windows, Linux, and macOS verification matrix. The adapter uses serialized
bun:testcallback instrumentation in explicitly unsandboxed trusted-local execution; container
Bun requests are refused. Missing or inconsistent callback and JUnit counts, ordinary errors,
and timeouts cannot kill a target. - Carry assertion ownership from the preload through a signed process pipe and emit the final
report from the driver. Candidate-written files cannot forge either evidence channel. Ownership
is scoped to each test callback execution, including each parameterized row, so a saved error
cannot be replayed. AsyncLocalStorage preserves that scope across asynchronous continuations.
Multiple failing candidate rows are credited only when every failure is an owned assertion. - Package the
assertledger/bunhelper and validate its JavaScript and TypeScript exports in a
fresh package consumer. See verification v3 migration. - Let static
doctorselect--framework bun:testin mixed repositories, including through SDK
and MCP, without executing repository code.
Compatibility: existing Node and structured-command requests keep their v1/v2 contracts and
decisions. Bun campaigns require v3 requests and new candidate tests that import assertSame;
old Bun expect tests can remain base controls but their failures do not count as target evidence.
The v1 evidence provider/export surface does not project Bun v3 evidence.
A repository that keeps a local-only symbolic link, such as an agent's skill directory, can now be
diagnosed and initialized without weakening the link refusal.
doctorandinitaccept--exclude NAME, repeatable, and the MCPassertledger_doctortool an
optionalexcludearray. Each value is one portable entry name, skipped at any depth like the
defaults; anything else is aCONFLICTwithINVALID_REPOSITORY_EXCLUDE. The names are written to
repository.exclude, and a valid configuration's list then applies toinitanddoctorwithout
flags,analyzeand runtime doctor's configuration check. A different explicit list fails closed,
for example withCONFIG_CONFLICT, or withUNSUPPORTED_REPOSITORY_SYMLINKwhen it exposes a
link again.audit, campaign copies and manifest digests ignore the configured list: they keep the defaults
and, for a campaign, the verification request'srepository.exclude.audittherefore still
refuses a repository whose linked entry is only declared in the configuration.- A link inside the inventory still fails closed.
initand every static doctor now report it as a
CONFLICTresult withUNSUPPORTED_REPOSITORY_SYMLINKinstead of throwing, so the CLI keeps exit
code 4 and the MCP tool returns the result instead of an error.analyzestill throws. Runtime
doctor therefore reports such a repository asRUNTIME_CONFIGURATION_BLOCKEDinstead of
RUNTIME_CONFIGURATION_UNAVAILABLE. explain UNSUPPORTED_REPOSITORY_SYMLINKnow has a catalogue entry, and the
INVALID_REPOSITORY_EXCLUDEguidance describes entry names.isRepositoryExcludeNameis exported beside the configuration parser, andanalyzeRepository
takes an optional{ configuredExcludes: true }; without it, the engine function is unchanged.
Compatibility: schema, policy, profile, benchmark and conformance versions, manifest, audit and
benchmark digest projections are unchanged. The public analyze result, whose digest is not
evidence, now omits configured names, so its files and repositoryDigest can differ from an audit
of the same tree. A configuration written by 1.1.1 plans the same bytes. A configuration
whose repository.exclude was edited by hand used to return CONFIG_CONFLICT; its names now apply
to the static inventory. SDK callers that caught the UNSUPPORTED_REPOSITORY_SYMLINK rejection from
init or doctor now receive a CONFLICT result.