feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781) - #1799

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30
Apr 29, 2026
Merged

feat(lenses): Exodus 21-30 lens content, batch 3 of Exodus pilot (#820, #1781)#1799
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-exodus-21-to-30

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 3 of the Exodus pilot. Book of the Covenant (ex21–23) + covenant ratification (ex24) + tabernacle instructions (ex25–30). 35 entries across 10 chapters, all 100/100 on lens_quality_scorer after one small fix pass.

The lowest per-chapter density of any batch in the pilot — average 3.5 lenses/chapter — and that's correct. Legal codes and architectural specifications don't need six lenses each; forcing them would dilute. ex24 is the only peak (5 lenses) because covenant ratification is the chapter where law-and-construction become liturgy.

Per-chapter lens distribution

ChapterLensesNotes
ex21 — Servants; injury laws3literary, redemptive, canonical
ex22 — Property + vulnerable protection3literary, redemptive, canonical
ex23 — Justice + festivals + angel4literary, redemptive, typological, canonical
ex24 — Covenant ratification5literary, typological, christocentric, redemptive, canonical
ex25 — Ark; mercy seat; lampstand4grammatical, typological, christocentric, canonical
ex26 — Coverings; veils3literary, typological, christocentric
ex27 — Bronze altar; courtyard3literary, typological, redemptive
ex28 — Priestly garments3grammatical, typological, christocentric
ex29 — Priestly consecration4literary, typological, christocentric, devotional
ex30 — Incense; basin; oil3literary, typological, canonical

Total 35 entries, average 3.5 lenses/chapter.

Theological highlights

  • ex24 christocentric: v 8's "blood of the covenant" is the formula Christ redeploys verbatim at Mt 26:28 ("this is my blood of the covenant"). The Last Supper deliberately rewrites Sinai into the upper room — same blood-grammar, new mediator.
  • ex25 grammatical:kapporet (mercy seat) from root kafar ("to cover, atone") — not throne-cushion but atonement-cover. Cherubim guarding the mercy seat (v 18) recall Gen 3:24's cherubim guarding Eden; Christ as both throne and atonement reopens what Eden's cherubim closed.
  • ex25 canonical: v 40's "according to the pattern shown to you on the mountain" → Heb 8:5 ("a copy and shadow of the heavenly things") → Heb 9:24 (Christ entering the heavenly archetype). The tabernacle is reverse-engineered from heaven.
  • ex26 typological: the inner veil (vv 31–33) is built to be torn — Mark 15:38 tears it from top to bottom; Heb 10:19–20 names Christ's flesh the new way through. Cherubim woven into the veil match the ark's cherubim — guards on both sides of the boundary.
  • ex28 typological: Aaron carries the twelve tribes' names on his shoulders and over his heart (vv 9–12, 29) — high priest physically bears Israel into God's presence. Heb 4:14: Christ as great high priest carries his people the same way.
  • ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates hearing, doing, walking — whole-life purification. Heb 7:27: Christ's once-for-all sacrifice abolishes the cycle while fulfilling its meaning.
  • ex30 typological: the half-shekel atonement-money is "the same for rich and poor" (v 15) — covenant atonement levels the human field. The pattern points to one ransom, every soul, no scaling.
  • ex23 typological: "my angel will go before you" with "my name in him" (vv 20–21) — patristic readers saw the angel of Yahweh as pre-incarnate appearance. Defensible across multiple traditions.

Pipeline gates (all green)

GateResult
schema_validator.py142820 passed / 0 failed
lens_quality_scorer.py35/35 entries at 100/100 after fix pass
build_sqlite.py8 lenses, 290 contents (255 baseline + 35 new)
validate_sqlite.py101 passed / 0 failed

Drafting note — token-swap fixes (lesson surfaced)

Three entries needed a single fix iteration. The pattern:

EntryIssue
ex25 typologicalused "thread" (a canonical token) without a typological token
ex25 canonicalused "pattern" (a typological token) without a canonical token
ex28 typologicallacked any of: type/foreshadow/anticipates/echoes/prefigures

Same root cause as the gen42/43 structural/narrator fix in batch 4 of the Genesis pilot: the rubric must_have_one_of lists are strict substring matches, and the typological/canonical token sets overlap conceptually but are scored disjointly. Drafting under the assumption that "this is clearly a typological entry" doesn't help if the entry uses canonical tokens — the scorer doesn't read the lens label, only the substrings.

Suggested rubric improvement (would be ~5 min): the rubric file already separates these lists; consider adding a small overlap allowance (e.g., "thread" → counts for both) or making each lens's must_have_one_of more distinct. Alternatively, add this to the drafting checklist: "verify each lens entry contains a token from that lens's specific list, not the conceptual neighbour".

Three quick str_replace swaps fixed all three. No content rewrite.

Branch / merge notes

Watch list for tier-2 audit

Five entries flagged for editor review:

  1. ex23 typological — "patristic readers saw the angel of Yahweh as pre-incarnate appearance" — defensible across Justin/Irenaeus/Calvin but is a classical Reformed reading; some Eastern traditions are more hesitant.
  2. ex24 christocentric — Mt 26:28 cited verbatim of v 8 ("blood of the covenant"); the connection is direct lexical citation but reads tightly compressed.
  3. ex25 christocentric — Gen 3:24 cherubim → ex 25:18 cherubim → Christ reopens Eden is a defensible patristic-Reformed move but covers a lot of ground in three lines.
  4. ex26 typological — "the chapter's veil is built to be torn" is rhetorically strong; sound but interpretive.
  5. ex28 christocentric — gold-plate "holy to the LORD" → Christ "bears not flawed worship but the worshippers themselves" is a creative theological move; defensible but worth tier-2 calibration.

Rollback plan

Revert the merge commit. The 10 new chapter files are additive and isolated under content/hermeneutic_lenses/chapters/; no existing content, schema, or app code is touched.

Roadmap

After this lands, batch 4 (ex31–ex40) closes the Exodus pilot. Golden calf, glory, covenant renewal, tabernacle construction. Expected high density on ex32 (calf), ex33 (glory), ex34 (renewal); construction chapters (ex36–39) will be sparse like this batch.

Refs #820. Closes part of #1781.

#1781)
Book of the Covenant + tabernacle instructions. Lower per-chapter density
(legal/architectural genre): 35 entries across 10 chapters, average 3.5
lenses/chapter. All 100/100 on lens_quality_scorer.
Per-chapter distribution:
- ex21 (servants; injury laws) 3 lenses
- ex22 (property; vulnerable-protection) 3 lenses
- ex23 (justice; festivals; angel) 4 lenses
- ex24 (covenant ratification) 5 lenses (peak)
- ex25 (ark; mercy seat; lampstand) 4 lenses
- ex26 (coverings; veils) 3 lenses
- ex27 (bronze altar; courtyard) 3 lenses
- ex28 (priestly garments) 3 lenses
- ex29 (priestly consecration) 4 lenses
- ex30 (incense; basin; oil) 3 lenses
Theological highlights:
- ex24 christocentric: v 8's 'blood of the covenant' is the formula
Christ redeploys verbatim at Mt 26:28 — Sinai becomes upper room.
- ex25 grammatical: kapporet = mercy seat, root kafar (atone). Cherubim
guarding the mercy seat (v 18) recall Eden's cherubim (Gen 3:24);
Christ reopens what they closed.
- ex26 typological: the inner veil (vv 31-33) is built to be torn
(Mark 15:38, Heb 10:19-20) — woven cherubim match the ark's cherubim.
- ex28 typological: Aaron carries Israel's names on shoulders + heart;
Christ as great high priest (Heb 4:14) carries his people the same way.
- ex29 christocentric: blood on ear/thumb/toe (v 20) consecrates
hearing/doing/walking; Heb 7:27 abolishes the cycle while fulfilling it.
- ex30 typological: half-shekel atonement-money the same for rich and
poor (v 15) — one ransom, no scaling, prefiguring Christ's.
- ex23 typological: 'my angel... with my name in him' (vv 20-21) read
by patristics as pre-incarnate appearance.
Pipeline gates (all green):
- schema_validator.py: 0 failed (142820 passed)
- lens_quality_scorer.py: 35/35 entries 100/100 (one fix iteration —
three rubric-token misses fixed in seconds)
- build_sqlite.py: 8 lenses, 290 contents (255 baseline + 35 new)
- validate_sqlite.py: 0 failed
Drafting note: three rubric-token swaps needed (ex25 typological,
ex25 canonical, ex28 typological). I had used 'thread' (canonical
token) in a typological entry and 'pattern' (typological token) in a
canonical entry — same lesson as the genesis batch 5 'structural'/
'narrator' issue. The lens_rubrics.json must_have_one_of lists are
strict substring matches, so token-token swaps don't carry over
between lenses. Worth a small rubric improvement: typological's tokens
overlap heavily with canonical's, and the scorer treats them as
disjoint. Future drafts should check both lists when in doubt.
Branched off latest master pre-#1798 merge; once #1798 lands, the
live lens_contents row count will be 303 + 35 = 338.
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation142820 passed, 0 failed
Build DB
DB Integrity101 passed, 0 failed

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 4001❌ 04001
Suites✅ 532❌ 0532

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.7s

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CraigBuckmaster