Skip to content

v0.6.0

Latest

Choose a tag to compare

@cristianducu cristianducu released this 28 Aug 05:34
· 10 commits to main since this release
c60c1bd

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 roots
  • descendants - everything downstream of a record
  • siblings - a candidate's generation
  • frontier - candidates never considered, and winners with no continuation yet
  • standing - one record's standing, taint, retraction status, and restorations
  • evidence - what a selection or a whole line rests on
  • selected - 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::queries module - 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 Writer and Receipt, 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.