Skip to content

AssertLedger 1.2.0

Choose a tag to compare

@hoklims hoklims released this 25 Sep 20:10
· 132 commits to main since this release
9f68497

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:test callback 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/bun helper and validate its JavaScript and TypeScript exports in a
    fresh package consumer. See verification v3 migration.
  • Let static doctor select --framework bun:test in 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.

  • doctor and init accept --exclude NAME, repeatable, and the MCP assertledger_doctor tool an
    optional exclude array. Each value is one portable entry name, skipped at any depth like the
    defaults; anything else is a CONFLICT with INVALID_REPOSITORY_EXCLUDE. The names are written to
    repository.exclude, and a valid configuration's list then applies to init and doctor without
    flags, analyze and runtime doctor's configuration check. A different explicit list fails closed,
    for example with CONFIG_CONFLICT, or with UNSUPPORTED_REPOSITORY_SYMLINK when 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's repository.exclude. audit therefore still
    refuses a repository whose linked entry is only declared in the configuration.
  • A link inside the inventory still fails closed. init and every static doctor now report it as a
    CONFLICT result with UNSUPPORTED_REPOSITORY_SYMLINK instead of throwing, so the CLI keeps exit
    code 4 and the MCP tool returns the result instead of an error. analyze still throws. Runtime
    doctor therefore reports such a repository as RUNTIME_CONFIGURATION_BLOCKED instead of
    RUNTIME_CONFIGURATION_UNAVAILABLE.
  • explain UNSUPPORTED_REPOSITORY_SYMLINK now has a catalogue entry, and the
    INVALID_REPOSITORY_EXCLUDE guidance describes entry names.
  • isRepositoryExcludeName is exported beside the configuration parser, and analyzeRepository
    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.