Commit 2b7758e
authored
Strong's for the German corpus + German word study + the strongs-de pipeline (#24)
* Menu rationalization: a bar of roles, Settings folds its depths away
The bar becomes the five hats a reader wears — Read · Study · Preach ·
Share · Sing — and the tools move one layer down (maintainer direction,
2026-08-09):
- Study is the hub (internally still the Explore screen): Memorize joins
its cards, lights the Study tab, and its hub's back goes up one layer.
- Preach raises Present; Sing is the hymnal; labels via new nav.* keys.
- Share is a real destination in both shells (ShareScreen.svelte /
ui/ShareScreen.kt): the QR + link card, plus the church fields moved
out of Settings to sit beside the QR their setting feeds, with a visit
button (the recipient's path). The header share icon and ShareAppDialog
are gone.
- Settings: everyday rows stay (language, theme, type, sliders,
verse-per-line); everything else folds behind ONE Advanced disclosure
in both shells. Church and Welcome left the dialog entirely.
- The ≡/⋮ utilities are reachable from EVERY destination (session-level
menu + ScreenBar slot on web; UtilityMenu on every Android bar), ending
the 3-tap Read-tab detour to Settings both shells shared. Welcome shows
for every reader there (falls back to the new-believer welcome) — down
from four surfaces to one.
- The Android weave-map card renders explore.weaveMap like the web,
instead of the drifted map.chordMap.
e2e updated across nine specs (labels, the Study→Memorize path, the
Advanced expansions, the firstrun welcome consolidation, dialog-focus
re-anchored on BookNav); FEATURE-MANIFEST's menu section rewritten.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
* Strong's tags for the German corpus + the strongs-de pipeline
- data/luther1912.jsonl gains 344,330 Strong's tags (364,489 codes) merged
from the Zefania XML "Luther 1912 mit Strongs" (toledot.info; the file's
header declares the text public domain — BIBLIOGRAPHY.md records it).
Tokens unchanged: luther1912-tok1 stays frozen; only the empty Strong's
slots fill.
- data-prep/luther/merge-strongs.py: book-level token-stream alignment
(versification-free — the Zefania edition's German numbering shifts in more
places than german-numbering.tsv records), orthography fold for the
old/new-spelling gap, joined-word and contraction handling. 98.3% of the
source's ~350k tags transfer; unmatched words stay untagged. Fails below a
97% floor rather than writing a diverged merge.
- check-luther.py claim #7: every code resolves in strongs.json, H only in
the OT and G only in the NT, count floor proves the merge ran.
- data-prep/strongs-de/: translate.py (Batch API machine translation of
strongs_def + derivation, stdlib-only, idempotent/resumable — run with
ANTHROPIC_API_KEY to produce translations.json) and build-strongs-de.py
(assembles data/strongs-de.json: translated prose with English fallback,
and the kjv_def slot carrying LUTHER RENDERINGS derived from the tagged
corpus — 8,001 codes, frequency-ordered, alignment noise filtered).
* German word study: the engine serves it, with the German lexicon slot ready
- The KJV-only gates predate the German corpus carrying its own tags, so they
fall where the tags make them wrong and stay where they are load-bearing:
Strong's loads for either corpus (load_core_data + open), the word-study
card studies German words (dictionary entry + concordance via the corpus's
own occurrence index), while the KJV-token-anchored tiers — morphology, the
rendering lens, same-root, the machine analytics — stay off for German, and
the overlay stays KJV-only.
- strongs_for(): a German reader gets data/strongs-de.json when the pack ships
it (machine-translated definitions + Luther renderings), else the English
dictionary. The panel labels the renderings slot for the reader's Bible
("Luther:" / "KJV:") and, on the German dictionary, carries the
machine-translation caveat with a report link to the repo's issues — the new
ext: link verb (https only) routes as PanelLink::External; the web opens it
noopener/noreferrer.
- Web pack: strongs-de.json is optional with its own germanLexicon role —
installed with the German corpus (one ask covers both), fetched in stage 2
for German-installed devices, evicted after loadCoreData like its English
sibling, and never downloaded by an English reader.
- Android: .data-v4 → .data-v5. The v0.46.0 chronological.json addition
shipped WITHOUT this bump — a ')' inside an include-list comment truncated
the asset-marker test's view of the gradle list, so it never noticed. The
parser now strips comments first; existing installs re-extract (and get the
retagged German corpus) on next update.
- Tests: the german_corpus ffi test asserts the new contract (tagged tokens,
studying card, no KJV-tier leaks); a new toy-home test pins the German
dictionary pick, the Luther label, the caveat + report link, and ext:
routing (https only; the two run serially in CI — they flip the global
language). language.spec.ts asserts the tags survive the idxcache into the
web engine (mutation-killed against the restored KJV-only gate, wasm
rebuilt for the mutation).
* v0.47.0
* German lexicon: inline *AI-translated mark + an English-definitions opt-out
- The definition paragraph carries a small faded "*KI-übersetzt" /
"*AI-translated" run when the German dictionary serves — the at-a-glance
mark; the full caveat + report link still close the card.
- New additive config field strongsDeOff: a German reader who prefers the
original English definitions flips it in Settings ▸ language ("Englische
Strong-Definitionen"). Applied by strongs_for at engine open, so the toggle
flushes and reloads exactly like a language change. Round-trips the config
wire and the on-disk golden.
- The german_corpus toy test covers the escape hatch: strongsDeOff in the
config returns the English definitions with no caveat attached.
* UAT round 2: picker exclusivity, chip names what's left, Explore overflow, "studied"
Four fixes from on-device UAT of the combined branch:
- The plans picker hides builtins whose class is already running — starting
"the Bible in 90 days" while "in a year" runs could only mean abandoning
the one you're on (StudyPanel offerable(); plans.classFull hint when a
class is fully occupied).
- The nav chip's label names what is LEFT of today (planToday remaining()),
so finishing Genesis 1 of a Gen 1–4 day shows "Gen 2–4" instead of a label
that never moves all evening; dwell reports also invalidate the cached
plans read (session onReadingWrote) as a belt for the same surface.
- Explore's cards no longer spill text past their border: the global 44px
tap floor replaces the grid's automatic minimum size, so .ex-card restores
min-height: auto (hazard documented in app.css).
- User-facing copy says a chapter is "studied", not "swept" — 12 strings in
en/de (keys unchanged); "sweep" survives only as the mechanism's internal
name. e2e assertions updated to match, and the language spec's negative
probe moved off "Sing"/"Singen" (a substring collision the menu merge
exposed).
Each behavioural fix carries a mutation-killed regression test in
plans-today.spec.ts (picker filter removed, label reverted to the whole-day
span, min-height restored to the floor — all three runs went red).
README refresh by the maintainer rides along.
* e2e: pay the menu rationalization's test debt
PR #21 was merged with its web job red — nine tests still navigated the
pre-rationalization chrome. All nine now walk the new one:
- Study/Share are destinations (bottom bar on phones, header roles bar on
desktop), not ≡ menu entries; the ≡ menu lost its .menu-host wrapper.
- Backup and the bug report fold behind Settings ▸ Advanced, and
details:has(pre.report) must name .diag or it also matches that new
ancestor disclosure.
- The share QR is the Share screen's card, not a header dialog.
- "Sing" now names both the destination and the hymn's sing-mode button, so
the hymnal spec clicks button.sing; the Sing destination's bar is titled
by the hymnal itself.
* data: the German Strong's dictionary ships
data/strongs-de.json — 14,197 entries, same schema as strongs.json.
Definitions and derivations are AI-translated from the English (Sonnet,
sentence-by-sentence under a fixed glossary; the panel marks them
*KI-übersetzt and links this repo's issues), the kjv_def slot carries
Luther 1912 renderings counted from the corpus itself (8,001 codes; 8 fall
back to English prose). data-prep/strongs-de/translations.json is the raw
translation record build-strongs-de.py assembles from, kept for
reproducibility and review.
Android bundles it (gradle syncData + the asset-marker list — the .data-v5
re-extract already covers it); the web pack picks it up through the
germanLexicon role wired earlier.1 parent 96bb38c commit 2b7758e
67 files changed
Lines changed: 33268 additions & 32130 deletions
File tree
- .github/workflows
- apps
- android/app
- src/main/java/dev/plumbline
- ui
- web
- e2e
- src
- engine
- hymnal
- lib
- memorize
- shell
- state
- study
- crates
- core/src
- i18n
- ffi
- src
- tests
- data-prep
- luther
- strongs-de
- __pycache__
- data
- docs
- scripts
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| 61 | + | |
| 62 | + | |
61 | 63 | | |
62 | | - | |
| 64 | + | |
63 | 65 | | |
64 | 66 | | |
65 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
36 | 44 | | |
37 | 45 | | |
38 | 46 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
138 | | - | |
139 | | - | |
140 | | - | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | 119 | | |
149 | 120 | | |
150 | 121 | | |
| |||
199 | 170 | | |
200 | 171 | | |
201 | 172 | | |
202 | | - | |
203 | | - | |
204 | | - | |
205 | | - | |
206 | | - | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | 173 | | |
218 | 174 | | |
219 | 175 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
272 | 272 | | |
273 | 273 | | |
274 | 274 | | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
275 | 280 | | |
276 | 281 | | |
277 | 282 | | |
| |||
Lines changed: 5 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
132 | 136 | | |
133 | 137 | | |
134 | 138 | | |
135 | | - | |
| 139 | + | |
136 | 140 | | |
137 | 141 | | |
138 | 142 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
| |||
103 | 104 | | |
104 | 105 | | |
105 | 106 | | |
| 107 | + | |
106 | 108 | | |
107 | 109 | | |
108 | 110 | | |
| |||
157 | 159 | | |
158 | 160 | | |
159 | 161 | | |
| 162 | + | |
160 | 163 | | |
161 | 164 | | |
162 | 165 | | |
| |||
Lines changed: 6 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| 117 | + | |
117 | 118 | | |
118 | 119 | | |
119 | 120 | | |
120 | | - | |
| 121 | + | |
121 | 122 | | |
122 | 123 | | |
123 | 124 | | |
| |||
134 | 135 | | |
135 | 136 | | |
136 | 137 | | |
| 138 | + | |
137 | 139 | | |
138 | 140 | | |
139 | 141 | | |
| |||
155 | 157 | | |
156 | 158 | | |
157 | 159 | | |
158 | | - | |
| 160 | + | |
159 | 161 | | |
160 | 162 | | |
161 | 163 | | |
| |||
259 | 261 | | |
260 | 262 | | |
261 | 263 | | |
| 264 | + | |
262 | 265 | | |
263 | 266 | | |
264 | 267 | | |
265 | 268 | | |
266 | | - | |
| 269 | + | |
267 | 270 | | |
268 | 271 | | |
269 | 272 | | |
| |||
Lines changed: 17 additions & 16 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
3 | | - | |
4 | | - | |
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
| |||
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
32 | | - | |
33 | | - | |
| 33 | + | |
| 34 | + | |
34 | 35 | | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
42 | | - | |
| 44 | + | |
43 | 45 | | |
44 | 46 | | |
45 | 47 | | |
| |||
48 | 50 | | |
49 | 51 | | |
50 | 52 | | |
51 | | - | |
52 | | - | |
| 53 | + | |
| 54 | + | |
53 | 55 | | |
54 | | - | |
| 56 | + | |
55 | 57 | | |
56 | 58 | | |
57 | 59 | | |
58 | 60 | | |
59 | | - | |
60 | | - | |
| 61 | + | |
61 | 62 | | |
62 | 63 | | |
63 | 64 | | |
| |||
0 commit comments