Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) by CraigBuckmaster · Pull Request #1779 · CraigBuckmaster/ScriptureDeepDive · GitHub
Skip to content

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820) - #1779

Merged
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding
Apr 28, 2026
Merged

feat(lenses): Phase 0 scaffolding for hermeneutic lenses (#820)#1779
CraigBuckmaster merged 1 commit into
masterfrom
feat/820-hermeneutic-lenses-scaffolding

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Phase 0 of Epic #820 — Hermeneutic Lenses

Lays the full content + tooling + UI runway for the Hermeneutic Lenses feature. Ships safe with zero chapter content — the loader, scorer, and validator all gracefully no-op until Phase 2+ adds chapter entries. The Explore menu's "Hermeneutic Lenses" card was already wired and visible to users; it now resolves to a working browse screen sourced from the DB instead of the previous hardcoded mismatch.

What's in this PR

Schema

  • hermeneutic_lenses gains a long_description TEXT column for browse-card detail copy. chapter_lens_content unchanged.

Content

  • content/hermeneutic_lenses/lenses.json — 8 canonical lens definitions: grammatical, literary, typological, redemptive, christocentric, canonical, devotional, mission. Foundation-first display order.

Tooling

  • _tools/lens_quality_scorer.py — DVCR-style scorer (Density, Verse Coverage, Completeness, Relevance — 25 pts each, 90-point floor) for chapter lens entries.
  • _tools/lens_rubrics.json — per-lens "must have one of" + "should avoid" tokens, soft-scored against guidance text. Edit freely; the scorer reloads on every run.
  • _tools/schema_validator.py — new Section 21 validates lenses.json shape, chapter file structure, panel-key allowlist, and the panel_order ⊆ panel_filter constraint.
  • _tools/accuracy_meta_extractors.pyextract_hermeneutic_lenses() produces Tier-2 claims so the accuracy auditor can verify guidance reflects real positions of the named hermeneutical school.

Drive-by refactor (prevents the exact bug class that bit during this work)

All chapter-walk loops now share a single NON_BOOK_DIRS frozenset constant:

FileInline skip-sets beforeAfter
schema_validator.py11 copies1 constant
build_sqlite_loaders.py2 copies1 constant
lens_quality_scorer.py2 copies1 constant

Adding a new content directory (e.g. hermeneutic_lenses itself) now requires one edit, not fifteen. hermeneutic_lenses added to the canonical skip list.

App

  • HermeneuticLens type gains long_description?: string.
  • LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 entries, all using stale lens IDs that no longer match the data layer). Long copy now sourced from the DB column.
  • ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more""Read Scripture through 8 interpretive frameworks". The old copy named lenses we don't ship.

Docs

  • _tools/DEV_GUIDE.md Section 13 documents the lens content directory layout, per-chapter file shape, curated-sparse coverage policy, banned filler patterns, and the three-step quality gate (schema → DVCR → accuracy).

Verified locally

$ python3 _tools/schema_validator.py
RESULTS: 138040 passed, 0 failed, 19 warnings
[OK] ALL CONTENT CHECKS PASSED
$ python3 _tools/build_sqlite.py
[OK] hermeneutic_lenses: 8 lenses, 0 contents
$ python3 _tools/validate_sqlite.py
RESULTS: 101 passed, 0 failed, 2 warnings
[OK] ALL CHECKS PASSED
$ python3 _tools/lens_quality_scorer.py
LENS QUALITY REPORT — 0 entries
No lens content yet — pipeline ready, awaiting Phase 2+.
$ grep -rn LENS_DETAILS app/src/
app/src/screens/LensBrowseScreen.tsx:10: * Epic #820 / Phase 0: removed the hardcoded LENS_DETAILS map. (...)
# Only the docstring reference noting the removal remains.

Out of scope (tracked as sibling sub-issues)

Rollback plan

Pure additive change to schema + tooling + content. Revert is a clean git revert — nothing depends on the new column or new directory yet. Existing lens UI (browse screen, in-chapter toggle) currently displays nothing because there's no chapter content; behavior was the same before this PR. The only user-visible change is the corrected Explore menu subtitle.

Closes scaffolding portion of #820. Sub-issues #820.2 through #820.11 will track the remaining phases.

Lays the full content + tooling + UI runway for Epic #820 Hermeneutic
Lenses. Ships safe with zero chapter content; the loader, scorer, and
validator all gracefully no-op until Phase 2+ adds chapter entries.
Schema:
- hermeneutic_lenses gains a long_description column for browse-card
detail copy. chapter_lens_content unchanged.
Content:
- content/hermeneutic_lenses/lenses.json: 8 canonical lens definitions
(grammatical, literary, typological, redemptive, christocentric,
canonical, devotional, mission), foundation-first display order.
Tooling:
- _tools/lens_quality_scorer.py: DVCR-style scorer (Density, Verse
Coverage, Completeness, Relevance — 25 each, 90 floor) for chapter
lens entries.
- _tools/lens_rubrics.json: per-lens "must have one of" + "should
avoid" tokens, soft-scored against guidance text.
- _tools/schema_validator.py: new Section 21 validates lenses.json
shape, chapter file structure, panel-key allowlist, panel_filter ⊆
panel_order constraint.
- _tools/accuracy_meta_extractors.py: extract_hermeneutic_lenses()
produces Tier-2 claims so the auditor can verify guidance reflects
real positions of the named hermeneutical school.
Refactor (drive-by, prevents the bug class that bit during this work):
- All chapter-walk loops now share a NON_BOOK_DIRS frozenset constant.
schema_validator had 11 inline copies of the same skip-set;
build_sqlite_loaders had 2; lens_quality_scorer had 2. New content
directories now require one edit, not fifteen. hermeneutic_lenses
added to the canonical list.
App:
- HermeneuticLens type gains long_description?: string.
- LensBrowseScreen drops its hardcoded LENS_DETAILS map (5 keys, all
using stale lens IDs). Long copy now sourced from the DB.
- ExploreMenuScreen subtitle: "Feminist, liberation, canonical & more"
→ "Read Scripture through 8 interpretive frameworks". The old copy
named lenses we don't ship.
Docs:
- DEV_GUIDE.md Section 13 documents the lens content directory layout,
per-chapter file shape, curated-sparse coverage policy, banned filler
patterns, and the three-step quality gate (schema → DVCR → accuracy).
Verified:
- schema_validator: 138040 passed, 0 failed
- build_sqlite: 8 lenses, 0 contents loaded
- validate_sqlite: 101 passed, 0 failed
- lens_quality_scorer: 0 entries (expected pre-Phase 2)
- LENS_DETAILS fully purged (grep -r LENS_DETAILS app/src/ shows
only a docstring reference noting the removal)
Out of scope for this PR (tracked as separate sub-issues):
- ChapterScreen consumption of panel_filter_json/panel_order_json (#820.2)
- Per-chapter lens content (#820.3 pilot, #820.4-11 rollout)
@github-actions

Copy link
Copy Markdown

Content Pipeline Results

✅ All pipeline checks passed

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

@github-actions

Copy link
Copy Markdown

Test Results

✅ All tests passed

PassedFailedTotal
Tests✅ 3973❌ 03973
Suites✅ 531❌ 0531

Coverage

StatementsBranchesFunctionsLines

⏱️ Duration: 93.1s

@CraigBuckmaster
CraigBuckmaster merged commit ec38274 into masterApr 28, 2026
7 checks passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/820-hermeneutic-lenses-scaffolding branch April 28, 2026 02:16
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