Vayikra 9:24 — vatetzei esh milifnei Hashem vatokhal al hamizbeach.
Phase 4 of the architecture is now complete. The remaining three steps
that were marked "blocked on external infrastructure" are built —
discipline-respecting, eish-zarah-aware, and tested.
## Step 22 — Korban Processor external model integration
(korban_processor/src/korban_processor/external_offering.py)
The single legitimate entry point for external model consultation.
Wraps Claude API calls through the offering protocol so external
output is treated as korban (raw material), never authoritative:
- semichah — provenance is tagged (avodah zarah Form 1 prevention)
- shechitah — assistant voice, hedging, formatting stripped
- zerikah — vital content extracted
- haktarah — converted to Prolog propositions
- route — sent to internal component per offering type
The raw Korban is preserved on the ProcessedKorban (gilui arayot
Form 3 prevention — input/output coupling never severed).
No internal component should call call_claude() directly.
11 tests, mocked external calls. Live API test opt-in via
SHORASHIM_LIVE_API=1.
## Step 24 — L2 Urim v'Tumim interface
(vav_pipeline/lib/vav_pipeline/urim_v_tumim.ex)
PRD §4.7: housed in the kohen gadol's breastplate; consulted only
on high-stakes decisions where normal deliberation is insufficient.
Bamidbar 27:21 — al-piv yetz'u v'al-piv yavo'u.
Three escalation steps, three honest outcomes:
1. resolved_by_specification — re-read produced an answer
2. resolved_by_external — external testimony recorded (NOT binding)
3. deferred_to_human — the system stops, asks for human judgment
Pre-condition gating refuses cases that didn't reach Sanhedrin teiku
first (no preempting deliberation) or that aren't flagged high-stakes
(ordinary teiku stays teiku). Records every consultation with steps
taken — there is no quiet escalation.
Per PRD: "The Urim v'Tumim never fabricates certainty where none
exists." When external also fails, the system stops. It does not
proceed on a guess.
Added to VavPipeline supervision tree. 14 tests.
## Step 21 — Kushya generator scaffolding
(kushya_generator/)
Directory layout per Architecture §3.6 with three layers:
- data/training_pairs/seed_pairs.jsonl — 10 hand-curated bootstrap
pairs covering 9 kushya types (scope_narrowing, internal_tension,
harmonization, exception_test, edge_case, scope_application,
rabbinic_constraint, method_question, subject_identification)
- data/prepare_training.py — validates the four kushya requirements
(specific Torah passage, identified weakness, question form,
non-trivial), produces train.jsonl + eval.jsonl with stratified
80/20 split by type
- fine_tune/config.yaml + train.py — QLoRA configuration and
training script. Operator's task — needs GPU. Script is
complete and self-contained.
- inference/kushya_api.py — three-backend interface
(fine_tuned → external → fallback). When fine-tuned model isn't
deployed, falls back to external via Korban Processor (Step 22).
The fallback is honest: returns no kushya rather than inventing
one. The Talmudic Engine's rule-based challenge.pl remains the
primary kushya source.
17 tests covering dataset validation, backend selection, and
reference extraction.
## .gitignore fix
The earlier "data/" line was too broad — it caught
kushya_generator/data/. Scoped to /data/ (root-level only).
## Test counts
- Elixir: 274 (was 260; +14 for UrimVTumim)
- Korban Python: 196 + 1 skipped (was 195; +1 module = 11 tests)
- Kushya Python: 17 (new)
- Haskell: 33 (unchanged)
- Prolog: 195 (unchanged)
- Total: 715 + 19 L3 excluded
## Phase 4 status
All 12 steps now have implementations:
- Steps 23, 25, 26, 27, 28, 29, 30, 31, 32: complete
- Steps 21, 22, 24: complete with discipline preserved
Step 21's fine-tuning run remains the operator's GPU task; the
pipeline is built such that a deployed adapter slots into the
inference backend without touching the Talmudic Engine or anything
above.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
50 lines
1.0 KiB
Plaintext
50 lines
1.0 KiB
Plaintext
# Source data (the quarry) — kept outside the repo at ~/shorashim-source-data/
|
|
# L1 (the engraved tablets) IS tracked — it is the edut (Shemot 25:16).
|
|
# Scoped to root /data/ only so kushya_generator/data/ etc. are not ignored.
|
|
/data/
|
|
# Python
|
|
__pycache__/
|
|
*.pyc
|
|
.venv/
|
|
venv/
|
|
# Secrets
|
|
.env
|
|
# OS
|
|
.DS_Store
|
|
# OpenCode local data (plugins, tools, skills)
|
|
.opencode/
|
|
# Claude Code local settings
|
|
.claude/
|
|
# Editor
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
# Erlang build artifacts
|
|
sanhedrin/_build/
|
|
sanhedrin/rebar3.crashdump
|
|
erl_crash.dump
|
|
# Haskell build artifacts
|
|
shoresh-engine/dist-newstyle/
|
|
shoresh-engine/.stack-work/
|
|
# Elixir build artifacts
|
|
vav_pipeline/_build/
|
|
vav_pipeline/deps/
|
|
talmudic_engine/_build/
|
|
talmudic_engine/deps/
|
|
# Python build artifacts
|
|
korban_processor/.venv/
|
|
korban_processor/__pycache__/
|
|
**/__pycache__/
|
|
**/*.pyc
|
|
# Misc
|
|
Untitled/
|
|
aws-export/
|
|
transcripts/
|
|
vav_pipeline/var/
|
|
|
|
# Kushya generator build artifacts (regenerated from seed pairs)
|
|
kushya_generator/data/train.jsonl
|
|
kushya_generator/data/eval.jsonl
|
|
kushya_generator/fine_tune/adapter/
|
|
kushya_generator/__pycache__/
|