L1: the petuchot and setumot are engraved (tablet 39)
The scroll in the aron had no paragraphs. The WLC marks every petuchah
(פ) and setumah (ס); scripts/build_l1.py handled sof pasuq, maqaf and
paseq and read past these. L1 was 5,853 verses divided only by chapter
numbers, which are not Torah's.
Transmitter's word: "add the petuchah and setumah markers to L1."
- build_l1.py: a verse followed — or interrupted — by a break carries
"parashah_breaks": [{ "after_word": 13, "type": "petuchah" }]
The break is recorded by the word it follows; at the end of a verse
that is the verse's word count. text_hebrew is untouched: the break
is structure, not letters. Counts go into build_report.json.
- 293 petuchot and 394 setumot, in 686 verses — the source's count
exactly. Four fall inside a verse (pisqa b'emtza pasuq): Bereishit
35:22, Devarim 2:8, 5:21, 23:8; Devarim 5:21 has two. These are the
Leningrad Codex's divisions (a scroll written to the Rambam's list
has 290 and 379); the README says which tradition L1 records.
WHAT CHANGED IN THE EDUT: one field added to 686 verse files. Verified
file by file — with that field removed, all 5,853 verse files are
byte-identical to the previous L1.
L1 SHA-256 156b1d27…d8c9d5 → f743b34b…3f1494
Moved together, because they pin the hash: L1Reader @l1_expected_hash ·
Luchot.Firmware + Spec · azazel goral._L1_INTEGRITY_HASH · the kohen's
gate in KOHEN.md and KOHEN_PROMPT.md. The goral's seed changes with it;
azazel records already in L3 stand as cast.
- L1Reader: `parashah_breaks` on every verse (a list, empty where there
is none; only the two kinds are passed on).
- test/tablet39_parashah_breaks_test.exs — 7 tests: the six days of
creation each close with a petuchah; the Shema's first paragraph
(Devarim 6:4–9) opens after a petuchah and closes with a setumah; the
break inside Bereishit 35:22 falls between ישראל and ויהיו; Devarim
5:21 has its two; the whole scroll counts 293 / 394 / 686.
- Specs: vayakhel §1.2 and terumah §E1 said the marks were dropped;
they now say where they are. (The source element is <seg>, not a
milestone as 483d50c called it; and that commit's "233" was 293.)
Doorpost @expected_hash 21f1a4d5… → b62311e7…, in this commit.
- l1/README.md: a "Paragraph Breaks" section.
Read before committing — all five suites on the new L1: Elixir 491/0
(seeds 0 7 42) · Haskell 59/0 · korban 222 passed 1 skipped · azazel
125 passed · Prolog 6 suites exit 0. verify_l1.py OK. Four images
built; full local stack (real engine, PostgreSQL with SSL): the witness
reads the scroll and matches, Hebrew 200, English 422, health 7/7,
L3 written, no errors; every image carries f743b34b… read-only.
Nothing consumes the breaks yet: no cycle, scope or answer uses the
parashah. They are in the scroll and in the reader.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
483d50c4ab
commit
7d46fdc7c9
701 files changed
+4305
-16
No files matched your search
@@ -101,6 +101,12 @@ VOWEL_POINTS = set(
|
||||
)
|
||||
|
||||
# Sof pasuq and maqaf
|
||||
# OSIS <seg type="…"> → the paragraph break it marks.
|
||||
PARASHAH_BREAKS = {
|
||||
"x-pe": "petuchah", # פ — open: the rest of the line is left blank
|
||||
"x-samekh": "setumah", # ס — closed: a space within the line
|
||||
}
|
||||
|
||||
SOF_PASUQ = "\u05C3" # ׃
|
||||
MAQAF = "\u05BE" # ־
|
||||
PASEQ = "\u05C0" # ׀
|
||||
@@ -414,6 +420,7 @@ def parse_verse(verse_elem, book_osis: str, book_hebrew: str) -> dict:
|
||||
full_text_parts = []
|
||||
word_position = 0
|
||||
ketiv_qere_entries = []
|
||||
parashah_breaks = []
|
||||
|
||||
children = list(verse_elem)
|
||||
i = 0
|
||||
@@ -457,6 +464,19 @@ def parse_verse(verse_elem, book_osis: str, book_hebrew: str) -> dict:
|
||||
full_text_parts.append("־")
|
||||
elif seg_type == "x-paseq":
|
||||
full_text_parts.append(" ׀ ")
|
||||
elif seg_type in PARASHAH_BREAKS:
|
||||
# Petuchah (פ) and setumah (ס): the open and closed
|
||||
# paragraph breaks of the scroll. The WLC marks each one
|
||||
# where it falls — almost always after the verse's last
|
||||
# word, four times in the middle of a verse (pisqa
|
||||
# b'emtza pasuq: Bereishit 35:22, Devarim 2:8, 5:21,
|
||||
# 23:8). Until tablet 39 the builder read past them and
|
||||
# L1 had no paragraphs at all. The break is recorded by
|
||||
# the word it follows; `text_hebrew` is left as it was.
|
||||
parashah_breaks.append({
|
||||
"after_word": word_position,
|
||||
"type": PARASHAH_BREAKS[seg_type],
|
||||
})
|
||||
|
||||
i += 1
|
||||
|
||||
@@ -485,6 +505,8 @@ def parse_verse(verse_elem, book_osis: str, book_hebrew: str) -> dict:
|
||||
verse_out["ketiv_qere"] = ketiv_qere_entries
|
||||
if smikhut:
|
||||
verse_out["smikhut"] = smikhut
|
||||
if parashah_breaks:
|
||||
verse_out["parashah_breaks"] = parashah_breaks
|
||||
return verse_out
|
||||
|
||||
|
||||
@@ -661,6 +683,7 @@ def build_l1(morphhb_dir: str, output_dir: str, lexicon_dir: str):
|
||||
total_verses = 0
|
||||
total_words = 0
|
||||
total_roots = set()
|
||||
parashah_counts = defaultdict(int)
|
||||
missing_teamim = []
|
||||
book_stats = {}
|
||||
|
||||
@@ -705,6 +728,8 @@ def build_l1(morphhb_dir: str, output_dir: str, lexicon_dir: str):
|
||||
|
||||
book_verse_count += 1
|
||||
total_verses += 1
|
||||
for brk in verse_data.get("parashah_breaks", []):
|
||||
parashah_counts[brk["type"]] += 1
|
||||
|
||||
# Count words and collect stats
|
||||
for word in verse_data["words"]:
|
||||
@@ -775,6 +800,8 @@ def build_l1(morphhb_dir: str, output_dir: str, lexicon_dir: str):
|
||||
print(f"Total words: {total_words}")
|
||||
print(f"Unique shoreshim: {len(total_roots)}")
|
||||
print(f"Verses missing te'amim: {len(missing_teamim)}")
|
||||
print(f"Parashah breaks: {parashah_counts['petuchah']} petuchot, "
|
||||
f"{parashah_counts['setumah']} setumot")
|
||||
words_with_shoresh = sum(_SHORESH_STATS[k] for k in ("main", "sub", "single"))
|
||||
rootless = sorted(_ROOTLESS.items(), key=lambda kv: (-kv[1], kv[0]))
|
||||
print(f"Words with a shoresh: {words_with_shoresh}")
|
||||
@@ -809,6 +836,10 @@ def build_l1(morphhb_dir: str, output_dir: str, lexicon_dir: str):
|
||||
"total_words": total_words,
|
||||
"unique_shoreshim": len(total_roots),
|
||||
"verses_missing_teamim": len(missing_teamim),
|
||||
"parashah_breaks": {
|
||||
"petuchah": parashah_counts["petuchah"],
|
||||
"setumah": parashah_counts["setumah"],
|
||||
},
|
||||
"words_with_shoresh": words_with_shoresh,
|
||||
"shoresh_provenance": {k: _SHORESH_STATS[k] for k in
|
||||
("main", "sub", "single", "particle", "none", "unlisted")},
|
||||
|
||||
Reference in new issue
Block a user