Repository navigation
StudySprint webapp v0.5.1
Pre-releaseSurface release webapp v0.5.1, cut by the release-cut workflow (issue #4455 seam 3) from tag webapp-v0.5.1. Changes: see CHANGELOG.md at this tag.
Surface parity at this cut
Foundation: v1.0.0 · this surface: v0.5.1 (tag webapp-v0.5.1)
Parity matrix of record: evidence/PARITY-MATRIX.md at tag webapp-v0.5.1.
Surface × core feature-parity matrix (iteration 1 of #4282)
Ground truth: the shipped bindings, read from the surfaces'
own builders (web/build_data.py, tui.py: build_state, the
APK bundle = the web bundle) at core v1.0.0 + surface line
0.5.1. This matrix is the catch-up program's baseline;
every iteration updates it and the per-surface parity
statements together (standing surface gates). Owner rule (2026-11-03): this table rides every release body from v1.0.0 — release-cut embeds it verbatim from the cut tag; a pre-matrix tag’s body falls back to a named versions-of-record line. Legend:
bound = the surface runs the real core path ·
partial = a named subset, with the gap stated ·
absent = not on the surface.
| Core capability (FEATURES.md) | CLI/core | webApp 0.5.1 | TUI 0.5.1 | APK 0.5.1 |
|---|---|---|---|---|
| §1/§2 Plan + trust receipt + Today (§2/§3) | bound | bound | bound | bound (build-time state, disclosed) |
| §3 Daily check-in + no-guilt shift | bound | bound (persisted; surface-level shift, core reflow not bound) | bound (persisted; real week/day identity) | as webApp |
| §3 SR review — FSRS + SM-2, receipts | bound | bound (browser engines over the core UX export) | bound (real review_card) |
as webApp |
| SR exports — Anki .apkg · Obsidian vault | bound | bound (browser ports of both writers over the web SR state: .apkg semantic parity · Obsidian byte parity, battery-pinned — tests/test_sr_exports_web.py) | bound (Export tab) | bound (as webApp) |
| §1/§3 Reader (sections + RSVP) | bound | bound (all 6 sections, 0.1.1) | bound | as webApp |
| §1 Intake — syllabus/textbook ingestion | bound | bound (in-browser grammar; photos = awaiting-core-ocr, disclosed) | bound (real ingest_any, confirm-gated) |
bound (native file chooser + camera wiring) |
| §1b Reading pipeline — finder · OCR · structure · term bank | bound | bound (ingestion grammar + the demonstration book's bundle at build time: ingest receipt counts shown (62 terms mined · 62 with definitions · 2 with index refs — Darwin, Origin of Species 6th ed., Ch. XIV + the book's own Glossary + Index); term expansion in the Reader (core-emphasized segments; tap → term_tap_payload: definition · index pages · sections); hypothes.is annotations view over the sections (W3C model; API sync via the config-injected token seam — token entered on-device in the pane, sync merges the account group's annotations into the view, provenance-stamped); OCR: photographs run through tesseract.js (WASM) in the browser — photo → OCR text → the ingestion grammar, provenance stamped ocr (battery: tests/test_ocr_web.py, two-engine agreement over a photo fixture); finder stays the core's separate leg) |
bound (the REAL pipeline live: Book tab over the bundled demonstration book (same counts), Ingest reports the three counts for any textbook via ingest_any; OCR seam wired through the core's tesseract default, provenance stamped ocr; hypothes.is annotations pane (W3C model, as webApp)) | bound (as webApp) |
| §1c Multi-course + exam countdowns + .ics export | bound | bound (course set = both bundled samples intaken through the core's intake_courses; header switcher rebinds every view; SR + check-ins persist under per-course keys, legacy keys adopted once by the first course; countdown from the intake (port-pinned for user courses); .ics download = the core's per-course export; create-a-course from a syllabus document in Ingest) | bound (Courses tab: the real intake_courses set incl. user courses from ~/.studysprint/courses; switching rebinds all panes; check-ins persist per course in checkin-logs.json (the flat file keeps the active course's log); .ics export writes the active course's calendar file; create-a-course form persists the syllabus doc) | as webApp |
| §1c Memory methods — loci/palace · Feynman · retrievability notifications · interleaving · Leitner | bound | bound (Memory view: palace walk over iteration 1's temple route · Feynman pane · retrievability list with one-tap grades · Leitner in SR · interleaved plan — browser ports battery-pinned to the core) | bound (Memory tab runs the real core functions; Leitner via leitner_review; interleave in the Plan pane) |
as webApp |
| §1d Calendar awareness — intake · frequency ramps · shift briefings · quiet hours | bound | bound (build-time state, disclosed) | bound (Calendar pane, live-assembled) | as webApp |
| §1d Geography — locations · routes · temple routes | bound | bound (build-time state, disclosed) | bound (Routes pane, live-assembled) | as webApp |
| §1d State recall + stress hardening (OPT-IN, ceilings in FEATURES §1d) | bound | bound (Hardening view: opt-in only, per-device flag off by default; ceilings verbatim; varied-context plan + reinstatement script + SIT drill plans (seeded pressure picks, receipt-reproducible) as browser ports battery-pinned to study_hardening; results record answered + 'not yet' with the supportive close — no score/penalty fields exist) | bound (Hardening tab runs the real study_hardening: opt-in persisted, off by default, refusal receipt when off; contexts + script + drill plan/result live) | bound (as webApp) |
Correction (2026-11-03): the parity matrix embedded above was composed from a tree whose matrix header had not yet rolled to the 0.5.1 surface line; the header lines in the embed are corrected to 0.5.1 to match the matrix of record. No other content changes.