feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782) - #1804

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9
May 2, 2026
Merged

feat(lenses): Numbers 1-9 lens content, batch 4 of Pentateuch-rest pilot (#820, #1782)#1804
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-4-numbers-1-to-9

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Batch 4 of the Pentateuch-rest pilot tracked under #1782 — first batch of Numbers. Adds 27 hermeneutic-lens entries across Numbers 1–9. Picks up after #1803 (Leviticus 21–27, which closed Leviticus).

Per-chapter distribution (27 total)

ChapterLensesWhy
num1 (first census)3grammatical (se'u et-ro'sh idiom), canonical (census thread), typological (Heb 3 wilderness fall)
num2 (camp arrangement)3literary (cardinal-direction structure), typological (camp→New Jerusalem), canonical (Ezek 48, Rev 21)
num3 (Levite census, firstborn substitution)2typological + canonical
num4 (Levite service, age limits)2grammatical (avodah doublet) + typological (Uzzah warning)
num5 (camp purity, restitution, ordeal)2literary triple structure + canonical (restitution → Zacchaeus)
num6 (Nazirite + Aaronic Blessing)6theology peak — full lens spread on the most-cited OT benediction
num7 (tribal offerings)2literary (intentional repetition) + devotional (v 89 voice from cherubim)
num8 (lampstand + Levite consecration)3redemptive, typological, devotional
num9 (Second Passover + cloud/fire)4canonical, christocentric, devotional, redemptive

Avg 3.0 entries/ch — slightly below the Leviticus average of 3.4. The chapter mix here is denser in procedural material (num3, 4, 5, 7, 8 all have ritual/admin focus), so the curated-sparse strategy lands lower per chapter while still spreading num6 fully.

Theological highlights

  • num6 (6 lenses, peak): vv 24–26's threefold blessing — the most-cited OT benediction in Christian and Jewish liturgy. Grammatical lens on the 3-5-7 Hebrew word rhythm; literary on the vow + blessing chapter doublet; typological on Nazirite as consecrated-one type; christocentric on the trinitarian echo at 2 Cor 13:14; canonical on the Ps 67 / Lk 1:79 / Jude 24–25 thread; devotional on receiving rather than generating blessing.
  • num1 / num2: the census + camp pair shape Israel as ordered congregation. Camp-with-tabernacle-at-center prefigures Rev 21:12–14's New Jerusalem; the cardinal-direction layout echoes into Ezek 48 and Rev 21:13.
  • num3 typological: vv 12–13's Levite-for-firstborn substitution carries the redemption-by-substitute pattern from Passover lamb forward to Christ.
  • num9: the cloud-and-fire (vv 15–23) anchors a major canonical thread (Ex 13 → 1 Kgs 8 → Mt 17:5 → Acts 2:3) and a christocentric anchor (Jn 1:14 logos that "tabernacled among us"; Acts 1:9 cloud at the ascension). The Second Passover provision (vv 6–13) is the chapter's hidden mercy — covenant feast opened twice for the unclean and the distant.

Pipeline gate results

schema_validator.py 146212 passed, 0 failed, 19 warnings (pre-existing ESV downloadable warns)
lens_quality_scorer.py 27/27 entries at 100/100 (per-chapter run, floor=100)
build_sqlite.py scripture.db green, hermeneutic_lenses chapter rows = 495
(= 468 baseline from #1803 + 27 batch 4; matches expected)
validate_sqlite.py 101 passed, 0 failed, 2 warnings (pre-existing embeddings/prompts)

Per-chapter SQLite distribution post-build (chapter_lens_content):

num1: 3 num2: 3 num3: 2 num4: 2 num5: 2 num6: 6 num7: 2 num8: 3 num9: 4

Length discipline

All entries authored to a 250-char target with 30-char headroom against the 280 schema ceiling. Actual range: 211–249 chars. Median ~231. One entry (num9 redemptive) initially landed at 254; trimmed to 229 before commit.

Filler / token guards

  • All six banned filler patterns verified absent at authoring time.
  • Rubric-token trap (carried forward from batches 1–3): every entry uses a token from its own lens's rubric, not a sibling lens's. Specifically verified: typological entries use type / pattern / prefigures / shadow; canonical entries use canon / echoes / thread / throughout Scripture; christocentric entries name Christ / Jesus explicitly; mission tokens nations / outward are not used in this batch.

Scholar set update for Numbers

Numbers introduces ashley (Timothy R. Ashley, NICOT Numbers commentary) as an additional scholar alongside milgrom (Anchor Bible Numbers) / calvin / mac. Ashley's panels are folded into panel_filter for the grammatical and literary lenses (where the philological weight matches), and stay out of the typological / christocentric / devotional mixes (where mac and calvin are the primary anchors). Verified: ashley is in the global scholar registry (load_scholar_keys()); section panels for num1–9 all include an ashley key.

Watch list for tier-2 audit

These are the entries most worth a human spot-check during accuracy auditing:

  1. num3 typological — "The shadow of substitutionary atonement runs from Passover lamb to Levite to Christ." The Levite-as-substitute reasoning (vv 12–13) is verse-grounded; the Christ-end is theological synthesis rather than a direct NT citation. Defensible move (Calvin develops this in his Numbers commentary) but synthesis.
  2. num6 christocentric — the Aaronic blessing → 2 Cor 13:14 link is via family resemblance (threefold benediction) rather than direct quotation. Calvin and many Reformed commentators trace this connection; not all readers will follow.
  3. num8 typological — "The shadow of separation by water runs from Levitical service toward baptismal language." The Lev/baptism connection is broadly NT-warranted (Heb 9:10's "various ceremonial washings") but the specific Numbers→baptism move is interpretive synthesis.
  4. num9 christocentric — "Jesus inhabits and inherits Numbers' cloud." Strong theological compression. Anchor texts (Jn 1:14, Acts 1:9) are solid; the inheritance language is interpretive.

Out of scope

  • No new content generation in content/numbers/{N}.json itself (only the lens chapter files).
  • No app code changes.
  • No CI workflow changes.
  • app/assets/db-manifest.json and app/assets/explore-images.json drift was checked out before staging.

Rollback

git revert <merge-commit> is sufficient. No schema changes, no migration, no R2 mutation in this PR.

Refs

Numbers 10–18 likely up next as batch 5 (rebellion cycles + Korah's rebellion + Aaronic budding rod).

@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

StepStatusDetails
Schema Validation146212 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.1s

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