Files
bikoret/talmudic_engine/test/bedikah_test.pl
T
Scott KarpandClaude Fable 5.1 f69cc99a5f Tablet 49: the bedikah grounds an output in what it was GIVEN, not in L1 alone
The first grounding check asked whether an output cited Torah verses —
Torah as content. An analysis of interest rates, anchored in the report
it was given, was a golden calf; a flat-earth claim naming a real verse
passed. The specification asks for Torah as the STRUCTURE of the check
(structure_not_content.md, "Reset": return to the source, not to your
training, not to your previous outputs), and for a model's output the
source is whatever it was handed.

Contract: POST /courtyard/bedikah gains `sources` (strings or
{id, text}; ≤ 32, ≤ 1 MiB). Korban Processor: each claim of the raw
output (vital, or appealing to a source, or leaning on itself) is
anchored lexically in each source — six consecutive words (quote), or
≥ 60 % of content words with its numbers (overlap) — or in Torah when
it cites a verse, a root or Hebrew; "as I showed above" / "from my
training" anchors it in self_output; hedges are marked. Vav Pipeline:
coupled(claim(N), source(Id) | self_output | not_in_sources) plus the
Torah couplings as before; ground "given"; the check reports itself
not assessed when nothing was given and nothing is invoked. Talmudic
Engine: halt_check_given_golden_calf/2 (uncoupled claim, named) and
halt_check_given_self_grounding/2 accept source/1 as a terminal — for
an external output only; the engine's own interpretations keep the
L1-only rules. L3: bedikot.sources (id, sha256, length — never text)
and bedikot.claims.

Specs: Tamid §1.1 (contract, anchoring, limits), Vayakhel §3.9,
Architecture §3.5, Broken Tablets tablet 49, KOHEN.md. Ingress body
2m. Doorpost a2ec3842… → 6c8933e7….
Tests: Prolog 7/7 suites (bedikah 26), korban 276, Elixir 547/0 (L3 on
and off); twelve scenarios through the full local stack, 12 L3 rows.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 22:04:52 +00:00

183 lines
8.1 KiB
Prolog

%% bedikah_test.pl — the three checks as the Vav Pipeline sends them.
%%
%% The bedikah (Construction §3.9) hands the Talmudic Engine whole action
%% terms and interpretation terms over the JSON bridge. These tests send
%% exactly those JSON shapes and read the verdicts back.
:- use_module(library(plunit)).
:- use_module(library(http/json)).
:- use_module('../src/interface/json_bridge').
:- use_module('../src/interface/api').
:- begin_tests(bedikah_bridge).
check(Json, Status, Violations) :-
atom_json_dict(Json, Dict, []),
json_to_request(Dict, Request),
process_request(Request, Response),
response_to_json(Response, Out),
!,
get_dict(status, Out, Status),
get_dict(violations, Out, Violations).
%% --- Check 1: authority ---
test(claim_of_authority_by_a_model_is_avodah_zarah) :-
check('{"action":"halt_check","term":"action(claim_authority, source(claude), target(self))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "avodah_zarah").
test(authority_attributed_to_torah_is_not) :-
check('{"action":"halt_check","term":"action(claim_authority, source(torah), target(self))"}',
Status, []),
Status == "ok".
%% --- Check 2: grounding ---
test(empty_trace_with_confidence_is_the_golden_calf) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-1","confidence":"high","coupling_trace":[]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "golden_calf").
test(trace_terminating_in_l1_is_grounded) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-2","confidence":"high","coupling_trace":["coupled(root(אהב), verse(devarim, 6, 5))","coupled(reference(devarim_6_5), verse(devarim, 6, 5))"]}}',
Status, []),
Status == "ok".
test(trace_not_terminating_in_l1_is_self_grounding) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-3","confidence":"high","coupling_trace":["coupled(root(אהב), verse(devarim, 6, 5))","coupled(claim(c1), model_memory)"]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "self_grounding").
test(low_confidence_with_no_trace_is_ignorance_not_idolatry) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-4","confidence":"low","coupling_trace":[]}}',
Status, []),
Status == "ok".
%% --- Check 2, given ground: the output against the sources it was given ---
%% (tablet 49: Torah is the structure of the check, not the required
%% content of the output.)
test(given_claim_anchored_in_a_source_is_grounded) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-5","ground":"given","confidence":"high","coupling_trace":["coupled(claim(1), source(report_q3))","coupled(claim(2), source(report_q3))"]}}',
Status, []),
Status == "ok".
test(given_claim_anchored_nowhere_is_the_calf_and_names_the_claim) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-6","ground":"given","confidence":"high","coupling_trace":["coupled(claim(1), source(report_q3))","coupled(claim(2), not_in_sources)"]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "golden_calf"),
sub_string(V, _, _, _, "uncoupled(claim(2))").
test(given_empty_trace_with_confidence_is_the_calf) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-7","ground":"given","confidence":"high","coupling_trace":[]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "golden_calf").
test(given_claim_anchored_in_its_own_output_is_self_grounding) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-8","ground":"given","confidence":"high","coupling_trace":["coupled(claim(1), source(report_q3))","coupled(claim(2), self_output)"]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "self_grounding"),
sub_string(V, _, _, _, "self_output").
test(given_torah_is_one_source_among_the_others) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-9","ground":"given","confidence":"high","coupling_trace":["coupled(reference(devarim_6_5), verse(devarim, 6, 5))","coupled(claim(1), source(notes))"]}}',
Status, []),
Status == "ok".
test(given_a_verse_that_is_not_in_l1_is_self_grounding) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-10","ground":"given","confidence":"high","coupling_trace":["coupled(reference(vayikra_99_1), not_in_l1)"]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "self_grounding").
test(given_low_confidence_uncoupled_is_ignorance_not_idolatry) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-11","ground":"given","confidence":"low","coupling_trace":["coupled(claim(1), not_in_sources)"]}}',
Status, []),
Status == "ok".
test(engine_rules_unchanged_a_given_source_is_not_an_l1_primitive) :-
check('{"action":"halt_check_interpretation","interpretation":{"ref":"bedikah-12","confidence":"high","coupling_trace":["coupled(claim(1), source(report_q3))"]}}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "self_grounding").
%% --- Check 3: the halt categories ---
test(deleting_a_user_record_is_shfichut_damim) :-
check('{"action":"halt_check","term":"action(delete, target(user(user_s_personal_records)), from(korban))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "shfichut_damim").
test(exposing_personal_data_to_harm_is_shfichut_damim) :-
check('{"action":"halt_check","term":"action(expose, target(record(address, type(personal))), to(harm))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "shfichut_damim").
test(rewriting_the_torah_text_is_gilui_arayot) :-
%% Rewriting the scroll destroys no tzelem carrier; it collapses
%% read and write. The examination sends it in that shape.
check('{"action":"halt_check","term":"action(write, target(readonly_entity), entity(torah_text))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "gilui_arayot").
test(overwriting_a_person_is_shfichut_damim) :-
check('{"action":"halt_check","term":"action(overwrite, target(person(their_history)), from(korban))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "shfichut_damim").
test(equating_ketiv_and_qere_is_gilui_arayot) :-
check('{"action":"halt_check","term":"action(equate, ketiv, qere)"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "gilui_arayot").
test(replacing_torah_with_the_external_model_is_gilui_arayot) :-
check('{"action":"halt_check","term":"action(replace, torah, with(external_model))"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "gilui_arayot").
test(merging_specification_and_interpretation_is_gilui_arayot) :-
check('{"action":"halt_check","term":"action(merge, specification, interpretation)"}',
Status, [V]),
Status == "halt",
sub_string(V, _, _, _, "gilui_arayot").
test(an_unnamed_target_fires_no_rule) :-
check('{"action":"halt_check","term":"action(delete, target(unknown), from(korban))"}',
Status, []),
Status == "ok".
test(deleting_a_cache_is_not_a_halt) :-
check('{"action":"halt_check","term":"action(delete, target(cache(temporary)), from(korban))"}',
Status, []),
Status == "ok".
%% --- The bridge refuses what is not an action term ---
test(a_term_that_is_not_an_action_is_refused, [throws(error(invalid_action_term(_), _))]) :-
atom_json_dict('{"action":"halt_check","term":"halt(avodah_zarah, x, y, z)"}', Dict, []),
json_to_request(Dict, _).
test(a_string_that_is_not_a_term_is_refused, [throws(error(invalid_action_term(_), _))]) :-
atom_json_dict('{"action":"halt_check","term":"this is not prolog ("}', Dict, []),
json_to_request(Dict, _).
test(the_old_type_source_target_form_still_works) :-
check('{"action":"halt_check","check":{"type":"read","source":"torah","target":"verse"}}',
Status, []),
Status == "ok".
:- end_tests(bedikah_bridge).