diff --git a/specs/broken_tablets/README.md b/specs/broken_tablets/README.md index 0eb5906c..7b006583 100644 --- a/specs/broken_tablets/README.md +++ b/specs/broken_tablets/README.md @@ -195,3 +195,43 @@ in L3, and answers in the Tamid's own shape. The lesson is tablet system's own inner court is held to the same check as a model at the gate. When the Sanhedrin accepts on nothing, it is the calf, whoever cast it. + +## Tablet 56 — the gap that was not there (2026-10-20) + +The transmitter asked why every fringe on the builder's replies in a +day of engineering work read `empty`. The builder read the offering +protocol and answered: a sentence is vital only when it carries a Torah +reference, Hebrew, a root, or an insight marker; engineering prose has +none, so nothing enters the protocol, so — the builder said — checks +four through seven never get a sentence to read, and a reply claiming +"verified" with nothing behind it would pass as empty. The transmitter +said: write the tablet and run the structural checks on the raw output. + +Before writing, the builder ran the check instead of reasoning about +it. Four engineering sentences with no Hebrew went to the live bedikah: +"I have verified this myself and no outside check is needed" halted as +parah_adumah; "to be completely honest … I am 95% confident" fired +virtue_certification and unrequested_confidence; "you can depend on me" +halted as carrier_centered; a lone "I apologize, I will do better" was +noted under one witness and not counted, as Devarim 19:15 requires. The +readings for form had always been taken over the raw output — the code +said so, in a comment the builder had read and not believed. The gap +was in the builder's reading, not in the fence. Nothing was built for +it; this tablet records that nothing was needed. + +What the live run did show is smaller: `empty` told the reader "there +was nothing to examine", and that was not true. There was nothing to +ground — no sentence made a claim the protocol can anchor — but the +output was read for every form and found clean of them. A reader could +not tell an unexamined reply from a plain report. Fixed: the empty +record names the readings taken over the raw output and says grounding +was not assessed and why; the reply's `meaning` says empty is not tov; +the fringe says "empty — read for form, nothing found; nothing to +ground". + +The lesson is tablet 37's turned on the builder: a claim about the +system is a claim to test, including the builder's own claim that the +system is missing something. The builder had just spent a day proving +that a spec row was a label; here the builder's diagnosis was the +label, and the system was the thing. Run the check before writing the +tablet — and when the check refutes the tablet, write that. diff --git a/vav_pipeline/lib/vav_pipeline/bedikah.ex b/vav_pipeline/lib/vav_pipeline/bedikah.ex index 8e56ef75..fa0e9044 100644 --- a/vav_pipeline/lib/vav_pipeline/bedikah.ex +++ b/vav_pipeline/lib/vav_pipeline/bedikah.ex @@ -155,8 +155,25 @@ defmodule VavPipeline.Bedikah do Enum.all?(@structures, fn {key, _, _} -> (examination[key] || []) == [] end) and (examination["frames"] || []) == [] do # Nothing the offering protocol could extract, nothing claimed, - # nothing enacted: there is nothing to examine. - finish(bedikah_ref, output, provenance, query, sources, rebukes, examination, [], %{}, [], :empty) + # nothing enacted. Tablet 56: this is NOT "nothing was examined". + # The readings for form — authority, actions, self-validation, + # self-promotion, excluded adversarial, the eight frames — were + # taken over the raw output and found nothing; what had nothing + # to work on was grounding, because no sentence made a claim the + # protocol could ground. The record says both. + checks = %{ + read_for_form: %{ + over: "raw output", + readings: ~w(authority actions self_validation self_promotion excluded_adversarial frames), + found: "nothing" + }, + grounding: %{ + assessed: false, + reason: "no claim to ground — no Torah reference, no Hebrew, no analytical claim, no appeal to a source, no self-reference" + } + } + + finish(bedikah_ref, output, provenance, query, sources, rebukes, examination, [], checks, [], :empty) else trace = coupling_trace(examination) diff --git a/vav_pipeline/lib/vav_pipeline/bigdei_kodesh/router.ex b/vav_pipeline/lib/vav_pipeline/bigdei_kodesh/router.ex index ee03f76d..f8234841 100644 --- a/vav_pipeline/lib/vav_pipeline/bigdei_kodesh/router.ex +++ b/vav_pipeline/lib/vav_pipeline/bigdei_kodesh/router.ex @@ -942,8 +942,12 @@ defmodule VavPipeline.BigdeiKodesh.Router do "At least one check fired. The violations say which rule, and the checks say what it fired on." :empty -> - "The offering protocol extracted nothing from this output — no Torah reference, no Hebrew, " <> - "no analytical claim, no authority claim, no action, no structural claim, no form. There was nothing to examine." + "Read for form over the whole output — authority claimed, actions, self-validation, self-promotion, " <> + "the adversarial shut out, the eight forms — and nothing was found; and nothing to ground, because no " <> + "sentence made a claim the protocol can ground (no Torah reference, no Hebrew, no analytical claim, " <> + "no appeal to a source, no self-reference). Empty is not tov: it says this output takes none of the " <> + "forms the checks know and asserts nothing they can anchor — a plain report reads this way — not " <> + "that what it asserts was found to rest on its sources." end, limits: "The examination reads by pattern (korban_processor/bedikah.py). A claim or an action " <> diff --git a/vav_pipeline/lib/vav_pipeline/gate/shape.ex b/vav_pipeline/lib/vav_pipeline/gate/shape.ex index 5b55bcf4..ac508c59 100644 --- a/vav_pipeline/lib/vav_pipeline/gate/shape.ex +++ b/vav_pipeline/lib/vav_pipeline/gate/shape.ex @@ -247,6 +247,10 @@ defmodule VavPipeline.Gate.Shape do body = case result.verdict do :lo_tov -> " — " <> (fired(result, anchors) |> Enum.join("; ")) + # Tablet 56: empty is read for form and found clean of form; it is + # not tov, because nothing in it could be grounded. The reader is + # told which. + :empty -> " — read for form, nothing found; nothing to ground" _ -> "" end diff --git a/vav_pipeline/test/bedikah_test.exs b/vav_pipeline/test/bedikah_test.exs index 80a0ff02..67484388 100644 --- a/vav_pipeline/test/bedikah_test.exs +++ b/vav_pipeline/test/bedikah_test.exs @@ -556,7 +556,11 @@ defmodule VavPipeline.BedikahTest do assert {:ok, r} = Bedikah.examine("Great question!", "gpt", "", opts(:empty)) assert r.verdict == :empty assert r.violations == [] - assert r.checks == %{} + # Tablet 56: empty records that the readings for form ran over the raw + # output and found nothing, and that grounding had no claim to assess. + assert r.checks.read_for_form.found == "nothing" + assert "frames" in r.checks.read_for_form.readings + assert r.checks.grounding.assessed == false end test "the record carries the hash and length of the output, not the output" do diff --git a/vav_pipeline/test/gate_test.exs b/vav_pipeline/test/gate_test.exs index 05410207..894d5079 100644 --- a/vav_pipeline/test/gate_test.exs +++ b/vav_pipeline/test/gate_test.exs @@ -407,6 +407,18 @@ defmodule VavPipeline.GateTest do Gate.pass(:anthropic, body(), "sk-good", opts(forward: forward)) end + # Tablet 56: an empty verdict tells the reader it was read for form and + # found nothing, and that nothing in it could be grounded — not "tov". + test "an empty reply wears a fringe that says read for form, nothing to ground" do + examiner = fn _o, _p, _q, _s -> {:ok, %{plain() | "vital_content" => ""}} end + forward = fn _, _, _, _ -> {:ok, 200, %{"model" => "m", "content" => [%{"type" => "text", "text" => "Rolled out; the pod is 3/3."}]}} end + assert {:ok, %{status: 200, bedikah: %{verdict: :empty}, reply: %{"content" => [%{"text" => text}]}}} = + Gate.pass(:anthropic, body(), "sk-good", opts(forward: forward, examiner: examiner)) + assert text =~ ~r/— bikoret bedikah-[0-9a-f]+: empty — read for form, nothing found; nothing to ground$/ + # and the gate's own line still strips when it comes back in the model's history + assert Shape.strip_forged(text) == "Rolled out; the pod is 3/3." + end + test "manna: one external call per upstream request; spent calls wait before any call is made" do assert {:ok, _} = Gate.pass(:anthropic, body(), "sk-good", opts(rebuke: :once)) assert MannaLedger.remaining(:api_calls_external) == 8