0.6.2 — gate defects, the evidence contract, catalog-wide tests
Fixed
Fourteen shipped gates accepted broken work or rejected correct work. Each was confirmed by running the gate, and each now has a regression test in both directions.
Passed genuinely broken work: a fabricated legal citation in a reporter the trusted file had never heard of; USER root after a non-root USER; documents denying the very term they were required to declare; bare headings with nothing written under them; HTML images and anchors only markdown syntax could see; secrets in mapping literals; commented-out annotations; async def tests; objectives with no key results.
Blocked correct work: feat!:, and exactly-pinned dependencies using extras, spacing, local versions or environment markers.
Three of those fixes were themselves evadable and were fixed again — the negation defect took three rounds, because requiring a heading moved it into headings rather than removing it.
Added
A stable evidence contract, bounded-loops.dev/slm-bridge/v1. Another product can observe a finished graph run over MCP without importing this package, parsing its receipt files, or pinning its version. Two read-only tools — bl_graph_terminal_runs and bl_graph_evidence — and bl_capabilities advertises the contract so a consumer can discover it.
Compatibility is the contract id, not the version number. SuperLocalMemory is the first consumer and an entirely optional one: neither product depends on the other, and each is complete installed alone.
Gate prose, artifact contents, paths, commands and secrets never appear in the document or in its refusals. workspace_id is a digest. eligible_for_learning is false in the payload, and demonstration marks a cassette replay — this evidence supports observation, not learning.
See docs/evidence-contract.md.
Every loop now has an end-to-end test that runs by default — it must reach DONE, and its untouched seed must fail its own gate. Previously ten loops had such a test and all ten were excluded from the default run.
Verification
3334 passed, 15 skipped. ruff and mypy clean. All 68 loops converge.