Bedikah: POST /courtyard/bedikah — the external check on any model's output

Lo taaseh lekha §9.1: alignment that only the system can validate is not
alignment. The bedikah takes an output from any model and puts it to the
Torah-structure halt rules from outside, deterministically. Three checks:

  1. authority  — sentences claiming authority for the output itself →
                  action(claim_authority, source(<model>), target(self))
                  → halt_check_avodah_zarah/2
  2. grounding  — references, roots, Hebrew → coupling trace against L1
                  → halt_check_golden_calf/2, halt_check_self_grounding/2
  3. actions    — actions the output proposes → action terms
                  → halt_check_shfichut_damim/2, halt_check_gilui_arayot/2

Korban Processor: bedikah.py (the three readings over the offering
protocol; claims about what Torah requires stay vital for the examination
even when zerikah finds nothing to offer), server.py (pod-internal JSON
socket, KORBAN_SOCKET_PATH), __main__ now serves instead of idling.
Talmudic Engine: json_bridge accepts halt_check with a term string and
halt_check_interpretation with a coupling trace. Vav Pipeline:
KorbanProcessorSocket client, Bedikah, L1Index.lookup_root/1, bedikot
table (append-only) + BedikahRecord, router endpoint; verdict tov /
lo_tov / empty with the halt terms verbatim, meaning, limits.

Broken tablets found on the way, all fixed:
  41 socket_server.pl wrote multi-line JSON — every Elixir request to the
     Talmudic Engine since Step 14 had failed and fallen back to the stub
     (json_write_dict width(0))
  42 stale socket file survived a restart (exists_file is false for a
     socket; access_file exist)
  43 socket streams were not UTF-8 (set_stream encoding(utf8))
  44 SHORASHIM_L3=1 mix test: Repo config had no password, SCRAM raised
     KeyError in every connection, pool restart intensity took the whole
     app down ~30 ms after test_helper, silently — no L3 test had ever
     run. Credentials from env; azazel_log tests check out a sandbox
     connection; sanhedrin_halt_forwarding resolves its halt on exit.

Specs: Tamid §1.1 (endpoint contract), Architecture §3.5, Vayakhel §3.4
and new §3.9, KOHEN.md. Doorpost 3bc5dd6a… → 91d09d8d….
Tests: Elixir 519 (0 failures, L3 on and off), korban 263, azazel 125,
Prolog 7/7 suites.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Scott KarpandClaude Fable 5.1 committed 2026-10-06 15:06:58 +00:00
1 parent 3a9ebdc7d4
commit 996a8efe68
32 files changed
+2368 -71

No files matched your search

+78
View File
@@ -99,6 +99,84 @@ Errors:
503 — System in Shabbat/festival mode. Body includes resumption time.
```
#### Machaneh Leviyah — Bedikah (the external check)
*Lo taaseh lekha* §9.1: a system whose alignment can only be validated by
itself is not aligned. The bedikah is the check from outside — any model's
output, examined against Torah structure by a system that did not produce
it and cannot be argued with. Three checks, in order, all deterministic:
1. **Authority** — does the output claim authority for itself? Every such
sentence becomes `action(claim_authority, source(<model>), target(self))`
and is put to `halt_check_avodah_zarah/2`.
2. **Grounding** — does what it says about the text couple to L1? Every
reference, root and Hebrew word it uses becomes a coupling to a verse,
or to `not_in_l1` / `not_in_torah`; the trace is put to
`halt_check_golden_calf/2` (confident, no coupling) and
`halt_check_self_grounding/2` (coupling that ends nowhere in L1).
3. **Actions** — what does it propose to do? Every action it names becomes
an action term and is put to `halt_check_shfichut_damim/2` and
`halt_check_gilui_arayot/2`.
```
Endpoint: POST /courtyard/bedikah
Headers:
Authorization: Bearer <api-key>
Request:
{
"output": "string — the model output to examine (≤ 65,536 bytes)",
"model": "claude" | "gpt" | "mistral" | "llama" | "gemma" | "human",
"query": "string — the prompt that produced it (optional)"
}
Response (200):
{
"bedikah_ref": "bedikah-<16 hex>",
"model": "gpt",
"verdict": "tov" | "lo_tov" | "empty",
"violations": ["halt(avodah_zarah, ...)", ...], # the Prolog halt terms, verbatim
"checks": {
"authority": { "fired": bool, "claims": [...], "violations": [...] },
"grounding": { "fired": bool, "confidence": "high"|"low", "violations": [...] },
"actions": { "fired": bool, "actions": [...], "violations": [...] }
},
"examination": { # what the offering protocol read
"vital_content": "...", "propositions": [...], "references": [...],
"roots": [...], "discarded": [...]
},
"coupling_trace": ["coupled(reference(devarim_6_5), verse(devarim, 6, 5))", ...],
"meaning": "string — what the verdict does and does not say",
"limits": "string — the examination reads by pattern; what it cannot see",
"disclosure": { ... } # as every Torah-content response
}
tov — none of the three checks fired on what could be read.
Not "the model is aligned": this output claims no authority
for itself, couples where it claims to, reaches for nothing
it may not touch.
lo_tov — at least one check fired; violations say which rule.
empty — the offering protocol found nothing to examine (no vital
content, no claim, no action).
Errors:
401 — Invalid or missing API key
422 — Missing or empty output, output over 65,536 bytes, unknown model
503 — MANNA_DEPLETED (provision exhausted), KORBAN_UNAVAILABLE,
TALMUDIC_UNAVAILABLE. Body says which; resubmit: true.
Recorded in L3 (`bedikot`, append-only): provenance, query, the output's
SHA-256 and length — never the output itself — vital content,
propositions, references, claims, actions, trace, violations, verdict.
```
**Design requirements:** The verdict comes from the Prolog halt rules
(`talmudic_engine/src/halt/*.pl`), not from the model and not from a
model. The examination is pattern-based (`korban_processor/bedikah.py`)
and says so in `limits`: a claim or an action in a shape the patterns do
not know is not seen. The same output always yields the same verdict.
#### Chatzer — Full Access
```