The tablet sentence-builder + the progress dashboard, explained as recipes. Written for an adult who hasn't touched the system in three weeks.
Maintenance rule: any change that alters an adult-facing flow (adult gate, practice mode, pack picker, sync, dashboard, pinning) must update this guide in the same change, including re-capturing any screenshot that changed.
| I want to… | Do this |
|---|---|
| Let her play | Wake the tablet. The app is already there and locked in (pinned). That's it. |
| Try the app myself | Turn Practice mode ON first (recipe 3) — otherwise your taps count as her learning data. |
| Open the adult controls | Press and hold the small grey text line at the very bottom of the screen for 2 seconds (recipe 2). |
| Move her to the next map | Adult controls → tap a different row under "Session pack" (recipe 4). |
| See her progress | On the PC: localhost:5173 in a browser → Sign in with Google (recipe 7). |
| Get data to the SLP | Dashboard → Export buttons → send the CSV files (recipe 8). |
| Unpin the tablet | Hold Back + Recents together, then enter the guardian lock-screen password (recipe 9). |
| Fix "sync failed" | Check ExpressVPN on the tablet first — a dead VPN tunnel blocks everything (recipe 10). |
The system has two halves:
The tablet is normally pinned — locked to the app so Home/Back can't leave it. She can't exit it, and neither can you without the guardian password (recipe 9).
Her screen. The photo on the left is the prompt; she builds "She is throwing a ball" by
tapping tiles. The grey text at the bottom ("Symbols: ARASAAC…") is also the hidden adult
gate — see recipe 2.
There is no visible settings button — that's deliberate, so she never wanders into it.
Everything an adult can do lives here: choose the session pack, install new packs, toggle
Practice mode, pair the device, and sync.
Tap Close to return to her screen. The gate works even while the tablet is pinned.
Why this matters: the app cannot tell whose fingers are tapping. Any build made without Practice mode ON is recorded as her learning data and pollutes her progress charts. (This has actually happened — 17 adult test builds once had to be surgically deleted from her records.)
Before you demo, test, or play:
The toggle, switched on.
The badge on the builder screen. If you don't see it, your builds are being logged as hers.
When you're done: open the gate again and tap the toggle off (the badge disappears). Practice mode also switches itself off after 30 minutes as a safety net, and a build in progress when the mode flips is discarded rather than mis-attributed.
Practice builds still sync and appear on the dashboard — under the separate Practice tab, excluded from her metrics. They're useful as demos.
The app never advances on its own — an adult always makes the change. That's deliberate: one predictable change at a time, decided by a human.
When to advance: check the dashboard's evidence table first (recipe 7). The working reference is: a target is ready when she builds it ~90% independently across 3 sittings, on at least 2 different days — but the SLP owns this criterion; when in doubt, ask her. The gentlest first step up from Map 1 is Map 2 (identical sentence frame, new food words).
The full ladder is 15 maps (Map 2 food theme → Map 3 is/are → Map 4 possessives → … → Map 15
feelings). Details live in docs/sentence-builder/SCENARIO_LIBRARY.md.
New maps arrive as smp-*.zip files. Two ways to install:
The easy way (from the PC, tablet on the dock):
venv/Scripts/python.exe scripts/reset_tablet.py install map2
This pushes nothing new — the zips are already in the tablet's Downloads — it drives the
installer for every map2/describe2 pack, then re-pins. Swap map2 for any map number.
(The zips themselves are made with node apps/sentence-builder/scripts/export-pack.ts
<packId> and pushed to the tablet's Downloads folder.)
The on-device way: the system file picker cannot open while pinned, so first unpin (recipe 9), then adult gate → Install pack from file… → pick the zip from Downloads → watch the status line confirm "Installed: …". Re-pin when done.
Installed packs appear as new rows in the Session pack list. Installing is safe to repeat — reinstalling the same pack changes nothing.
Her builds are stored on the tablet instantly (works fully offline) and mirrored to the cloud so the dashboard can see them.
Synced N · already mirrored N · failed N · remaining N.scripts/pair_device.py on the PC.If sync fails, see recipe 10 — it's almost always the VPN.
The dashboard runs on the PC (it is not on the public internet).
pnpm --filter @alpine/dashboard devTwo tabs:
What a synced session looks like: the session log (duration, completed, abandoned), per-map
view, and the export buttons. The "Her progress" tab has the same layout plus the per-target
evidence sections.
How to read the evidence (the 30-second version): progress is measured as the support-shift — the share of builds she completes with no help rising over time — and speed past that ceiling, never as an accuracy score. "Insufficient data" labels are honest, not broken: the views refuse to imply evidence from too few builds. The dashboard reports; the SLP judges.
Pinned = locked to the app: Home and Back do nothing, notifications can't intrude, she cannot leave (and nothing can interrupt her). The tablet is normally handed over pinned.
venv/Scripts/python.exe scripts/reset_tablet.py unpinvenv/Scripts/python.exe scripts/reset_tablet.py pinThe invariant: always hand the tablet back to her pinned. The install script re-pins automatically; if you unpinned by hand, re-pin by hand.
| Symptom | First move |
|---|---|
| Sync fails / dashboard shows nothing new | Check ExpressVPN on the tablet — a dead VPN tunnel silently blocks all the app's internet. Keep it force-stopped/disconnected, then Sync now. |
| Voice sounds different | An Android TTS update replaced the pinned voice. The app auto-falls back at launch; a restart of the app usually restores the right one. |
| App won't launch / black screen | From the PC: scripts/reset_tablet.py unpin (force-stops and relaunches), then re-pin. |
| "Practice" badge won't go away | Adult gate → tap the Practice toggle off. It also auto-expires after 30 min. |
| Adult gate won't open | You're holding too briefly or off-target: hold the grey ARASAAC line itself, a full 2 seconds. |
| Dashboard says signed in but is empty | Her data may genuinely be empty (e.g. after a wipe) — check the Practice tab; if that's empty too, the sync hasn't run: recipe 6. |
| I built sentences without Practice mode ON | Stop. Tell the developer/agent which minutes were yours — the affected session can be deleted from the cloud precisely, but only if it's identified before her next session mixes in. |
Wiping test data (careful): scripts/reset_tablet.py (no arguments) does a full
reset — wipes the tablet journal and every installed pack, then reinstalls and re-pins.
Use it only before a fresh counted session, never to fix a small mistake. Deleting a single
bad session from the cloud is surgical and preferred — ask the agent.
| Thing | Place |
|---|---|
| This guide, always reachable | https://alpine-ai.dayanjan.com/guide |
| This guide (repo source) | docs/guide/PARENT_GUIDE.md (+ PARENT_GUIDE.html, shareable single file). After edits: venv/Scripts/python.exe scripts/guide/build_guide_html.py then firebase deploy --only hosting |
| The map ladder + SLP question list | docs/sentence-builder/SCENARIO_LIBRARY.md |
| What the metrics mean (normative) | docs/sentence-builder/TELEMETRY_V2_DESIGN.md |
| Tablet automation script | scripts/reset_tablet.py (install / pin / unpin) |
| Pack export | apps/sentence-builder/scripts/export-pack.ts |
| Dashboard | apps/dashboard — pnpm --filter @alpine/dashboard dev → localhost:5173 |