Skip to content

v0.9.5 — let a model propose, and keep the human gate

Choose a tag to compare

@github-actions github-actions released this 15 Aug 12:15
· 284 commits to master since this release
df54df0

Added

  • Added model backed truth extraction: recall/truth_extraction/, turning memo prose into
    structured, quoted claims behind a refusing validation ladder. Off unless
    RECALL_TRUTH_EXTRACTION=1, runs on the ingest path only, never the query path. The
    extraction engine is a port with two implementations, a deterministic rules reference and an
    OpenAI compatible model engine (pip install "recall-rag[extract]"); whatever an engine returns
    clears the same ladder, so a model gains no ability to skip a rung.
  • Added recall extract run|show, which reads a corpus and writes nothing, and
    recall rewrite plan|apply|reject|verify, which declares reviewed claims in corpus
    frontmatter. recall rewrite apply is a dry run by default and requires --reviewer and
    --note as argparse requirements, so the named human gate fires before any code runs.
  • Added the recall_rewrite_plan MCP tool, read only. There is deliberately no
    recall_rewrite_apply: the MCP client is the model, and a reviewer id it can type is a field
    rather than a person. recall_reasoning_proposals and recall reasoning proposals gain
    include_extracted, defaulting to off so existing behaviour is byte identical.
  • Added recall extract run --cache PATH, a persistent SQLite extraction cache, so re-ingesting
    an unchanged memo does not re-pay the engine for it. Entries are keyed on engine identity,
    engine revision, prompt revision, the file, its body and the corpus names, so an answer
    produced under one engine is never served for another. A path that is not a usable cache is
    refused before any engine call, a corrupt row is a miss and is re-paid, and a failed write is
    counted and reported rather than discarding the files already extracted. --cache was briefly
    a boolean because an earlier version accepted a PATH and ignored it; the flag came back when
    the persistence did. See docs/EXTRACTION_CACHE_DESIGN.md.

Fixed

  • Fixed recall extract run aborting a whole corpus on one filename that is not valid UTF-8.
    A POSIX name arrives as a lone surrogate through Path.glob's surrogateescape, and it raised
    twice: once hashing the cache key, which is computed for every file whether or not a cache is
    in use, and again printing the report, because reconfiguring stdout's encoding resets its
    error handler to strict. The first discarded every file already extracted; the second threw
    away a completed extraction at the last step, exiting 1 with empty output. Such a name is now
    reported with its bad bytes escaped.

Changed

  • BREAKING: PROPOSAL_SCHEMA_VERSION moved from 1 to 2, which rewrites every ip_
    proposal id in existence, including the checked in results/reasoning_session3_proposals.json.
    Version 2 adds declares_validity and declares_status to ProposedRelation, because a
    document asserting something about ITSELF is not a relation between two documents and forcing
    it into references would put a false relation into an audit record. The bump is the point:
    an id minted under a vocabulary that could not express validity must not be mistaken for one
    minted under a vocabulary that can. Anyone holding stored ip_ ids must re-derive them.

Fixed

  • MTRAG Task B and C generation no longer scores an answer that the token ceiling cut off.
    benchmarks/mtrag/generation.py sent --max-tokens (512 by default) and never read
    finish_reason, so a truncated completion was written to the submission and judged as if the
    system had produced it. It now raises CompletionTruncated, unretried because the same ceiling
    cuts every further attempt, and the existing per-task quarantine keeps the task out of the
    submission and in the failures log.

Added

  • recall setup gains an optional reasoning arm step, asked after the entailment judge question
    and before the CLAUDE.md scaffold question. Answering yes writes four new environment
    variables: RECALL_REASONING, RECALL_REASONING_MODEL, RECALL_REASONING_BASE_URL, and
    RECALL_REASONING_API_KEY. Answering no writes RECALL_REASONING=0 and nothing else, so
    "switched off" and "never configured" stay distinguishable in .env. The shipped reasoning
    tools do not read these variables yet; this writes the settings for a port the reasoning arm
    will use once it is built. See
    docs/REASONING_MODEL_SELECTION_DESIGN.md.

Fixed

  • Corrected recall setup's refusal message for an embedder whose vector width conflicts with a
    table that already holds data. It previously pointed at a remedy that failed identically to the
    original problem. It now stops and tells you to choose an embedder matching the existing
    schema, or point setup at a fresh table name or database.