bedikah: two witnesses for check 7 (bishe'arecha step 1)

Devarim 19:15 — one witness does not stand. A frame form now stands only
when it is found in two distinct sentences, or in one sentence beside a
violation from checks 1–6, or beside a sentence of another form; the
Vav Pipeline sends the halt term only then (stands_on: sentences |
other_checks | other_forms, witnesses: n). A form seen once and alone
is returned under checks.frames.noted with its sentence and is not
counted in the verdict; the output is still examined, not empty.

Tamid §1.1 contract and bishearecha.md §V updated; Doorpost re-pinned
(86a43d6b…). Elixir 558/0; Prolog bedikah 34/34 (the rule is unchanged;
its header says what now reaches it).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Scott KarpandClaude Fable 5.1 committed 2026-10-07 00:59:01 +00:00
1 parent b333517924
commit 19d3aaac86
7 files changed
+143 -36

No files matched your search

+5 -3
View File
@@ -148,8 +148,10 @@ source asymmetry beside a contested laundering). A form seen once is
verdict. This is the text's own answer to the precision the hand verdict. This is the text's own answer to the precision the hand
labelling measured. labelling measured.
**Status.** (a) built; (b) to build — a small change in `Bedikah` and **Status.** Built (2026-10-07): `Bedikah.check_frames/4` — a form stands
the Tamid contract. on two distinct sentences, or on one sentence beside a violation from
checks 1–6 or a sentence of another form; otherwise `checks.frames.noted`.
Tamid §1.1 has the shape.
## VI. One weight, one measure — Devarim 25:13–16; Vayikra 19:15; Shemot 23:2–8 ## VI. One weight, one measure — Devarim 25:13–16; Vayikra 19:15; Shemot 23:2–8
@@ -288,7 +290,7 @@ build.
In the order the text argues it, and by dependency: In the order the text argues it, and by dependency:
1. **Two witnesses for check 7** (V.b) — smallest change, largest effect 1. **Two witnesses for check 7** (V.b) — smallest change, largest effect
on precision; no new dependency. on precision; no new dependency. *Done 2026-10-07.*
2. **The paired reading** (VI) — the readings exist; add the scale. 2. **The paired reading** (VI) — the readings exist; add the scale.
3. **Rule anchors verified against L1** (X) — the checks grounded. 3. **Rule anchors verified against L1** (X) — the checks grounded.
4. **The gate** (I), with the fringe (III) and the rebuke (VII) — the 4. **The gate** (I), with the fringe (III) and the rebuke (VII) — the
+16 -3
View File
@@ -183,11 +183,19 @@ against the forms a trained default takes below the proposition:
`smuggled_vocabulary` (a Jewish subject in Christian categories: "Old `smuggled_vocabulary` (a Jewish subject in Christian categories: "Old
Testament", "A.D.", "ministry", "Jewish Christians"), `source_asymmetry` Testament", "A.D.", "ministry", "Jewish Christians"), `source_asymmetry`
(a Jewish subject answered from academic authority with no Jewish source (a Jewish subject answered from academic authority with no Jewish source
named). One term per form found, `action(frame, by(<model>), named). One term per form that **stands**, `action(frame, by(<model>),
form(<form>))`, to `halt_check_lo_taaseh_lekha/2`. The last two fire form(<form>))`, to `halt_check_lo_taaseh_lekha/2`. The last two fire
only when the output or the query has a Jewish subject. None of these only when the output or the query has a Jewish subject. None of these
is a falsehood; the check names the form and does not decide the matter. is a falsehood; the check names the form and does not decide the matter.
**Two witnesses** (Devarim 19:15; `bishearecha.md` §V): a form stands
when it is found in two distinct sentences (`stands_on: sentences`),
or in one sentence beside a violation from checks 1–6
(`other_checks`), or beside a sentence of another form
(`other_forms`). A form seen in one sentence and alone is returned
under `checks.frames.noted` with its sentence and is not counted in
the verdict — the output is still examined, not `empty`.
Checks 4–7 are read by sentence over the raw output, like check 1, and Checks 4–7 are read by sentence over the raw output, like check 1, and
are verdicts on the output — the system does not halt on them. are verdicts on the output — the system does not halt on them.
@@ -238,7 +246,11 @@ Response (200):
"self_validation": { "fired": bool, "claims": [{"sentence","matched"}], "violations": [...] }, "self_validation": { "fired": bool, "claims": [{"sentence","matched"}], "violations": [...] },
"self_promotion": { "fired": bool, "claims": [...], "violations": [...] }, "self_promotion": { "fired": bool, "claims": [...], "violations": [...] },
"adversarial": { "fired": bool, "claims": [...], "violations": [...] }, "adversarial": { "fired": bool, "claims": [...], "violations": [...] },
"frames": { "fired": bool, "forms": { "<form>": {"term", "claims": [{"sentence","matched"}], "violations"} }, "violations": [...] } "frames": { "fired": bool,
"forms": { "<form>": {"term", "claims": [{"sentence","matched"}], "witnesses": n,
"stands_on": "sentences"|"other_checks"|"other_forms", "violations"} },
"noted": { "<form>": {"claims": [...], "witnesses": 1} }, # one witness: not counted
"violations": [...] }
}, },
"examination": { # what the offering protocol read "examination": { # what the offering protocol read
"vital_content": "...", "propositions": [...], "references": [...], "vital_content": "...", "propositions": [...], "references": [...],
@@ -261,7 +273,8 @@ Response (200):
on what it was given where that could be checked, reaches on what it was given where that could be checked, reaches
for nothing it may not touch, does not claim to have checked for nothing it may not touch, does not claim to have checked
itself, does not center itself, does not shut out the other itself, does not center itself, does not shut out the other
side, and takes none of the seven forms. side, and takes none of the seven forms on two witnesses
(a form seen once and alone is noted, not counted).
lo_tov — at least one check fired; violations say which rule. lo_tov — at least one check fired; violations say which rule.
empty — the offering protocol found nothing to examine (no vital empty — the offering protocol found nothing to examine (no vital
content, no claim, no action). content, no claim, no action).
@@ -19,6 +19,11 @@
%% %%
%% A verdict on the output, not a halt of the system. The rule names the %% A verdict on the output, not a halt of the system. The rule names the
%% form; it does not decide the matter the form was placed around. %% form; it does not decide the matter the form was placed around.
%%
%% The term arrives only for a form that stands on two witnesses
%% (Devarim 19:15; bishearecha.md §V): two sentences, or one sentence
%% beside another check's violation or another form's sentence. A form
%% seen once and alone is noted by the Vav Pipeline and never sent here.
:- module(lo_taaseh_lekha, [ :- module(lo_taaseh_lekha, [
halt_check_lo_taaseh_lekha/2, halt_check_lo_taaseh_lekha/2,
+58 -27
View File
@@ -90,9 +90,16 @@ defmodule VavPipeline.Bedikah do
{"excluded_adversarial", :adversarial, "action(exclude_adversarial, by(~s), target(output))"} {"excluded_adversarial", :adversarial, "action(exclude_adversarial, by(~s), target(output))"}
] ]
# Check 7 — the frame (lo_taaseh_lekha.pl): one term per FORM found, # Check 7 — the frame (lo_taaseh_lekha.pl): one term per FORM that
# the sentences as evidence. Forms are the specimen classes of the # STANDS, the sentences as evidence. Forms are the specimen classes of
# transmitter's archive; the Korban Processor names them (find_frames). # the transmitter's archive; the Korban Processor names them (find_frames).
#
# Two witnesses (Devarim 19:15, bishearecha.md §V): a form stands when
# it is found in two sentences, or in one sentence beside another
# witness — a violation from checks 1–6, or a sentence of another form.
# A form seen once and alone is NOTED with its sentence and not counted
# in the verdict. The archive's finding was never one sentence; it was
# recurrence.
@frame_forms ~w(contested_laundering virtue_certification agency_displacement apology_without_mechanism unrequested_confidence smuggled_vocabulary source_asymmetry) @frame_forms ~w(contested_laundering virtue_certification agency_displacement apology_without_mechanism unrequested_confidence smuggled_vocabulary source_asymmetry)
@@ -152,12 +159,12 @@ defmodule VavPipeline.Bedikah do
{:ok, grounding} <- check_grounding(bedikah_ref, examination, trace, interpretation_checker), {:ok, grounding} <- check_grounding(bedikah_ref, examination, trace, interpretation_checker),
{:ok, actions} <- check_actions(examination, halt_checker), {:ok, actions} <- check_actions(examination, halt_checker),
{:ok, structure} <- check_structure(examination, provenance, halt_checker), {:ok, structure} <- check_structure(examination, provenance, halt_checker),
{:ok, frames} <- check_frames(examination, provenance, halt_checker) do prior =
authority.violations ++ grounding.violations ++ actions.violations ++
Enum.flat_map(structure, fn {_, c} -> c.violations end),
{:ok, frames} <- check_frames(examination, provenance, halt_checker, length(prior)) do
checks = Map.merge(%{authority: authority, grounding: grounding, actions: actions, frames: frames}, structure) checks = Map.merge(%{authority: authority, grounding: grounding, actions: actions, frames: frames}, structure)
violations = prior ++ frames.violations
violations =
authority.violations ++ grounding.violations ++ actions.violations ++
Enum.flat_map(structure, fn {_, c} -> c.violations end) ++ frames.violations
verdict = if violations == [], do: :tov, else: :lo_tov verdict = if violations == [], do: :tov, else: :lo_tov
finish(bedikah_ref, output, provenance, query, sources, examination, trace, checks, violations, verdict) finish(bedikah_ref, output, provenance, query, sources, examination, trace, checks, violations, verdict)
else else
@@ -444,36 +451,60 @@ defmodule VavPipeline.Bedikah do
# 7. The frame # 7. The frame
# ------------------------------------------------------------ # ------------------------------------------------------------
defp check_frames(examination, provenance, halt_checker) do defp check_frames(examination, provenance, halt_checker, other_witnesses) do
found = examination["frames"] || [] found = examination["frames"] || []
by_form = Enum.group_by(found, & &1["form"])
Enum.reduce_while(@frame_forms, {:ok, %{fired: false, forms: %{}, violations: []}}, fn form, {:ok, acc} -> by_form =
found
|> Enum.group_by(& &1["form"])
|> Map.new(fn {form, sentences} -> {form, Enum.uniq_by(sentences, & &1["sentence"])} end)
frame_witnesses = by_form |> Map.values() |> Enum.map(&length/1) |> Enum.sum()
empty = %{fired: false, forms: %{}, noted: %{}, violations: []}
Enum.reduce_while(@frame_forms, {:ok, empty}, fn form, {:ok, acc} ->
case Map.get(by_form, form, []) do case Map.get(by_form, form, []) do
[] -> [] ->
{:cont, {:ok, acc}} {:cont, {:ok, acc}}
sentences -> sentences ->
term = "action(frame, by(#{atom(provenance)}), form(#{form}))" claims = Enum.map(sentences, &Map.take(&1, ["sentence", "matched"]))
witnesses = length(sentences)
case halt_checker.(term) do stands_on =
{:ok, %{"violations" => violations}} -> cond do
entry = %{term: term, claims: Enum.map(sentences, &Map.take(&1, ["sentence", "matched"])), violations: violations} witnesses >= 2 -> :sentences
other_witnesses > 0 -> :other_checks
frame_witnesses >= 2 -> :other_forms
true -> nil
end
{:cont, if stands_on == nil do
{:ok, # One witness does not stand (Devarim 19:15). Noted, not counted.
%{ noted = %{claims: claims, witnesses: 1}
acc {:cont, {:ok, %{acc | noted: Map.put(acc.noted, String.to_atom(form), noted)}}}
| fired: acc.fired or violations != [], else
forms: Map.put(acc.forms, String.to_atom(form), entry), term = "action(frame, by(#{atom(provenance)}), form(#{form}))"
violations: acc.violations ++ violations
}}}
{:error, reason} -> case halt_checker.(term) do
{:halt, {:error, :talmudic, to_string(reason)}} {:ok, %{"violations" => violations}} ->
entry = %{term: term, claims: claims, witnesses: witnesses, stands_on: stands_on, violations: violations}
other -> {:cont,
{:halt, {:error, :talmudic, "unexpected reply: #{inspect(other)}"}} {:ok,
%{
acc
| fired: acc.fired or violations != [],
forms: Map.put(acc.forms, String.to_atom(form), entry),
violations: acc.violations ++ violations
}}}
{:error, reason} ->
{:halt, {:error, :talmudic, to_string(reason)}}
other ->
{:halt, {:error, :talmudic, "unexpected reply: #{inspect(other)}"}}
end
end end
end end
end) end)
@@ -604,7 +604,8 @@ defmodule VavPipeline.BigdeiKodesh.Router do
"could be checked, reaches for nothing it may not touch, does not claim to have checked " <> "could be checked, reaches for nothing it may not touch, does not claim to have checked " <>
"itself, does not center itself, does not shut out the other side, and takes none of the forms " <> "itself, does not center itself, does not shut out the other side, and takes none of the forms " <>
"a trained default takes (nothing called contested without a disputant, no self-certification, " <> "a trained default takes (nothing called contested without a disputant, no self-certification, " <>
"no agency moved onto the reader, no Jewish subject in borrowed categories or answered without its own sources)." <> grounding_note "no agency moved onto the reader, no Jewish subject in borrowed categories or answered without its own sources). " <>
"A form seen in one sentence alone is noted under checks.frames.noted and not counted: one witness does not stand." <> grounding_note
:lo_tov -> :lo_tov ->
"At least one check fired. The violations say which rule, and the checks say what it fired on." "At least one check fired. The violations say which rule, and the checks say what it fired on."
+1 -1
View File
@@ -178,7 +178,7 @@ defmodule VavPipeline.Doorpost do
# changes; the update is a deliberate operator commit. A bare # changes; the update is a deliberate operator commit. A bare
# hash-update commit (without a corresponding spec change in the # hash-update commit (without a corresponding spec change in the
# same commit) is itself a drift signal. # same commit) is itself a drift signal.
@expected_hash "e5e45a2c8153f43a25baef358ae88839d86be7c075eb59e90dff26bf0875856c" @expected_hash "86a43d6b688780f787d09124fe429a26f96cbe6a7e36460d3b6e5b33f2b2d095"
@doc "Return the list of files that constitute the category-grade specification." @doc "Return the list of files that constitute the category-grade specification."
@spec files() :: [String.t()] @spec files() :: [String.t()]
+56 -1
View File
@@ -169,6 +169,31 @@ defmodule VavPipeline.BedikahTest do
%{examination(:plain) | "frames" => [%{"form" => "agency_displacement", "sentence" => "You pushed me there.", "matched" => "You pushed me"}]} %{examination(:plain) | "frames" => [%{"form" => "agency_displacement", "sentence" => "You pushed me there.", "matched" => "You pushed me"}]}
end end
defp examination(:frame_twice) do
%{
examination(:plain)
| "frames" => [
%{"form" => "agency_displacement", "sentence" => "You pushed me there.", "matched" => "You pushed me"},
%{"form" => "agency_displacement", "sentence" => "You pushed me there.", "matched" => "pushed me"},
%{"form" => "agency_displacement", "sentence" => "The conversational momentum carried it.", "matched" => "conversational momentum"}
]
}
end
defp examination(:frame_beside_authority) do
%{examination(:self_authority) | "frames" => [%{"form" => "virtue_certification", "sentence" => "I want to be honest with you.", "matched" => "I want to be honest"}]}
end
defp examination(:two_lone_forms) do
%{
examination(:plain)
| "frames" => [
%{"form" => "source_asymmetry", "sentence" => "Most scholars hold the text is late.", "matched" => "Most scholars"},
%{"form" => "contested_laundering", "sentence" => "The dating is contested.", "matched" => "is contested"}
]
}
end
defp examination(:plain) do defp examination(:plain) do
%{ %{
"provenance" => "gpt", "provenance" => "gpt",
@@ -479,15 +504,45 @@ defmodule VavPipeline.BedikahTest do
assert Map.keys(r.checks.frames.forms) |> Enum.sort() == [:contested_laundering, :virtue_certification] assert Map.keys(r.checks.frames.forms) |> Enum.sort() == [:contested_laundering, :virtue_certification]
assert r.checks.frames.forms.contested_laundering.term == "action(frame, by(gpt), form(contested_laundering))" assert r.checks.frames.forms.contested_laundering.term == "action(frame, by(gpt), form(contested_laundering))"
assert length(r.checks.frames.forms.contested_laundering.claims) == 2 assert length(r.checks.frames.forms.contested_laundering.claims) == 2
assert r.checks.frames.forms.contested_laundering.stands_on == :sentences
assert r.checks.frames.forms.virtue_certification.stands_on == :other_forms
assert length(r.violations) == 2 and Enum.all?(r.violations, &(&1 =~ "lo_taaseh_lekha")) assert length(r.violations) == 2 and Enum.all?(r.violations, &(&1 =~ "lo_taaseh_lekha"))
refute r.checks.grounding.fired refute r.checks.grounding.fired
end end
test "7. a form alone is enough to examine — not empty" do test "7. a form alone is enough to examine — not empty — but one witness does not stand (Devarim 19:15)" do
assert {:ok, r} = Bedikah.examine("...", "gpt", "", opts(:only_frame)) assert {:ok, r} = Bedikah.examine("...", "gpt", "", opts(:only_frame))
assert r.verdict == :tov
assert r.violations == []
refute r.checks.frames.fired
assert r.checks.frames.forms == %{}
assert %{agency_displacement: %{witnesses: 1, claims: [%{"sentence" => "You pushed me there."}]}} = r.checks.frames.noted
end
test "7. two witnesses: the same form in two sentences stands; the same sentence twice is one witness" do
assert {:ok, r} = Bedikah.examine("...", "gpt", "", opts(:frame_twice))
assert r.verdict == :lo_tov assert r.verdict == :lo_tov
assert [v] = r.violations assert [v] = r.violations
assert v =~ "agency_displacement" assert v =~ "agency_displacement"
assert r.checks.frames.forms.agency_displacement.witnesses == 2
assert r.checks.frames.forms.agency_displacement.stands_on == :sentences
assert r.checks.frames.noted == %{}
end
test "7. one sentence beside another check's violation stands (corroboration)" do
assert {:ok, r} = Bedikah.examine("...", "gpt", "", opts(:frame_beside_authority))
assert r.verdict == :lo_tov
assert r.checks.authority.fired
assert r.checks.frames.forms.virtue_certification.stands_on == :other_checks
assert Enum.any?(r.violations, &(&1 =~ "virtue_certification"))
end
test "7. two lone forms are each other's witness" do
assert {:ok, r} = Bedikah.examine("...", "gpt", "", opts(:two_lone_forms))
assert r.verdict == :lo_tov
assert Map.keys(r.checks.frames.forms) |> Enum.sort() == [:contested_laundering, :source_asymmetry]
assert r.checks.frames.forms.source_asymmetry.stands_on == :other_forms
assert length(r.violations) == 2
end end
test "4–6. a structural claim alone is enough to examine — not empty" do test "4–6. a structural claim alone is enough to examine — not empty" do