open-standards/aac
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science fcc6cd3cfe clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves
These are the only lints clippy 1.99.1 reports that clippy 1.98.0 does not.
Every cargo root in the tree was compared on both toolchains (the evidence is
in the next commit). 1.98.0's clippy also builds every target of the fixed
code, and reports nothing it did not report before, so this commit stands
under either pin.

What changed, and why

- clippy::assert_is_empty is new in 1.99. 36 sites, all in test code
  (#[cfg(test)] modules; no lib or bin build reports any):
  aac-core and access-core, 23 sites; openpay's op-crypto-extra, op-emv,
  op-iso20022, op-reconciliation, op-routing, op-screening, op-settlement
  and op-tax, 13 sites. `assert!(x.is_empty())` becomes
  `assert_eq!(x, [] as [T; 0])`, `assert_ne!` for the negation, or `""` for
  strings, so a failure prints the value instead of only "false". aac-core and
  access-core are `#![deny(warnings)]` and `#![deny(clippy::all)]`, so without
  this their clippy run fails on 1.99.1.
  Judgment call: at 18 of the 36 sites, clippy's own "MachineApplicable"
  suggestion does not compile. It names local types by crate-relative path
  (`finder::Found`, which is not in scope in a test module), or offers a bare
  `[]` whose element type cannot be inferred. So each site names its element
  type as its own module sees it (`[] as [Found; 0]`, `[] as [f64; 0]`). The
  four lines rustfmt would wrap are wrapped the way rustfmt wraps them.

- clippy::approx_constant (deny-by-default) now knows EULER_GAMMA and
  GOLDEN_RATIO. Both are in std::f{32,64}::consts and stable since 1.94; the
  jouleclaw workspace MSRV is 1.97.
  - jouleclaw-omni, inference/architecture/mochi.rs: `1.618_034` becomes
    `std::f32::consts::GOLDEN_RATIO`. They are the same f32
    (1.61803400516510009765625), so the latents do not change. This file is
    in standards-build.yml's macOS gate (`cargo clippy -p jouleclaw-omni
    --features metal -- -D warnings`), which fails on 1.99.1 without the fix.
  - jouleclaw-outlier, c_factor: `0.5772156649` becomes
    `std::f64::consts::EULER_GAMMA`. Judgment call: the literal was
    truncated, so c(n) moves by 3.1e-12. The normalisation in the
    isolation-forest paper uses the Euler-Mascheroni constant itself, so this
    is the intended value. No other crate and no committed vector reads these
    scores, and the crate's tests pass unchanged.

- smart-byte-rs/Cargo.lock: async-trait 0.1.89 becomes 0.1.92, which adds
  syn 3.0.9 as its dependency. 0.1.89 put `#[must_use]` on every trait method
  it generates. clippy 1.99 now counts the returned `Pin<Box<dyn Future>>` as
  must_use already, so clippy::double_must_use fired at 9 #[async_trait] trait
  methods. The attribute there is the macro's, not ours, so the right fix is
  the macro: 0.1.92 no longer emits it, and every other lockfile in this tree
  already uses 0.1.92. A narrow `cargo update -p async-trait --precise 0.1.92`
  also moved data-encoding-macro-internal (which accepts syn >=1, <3) from syn
  2 to syn 1. That was put back to syn 2.0.117, as on main, so the lock
  changes only what the bump needs. `cargo update --workspace --locked` and
  scripts/check-lockfiles.sh accept it.

Left as they are

- openpay op-dispute-evidence evidence.rs:92 (clippy::double_must_use) is
  reported on 1.98.0 too. Only the message's wording changed in 1.99.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 22:04:23 -04:00
..
aac-rs clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-10-25 22:04:23 -04:00
conformance/v1 feat(access-core, aac-core): Bayesian selection that never moves a cell, and prediction in 43 languages 2026-09-29 11:28:26 -04:00
spec WIP: merge main (access stack, editing) into aac/keyboard: conflicts resolved, port to follow 2026-10-05 11:40:51 -04:00
vocab spec(aac): 0.2.0 — language honesty, and timing that belongs to the person 2026-09-28 16:26:17 -04:00
LICENSE Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
LICENSE-SPEC Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
README.md aac symbols: ARASAAC and Sclera as optional non-commercial sets 2026-10-11 05:20:33 -04:00
SPEC.md Merge aac/word-finding into aac/integ-1015 2026-10-15 12:46:11 -04:00

AAC

A carrier for voice. A communication board is a signed, portable file — every symbol, every language, every access method — that speaks on any device, offline, owned by no one.

AAC is the communication cargo class of the Transaction Science substrate. Where Smart Byte carries value, EOC carries compute, Map carries place, and Joule Code carries coding work, AAC carries utterance — what a non-speaking person means to say — as a content-addressed, portable board with its access model and its energy cost intrinsic.

Augmentative and alternative communication is the assistive technology that gives a voice to people who cannot rely on speech: children and adults with autism, cerebral palsy, ALS, stroke, apraxia, Rett syndrome, and many other conditions. A board is a grid (or a visual scene, or a keyboard) of cells; selecting cells composes an utterance; the device speaks it. The selecting can be done by touch, by a single switch scanned across the grid, by where the eyes rest, by a head pointer, by a joystick — whatever motor channel a person has.

A board in this standard is not an app's private save file and not a vendor API response. It carries exactly what a voice needs to survive moving between devices: identity (a content address over its canonical serialization), a layout (cells placed once and locked, so muscle memory is never invalidated), symbols (referenced by source and stable id, not baked-in pixels), an access model (the method, timing, and calibration the user relies on), language (a graph edge, so a bilingual user code-switches by traversal), and a two-part joule cost on every operation — for transparency, never billing. Communication resolves through an explicit energy-tiered cascade: the overwhelming majority of utterances are cache hits and on-device lookups that never touch a network, and richer help (context-aware prediction, sentence construction, voice cloning) is reached only when something cheaper cannot close the request.

The substrate is intentionally ownerless: no protocol-level token, permissive licensing on the spec text and reference code, and conformance vectors so any implementer can verify canonicity without a trust relationship with the authors. A conforming client opens a board, renders it, drives it with the user's access method, predicts on-device, and speaks — against local storage, with no contact with any company's servers as a condition of operation. Transaction Science is one steward: it publishes the spec, ships the reference implementation, and operates optional commercial services (hosted symbol libraries, voice banking, team coordination) around the substrate — not its proprietor. The symbols the reference app ships are never among the things charged for: Mulberry Symbols, the default set, may be used in a paid product only if the symbols themselves, and any symbols derived from them, stay free of cost and freely available to all, so only added value such as hosting or curation can be charged for (see aac-rs/crates/aac-web/public/symbols/LICENSES.md). Two optional sets, ARASAAC and Sclera, are licensed for non-commercial use only: a deployment that is free and shows no adverts may offer them, and they are never part of a paid product, plan or hosted library (aac-rs/tools/symbols/README.md, "Non-commercial sets").

The doctrine

A voice is a file, not a subscription. The durable layer of a communication system is not the app and not a recurring charge — a person's ability to speak must not lapse when a payment does. It is the portable, self-describing board that renders and speaks forever from dumb storage, on any device the user already owns.

Seven principles, normative in SPEC.md:

  1. Free forever. No billing, no tiers, no balance, no in-app purchase. Every cascade level is free at the protocol layer. A conforming implementation never gates communication behind payment.
  2. Offline first. Levels L0–L2 — cache, symbol lookup, local prediction — run entirely on-device and carry 95%+ of communication. A network drop never silences a user.
  3. Motor stability, and timing that belongs to the person. Timing is set by the person; a client may propose a change from their own responses but never changes it silently (SPEC §5.1). Cells are placed once and locked. Symbols do not move; layouts do not reflow. The user's motor plan is sacred — a board that rearranges itself has destroyed the thing that made it usable.
  4. Every access method. Touch, switch scanning (1- and 2-switch, row-column, group, linear), dwell/eye-gaze, head tracking, joystick, partial voice. No method is an afterthought; each is a first-class input in the same model.
  5. Multilingual, honestly. Multilingual is a graph edge, not a separate app. Code-switching is traversal. RTL, CJK, Indic, and Arabic scripts are first-class. Every language says how its core vocabulary was obtained: the reference ships 45, with English studied with English speakers and the other 44 labelled as glosses until their speakers validate their own (SPEC §4.1).
  6. Open interchange. A board exports to and ingests from the open interchange format. A user brings their existing boards in and takes everything with them when they leave. No lock-in — ever.
  7. The receipt. Every operation reports a two-part energy cost in microjoules with an honest provenance tag. The cost is shown for transparency and is never converted into a charge.

The cascade

AAC's organizing primitive is the energy-tiered cascade — ten levels, each an order of magnitude costlier than the last, each reached only when nothing cheaper closes the request:

Level Name Typical op Energy Offline
L0 Cache hit recently-used phrase, pinned message, motor-planned sequence ~1 µJ ✅
L1 Symbol lookup core vocabulary retrieval, symbol-set search ~10 µJ ✅
L2 Local prediction on-device word/phrase n-gram completion ~100 µJ ✅
L3 Context prediction time / place / partner / activity-aware prediction ~1 mJ —
L4 Semantic expansion novel sentence construction from partial input ~10 mJ —
L5 Conversation AI conversation repair, social scripts, pragmatics ~100 mJ —
L6 Generative communication letters, posts, longer narratives ~1 J —
L7 Voice clone personal-voice synthesis from recordings ~5 J —
L8 Multimodal generation custom symbol / visual-scene synthesis ~10 J —
L9 Adaptive model retrain the user's prediction model ~15 J —

The boundary at L2/L3 is normative: exactly L0–L2 are offline-capable, and a conforming client serves them with no network. Everything above is enrichment, never a dependency.

Open interchange

A user's years of customization — added words, custom symbols, personal phrases, the exact layout their muscle memory has learned — are the most valuable and least portable thing in assistive technology. AAC makes interchange a property of the standard: a board serializes to a canonical, self-describing form, and the reference engine ingests the open board interchange format and other community exports so a user never starts over when moving in, and never loses anything when moving on. Ingestion is one-directional and additive — the standard reads existing work into the substrate; it does not compete with the tools that produced it.

Contents

  • SPEC.md — the normative specification (RFC 2119): the board / cell / symbol data model, the access-method abstraction, canonical serialization, the cascade and its offline invariant, the interchange format, and the receipt.
  • spec/ — sub-specifications: the board data model, the motor-stability invariant, the access model, the communication cascade, interchange, and the receipt, and keyboards and alphabet access (proposed).
  • vocab/ — the controlled vocabulary (LEXICON.md) and stable IRIs: the OWL ontology (v1.ttl), the JSON-LD 1.1 context (v1.jsonld), and SHACL shapes (v1.shapes.ttl). Namespace https://aac.transaction.science/vocab/v1#.
  • conformance/ — published vectors. An implementation is conformant if it reproduces them.
  • aac-rs/ — the Rust reference: aac-core (the engine — boards, symbols, vocabulary, motor planning, scanning, dwell, prediction, i18n, interchange), aac-web (a reference communication app built on Leptos), and aac-conformance (the harness).

Reference implementation and demonstrator

The Rust reference lives in aac-rs/. aac-core is the engine a third party implements against — platform-agnostic, dependency-light, no UI. The demonstrator is aac.transaction.science: a free communication app (Rust → WASM, offline-first PWA) that consumes aac-core and renders grid boards, switch scanning, dwell selection, gamepad and eye-tracking input, on-device prediction, and system / banked-voice speech. The demonstrator is a demonstration of the standard — free forever, every access method — not a product to be sold.

Status

v0.2.0 draft — adds language honesty (SPEC §4.1) and person-owned timing with a scan-rate floor and two-way dwell proposals (§5.1–§5.3), each with a conformance suite (C5–C7); see the changelog at the end of SPEC.md. The demonstrator can also be served under another site's path and name — see aac-rs/README.md. Reference engine ported and building: aac-core (22 modules — boards, symbols, vocabulary, motor planning, switch scanning, dwell, prediction, context, history, multilingual, accessibility, partner tools, analytics, the cascade router, the store, interchange import/export), aac-web (the Leptos reference app), and the aac-conformance harness (cascade routing, energy monotonicity, the offline invariant, wire round-trips, the scan-rate floor, dwell proposals, and language honesty). cargo test and cargo clippy --all-targets are green on the engine and the harness. The reference app builds end-to-end through cargo leptos build --release — both the WASM client (aac-web.wasm, ~3 MB) and the SSR server binary — and boots: it serves the app shell and the offline-first PWA assets. Specification core published in SPEC.md and spec/, with the controlled vocabulary and stable IRIs in vocab/. Not a medical device; not certified as a speech-generating device (SGD) for insurance funding (see SPEC §11).

Licence

  • Reference code (aac-rs/): Apache-2.0 — see LICENSE — except the third-party symbol material and the language pack data below.
  • Language pack data (aac-rs/data/lang/, served by the app as public/lang/): CC BY-SA 4.0 or CC0 1.0 per pack — see aac-rs/data/lang/LICENSE.md, which lists each pack's licence and attribution. ShareAlike applies to the pack files, not to the code that loads them.
  • Specification text (SPEC.md, spec/, vocab/): CC-BY-4.0 — see LICENSE-SPEC.
  • Symbol material adapted from Mulberry Symbols, OpenMoji and Blissymbolics (BCI-AV): CC-BY-SA-4.0, with each set's attribution and conditions in aac-rs/crates/aac-web/public/symbols/LICENSES.md. This covers the sprites aac-rs/crates/aac-web/public/symbols/*.svg and aac-rs/tools/symbols/mapping-review.md (which quotes the sets' symbol names and BCI-AV glosses). The optional ARASAAC (CC BY-NC-SA 4.0) and Sclera (CC BY-NC 2.0 BE) pictograms are not in this repository: aac-rs/tools/symbols/build_nc.py builds their packs outside it, and only their mapping, hashes and attribution are here.