Retraction and standing on every surface. This release adds no new record kinds and no spec change - the epoch stays 0.3 - and the library API is unchanged. What changes is reach: the semantics that define Bellbook (retraction, transitive taint, standing, restoration) were previously exercisable only from the Rust core; the CLI and the Python package can now tell the whole story, and the story is enforced in CI on both surfaces. Existing 0.3/0.4 receipts and rules validate identically.
Added
- CLI
bellbook retract(#83). Retract a committed record from a log:bellbook retract --log DIR --rules FILE --author ID --target RECORD_ID --reason TEXT [--json], with the same conventions as the other mutating commands. The record stays in the log; the receipt reports Tainted from then on. - Python
Writer.retract(author, target, reason)(#82). The same verb from thebellbookpackage, returning aCommitlike the other verbs. Ownership is enforced by replay: the retractor must be the target's author or an admin retraction actor, an Executor may never author one, and a Verdict or Retraction cannot be retracted. - Retraction-story rules knobs on both surfaces (#84).
bellbook rules init --admin IDand--reaffirmer ID, with matchingadmins=andreaffirmers=keyword arguments on Pythondefault_rules. Without these, records authored by an Executor were retractable only through a knob no adoption surface could set. - The repair pattern, verified and documented (#85). A candidate motivated by an evaluation names it in
derives_fromalongside the candidate it derives from;Causecarries intent, not taint, so retracting that evaluation later does not compromise the repair. - The release gate, enforced (#87). A CLI test and a Python test each replay the broken-benchmark story end to end - Clean, retract, standing collapse at depth, reaffirm, restoration recorded - asserting behavioral equivalence with
examples/broken_benchmark.rs, plus an ownership battery. - Quickstart Phase 2: the benchmark was broken (#86).
docs/quickstart-best-of-n.mdwalks retract -> Tainted -> reaffirm -> restoration in both columns, stating plainly: restoration restores standing, not Clean. The receipt stays Tainted permanently, because a record that could quietly return to Clean would be a record you could not trust.
Install
Rust:
cargo add bellbook@0.5.0
Python (prebuilt wheels for Linux, macOS, Windows; no Rust toolchain needed):
pip install bellbook==0.5.0
Verified
- crates.io: https://crates.io/crates/bellbook/0.5.0
- PyPI: https://pypi.org/project/bellbook/0.5.0/
pip install bellbook==0.5.0in a clean venv: the full retraction story (admin cross-author retract -> Tainted, reaffirm -> restoration recorded, receipt stays Tainted) passes against the published wheel.
Full Changelog: https://github.com/bellbook-ai/bellbook/blob/v0.5.0/CHANGELOG.md