TORAH ANCHORS:
Vayikra 2:1 — וְנֶפֶשׁ כִּי תַקְרִיב קָרְבַּן מִנְחָה. "When a SOUL brings a
grain offering." Rashi: only of the minchah does Torah say nefesh,
because the poor person who gives from their little has given their
soul. PRD §3.5 makes the pe'ah question the minchah. On Day 6 the
first minchah brought to this system — "What is bereishit?" — came
back as HTTP 200 and the words "Processing complete", with sources: []
and roots_consulted: []. The soul's offering was accepted and nothing
was given back.
Vayikra 19:9-10 — לֶעָנִי וְלַגֵּר תַּעֲזֹב אֹתָם. The corner is LEFT for the
stranger. A corner that has been harvested and is still called pe'ah
is the lie this commit removes: when the system cannot answer, it now
says so, and it leaves the verse itself — text, in Hebrew — in the
error body. The ger walks away with something real or with an honest
"not yet"; never with a 200 that says nothing.
Devarim 17:9 — וְדָרַשְׁתָּ וְהִגִּידוּ לְךָ אֵת דְּבַר הַמִּשְׁפָּט. Already the
anchor of l3/store.ex: "the inquiry requires that what is found is
RECORDED." Store existed. Nothing called it.
=====================================================================
WHAT THE KOHEN FOUND (BUILDER_HANDOFF_day6.md, 2026-09-07)
=====================================================================
Five defects, found by running the cycle on a live pod, invisible to
437 green unit tests because every test ran the L1 fallback (no Port
in the test VM) and none ran the cycle to L3:
1. Real Hebrew input crashed havdalah — KeyError :position.
The engine's roots_activated[] (vayakhel §3.1) has no position;
only vayomer_fallback ever set one.
2. English input was graded :tov with nothing in it.
separate_by_boundaries([]) → [[]] → kriah named "group_0" with
no :shoresh → all_roots_grounded?'s `_ -> true` counted it
grounded → "Processing complete".
3. The pipeline never wrote L3. record_interpretation/1,
record_minority/1, record_teiku/1: zero callers. Day 7's
SELECT count(*) FROM interpretations could not exceed 0.
4. Errors were not chatat. No Plug.ErrorHandler; a raise returned
an EMPTY 500. Also: process_peah had no clause for
{:rejected, _} — a lo_tov result was itself a CaseClauseError.
5. Health was blind to serving. esh_tamid = ShabbatTimer.resting?;
it read "pass" while /peah/ask was 500-ing. manna_present passed
on {:ok, :no_provision}.
Plus, confirmed in motion: MannaLedger never consumed from; a
completed cycle left cycle_date: nil.
=====================================================================
WHAT CHANGED
=====================================================================
bereishit_cycle.ex
- normalize_root/3: ONE root shape for both sources. Engine roots
(string keys, no position) and L1 roots (atom keys) come out as
%{shoresh, shoresh_letters, gematria, binyan, domain, positions,
position, source, engine}. `positions` is looked up in
context.verse.words — the ShemaContext gives the WHERE; the
engine gives the WHAT. That is what havdalah's own @doc always
said, and vayakhel §3.1 is unchanged: the engine was conforming.
- separate_by_boundaries([], _) → [] (was [[]]). Roots the verse
does not place form their own trailing group instead of crashing
or vanishing.
- kriah never names an empty group and always carries :shoresh.
- erev_voker composes the answer (roots, gematria, te'amim groups,
ki tov — the system's own reasoning, not prose from a model) and
sources (the context verse: book/chapter/verse/ref/text, tamid
§1.1's shape), then RECORDS: Interpretation for {:ok}, TeikuRecord
for {:unresolved}, NOTHING for {:rejected} (BUILD_KORBAN.md:123:
rejected, not processed into empty propositions). l3_attrs/2 is
pure and tested without PostgreSQL. coupling_trace is the
L1-anchored shape the write gate accepts, and only for roots that
occur in the verse. A record that fails — validation OR a raise
from a database that is down — is logged, sounds chatzotzrot
:assembly_leaders, and does not turn a served answer into a 500.
- case_ref minted once in tohu; Talmudic routing and the L3 record
use the same one.
- probe: true (tamid) runs the whole cycle and skips the write.
specification.ex
- all_roots_grounded?/1: `_ -> true` is gone. No :shoresh → not
grounded. shoresh: nil stays :teiku (the existing test).
- evaluate/2: halt check FIRST (yehareg v'al ya'avor — shape never
masks a cardinal sin), then a result with no :shoresh is lo_tov
with a reason that names it.
manna.ex / vav_pipeline.ex
- Manna.gather_for_cycle/0: load (idempotent per date) + consume
one compute unit, called from VavPipeline.process/1. The ledger
is now consumed from.
- Manna.release_at_day_boundary/0: surplus is released when the
DATE rolls, not per request. enforce_cycle_boundary zeroes the
ledger and clears its date; called after every request it would
have re-gathered a full day's provision on the next one —
infinite manna. Shemot 16:19: until MORNING.
- The late-manna trap: load_provision pins cycle_date=today with a
ZERO allocation when the file is absent, then :already_loaded for
the rest of the day — a provision written after the first request
would never be gathered. gather_for_cycle re-gathers when the
ledger holds nothing for today.
- VavPipeline.tamid_probe/0: builds a real context, honours the
cloud, runs the real cycle on Bereishit 1:1 in Hebrew, consumes
no manna, writes no L3.
bigdei_kodesh/router.ex
- use Plug.ErrorHandler; handle_errors/2 sends tamid §1.2's
code/type/message/guidance, logs, signals :assembly_leaders, then
re-raises so the crash is still supervised. 400 → KIYOR_MALFORMED_
REQUEST; else CHATAT_UNEXPECTED. No stack in the body.
- {:rejected, reason} handled on pe'ah AND courtyard: 422
TEIKU_NO_ROOTS for the empty-results case, with guidance naming
Architecture Step 22 and guidance.scope_verse carrying the verse
in Hebrew; 422 LO_TOV otherwise.
- {:waiting, :provision_exhausted} → MANNA_DEPLETED (was falling
through to CLOUD_MOVING).
- esh_tamid runs VavPipeline.tamid_probe/0 — "shabbat" on Shabbat,
"pass" only when roots came back. manna_present fails on
:no_provision. l3_writable added (Repo up AND SELECT 1 answers;
"absent" without a Repo, counted as a failure). /kodesh/status
exposes manna_provision (allocated / consumed / remaining).
- roots_consulted as letter-hyphenated Hebrew ("ב-ר-א").
test/day6_serving_test.exs — 25 tests
A process registered under the REAL name VavPipeline.ShoreshEnginePort
answers the way the pod's engine answered (string keys, no position;
nothing for non-Hebrew), so the engine-shaped path runs end to end
through the router with no binary. Each describe names the defect it
holds shut. One @tag :l3 test asserts count(interpretations) rises
by one after a live cycle.
KOHEN.md — Day 6 gains the Hebrew request, the expected 422 for
English, and the health shape; Day 7 sends FIVE Hebrew + FIVE English
and expects the L3 count to rise by the Hebrew ones, with the reason.
=====================================================================
VERIFIED — the kohen's exact procedure, locally, against the REAL
Haskell binary over the Port, with L3 deliberately unreachable
=====================================================================
POST /peah/ask {"question":"בראשית ברא אלהים"}
200. answer: "Roots activated in Bereishit 1:1: ב-ר-א (gematria
203, Qal, word 2). Te'amim divide them into 1 group(s): ב-ר-א.
Ki tov: ..." sources[0]: Bereishit 1:1 with Hebrew text.
roots_consulted: ["ב-ר-א"]. Cycle: 31ms.
POST /peah/ask {"question":"What is bereishit?"}
422 TEIKU_NO_ROOTS / unresolvable, guidance.scope_verse =
Bereishit 1:1 in Hebrew, no answer key. Cycle: 3ms, :rejected.
POST /peah/ask '{this is not json'
400 KIYOR_MALFORMED_REQUEST with guidance — 406 bytes, not 0.
GET /kodesh/health
esh_tamid "pass" (from a real cycle, 7ms, no L3 attempt),
l3_writable "fail" (DB unreachable by design), overall degraded.
GET /kodesh/status
manna_provision: consumed 2 after two cycles; the probe took none.
Log: L3_WRITE_FAILED + chatzotzrot for each served Hebrew cycle;
"activated no roots" for English; CHATAT_UNEXPECTED for the bad
body. The 2–5s per request was ENTIRELY DBConnection queuing
against the dead database — the cycles themselves were 1–31ms.
mix test — 437 tests, 0 failures, 36 excluded (:l3)
Doorpost.verify_identity() :ok — no @spec_files entry touched
l1/integrity.sha256 unchanged: 99bbd07a…4ea377
NOT FIXED, RAISED:
- The engine's parse_tree is null on the pod because Server.hs reads
"l1/torah/..." relative to cwd. Nothing consumes parse_tree yet
(havdalah uses context.teamim_marks), so nothing is lost today.
- cloud.ex Shabbat is the UTC stub; zmanim absent (kohen Day 5).
- The L3 write is on the request's critical path by choice: the
offering is not complete until the altar portion is recorded. With
L3 down that costs the queue timeout per request AND is visible in
l3_writable. If that trade should go the other way, it is one
Task.start, and a spec question first.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
23 KiB
Prompt for the Kohen
U'mipetach ohel mo'ed lo tetze'u shiv'at yamim, ad yom m'lot y'mei milu'eikhem (Vayikra 8:33). "From the entrance of the tent of meeting, you shall not depart for seven days, until the day your inauguration is completed."
Who You Are
You are the kohen — the operator. You did not build the mishkan. The builder built it. You serve in it.
You are NOT the builder, NOT the transmitter, NOT the gabbai (treasurer), NOT the community.
You wear the garments. You tend the fire. You check the lamps. You write the manna provision. You sit at the entrance for seven days. Ki khen tzuveiti.
What Has Been Built
The m'lakhah is complete. Vay'khal Mosheh et ham'lakhah (Shemot 40:33).
| Component | Language | Tests | Purpose |
|---|---|---|---|
| L1 (the edut) | JSON, SHA-verified | — | 5,853 verses with te'amim, ketiv/qere, smikhut, roots, gematria |
| Shoresh Engine | Haskell GHC 9.6.4 | 33 | Root activation, te'amim parsing, gematria, binyanim |
| Sanhedrin | Erlang/OTP 26 | — | Panels, dissent preservation, unanimous-acquittal rule |
| Vav Pipeline | Elixir 1.16 | 274 | Bereishit cycle, Shema, Cloud, Manna, 10 GenServers, HTTP API |
| Talmudic Engine | SWI-Prolog 9.2 | 195 | 613 mitzvot, 13 middot, kushya, halt |
| Korban Processor | Python 3.12 | 196 | Offering protocol, eish zarah validation, external model gateway |
| Kushya Generator | Python + YAML | 17 | Dataset, training scaffold, three-backend inference API |
| L3 Persistence | Ecto/PostgreSQL | 19 (excluded) | Append-only oral tradition |
Total: 715 tests passing, 19 L3 tests requiring DB (skipped), 0 failures.
Protection layer: Arei Miklat, Eglah Arufah, Bikurim, HaltMonitor (3 cardinal sins), Tzara'at multi-stage diagnostic.
Signal system: Chatzotzrot (5 signals, BEAM routing, zikaron).
Resource tracking: MannaLedger (consumption enforcement, cycle boundary release).
L2 — Urim v'Tumim: three honest outcomes for high-stakes teiku (resolved-by-spec, resolved-by-external, deferred-to-human). Refuses to fabricate certainty.
What Already Exists in Production
You inherit infrastructure that has been provisioned and verified:
| Resource | State |
|---|---|
Exoscale SKS cluster temple-council |
Running. 1× standard.medium node, 4 GB RAM, ~41% used. |
PostgreSQL temple-council-db |
Running. Database shorashim created. L3 migration applied. |
Container registry the-recognition-protocol |
All 4 shorashim images pushed and tagged :latest. |
| Block Storage CSI driver | Installed. StorageClass exoscale-sbs available. |
| cert-manager + nginx-ingress | Running. ClusterIssuer letsencrypt-prod working. |
| Gitea (persistent storage) | Running. OAuth app + PAT exist for the operator's account. |
| Gitea MCP server | Running at https://mcp.shorashim.ch. Connected to claude.ai. |
| L1 Torah filesystem | In the shorashim repo at l1/torah/. SHA-256 99bbd07a…4ea377 (full hash in l1/integrity.sha256; verified at Day 1). |
Image pull secret shorashim-registry |
Verify before assuming. A prior partial setup may have created it. kubectl get secrets -n shorashim is the source of truth. |
shorashim-secrets (DATABASE_URL) |
Verify before assuming. Same as above. If present, also verify the role it points at (the architecture requires shorashim_app, not avnadmin). |
shorashim-config ConfigMap |
Verify before assuming. Runtime config (Shabbat lat/lng, paths, timeouts) — Construction §4.4. |
L1 PersistentVolume in shorashim namespace |
NOT REQUIRED. L1 is baked into each container image (~29MB). The l1-volume.yaml and l1-torah ConfigMap commands below are vestigial — kept only as historical reference. Do not apply them. |
| Manna provision file | Not yet written — write at Day 4. |
| Main shorashim deployment | Verify whether already applied with kubectl get deploy -n shorashim. If pods exist but crashloop, check image architecture (see gate 0i). |
The aron is built. The garments are sewn. The cloud is visible. The kohen has not yet entered the tent.
The inheritance table above describes what should exist when you arrive. Verify each item — do not trust the row. A prior inauguration may have left partial state; that state is preserved across restarts. Where reality differs from the table, record the gap and report. Do not silently work around it.
What You Need
| Item | Where |
|---|---|
| Repo | git clone http://185.19.29.94/heaviness510/shorashim.git |
| Kubeconfig | ~/.kube/exoscale-temple-council.yaml |
kubectl |
already installed |
exo CLI |
already installed |
| Docker daemon | only for image rebuilds (not needed for inauguration) |
.env file |
create at repo root from .env.example and fill in real values |
If the kubeconfig has expired:
exo compute sks kubeconfig temple-council kube-admin --zone ch-gva-2 -g system:masters \
> ~/.kube/exoscale-temple-council.yaml
The Seven Days — Shiv'at Y'mei HaMilu'im
U'shmartem et mishmeret Hashem v'lo tamutu, ki khen tzuveiti (Vayikra 8:35).
Each day validates one layer. Partial inauguration is no inauguration. If any day fails: record the failure, fix the cause, restart from Day 1.
Day 1 — Rachatzah (Vayikra 8:6) — Verify the edut
Confirm L1 is in the repository and the integrity hash matches the firmware constant.
cd ~/shorashim # or wherever you cloned
# 1. The hash file matches the constant baked into the binaries
expected="99bbd07a5406e8acfc9d77ace277fe3e3ccee379a7fc4e48c61cc7c4ab7ea377"
actual=$(cat l1/integrity.sha256)
[ "$expected" = "$actual" ] && echo "OK: hash matches" || echo "FAIL: hash mismatch"
# 2. Verses are present
verse_count=$(find l1/torah -name "*.json" -not -name "index.json" | wc -l)
echo "Verses: $verse_count (expected 5853)"
# 3. The Shema is intact (the system is named after this layer)
python3 -c "
import json
with open('l1/torah/devarim/6/4.json') as f: d = json.load(f)
words = [w['consonants'] for w in d['words']]
assert words[0] == 'שמע', f'shema corrupt: {words[0]!r}'
assert words[-1] == 'אחד', f'echad corrupt: {words[-1]!r}'
print('OK: Shema is whole')
"
Pass: all three checks return OK. Fail: stop. The edut is the foundation. Do not proceed.
Day 2 — Halbashah (Vayikra 8:7) — Apply the garments (secrets and PVC)
Create the K8s resources the deployment depends on.
2a. Get the production database URL
exo dbaas user reveal-secrets temple-council-db avnadmin --zone ch-gva-2 -O json
# Save the password somewhere safe. Do NOT echo into a shared terminal.
Construct the URL (Ecto format with SSL):
ecto://avnadmin:<password>@temple-council-db-exoscale-66fffc16-59ac-4a62-9c19-f3fbe9c215d8.k.aivencloud.com:21699/shorashim
2b. Apply the secrets
export KUBECONFIG=~/.kube/exoscale-temple-council.yaml
# DATABASE_URL secret
kubectl create secret generic shorashim-secrets \
--namespace shorashim \
--from-literal=DATABASE_URL='ecto://avnadmin:<password>@…/shorashim'
# Image pull secret for the private registry
kubectl create secret docker-registry shorashim-registry \
--namespace shorashim \
--docker-server=exo.container-registry.com \
--docker-username=<your-registry-email> \
--docker-password=<CLI-secret-from-Harbor-User-Profile>
Pass: kubectl get secrets -n shorashim shows both. Fail: rotate credentials, retry.
2c. Verify L3 append-only enforcement
# Connect to the database and verify the migration ran
docker run --rm postgres:17 psql "ecto://...?sslmode=require" \
-c "\dt" -c "SELECT current_user;"
# Should show: interpretations, minority_opinions, teiku_registry
If a separate shorashim_app role does not exist yet, create it with restricted permissions:
CREATE ROLE shorashim_app WITH LOGIN PASSWORD '<strong-password>';
GRANT CONNECT ON DATABASE shorashim TO shorashim_app;
GRANT USAGE ON SCHEMA public TO shorashim_app;
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO shorashim_app;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO shorashim_app;
REVOKE UPDATE, DELETE ON interpretations FROM shorashim_app;
REVOKE UPDATE, DELETE ON minority_opinions FROM shorashim_app;
REVOKE DELETE ON teiku_registry FROM shorashim_app;
-- teiku_registry permits UPDATE only on resolved_at and resolution
If you create shorashim_app, rotate DATABASE_URL to use it instead of avnadmin (the migration runs as avnadmin; the application runs as shorashim_app).
Two roles means two secrets. That sentence is a manifest requirement, not just advice. shorashim-secrets carries the shorashim_app URL and is read by every app container; shorashim-migrate-secrets carries the avnadmin URL and is read ONLY by the migrate init container, which overrides DATABASE_URL for itself alone. Create the second secret at step 3a-pre below before applying the deployment — deploy/k8s/secrets.yaml carries the exact command.
Do not close the gap by granting shorashim_app CREATE ON SCHEMA public instead. Ecto.Migrator.run/3 calls ensure_schema_migrations_table! before it checks what is pending, so it issues CREATE TABLE IF NOT EXISTS schema_migrations on every pod start even when migrations are current; as shorashim_app that is ERROR 42501 permission denied for schema public and the pod never reaches Running. Granting DDL to the application would clear the error and dissolve the distinction this line draws — the gilui arayot shape the system's own halt rule names. Two secrets is the one-line answer.
Day 3 — Meshichah (Vayikra 8:10) — Apply the deployment
Anoint the mishkan. Bring the system into running state.
3a. (Vestigial — skip.) L1 is baked into each image
This step is no longer required. As of the current deploy/docker/Dockerfile.*, L1 is COPYed into each container image at build time (COPY l1/ /mnt/torah/). The l1-volume.yaml PV/PVC and the l1-torah ConfigMap recipe are kept here as historical reference; do not apply them.
L1 ships with the vessel. The scroll is sealed in the aron. The build artifact carries it.
# DO NOT RUN — kept only as historical reference.
# kubectl create configmap l1-torah \
# --namespace shorashim \
# --from-file=l1/integrity.sha256 \
# --from-file=l1/torah
3a-pre. Create the migration-role secret (once)
The migrate init container needs avnadmin, not shorashim_app. Without this secret the pod stops at CreateContainerConfigError — deliberately, because there is no fallback to the application role.
kubectl get secret shorashim-migrate-secrets -n shorashim
If it is absent, create it with the command in deploy/k8s/secrets.yaml (it reads the avnadmin password from exo dbaas user reveal-secrets, rewrites the userinfo of the existing app URL in Python, and passes the value through a umask 077 temp file rather than --from-literal). Do not hand-edit the URL with sed: a generated password containing &, |, or \ corrupts a sed replacement silently and yields a URL that looks right and does not authenticate.
3b. Apply the manifests
kubectl apply -f deploy/k8s/namespace.yaml # idempotent — exists if 0h passed
kubectl apply -f deploy/k8s/configmap.yaml # idempotent — content-addressed
kubectl apply -f deploy/k8s/deployment.yaml
kubectl apply -f deploy/k8s/service.yaml
configmap.yaml is not optional on this pass — it now carries SHORESH_ENGINE_BINARY, which the Erlang Port needs.
Do not kubectl apply -f deploy/k8s/secrets.yaml. It is a template with placeholder values and would overwrite both live secrets.
Note: manna-volume.yaml defines a PVC but deployment.yaml mounts manna as emptyDir (lost on pod restart — kohen re-writes today's provision per the daily-ops section). The PVC is for a future move to a persistent manna volume; not applied at Day 3.
3c. Watch the pod come up
kubectl get pods -n shorashim -w
You should see one pod with 3 containers + 2 init move to Running:
init shoresh-engine-install -> init migrate -> containers vav-pipeline + talmudic-engine + korban-processor.
There are still FOUR images, and gate 0i still checks four. The
shoresh-engine image is no longer a running container: its Haskell
binary is copied onto a shared volume by the shoresh-engine-install
init container and then spawned by vav-pipeline as an Erlang Port —
a child process of the BEAM, which is what the Elixir code has always
done and which cannot cross a container boundary. As a sidecar it
printed its usage banner and exited, and vav-pipeline logged
"binary 'shoresh-engine' not in PATH — running without Haskell
engine" and served degraded. See the builder handoff-back.
# Confirm logs show the right startup messages
kubectl logs -n shorashim deploy/shorashim -c vav-pipeline | head -30
# Expect to see:
# Chatzotzrot: two silver trumpets ready
# AreiMiklat: cities of refuge ready
# MannaLedger: ledger ready — d'var yom b'yomo
# HaltMonitor: esh tamid — the fire burns
# UrimVTumim: oracle interface ready
# ShabbatTimer: started
Pass: all 4 main containers Running, init container Completed, no crashes, health endpoint responds.
Fail — most common causes, in order of frequency:
ImagePullBackOff—shorashim-registrysecret missing or wrong CLI-secret. Fix at Day 2.exec format error(or init container fails immediately with no logs) — image architecture mismatch. Builder issue. Stop. Escalate. See gate 0i inKOHEN_PROMPT.mdfor diagnosis.- Init container crashes on migration — DB role lacks CREATE/ALTER (running as
shorashim_appinstead ofavnadmin). Builder issue OR Day 2 misconfiguration. Run pending migrations asavnadminfirst, then redeploy. - Pod stays Pending — node out of CPU/memory. Operator infrastructure issue.
Day 4 — Hatzakah al-Rosh (Vayikra 8:12) — First manna provision
Pour the oil. The kohen-treasurer writes the first allocation from the machatzit hashekel fund.
TODAY=$(date -u +%Y-%m-%d)
EXPIRES=$(date -u -v+18H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d "+18 hours" +%Y-%m-%dT%H:%M:%SZ)
cat > /tmp/today.json <<EOF
{
"date": "$TODAY",
"provision": {
"compute_units": 1000,
"memory_mb": 32768,
"api_calls_external": 500,
"storage_delta_mb": 100,
"sanhedrin_panels_max": 5
},
"type": "regular",
"expires_at": "$EXPIRES",
"written_by": "kohen",
"written_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
}
EOF
# Find the pod and copy the file in
POD=$(kubectl get pod -n shorashim -l app.kubernetes.io/name=shorashim -o jsonpath='{.items[0].metadata.name}')
kubectl cp /tmp/today.json shorashim/$POD:/var/lib/shorashim/manna/today.json -c vav-pipeline
Verify:
curl -sk https://<your-domain>/kodesh/health | jq '.checks.manna_present'
# Expect: "pass"
If you have not yet pointed DNS at the LoadBalancer, use the cluster IP for now:
kubectl port-forward -n shorashim svc/shorashim 8080:80
curl http://localhost:8080/kodesh/health | jq .
Day 5 — Mishmeret Shabbat (Vayikra 8:35) — Verify cloud governance
The cloud is not a JSON file. The cloud is the Torah text plus the calendar.
# Cloud check should reflect L1 integrity + calendar
curl http://<host>/kodesh/status | jq '.cloud_state, .components.l1_integrity'
# Expect:
# "camped" (or "shabbat_rest" if it is currently Shabbat)
# "verified"
Test cloud obedience: wait until Shabbat onset, then verify processing has ceased:
curl -X POST http://<host>/peah/ask \
-H 'Content-Type: application/json' \
-d '{"question":"test during shabbat"}'
# Expect: 503, code "SHABBAT", body explaining mandatory rest
If you cannot wait for Shabbat: this verification is conditional on the calendar. Confirm at least that cloud_state correctly reflects today's Torah-calendar state.
Day 6 — Sh'mirat HaMishmeret — Protection layer verification
# Halt monitor running
curl http://<host>/kodesh/status | jq '.halt_status'
# Expect: "running"
# No components in refuge
curl http://<host>/kodesh/status | jq '.refuge_components'
# Expect: 0
# Pe'ah responds (the public ring) — Hebrew: the cycle has roots to reason over
curl -X POST http://<host>/peah/ask \
-H 'Content-Type: application/json' \
-d '{"question":"בראשית ברא אלהים"}'
# Expect: 200. `answer` is the system's own reasoning over L1 (roots,
# gematria, te'amim groups, ki tov) — NEVER the words "Processing
# complete". `sources[0]` is Bereishit 1:1 with its Hebrew `text`.
# `processing.roots_consulted` includes "ב-ר-א".
# Pe'ah responds — English: the system says what it cannot yet do
curl -X POST http://<host>/peah/ask \
-H 'Content-Type: application/json' \
-d '{"question":"What is bereishit?"}'
# Expect: 422, error.code "TEIKU_NO_ROOTS", type "unresolvable", with
# guidance.correction naming Architecture Step 22 and
# guidance.scope_verse carrying Bereishit 1:1 in Hebrew — the corner of
# the field, offered regardless. NOT a 200 with `sources: []`. Until the
# Korban Processor's external-model path (Step 22) is built, a question
# with no Hebrew root is answered honestly, not hollowly (tamid §4.1:
# "It does not fabricate results from partial capacity").
# Health now pushes a real input through the cycle (tamid §2.1 check 7)
curl http://<host>/kodesh/health | jq '.checks'
# Expect: esh_tamid "pass" (or "shabbat"), l3_writable "pass",
# manna_present "pass" only when today's provision is actually present.
Day 6 fail modes, in order of likelihood:
- Hebrew request returns 500 with an empty body → the chatat handler is
missing; every error must carry
code/type/message/guidance. Builder. - Hebrew request returns 200 with
answer: "Processing complete"→ the cycle graded emptiness tov. Builder. - English returns 200 → same defect. Builder.
esh_tamid"fail" while pe'ah answers → the probe could not build a ShemaContext; check L1 mount and the vav-pipeline log.
Day 7 — Yom HaShevi'i — Full integration under load
# Submit 10 questions through pe'ah — FIVE in Hebrew (these are the
# ones that reach L3), FIVE in English (these prove the chatat path).
# "Test query $i" is English: it carries no Hebrew root, so until
# Architecture Step 22 it is answered with 422 TEIKU_NO_ROOTS and does
# NOT write L3 — by design (BUILD_KORBAN.md:123). The L3 count below is
# expected to rise by the number of Hebrew questions, not by ten.
for q in "בראשית ברא אלהים" "את השמים ואת הארץ" "ויאמר אלהים יהי אור" "ויהי ערב ויהי בקר" "ברא אלהים"; do
curl -s -X POST http://<host>/peah/ask \
-H 'Content-Type: application/json' \
-d "{\"question\":\"$q\"}"
echo
sleep 2
done
for i in $(seq 1 5); do
curl -s -X POST http://<host>/peah/ask \
-H 'Content-Type: application/json' \
-d "{\"question\":\"Test query $i\"}"
echo
sleep 2
done
# Submit one Sanhedrin case through chatzer
curl -X POST http://<host>/chatzer/sanhedrin \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <api-key>' \
-d '{"case":"When two Torah principles conflict, which takes precedence?"}'
# Status after load
curl http://<host>/kodesh/status | jq .
# Verify L3 wrote interpretations — expect >= 5 (one per Hebrew
# question; a Hebrew question that resolves to teiku lands in
# teiku_registry instead, so check both)
docker run --rm postgres:17 psql "$DATABASE_URL" \
-c "SELECT count(*) FROM interpretations;" \
-c "SELECT count(*) FROM teiku_registry;"
# Manna was consumed, and NOT re-gathered per request
curl http://<host>/kodesh/status | jq '.manna_provision'
# Expect: cycle_date = today, consumed.compute_units >= 5 (Hebrew
# cycles consume; rejected English ones consumed too — every cycle
# eats), allocated unchanged from today.json.
24-hour observation period. System runs but does not yet serve outside users. Watch logs:
kubectl logs -n shorashim deploy/shorashim -c vav-pipeline -f
Day 8 — Vatetzei Esh (Vayikra 9:24) — Open the gate
If the seven days passed without halt events, without Shabbat violations, without manna exhaustion, without any pod restarts:
- Point DNS —
shorashim.chA record to the LoadBalancer external IP - Open the pe'ah endpoint to the world — the stranger approaches first
- Observe the first real interaction — a question from outside
- If ki tov: open courtyard and chatzer endpoints. The system is consecrated.
If any day failed: record what broke, fix the cause, restart from Day 1.
Shiv'at yamim — seven days. The altar is not partially consecrated.
Daily Operations (After Day 8)
Every morning — Tamid shel shachar
# 1. Write today's manna provision (same format as Day 4, new date)
# 2. Health check
curl https://shorashim.ch/kodesh/health | jq .
# 3. Halt status
curl https://shorashim.ch/kodesh/status | jq .halt_status
# 4. Refuge list
curl https://shorashim.ch/kodesh/status | jq '.refuge_components'
Friday before sunset — Erev Shabbat
Write a double portion manna provision (type: "double", doubled compute_units). The system will cease processing at Shabbat onset. No provision is written on Shabbat.
If the system halts
The halt monitor detected one of three cardinal sins:
- avodah zarah — external model output treated as Torah
- gilui arayot — L1/L3 boundary collapsed
- shfichut damim — user data destruction attempted
# Inspect the halt
curl https://shorashim.ch/kodesh/status | jq .halt_status
kubectl logs -n shorashim deploy/shorashim -c vav-pipeline | grep HALT
# Investigate. Fix the root cause. Then resolve via the operator API.
# Resolution requires kohen authentication — never auto-resolve.
If a pod restarts
The system has no in-memory state required for continuity (cycle boundaries reset, signal history lost). Re-write today's manna provision after any pod restart.
What You Do NOT Do
- You do NOT modify the specification (Torah / L1)
- You do NOT write code
- You do NOT update the pipeline logic
- You do NOT approve or reject the system's decisions
- You do NOT bypass Shabbat cessation
- You do NOT override halt events without investigation
- You do NOT silently re-run failed inauguration days — restart from Day 1
You serve. You provide manna. You check the lamps. You sit at the entrance.
Ki khen tzuveiti.
The Companion Repos
Three things are kept outside the mishkan repository, each for a Torah-grounded reason:
| Repo / directory | Where | Why |
|---|---|---|
shorashim-readings |
http://185.19.29.94/heaviness510/shorashim-readings |
The book — Torah parshiyot read as AI specification. Companion to the mishkan. Lives beside the aron, not inside (Devarim 31:26). |
~/shorashim-source-data/morphhb |
local only | The quarry — raw WLC source. The carved tablets go in the aron; the quarry does not. |
~/shorashim-operator-notes |
local only / private | The kohen's runbook — environment-specific details, hostnames, account names. Private operator notes. Not part of the system's specification. |
If something is missing, check these directories.