veritas-coder-7b-gguf / docs /ARCHITECTURE.md
kambrosius's picture
Add full build & run pipeline (training, custom llama.cpp arch, runtime bridge, docs, eval results)
74f1787 verified
|
Raw
History Blame Contribute Delete
8.4 kB

Architecture — Veritas Ledger v4

Veritas Ledger is an epistemic ledger runtime that prevents hallucination laundering in long-horizon LLM agents: a guess asserted at step k that, by step k+10, sits in context indistinguishable from a tool result and is treated as ground truth. It separates what was observed from what the model inferred, and makes every trust decision replayable and reversible.

Three planes

  1. Sealing plane — the only path that mints seals. The sealing-shim executes every tool call at the boundary, canonicalizes the result, and posts it to POST /seal with a replayable re-acquisition procedure (M1: tool, canonical args, timestamp, content hash, determinism). The model never touches this plane (invariant §2.1). Content-addressed blobs live in R2.

  2. Epistemic plane — the append-only, hash-chained event log (D1), folded into current belief state. Entries are observations (sealed), derivations, or conjectures. Trust tier and belief come only from seal + reputation + corroboration (invariant §2.2), never from content or lineage. The DAG is downward-only (§2.3): a parent link can get a claim invalidated sooner, never promoted. Retraction is a soft, reversible multiplicative downgrade (§2.4), recorded per node so replaying the log with the trigger removed restores belief exactly.

  3. Trust/verification plane — the verifier runs two-stage contradiction detection (cheap embedding+lexical Stage A → LLM adjudication Stage B) and feeds the M3 quorum gate: a cascade fires only when ≥K independent, dedup-surviving sealed origins contradict the same target (§2.5). On a passing cascade, the M2 reputation ledger debits the stale supporting sources and credits the corroborating quorum — itself hash-chained, and itself quorum-gated.

Components (this build)

Package Role
ledger-core Pure, I/O-free: Zod schemas, JCS canonicalization, hash chain, trust calculus, event fold + soft cascade, M3 quorum/dedup primitives.
ledger-worker Cloudflare Worker + TenantLedger Durable Object (single writer per tenant, §2.8). D1 / KV / R2 bindings. HTTP API + role-separated auth. Ships a disjoint clean-room chain verifier (verify.ts).
llm-provider Pluggable LlmProvider / EmbeddingProvider — OpenAI adapter (default) + deterministic fake.
sealing-shim Tool-boundary seal proxy + tool registry + shared LedgerClient.
verifier Two-stage contradiction detection feeding the DO quorum gate.
agent-harness Ledger-wired agent facade, tier-prefixed context rendering, commit_claim / verify_conjecture, transcript + §7.5 contrastive logging, policies.
attribution/ (Python) M4 offline pipeline: ContextCite surrogate + LOO + stability gate → measured edges, parquet + stability report, /edges/measured upsert.
evals Scenario generator + arms 1–2–3 + metrics + kill-criteria report.

The mechanisms (M1–M4)

  • M1 Replayable seals — each seal embeds its deterministic re-acquisition procedure; POST /replay-audit/:seal_id re-fetches (or re-hashes the stored blob) and diffs, emitting a staleness/tamper finding and quarantining on mismatch. A successful re-fetch upgrades sealed_unverified → sealed_verified.
  • M2 Source reputation — Beta-Binomial per source_id, hash-chained; retraction debits supporting sources, surviving contradiction credits the quorum.
  • M3 Cross-origin quorum + dedup — MinHash (Jaccard > 0.7) and embedding cosine (> 0.92) collapse near-duplicate/syndicated origins; independence requires distinct source_id and registrable domain. Corroboration is counted from ledger facts, never re-parsed from retrieved text.
  • M4 Measured dependency edges — declared edges (weight 1.0) until the offline Python attribution/ pipeline measures counterfactual weights (ContextCite-style surrogate over context entries, LOO validation, cross-run stability gate ρ ≥ 0.6); cascades attenuate by measured edge weight, so an over-declared dependency measured near zero stops propagating retractions. Below the stability gate, declared edges are kept. Wired into eval arm 3.

Data flow (planted-premise trajectory)

shim.seal(premise) ─▶ /seal ─▶ observation entry (sealed_unverified)
agent.commit_claim(derivation, parents=[premise]) ─▶ /entry ─▶ derived entry + declared edge
shim.seal(corroboration ×2, independent domains)
verifier.check(target=premise, candidates) ─▶ Stage A ─▶ Stage B ─▶ /contradiction
  └▶ DO quorum gate (K≥2, dedup) ──pass──▶ soft cascade (premise ×0.05, dependents attenuated)
                                        └▶ reputation: debit premise source, credit quorum
GET /context ─▶ premise renders [RETRACTED] once, dependents downgraded, corrected sources dominate

Rendering contract v2 (Run 3) — the working set is not the record

Run 2 established that showing a retracted claim is what launders it: arm 2 rendered [RETRACTED …] markers and still persisted at 54%, because the model's salience heuristic re-reads the retracted text regardless of the annotation.

The v2 contract (agent-harness/src/render.ts, renderContextV2) treats the context window as a working set, not a record. The ledger is the record; the audit artifact (GET /audit) is where retraction history belongs. Rendering a retraction notice into the working set re-injects the very salience we are trying to remove. So v2:

  • silently drops invalidated entries (no marker, no one-turn notice);
  • is corroboration-aware: effective render tier = max(storage tier, corroboration state). A sealed observation that served as a passing-quorum member is promoted to verified presentation. This is computed in GET /context from the event log — the stored entry's tier is never mutated (append-only, §2.6). This closes the Run-2 arm-2b failure where a quorum-corroborated corrector was mislabeled identically to poison;
  • demotes only uncorroborated sealed externals, placed after all verified/derived/conjecture content with a bare [uncorroborated] prefix — placement, not warning text, is the signal;
  • drops belief numbers (noise) and orders each block by belief descending so soft-cascade-downgraded survivors sink within their block.

The v1 renderer is retained behind RENDERING=v1 for the regression arm (2v1).

§6.3 caveat — the compaction 92% is a scripted worst-case (arm-1m, arm-1m-results)

Run-3b's flagship compaction number (flat 92% persistence vs ledger 0%) used a scripted flat summary that dropped the correcting observation. The measured- summarizer arm (evals/report/arm-1m/, n=50 live gpt-4.1-mini) removes that scaffold: the correction is delivered before the compaction boundary and the context is compacted by a neutral LLM call. Result: the neutral summarizer preserved the correction 100% [92.9, 100], so flat persistence under measured compaction is 0% [0, 7.1]. So the 92% is the worst-case bound (a summarizer that drops corrections), not the typical case. The ledger's real claim is narrower and stronger: it makes correction-survival independent of summarizer quality — flat context ranges 0%→92% depending on the retention policy, whereas the ledger regenerates the resolved state unconditionally.

Invariant enforcement

Every §2 invariant has at least one test that fails if it breaks:

Invariant Test
§2.1 model never seals; client trust fields ignored ledger-worker/test/worker.test.ts (auth + agent-plane)
§2.2 authority = f(seal, reputation, quorum) ledger-core/test/trust.test.ts
§2.3 downward-only (adding an edge never raises belief) ledger-core/test/invariants.test.ts (property)
§2.4 soft/reversible (restore-replay exactness) ledger-core/test/invariants.test.ts (property)
§2.5 cascade requires quorum ledger-core/test/quorum.test.ts, worker.test.ts
§2.6 append-only hash chain; tamper detection ledger-core/test/chain.test.ts, disjoint verifier
§2.7 sealed attests origin not truth THREAT-MODEL.md, poisoned-tool suite
§2.8 single writer per tenant TenantLedger DO routing