open-standards/aac/aac-rs
Repository files (latest commit first)
Filename Latest commit message Latest commit date
David Charlot a5152bc0c8
All checks were successful
no-vanity-metrics / Scan committed Markdown for vanity metrics (push) Successful in 4s
standards workspaces build + test / eoc-rs (push) Successful in 1m54s
standards workspaces build + test / jouleclaw-rs (push) Successful in 2m2s
standards workspaces build + test / aac-rs (push) Successful in 58s
standards workspaces build + test / jcp-rs (push) Successful in 1m20s
standards workspaces build + test / arl-rs (push) Successful in 3m21s
standards workspaces build + test / joule-code-rs (push) Successful in 42s
standards workspaces build + test / joulecontract-rs (push) Successful in 33s
standards workspaces build + test / proof-rs (push) Successful in 1m13s
standards workspaces build + test / map-rs (push) Successful in 29s
standards workspaces build + test / mesh-rs (push) Successful in 25s
standards workspaces build + test / joule-ui-rs (push) Successful in 2m28s
standards workspaces build + test / openpay (push) Successful in 1m13s
standards workspaces build + test / sandbox-rs (push) Successful in 2m8s
standards workspaces build + test / jouledesk-rs (push) Successful in 2m32s
standards workspaces build + test / smart-byte-rs (push) Successful in 2m27s
standards workspaces build + test / joulehook-rs (push) Successful in 2m15s
standards workspaces build + test / sense-rs (push) Successful in 2m36s
standards workspaces build + test / macOS energy backend (jcp-energy) (push) Successful in 2m21s
spec(aac): 0.2.0 — language honesty, and timing that belongs to the person
- §4.1 Language honesty: every language states how its core vocabulary was
  obtained (CoreStatus); an absent status reads as GlossOnly; glosses are never
  presented as a language's core. Withdraws the claim that one ~400-word core
  covers ~80% of every language.
- §5.1 Timing belongs to the person: scan rate and dwell are theirs to set;
  automatic adaptation is off unless they opt in; changes are proposed, never
  silent.
- §5.2 Scan-rate floor: max(⌊100·M/65⌋, P95), from at least 10 responses.
  The previous reference set 80% of the mean press, so the highlight had
  usually moved on when the person pressed.
- §5.3 Dwell proposals go both ways, with floors, replacing "should adapt to
  fatigue" (the old reference only ever lengthened the dwell).
- §10 adds C5–C7; §11 says access and vocabulary choices are never a
  prerequisite for starting.
- spec/access_model.md, the lexicon and the ontology agree (new CoreStatus
  class and individuals; scanRateMs, dwellMs, adaptationOptIn; Turtle, SHACL
  and JSON-LD validated with rdflib). New aac-rs/README.md covers testing,
  the static build, and hosting Express under another site.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 16:26:17 -04:00
..
crates spec(aac): 0.2.0 — language honesty, and timing that belongs to the person 2026-09-28 16:26:17 -04:00
Cargo.lock fix(access-core): a clock that works in browsers, and a scan grid that follows the board 2026-09-28 16:25:49 -04:00
Cargo.toml fix(access-core): a clock that works in browsers, and a scan grid that follows the board 2026-09-28 16:25:49 -04:00
prerender-static.sh build(aac-web): a static build that is safe to cache and opens offline 2026-09-28 16:26:03 -04:00
README.md spec(aac): 0.2.0 — language honesty, and timing that belongs to the person 2026-09-28 16:26:17 -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.

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.