open-standards/aac/aac-rs
Repository files (latest commit first)
Filename Latest commit message Latest commit date
David Charlot 560c3e58fa aac, sandbox: five citations named sections their SPECs do not have
Code cites normative text to say which rule it enforces. These five cited
sections that do not exist, so the citation read as authority it did not have.
None of the rules was missing — every one is written down, just not where the
code said:

  aac §3.3 (3 sites)  the rule is §3 item 3 ("rendering its cell as visually
                      inactive **in place**") and §3.1 item 3 ("MUST keep its
                      position and MUST be rendered as visually inactive and
                      not selectable"). aac/SPEC.md has §3 and §3.1 and no
                      §3.2 or §3.3, and the SPEC's own cross-references
                      already use the form this commit adopts — line 54 reads
                      "(§3 item 3, §3.1)".

  sandbox §6.5        the receipt's storage line is `spec/receipts.md`:
                      "Storage activity is its own line … it does **not** enter
                      the per-device-class energy sum of §6.2". §6 has 6.1-6.4.

  sandbox §12.1       the deterministic-first cascade is `spec/build.md`, under
                      "## Deterministic-first (the cascade)". §12 exists and
                      records the tier in the build receipt, but has no
                      subsections.

So each citation now points where the rule actually is. Sections of a
`spec/*.md` subfile are not sections of `SPEC.md`, and are cited by file name.

Found by checking every `SPEC §N` in the tree against the headings of the
SPEC.md beside it — 1454 citations across 15 standards, and these five were
the only ones that did not resolve. The commit after this one makes that a
check, because all three were written long before anyone read them. The same
family as #190, where `jcp-runtime` cited `SPEC §4.10` in six places and
§4.10 did not exist.

Both workspaces check clean with `--all-targets`.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-13 03:06:10 -04:00
..
crates aac, sandbox: five citations named sections their SPECs do not have 2026-10-13 03:06:10 -04:00
data feat(aac): words for the app's own boards in 44 languages, by two readers 2026-10-08 09:07:42 -04:00
third_party Merge origin/main into aac/voice-quality: bar scanning, First letters, the hotfix 2026-10-04 20:15:01 -04:00
tools feat(aac): words for the app's own boards in 44 languages, by two readers 2026-10-08 09:07:42 -04:00
Cargo.lock
Cargo.toml
prerender-static.sh feat(aac-web): an on-screen keyboard every access method reaches, the alphabet by ear, phrases 2026-10-04 21:51:52 -04:00
README.md Merge origin/main into aac/voice-quality: bar scanning, First letters, the hotfix 2026-10-04 20:15:01 -04:00

aac-rs — the AAC reference implementation

Rust reference for the AAC open standard. Apache-2.0.

Crate What it is
access-core The shared access kernel: access methods, switch scanning with its response calibration (SPEC §5.2), dwell with two-way proposals (§5.3), gaze estimation, voice. Four dependencies (serde, serde_json, thiserror, web-time).
aac-core The engine: boards, symbols, vocabulary, motor planning, prediction, i18n with each language's core status (§4.1), the cascade, interchange.
aac-web Express, the reference communication app (Leptos → WASM, offline-first PWA). Live at aac.transaction.science.
aac-conformance The harness: C1–C7 against the published vectors in ../conformance/v1/.

Test and conform

cargo test --workspace
cargo run -p aac-conformance --bin aac-conformance     # C1–C7; any FAIL exits non-zero
cargo run -p aac-conformance --bin gen-vectors -- ../conformance/v1   # regenerate C5/C6 vectors

Build the app as a static site

bash prerender-static.sh        # → target/site/, ready to rsync; deploy with no_cache_bust

The script builds with the wasm-bindgen CLI version the crate pins (installing a private copy if the machine's differs), prerenders the SSR shell, content-hashes pkg/, and writes a service worker that precaches the shell and every file it loads, so the installed app opens with no network.

Four optional downloads ship beside the app, each built outside git and checked against a catalogue committed here. Each is offered to the person, never fetched by itself, and runs on their device:

  • Natural voices (tools/voices/): neural text-to-speech, offered first for the person's language (in setup, and when the language changes). Of the device's own voices the best speaks (premium, enhanced, then basic), the one the person chose while the device has it, and robotic or novelty voices only when nothing else speaks the language; online voices never (access-core voice.rs, aac-web voices.rs; device-voice facts from Readium Speech, third_party/readium-speech/).
  • The sentence helper (tools/ai/): an on-device language model that turns a few chosen words into whole sentences, and suggests replies. It runs on the graphics chip only, and only in the languages it was tested in.
  • Hearing your partner (tools/asr/): on-device speech recognition that writes down what someone says to the person, for the sentence helper's replies. It listens only when asked, keeps and sends nothing, runs on the graphics chip only, and only in the languages with evidence it is accurate.
  • First letters (tools/ae/): abbreviation expansion. The person types only the first letter of each word (iwtgh), and a small on-device model offers whole sentences (I want to go home), fitting what their partner said. It runs on the listener's runtime, on the graphics chip only, never speaks by itself, and is offered only where we measured it (English).

Set AAC_VOICES=none, AAC_AI=none, AAC_ASR=none or AAC_AE=none to build without them.

Host it under your own site

Express reads four build-time variables (set them for both the cargo-leptos build and the prerender):

Variable Default Use
AAC_BASE_PATH "" Mount path, e.g. /app. Also set LEPTOS_SITE_PKG_DIR=app/pkg for the prerender.
AAC_SW_URL /sw.js The service worker to register (a host usually runs one for its whole site).
AAC_APP_TITLE AAC — aac.transaction.science The document title.
AAC_HIDE_ENERGY unset Set to hide the energy meter.

aac.aurasense.ai builds it this way at /app (build-app.sh).

Two rules the app keeps

  • The first frame is the same on the server and in the browser. Saved state is restored only after hydration, behind a brief starting screen. Reading it earlier made a returning user's first frame differ from the prerendered page, and hydration aborted.
  • Timing belongs to the person (SPEC §5.1). Settings → Timing sets scan speed and dwell, shows proposals from the person's own responses to accept or decline, and adjusts automatically only if they turn that on.