open-standards/aac/aac-rs/tools/pagesets/phrases/sources/emergent.yaml
Transaction Science 7c29c52054 feat(aac pagesets): four phrase page sets, built from readable sources, in English and ten languages
Our own page sets for the reference app and any Open Board Format app:

- Adult conversation (41 boards): an always-row (Back, Yes, No, I don't
  know, Wait), a 0-10 scale, pain, comfort and feelings scales, repairs,
  word finding, six scripts as one-press-per-line sequences, cards that
  explain aphasia, ALS/MND, PPA, brain injury and Parkinson's in the
  person's own voice, care, positioning and breathing requests that
  claim nothing is sent, life-story and people templates for the
  person's photos, a page for banked messages, and a staged plan for PPA
  written for partners.
- Intent first in 12, 20 and 40 cells: start pages by purpose, predictable
  branches, operational commands in one place on every page, popups that
  close after a choice, and page numbers for a printed partner book.
- Themed phrases: nine 6x3 pages of starters, words and messages.
- First switches and messages: one-message pages, sequences, press for
  fun, two and four choices, and learn-to-scan pages.

tools/pagesets/phrases/build.py validates the YAML sources (layout,
links, symbol concepts, proprietary names, medical-claim wording) and
writes the packages, a catalogue and the licence into --out DIR,
reproducibly; --check fails on a non-reproducible build or stale reports.
Packages are generated by the site build, not committed.

Every text was drafted, back-translated by a reader who never saw the
English, and judged, in up to three rounds: 10,748 of 10,750 agreed
(es fr de pt it zh ja ar hi ru), recorded per text as "agreed by two model
readers; native review pending"; the two others stay in English, marked.

A new aac-core test runs the generator, then imports every package with
the app's importer and an independent OBF validator, and checks structure,
links, symbol references, that no language moves a cell, that each cell is
in one language and says so, and that translated cells import as the
person's own words with their chosen symbols.

The design notes propose (not implemented) a sequence extension, popups,
speak-only pages, links that say words and one-target scanning, with SPEC
text, and how the chooser should offer each set.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 12:18:45 -04:00

288 lines
13 KiB
YAML

# First switches and single messages: for people beginning to communicate,
# and for first switch use. See tools/pagesets/DESIGN-emergent.md.
#
# The person's pages have no navigation cells: on a one-cell page any press
# (a touch anywhere, any switch) says the message, and a partner moves
# between pages with the app's own Back and Home. The index pages are for
# the partner.
#
# New behaviour these pages need (designed in DESIGN-emergent.md, not yet
# in the app; a client without it still speaks the cell's first message):
# seq ext_aurasense_sequence: each press says the next line
# effect ext_aurasense_effect: a short animation with the words
# speak_only (board): words are said at once and never build a message
set:
name: First switches and messages
description: >-
Pages for first communication and first switch use: one big message,
messages said one press at a time (a greeting, a joke, a song, the
day's news), press-for-fun pages, two and four choices, and pages that
teach scanning step by step.
version: 2026-10-05
license:
type: CC-BY-SA-4.0
copyright_notice_url: https://creativecommons.org/licenses/by-sa/4.0/
author_name: AuraSense Tech Corporation and the open-standards AAC contributors
source_url: https://aac.aurasense.ai/
symbols: [mulberry, openmoji]
root: index
palette:
nav: "#CFD8DC"
c1: "#FFD600"
c2: "#00B0FF"
c3: "#FF9100"
c4: "#00E676"
c5: "#E040FB"
c6: "#FF5252"
cells:
back: {label: Back, go: "@back", symbol: "nav:back", color: nav}
boards:
index:
name: First switches
description: >-
Pages for the person to use, chosen by a partner. On the person's own
pages any press says the message; use the app's Back and Home to
move between pages.
grid: [2, 3]
rows:
- [{label: "One message", go: one, color: c1}, {label: "Messages in turn", go: turns, color: c2},
{label: "Press for fun", go: fun, color: c3}]
- [{label: "Make a choice", go: choices, color: c4}, {label: "Learn to scan", go: scan, color: c5}, ~]
# ─── One message: a single big cell (any press says it) ──────────────────
one:
name: One message
grid: [3, 4]
rows:
- [$back, {label: "Hi!", go: one-hi, color: c1}, {label: "More, please!", go: one-more, color: c1},
{label: "Look at me!", go: one-look, color: c1}]
- [{label: "My turn!", go: one-turn, color: c1}, {label: "All done!", go: one-done, color: c1},
{label: "Help!", go: one-help, color: c1}, {label: "I want that!", go: one-want, color: c1}]
- [{label: "Let's go!", go: one-go, color: c1}, {label: "My own message", go: one-mine, color: c1}, ~, ~]
one-hi: {name: "Hi!", grid: [1, 1], speak_only: true, rows: [[{say: "Hi!", symbol: "hi", color: c1}]]}
one-more: {name: "More, please!", grid: [1, 1], speak_only: true, rows: [[{say: "More, please!", symbol: "more", color: c1}]]}
one-look: {name: "Look at me!", grid: [1, 1], speak_only: true, rows: [[{say: "Look at me!", symbol: "look", color: c1}]]}
one-turn: {name: "My turn!", grid: [1, 1], speak_only: true, rows: [[{say: "My turn!", color: c1}]]}
one-done: {name: "All done!", grid: [1, 1], speak_only: true, rows: [[{say: "All done!", symbol: "all done", color: c1}]]}
one-help: {name: "Help!", grid: [1, 1], speak_only: true, rows: [[{say: "Help!", symbol: "help", color: c1}]]}
one-want: {name: "I want that!", grid: [1, 1], speak_only: true, rows: [[{say: "I want that!", symbol: "want", color: c1}]]}
one-go: {name: "Let's go!", grid: [1, 1], speak_only: true, rows: [[{say: "Let's go!", symbol: "go", color: c1}]]}
one-mine:
name: My own message
grid: [1, 1]
speak_only: true
rows: [[{label: "My own message", say: "…", color: c1,
fill: {words: true, recording: true, hint: "Type or record today's message"}}]]
# ─── Messages in turn: each press says the next line ─────────────────────
turns:
name: Messages in turn
description: Each press says the next line. After the last line, the next press starts again.
grid: [3, 3]
rows:
- [$back, {label: "Good morning", go: seq-morning, color: c2}, {label: "Tell a riddle", go: seq-riddle, color: c2}]
- [{label: "Action song", go: seq-song, color: c2}, {label: "My news", go: seq-news, color: c2},
{label: "Reading together", go: seq-reading, color: c2}]
- [{label: "Playing a game", go: seq-game, color: c2}, {label: "Goodbye", go: seq-goodbye, color: c2}, ~]
seq-morning:
name: Good morning
grid: [1, 1]
speak_only: true
rows: [[{label: "Good morning", symbol: "morning", color: c2,
seq: {lines: ["Good morning!", "How is everyone today?", "Today is a good day.", "Let's get started!"],
reset_after_minutes: 60}}]]
seq-riddle:
name: Tell a riddle
grid: [1, 1]
speak_only: true
rows: [[{label: "Tell a riddle", symbol: "funny", color: c2,
seq: {lines: ["I have a riddle for you.", "What has four legs but can't walk?", "A table!", "Ha ha! Got you!"],
reset_after_minutes: 60},
note: "A riddle whose answer is the same in every language: translate it so the answer still works (an object with legs that cannot walk)."}]]
seq-song:
name: Action song
grid: [1, 1]
speak_only: true
rows: [[{label: "Action song", symbol: "sing", color: c2,
seq: {lines: ["Clap your hands!", "Stamp your feet!", "Turn around!", "Jump up high!", "Now sit down!"],
reset_after_minutes: 60}}]]
seq-news:
name: My news
description: Change these lines each day to tell the day's news, or record them in a familiar voice.
grid: [1, 1]
speak_only: true
rows: [[{label: "My news", color: c2,
fill: {words: true, recording: true, hint: "Change each line to today's news"},
seq: {lines: ["Guess what?", "I have news!", "I went somewhere.", "It was fun!", "Ask me about it!"],
reset_after_minutes: 240}}]]
seq-reading:
name: Reading together
grid: [1, 1]
speak_only: true
rows: [[{label: "Reading together", symbol: "book", color: c2,
seq: {lines: ["Let's read!", "Turn the page!", "Wow!", "What happens next?", "The end!"],
reset_after_minutes: 60}}]]
seq-game:
name: Playing a game
grid: [1, 1]
speak_only: true
rows: [[{label: "Playing a game", symbol: "game", color: c2,
seq: {lines: ["Ready?", "My turn!", "Your turn!", "Yay!", "Again!"], reset_after_minutes: 60}}]]
seq-goodbye:
name: Goodbye
grid: [1, 1]
speak_only: true
rows: [[{label: "Goodbye", color: c2,
seq: {lines: ["It's time to go.", "Thank you for today!", "See you tomorrow!", "Bye-bye!"],
reset_after_minutes: 60}}]]
# ─── Press for fun: cause and effect ─────────────────────────────────────
fun:
name: Press for fun
description: Any press makes something happen. There is no wrong press.
grid: [2, 2]
rows:
- [$back, {label: "Fun words", go: fun-words, color: c3}]
- [{label: "Animal sounds", go: fun-animals, color: c3}, {label: "Party", go: fun-party, color: c3}]
fun-words:
name: Fun words
grid: [1, 1]
speak_only: true
rows: [[{label: "Fun words", color: c3, effect: sparkle,
seq: {lines: ["Wow!", "Whee!", "Uh-oh!", "Yay!", "Boom!", "Ta-da!"], order: shuffle}}]]
fun-animals:
name: Animal sounds
grid: [1, 1]
speak_only: true
rows: [[{label: "Animal sounds", symbol: "dog", color: c3, effect: bounce,
seq: {lines: ["Moo!", "Woof!", "Meow!", "Quack!", "Baa!"]},
note: "Use the sounds these animals make in your language (cow, dog, cat, duck, sheep)."}]]
fun-party:
name: Party
grid: [1, 1]
speak_only: true
rows: [[{label: "Party", symbol: "party", color: c3, effect: confetti,
seq: {lines: ["Hooray!", "Let's party!", "Woo-hoo!", "Happy birthday!"], order: shuffle}}]]
# ─── Make a choice ───────────────────────────────────────────────────────
choices:
name: Make a choice
description: Offer the real things too, and give the person what they chose.
grid: [3, 3]
rows:
- [$back, {label: "Drink or snack", go: two-snack, color: c4}, {label: "Music or book", go: two-music, color: c4}]
- [{label: "More or all done", go: two-more, color: c4}, {label: "Yes or no", go: two-yesno, color: c4},
{label: "This one or that one", go: two-photo, color: c4}]
- [{label: "What shall we do?", go: four-do, color: c4}, {label: "Snack time", go: four-snack, color: c4},
{label: "Choose from four photos", go: four-photo, color: c4}]
two-snack:
name: Drink or snack
grid: [1, 2]
speak_only: true
rows: [[{say: "A drink, please.", symbol: "drink", color: c2}, {say: "A snack, please.", want_symbol: "snack", color: c3}]]
two-music:
name: Music or book
grid: [1, 2]
speak_only: true
rows: [[{say: "Music, please.", symbol: "music", color: c2}, {say: "A book, please.", symbol: "book", color: c3}]]
two-more:
name: More or all done
grid: [1, 2]
speak_only: true
rows: [[{say: "More!", symbol: "more", color: c4}, {say: "All done!", symbol: "all done", color: c6}]]
two-yesno:
name: Yes or no
grid: [1, 2]
speak_only: true
rows: [[{say: "Yes", symbol: "yes", color: c4}, {say: "No", symbol: "no", color: c6}]]
two-photo:
name: This one or that one
grid: [1, 2]
speak_only: true
rows: [[{say: "This one!", color: c2, fill: {photo: true, hint: "Add a photo of the first choice"}},
{say: "That one!", color: c3, fill: {photo: true, hint: "Add a photo of the second choice"}}]]
four-do:
name: What shall we do?
grid: [2, 2]
speak_only: true
rows:
- [{say: "Let's play!", symbol: "play", color: c1}, {say: "Music!", symbol: "music", color: c2}]
- [{say: "Let's read!", symbol: "book", color: c3}, {say: "Let's go outside!", symbol: "outside", color: c4}]
four-snack:
name: Snack time
grid: [2, 2]
speak_only: true
rows:
- [{say: "An apple, please.", symbol: "apple", color: c1}, {say: "A banana, please.", symbol: "banana", color: c2}]
- [{say: "A cookie, please.", symbol: "cookie", color: c3}, {say: "Some cheese, please.", symbol: "cheese", color: c4}]
four-photo:
name: Choose from four photos
grid: [2, 2]
speak_only: true
rows:
- [{say: "This one!", color: c1, fill: {photo: true, hint: "Add a photo of one choice"}},
{say: "This one!", color: c2, fill: {photo: true, hint: "Add a photo of one choice"}}]
- [{say: "This one!", color: c3, fill: {photo: true, hint: "Add a photo of one choice"}},
{say: "This one!", color: c4, fill: {photo: true, hint: "Add a photo of one choice"}}]
# ─── Learn to scan: two, then four, then a row, then two rows ────────────
scan:
name: Learn to scan
description: >-
Start with two choices, scanned one at a time, slowly, with a large
highlight. Every choice is something fun the partner does at once,
so every press is rewarded. Move on when the person waits for the
choice they want.
grid: [2, 3]
rows:
- [$back, {label: "Two choices", go: scan-2, color: c5}, {label: "Four in a row", go: scan-4, color: c5}]
- [{label: "Six in a row", go: scan-6, color: c5}, {label: "Two rows", go: scan-rows, color: c5}, ~]
scan-2:
name: Two choices
description: Scan one at a time (linear), slowly. Do what the person chose, right away.
grid: [1, 2]
speak_only: true
rows: [[{say: "Tickle me!", color: c1}, {say: "Sing a song!", symbol: "sing", color: c2}]]
scan-4:
name: Four in a row
description: Scan one at a time (linear). Keep the same order every time.
grid: [1, 4]
speak_only: true
rows: [[{say: "Tickle me!", color: c1}, {say: "Sing a song!", symbol: "sing", color: c2},
{say: "Blow bubbles!", color: c3}, {say: "Clap with me!", color: c4}]]
scan-6:
name: Six in a row
description: Scan one at a time (linear). The person waits for the one they want.
grid: [1, 6]
speak_only: true
rows: [[{say: "Tickle me!", color: c1}, {say: "Sing a song!", symbol: "sing", color: c2},
{say: "Blow bubbles!", color: c3}, {say: "Clap with me!", color: c4},
{say: "Peekaboo!", color: c5}, {say: "Do it again!", color: c6}]]
scan-rows:
name: Two rows
description: "Scan row by row (row-column): first choose the row, then the choice in it."
grid: [2, 4]
speak_only: true
rows:
- [{say: "Tickle me!", color: c1}, {say: "Sing a song!", symbol: "sing", color: c2},
{say: "Blow bubbles!", color: c3}, {say: "Clap with me!", color: c4}]
- [{say: "Peekaboo!", color: c5}, {say: "Do it again!", color: c6},
{say: "Let's read!", symbol: "book", color: c2}, {say: "All done!", symbol: "all done", color: c6}]