A Bellbook log has always known more than it could tell you. Replay derives lineage, evidence, standing, taint - and until now, asking about any of it meant walking records by hand. RFC-0002 names the seven questions the log can answer, and this release implements the closed set on every surface:
descent- the line of descent from a candidate back to its rootsdescendants- everything downstream of a recordsiblings- a candidate's generationfrontier- candidates never considered, and winners with no continuation yetstanding- one record's standing, taint, retraction status, and restorationsevidence- what a selection or a whole line rests onselected- the selections under an exact objective, with chosen candidates and evidence
No new record kinds and no spec change - the epoch stays 0.3, and existing 0.3/0.4/0.5 receipts and rules validate identically. And no ranking anywhere: queries report annotated facts (standing, taint, retraction - nothing silently filtered) and the caller decides.
Every surface, the same answer
- Rust: the
bellbook::queriesmodule - deterministic, read-only, derived from what replay already computes. Queries answer only over verified state: an invalid log returns an error, never answers, and rejected records are not addressable. - CLI:
bellbook query NAME [ID|OBJECTIVE] (--log DIR --rules FILE | --receipt FILE) [--json]- the same queries over a live log or a portable receipt, with byte-identical JSON on both inputs (asserted in CI). - Python: the seven queries as methods on
WriterandReceipt, returning plain dicts/lists in the shared shapes. - Conformance: the corpus gains
query-cases.json- executable answers, with a build-failing assertion that every query name has vectors - and the independent Python validator implements the named set from scratch and agrees with the reference byte for byte, the same cross-implementation discipline the verdicts live under.
The gate proof
RFC-0002 pre-registered its own success criterion: re-running the project's field tests must need zero hand-walking of records. That proof now lives in CI - the canary best-of-N story (adopt a baseline on a benchmark, run a round, discover the benchmark was broken, retract, repair) rewritten so that every question is answered by bellbook query alone: who won and on what evidence, the full line of descent, what the line rests on (the retracted benchmark surfaces, annotated), standing after the repair, and what is still open on the frontier.
Tie-breaks become evidence
When two candidates pass and one wins, the reason deserves to be evidence, not prose. The best-of-N quickstart now documents the pattern: record the discriminating fact as an Evaluation under its own criterion, and the selection's evidence genuinely distinguishes the winner - queryable ever after. (rationale stays what it is: a recorded statement, verified by no one.)
Boundaries, kept
The general query engine - patterns, predicates, composition - remains gated on RFC-0001 section 15's adoption criterion, and nothing in this release re-opens that decision. The named set is closed, its semantics pinned three ways: the RFC for edge cases, SPEC section 12.4 for existence and boundaries, and the corpus for executable answers.
Install
cargo add bellbook # 0.6.0
pip install bellbook # 0.6.0
Full details in the CHANGELOG.