feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781) - #1795

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40
Apr 28, 2026
Merged

feat(lenses): Genesis 31-40 lens content, batch 4 of pilot (#820, #1781)#1795
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-2-genesis-31-to-40

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Hermeneutic Lenses pilot (Epic #820, tracking #1781). Adds curated-sparse lens guidance for Genesis 31–40: 40 entries across 10 chapters, all scoring 100/100 on lens_quality_scorer.

Per-chapter lens distribution

ChapterLensesNote
gen31 — Jacob flees Laban; Mizpah covenant4grammatical, redemptive, canonical, devotional
gen32 — Wrestling at Peniel6grammatical, literary, typological, redemptive, christocentric, devotional — theology-dense
gen33 — Reconciliation with Esau4literary, redemptive, christocentric, devotional
gen34 — Dinah and Shechem3literary, canonical, redemptive — sparse / dark
gen35 — Return to Bethel; Rachel/Isaac die4grammatical, redemptive, canonical, devotional
gen36 — Esau's genealogy2canonical, redemptive — very sparse, mostly canonical
gen37 — Joseph sold5literary, typological, redemptive, christocentric, canonical
gen38 — Judah and Tamar5literary, redemptive, christocentric, devotional, canonical
gen39 — Joseph in Potiphar's house4literary, redemptive, devotional, typological
gen40 — Dreams in prison3literary, devotional, redemptive — sparse narrative

Total: 40 entries. Average 4.0 lenses/chapter — within the curated-sparse band (theology-dense gen32 at 6, near-vestigial gen36 at 2, narrative chapters at 3–4).

Theological highlights

  • gen32 typological + christocentric: Jabbok wrestling (vv 24–30) read with Hosea 12:3–4 toward Gethsemane and the cross — blessing carried through wound; Israel's limp foreshadows victory through scar.
  • gen37 christocentric: Joseph sold for twenty pieces of silver (v 28) anchored to Matthew 26:15 (and Acts 7:9–10's parallel reading) — beloved son rejected by his own as the gospel's deep grammar.
  • gen38 christocentric: Tamar in Matthew 1:3; Perez (v 29) → David → Messiah. Christ's family tree refuses respectability from generation one.
  • gen34 canonical: Levi/Simeon's weaponised circumcision (vv 13–17, 25–26) threaded to Gen 49:5–7 and Judges 19–21 — covenant-people violence is a thread throughout Scripture.
  • gen35 canonical: Bethel's pillar (v 14) is later corrupted by Jeroboam's calf (1 Kgs 12:28–29) and denounced by Hosea (Hos 4:15) — site of fidelity becomes site of apostasy.
  • gen33 christocentric: Esau running to embrace the deceiver (v 4) prefigures the running father of Luke 15:20 and behind it Christ's reconciling absorption of wrong.

Pipeline gates (all green)

GateResult
schema_validator.py140196 passed / 0 failed / 19 unrelated content warnings
lens_quality_scorer.py40/40 entries at 100/100 (all four dimensions full marks)
build_sqlite.py8 lenses, 131 contents (gen1–20 baseline 91 + 40 new)
validate_sqlite.py101 passed / 0 failed

Drafting discipline (lessons applied from batches 1–3)

  • 250-char draft ceiling: each guidance entry drafted toward ~220–245 chars to leave 30+ char headroom under the 280 schema cap. Result — zero trim iterations needed across 40 entries.
  • Rubric tokens baked in first draft: every entry contains at least one must_have_one_of token from _tools/lens_rubrics.json for its lens, written into the first version rather than retrofitted.
  • Banned filler avoided up front: no occurrences of "the lens reveals", "this lens shows", "through this lens", "this passage shows that", "this text teaches that", "in this chapter we see/learn".
  • Verse anchors in v X / vv X-Y form so the in-chapter bounds check fires. Cross-book refs (Mt 26:15, Hos 12:3–4, etc.) use the standard book-chapter:verse form which the scorer correctly ignores for chapter-bounds.

Watch list for tier-2 audit

These are the entries most likely to draw editorial scrutiny on a deeper read; flagging proactively rather than waiting for the auditor.

  1. gen32 christocentric — Hosea 12:3–4 → Gethsemane → cross is a defensible Reformed reading but compresses three theological moves; consider expanding in a future tier-2 pass if the chain feels too fast for the audience.
  2. gen37 typological — claims Joseph "fits a typological pattern" with four anchors (vv 4, 13, 28, 33). Patristic/Reformed traditions support this; the audit should confirm we're not inventing a Lutheran-style tight typological correspondence the text doesn't carry.
  3. gen33 christocentric — Luke 15:20 echo of Esau's run is a homiletical commonplace, but the typology is associative rather than canonical; the scorer accepts it; an editor may prefer "anticipates" rather than "foreshadowing".
  4. gen38 christocentric — Tamar's place in Mt 1:3 is canonical fact, but the "scandal in the family tree" framing is interpretive; verify it matches the tone of the canonical-women thread elsewhere in the corpus.
  5. gen34 redemptive — calling the Shechem episode a "fall within the chosen line" tracks Wenham/Walton; verify scholarly attribution alignment if a scholar panel ever cites this entry.

Branch / merge notes

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. SQLite rebuilds deterministically from the JSON, so a revert restores byte-identical state.

After this lands

Only batch 5 (Gen 41–50) remains to complete the Genesis pilot.

Closes part of #1781. Refs #820.

Adds curated-sparse hermeneutic lens guidance for Gen 31-40 — batch 4 of the
pilot. 40 entries across 10 chapters, all 100/100 on lens_quality_scorer.
Per-chapter distribution (curated-sparse):
- gen31 (Mizpah covenant) 4 lenses
- gen32 (wrestling at Peniel) 6 lenses (theology-dense)
- gen33 (reconciliation w/ Esau) 4 lenses
- gen34 (Dinah) 3 lenses (sparse / dark)
- gen35 (return to Bethel) 4 lenses
- gen36 (Esau genealogy) 2 lenses (very sparse)
- gen37 (Joseph sold) 5 lenses (Joseph cycle begins)
- gen38 (Judah and Tamar) 5 lenses (Mt 1:3 messianic line)
- gen39 (Joseph in Potiphar's) 4 lenses
- gen40 (dreams in prison) 3 lenses
Theological highlights:
- gen32 typological/christocentric: Peniel wrestling read with Hos 12:3-4
toward Gethsemane and the cross.
- gen37 christocentric: Joseph sold for 20 silver pieces (v 28) anchoring
Mt 26:15 and the beloved-son-rejected pattern.
- gen38 christocentric: Tamar in Mt 1:3, Perez (v 29) → David → Messiah;
scandal in Christ's family tree.
- gen34 canonical: Levi/Simeon's circumcision-deception threaded forward
to Gen 49:5-7 and Judges 19-21.
Pipeline gates (all green):
- schema_validator.py: 0 failed (140196 passed, 19 unrelated warnings)
- lens_quality_scorer.py: 40/40 entries 100/100
- build_sqlite.py: 8 lenses, 131 contents (gen1-20 baseline + 40 new)
- validate_sqlite.py: 0 failed
Drafting discipline: targeted ~250-char ceiling per guidance entry to
keep 30-char headroom under the 280 schema cap; rubric tokens baked
into the first draft. Result: zero trim iterations needed.
Notes:
- PR #1794 (batch 3, gen 21-30) is still in flight; this batch branches
off master and assumes #1794 lands first. No file conflicts expected
since chapter files are non-overlapping.
- Remaining pilot work after this PR: batch 5 (gen 41-50).
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation140196 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.5s

@CraigBuckmaster
CraigBuckmaster merged commit b183f7b into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-2-genesis-31-to-40 branch April 28, 2026 23:31
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