Editing (editing.rs, edit_bar.rs, panels/cell_editor.rs, panels/board_editor.rs): Edit mode is turned on from the partner menu or Settings. In it a tap (or a switch press, or a dwell) on a cell opens the cell editor: its words, what it says, what it does (say, add to the message, open a board, a message control), its picture (the symbol its words name, one chosen from Mulberry, OpenMoji or Bliss with search in the person's language, a photo from the camera or library kept on the device, or words only), a recording, its colour (the Fitzgerald Key's, or any) and whether it is hidden. Empty places take new words; copy, paste and remove; Boards adds, renames, resizes (at the end, where empty), deletes and chooses the home board. Every change is made on a copy and refused if any word would move (SPEC §3.1), and Undo puts the boards back. Hidden words keep their places, faded while editing, and cannot be chosen by touch, switch or dwell unless shown for now. Message banking (media.rs, bindings/media.js, panels/voice_banking.rs): the recordings were thrown away; now they are kept in IndexedDB, listed, played, renamed, deleted, and put on cells, which play them in place of the voice (and speak the words if the file is gone). Photos are kept the same way. Nothing claims a synthetic voice. Both travel in the backup and the .obz. Page sets (D5): setup's last step chooses Basic, Fitzgerald colours (12, 35 or 70 words), Core and topics, or the Medical quick board, and loads it; Settings adds another beside the person's boards (undoable) and chooses the home board, which is now kept rather than found anew on each start. The lock (D15): Off, a PIN, or hold-to-unlock (pointer only, so a held switch never unlocks); it guards Edit mode, Settings, Import / Export and Boards, and never the words. Guided Access and Setup, which did nothing, are gone from PartnerMode; the partner menu has Edit boards, Show hidden words and the lock instead. Naming and claims: 'PODD-inspired' is now 'Core and topics'; competitor price claims are out of visual_scene.rs, aphasia.rs and coach.rs; the coach no longer promises a synthesized voice. The backup (version 2) can be imported again, as can the boards-only file the app saved before. SPEC §2.1 (optional cell fields), §3.1 (editing never moves another word) and an §8 addition, all proposed; spec/board.md and motor_stability.md. Co-Authored-By: Claude Opus 5.5 <[email protected]>
2.8 KiB
AAC sub-spec — Motor stability
Normative refinement of SPEC §3. Reference: aac_core::board::Cell::{position, locked}.
A configured board's most valuable property is not its content but its geometry: the learned muscle memory of where each word lives. A user who reaches for "want" in the top-left does so without looking, often without conscious thought. Anything that moves "want" destroys that — and motor relearning for a person with a significant physical impairment can cost weeks. This sub-spec makes geometry an invariant, not a preference.
1. Positions are immutable
A cell's position MUST NOT change once assigned, for the life of the cell, except by an explicit user or editor edit to a cell whose locked flag is false. In particular, the following MUST NOT move a cell:
- prediction or frequency (
Cell::frequencyweights ranking, never placement); - context, time of day, partner, or activity (any L3+ enrichment,
cascade.md); - language switching (a code-switch is a traversal, not a re-layout —
access_model.md); - "tidying", auto-fill, or alphabetization.
2. Locked boards do not reflow
A client MUST NOT reflow, resort, auto-arrange, or re-pack the cells of a board whose cells are locked. Adding a cell to a locked board MUST place it in a free position without disturbing any existing cell.
3. Hiding is in place
Progressive disclosure — hiding advanced vocabulary while a user is still learning — MUST be done by rendering a cell visually inactive at its position, never by removing it and collapsing the grid. A word that reappears later MUST reappear in the exact position it would have occupied all along. This is why CellContent::Blank exists: it reserves geometry against a future word, and why a cell can be marked hidden (proposed, SPEC §2.1, §3.1): the word stays where it is, not selectable, until it is shown again.
Editing follows the same rule (SPEC §3.1): an edit changes one cell in its place; a new cell goes only into a free position, a removed one leaves its position free, and a grid grows or shrinks only at its end, where it is empty.
4. Determinism across clients
Two openings of the same board — on the same client, on a different conforming client, before and after an interchange round-trip (§7–§8) — MUST present identical cell positions. Position assignment during ingest of a positionless source MUST be deterministic (row-major fill) and then fixed (see interchange.md).
5. Conformance
An implementation that violates §1–§4 is non-conformant regardless of any other quality. Motor stability is checked by opening a vector board, applying a frequency/prediction update, re-serializing, and asserting position-set equality against the input.