KeyQuest now treats built-in practice topics as data instead of hard-coded lists.
Sentences/manifest.json: canonical built-in topic listdocs/dev/schemas/sentences-manifest.schema.json: JSON schema for the manifestmodules/sentences_manager.py: runtime loader and fallback logic
Each topic entry should define:
name: canonical topic key used by the appfile: backing.txtfile insideSentences/display_name: optional UI label overrideexplanation: optional short description for menus and docs
The manifest also defines speed_test_file, which keeps the speed-test pool configurable without changing Python code.
- If
Sentences/manifest.jsonis missing or invalid, the app falls back to the built-in default manifest inmodules/sentences_manager.py. - Extra
.txtfiles dropped intoSentences/still appear as practice topics even if they are not yet listed in the manifest. - Manifest entries win when both a manifest mapping and an inferred filename are available.
- Add new built-in topics to
Sentences/manifest.jsonand commit the matching.txtfile inSentences/. - Keep display names and explanations concise; they are spoken aloud in menu flows.
- If the shape changes, update the schema and
modules/sentences_manager.pytogether.