open-standards/aac/spec/motor_stability.md
Transaction Science be82ac7c52 feat(aac-web): Edit mode, message banking that keeps its recordings, page sets that load, an editing lock
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]>
2026-10-04 21:28:05 -04:00

2.8 KiB
Raw Permalink Blame History

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::frequency weights 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.