Skip to content

v0.1.69 — one bad ledger entry no longer disables every stance

Latest

Choose a tag to compare

@mitchjablonski mitchjablonski released this 18 Oct 01:25
feeb796

v0.1.69 ships the 2 PRs merged on main since v0.1.68, both merge commits: #556 and #559.

What ships

One bad ledger entry no longer disables every stance (#559, fixes #557)

Before, a single malformed taste-ledger entry (for example a non-string concept) made the matcher throw. The failure was silent, and every stance stopped enforcing. That happened in both the hook and the server-side present_* gate. Now:

  • A bad concept is ignored or coerced: concept: {name: "…"} is read as its name. A non-string concept is treated as absent.
  • The entry still enforces: it matches through its description, with an ask by default and a deny under strict-stop.
  • A truly unusable entry is skipped and recorded, while every other valid stance keeps enforcing.
  • Valid ledgers behave byte-identically to before.

Preflight failures are classified and visible in doctor (#556, refs #546)

This is observability only; hook decisions are unchanged. The hook's stdout, stderr and exit status are byte-identical to main in every characterized case.

  • A failure taxonomy: input_malformed, ledger_unreadable, ledger_corrupt, matcher_import_failed, evaluator_threw, session_store_unreadable and ledger_entry_invalid, written as a bounded, redacted record.
  • Doctor reports recent failures and the gate mode as visible to doctor. It labels settings env versus shell env, and never claims the hook's effective environment.
  • docs/preflight-modes.md says explicitly that strict-stop is not fail-closed protection.

Known limits (no fail-closed claim)

  • File-level corrupt or unreadable ledgers still fail open, as before. These changes are observability plus restored intended behavior.
  • #546 stays open for the remaining items, and #553 (worker subagent denies don't reach the parent) is open.

Not in this release: the delegate slices S1–S6, #430 and #434.

Review provenance

Each is from the PR's comments.

  • #556: Opus adversarial review requested changes at 04b5ae8b (the only blocker was a rebase onto #552). An Opus delta review approved 42fcf2b7, and the refresh onto v0.1.68 (74d6cf7b) was re-checked side by side (108 rows). Merged as 2beecf0e by Opus under Mitch's authorization.
  • #559: Opus adversarial review approved 48880c3e. After a LOW fix (a bad concept no longer skips the entry), an Opus delta re-review approved 92dd5bed. Merged as c87f9187 by Opus under Mitch's authorization; GitGuardian was skipped on the merge. A GitGuardian alert (incident 38341052) on #559 was checked and is a false positive: const SECRET = "sk-ant-api03-MCP-BAD-ENTRY"; at preflight-bad-entry-mcp.test.ts:18 is a made-up redaction canary in a test. This is recorded on #559 and #560.

Verification

Measured on a fresh native clone, branch release/v0.1.69 off main c87f9187:

  • Version sources: all four read 0.1.69.
  • Diff vs main: 7 files, 7 insertions and 7 deletions (the four version sources plus the daemon.js, standalone.js and doctor.mjs stamps).
  • Cold build: pnpm install --frozen-lockfile, then pnpm build:clean; the regenerated stamps are committed.
  • Typecheck: 3 of 3 tasks clean.
  • Lint: 0 errors; mcp-server 219 warnings (cap 240), shared 3.
  • Tests: full FORCE_COLOR=0 NO_COLOR=1 pnpm test passes on the first run, in the foreground: mcp-server 403 files and 6,115 tests (108 skipped), shared 15 files and 321 tests. No timing failures.
  • Checks: version-lockstep and plugin-bundle-boot pass (2 files, 5 tests).
  • Rebuild: a second cold pnpm build:clean leaves git status clean, and grep -rF "0.1.68" claude-plugin/server returns nothing.
  • Conflict markers: none.