open-standards/aac/aac-rs/tools/symbols/overrides.toml
Transaction Science b892888016 aac symbols: rebuild the open sets for today's vocabulary (472 -> 511 concepts)
main's index.json predated 39 words added to vocabulary.rs and the boards.
A rebuild maps 7 of them, all in Blissymbolics (and, because, but, if, or, so,
social; the open pictographic sets have no confident picture for the rest).
"so" is the vocabulary's and page sets' "therefore": an override picks
BCI-AV 17708 (therefore, so, so that) over the automatic 17705 (then, so,
later). New Bliss sprite bliss.e5601bc69bf5.svg; the page-set catalogue is
rewritten for it (catalog.py --check passes: 118 packages), and DESIGN-core's
list of words with no symbol loses those six.

The contact sheets render again (tools/symbols/review/, git-ignored): their
code sat after a raise.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 09:10:33 -04:00

296 lines
22 KiB
TOML

# Hand-curated symbol choices, one entry per concept per set.
#
# Keys are normalised concepts (see normalize_concept in build.py).
# symbol = the set's own id: Mulberry file name (without .svg), OpenMoji
# hexcode, Bliss BCI-AV id
# none = true leaves the concept unmapped in that set (the runtime falls
# back to the next set) -- used where the automatic match is wrong
# reason = why; required
#
# Where a label means different things on different boards, the sense used
# on the default boards wins, because that is the picture people see first.
# Every choice here was checked against the rendered contact sheets.
#
# Cell concepts: message-bar action cells are keyed by their action
# ("action:speakall", "action:clear") and a navigation cell whose label is a
# homograph by its navigation sense ("nav:back"), so the Back key never shows
# the body part. See cell_concept() in build.py and
# aac_core::symbols::lookup_for_cell.
#
# Locale-sensitive (to revisit when per-locale overrides exist; the app ships
# in 45 languages):
# - "come": Mulberry's palm-up beckoning finger is rude in the Philippines
# and parts of East Asia; a palm-down beckoning hand is the usual variant.
# - "good"/"bad": thumbs up/down (Mulberry and OpenMoji) is rude in parts of
# West Africa and the Middle East.
# - "nav:back": the left arrow should be mirrored in right-to-left scripts
# (Arabic, Hebrew, Persian, Urdu), where "back" points right.
# - The OK-hand gesture is never used: it is obscene or insulting in several
# regions and a flagged hate sign in some contexts.
[mulberry]
# ── Wrong automatic matches ──
"orange" = { none = true, reason = "vocabulary word is the colour; the only Mulberry 'orange' is the fruit and the set has no orange paint swatch" }
# ── People whose gender or age the word does not name (SPEC §4.3) ──
# Where Unicode has a gender-neutral person for the word (built on 🧑
# "person") or a neutral object, OpenMoji's is used instead of a gendered or
# child figure. Unicode's person may still be drawn with one hairstyle; it is
# the neutral design the international standard defines.
"doctor" = { none = true, reason = "drawn as a man (doctor_1a); OpenMoji's health worker is Unicode's gender-neutral person" }
"teacher" = { none = true, reason = "drawn as a man in a suit and tie (teacher_1a); OpenMoji's teacher is Unicode's gender-neutral person" }
"police" = { none = true, reason = "drawn as a man in a British custodian helmet (police_1a); OpenMoji's police officer is gender-neutral in Unicode and wears a cap worn worldwide" }
"eat" = { none = true, reason = "drawn as a boy eating (eat_,_to): a child for a word about no one's age; OpenMoji's plate with fork and knife is neutral" }
"drink" = { none = true, reason = "drawn as a boy drinking (drink_,_to): a child for a word about no one's age; OpenMoji's cup with straw is neutral" }
"brush" = { none = true, reason = "drawn as a boy brushing his teeth (brush_teeth_,_to); OpenMoji's toothbrush is neutral" }
"taste" = { none = true, reason = "drawn as a child tasting (taste_,_to); OpenMoji's tongue is neutral" }
"park" = { none = true, reason = "the only match is 'park_,_to' (parking a car); the board word is the place" }
"pants" = { symbol = "trousers", reason = "US 'pants' = trousers; Mulberry's 'pants' is British underpants" }
"right" = { symbol = "correct", reason = "vocabulary 'right' is the opposite of 'wrong' (correct), not the direction arrow" }
"break" = { symbol = "break_time_1", reason = "board cell speaks 'I need a break' (a rest), not breaking glass" }
"dress" = { symbol = "get_dressed_,_to", reason = "vocabulary 'dress' is the verb; the automatic match was the garment" }
"sweet" = { symbol = "sweet_2", reason = "taste adjective beside sour/salty/spicy, drawn in the same taster style; 'sweet' is a candy" }
"old" = { symbol = "old_object", reason = "board pairs 'old' with 'new' for things; old_object shows age without implying a person" }
# ── People and family ──
"mom" = { symbol = "mum_parent", reason = "set's parent symbol with the mother highlighted" }
"dad" = { symbol = "dad_parent", reason = "set's parent symbol with the father highlighted" }
"grandma" = { symbol = "grandmother", reason = "family-tree symbol with the grandmother highlighted" }
"grandpa" = { symbol = "grandfather", reason = "family-tree symbol with the grandfather highlighted" }
"aunt" = { symbol = "aunt_maternal", reason = "set only draws aunts by side of family; the relation highlight reads as 'aunt'" }
"uncle" = { symbol = "uncle_maternal", reason = "set only draws uncles by side of family; the relation highlight reads as 'uncle'" }
"therapist" = { symbol = "speech_language_therapist_1a", reason = "the therapist most AAC users see; person with a speech bubble" }
# ── Feelings ──
# The set draws each feeling as a man's face (angry_man, sad_man...). A word
# that names no gender or age gets a neutral picture (SPEC §4.3), so where
# OpenMoji has the feeling, its emoji face -- no gender, age or skin, as in
# Unicode -- is used instead, and the feelings stay one face style.
"happy" = { none = true, reason = "drawn as a man's face (happy_man); OpenMoji's grinning face is neutral" }
"sad" = { none = true, reason = "drawn as a man's face (sad_man); OpenMoji's frowning face is neutral" }
"angry" = { none = true, reason = "drawn as a man's face (angry_man); OpenMoji's angry face is neutral" }
"scared" = { none = true, reason = "drawn as a man's face (afraid_man); OpenMoji's fearful face is neutral" }
"confused" = { none = true, reason = "drawn as a man's face (confused_man); OpenMoji's confused face is neutral" }
"excited" = { none = true, reason = "drawn as a man's face (excited_man); OpenMoji's star-struck face is neutral" }
"worried" = { none = true, reason = "drawn as a man's face (worried_man); OpenMoji's worried face is neutral" }
"surprised" = { none = true, reason = "drawn as a man's face (surprised_man); OpenMoji's open-mouthed face is neutral" }
"jealous" = { symbol = "jealous_man", reason = "set's 'jealous' face; no set has a neutral one (a man's face, drawn in the chosen skin tone)" }
"funny" = { none = true, reason = "drawn as a man's laughing face (funny_laugh); OpenMoji's face with tears of joy is neutral" }
"tired" = { none = true, reason = "drawn as a man yawning (yawn_,_to); OpenMoji's yawning face is neutral" }
"think" = { none = true, reason = "drawn as a man's face (think_,_to); OpenMoji's thinking face is neutral" }
"hot" = { none = true, reason = "drawn as a man's face (hot_person); OpenMoji's hot face is neutral" }
"quiet" = { none = true, reason = "drawn as a man (quiet); OpenMoji's shushing face is neutral" }
"itchy" = { symbol = "itch", reason = "person scratching an itch" }
"delicious" = { none = true, reason = "drawn as a boy tasting (delicious_food): a child for a word about no one's age; OpenMoji's face savouring food is neutral" }
"slow" = { symbol = "snail", reason = "snail is the conventional AAC picture for slow; pairs with the set's running 'fast'" }
"big" = { symbol = "large", reason = "set's size symbol, drawn in the same style as the automatic 'little'" }
"clean" = { symbol = "clean_room", reason = "sparkling room shows the adjective (board 'Describing'), not a cleaning action" }
# ── Social words ──
"hi" = { none = true, reason = "drawn as a man waving (hello); OpenMoji's waving hand takes the chosen skin tone and no gender" }
"yes" = { symbol = "correct", reason = "tick mark; pairs with the set's cross for 'no'" }
"no" = { symbol = "mistake_no_wrong", reason = "the set's own 'no/wrong' cross" }
"wrong" = { symbol = "mistake_no_wrong", reason = "the set's own 'no/wrong' cross" }
"all done" = { symbol = "finish", reason = "the set's 'finish' symbol" }
"done" = { symbol = "finish", reason = "the set's 'finish' symbol" }
# ── Places ──
"home" = { symbol = "house", reason = "house is the set's picture for home" }
"bathroom" = { symbol = "toilet", reason = "board speaks 'I need the bathroom' (US: the toilet)" }
"store" = { symbol = "shop", reason = "US 'store' = the set's 'shop'" }
"restaurant" = { symbol = "cafe", reason = "waiter serving a seated diner; the set has no separate restaurant" }
"hospital" = { symbol = "surgery_health_centre", reason = "medical building with first-aid sign; the set has no separate hospital" }
"playground" = { symbol = "slide", reason = "the set's playground category symbol; slide is the conventional playground picture" }
"office" = { symbol = "office_block", reason = "office building" }
"class" = { symbol = "class_room", reason = "classroom with pupils at desks" }
"recess" = { symbol = "break_time_2", reason = "school break time (see-saw and clock) = US recess" }
"next to" = { symbol = "beside_next_to", reason = "the set's beside/next-to position symbol, same style as its other prepositions" }
"mountain" = { symbol = "mountains", reason = "plural drawing of the same thing" }
# ── Things ──
"bed" = { symbol = "single_bed", reason = "plain bed" }
"toy" = { symbol = "toys", reason = "the set's toys symbol" }
"phone" = { symbol = "mobile_phone", reason = "the phone people carry" }
"tv" = { symbol = "flatscreen_tv", reason = "television" }
"juice" = { symbol = "orange_juice", reason = "glass of juice with its fruit; the set has no generic juice" }
"cookie" = { symbol = "biscuit_chocolate_chip", reason = "US cookie = chocolate-chip biscuit" }
"emergency" = { symbol = "ambulance", reason = "board speaks 'This is an emergency'; ambulance is the conventional picture" }
"hat" = { symbol = "hat_-_mans", reason = "plain brimmed hat" }
"shoe" = { symbol = "shoe_-_mans", reason = "plain shoe" }
"shoes" = { symbol = "shoe_-_mans", reason = "plain shoe" }
"diaper" = { symbol = "nappy", reason = "US diaper = British nappy" }
"color" = { symbol = "colour", reason = "US spelling of the set's 'colour'" }
"time" = { symbol = "clock", reason = "clock" }
"party" = { symbol = "party_celebration", reason = "cake, present and balloon" }
"birthday" = { symbol = "birthday_cake", reason = "birthday cake with candles" }
"verbs" = { symbol = "verbs_collective", reason = "the set's own collective symbol for verbs (navigation cell)" }
"actions" = { symbol = "verbs_collective", reason = "the 'Actions' navigation cell opens the board of action words; same collective symbol as 'Verbs'" }
"nav:back" = { symbol = "left", reason = "Back navigation cell: plain left arrow; the label 'back' alone is the body part (mirror in RTL scripts)" }
# ── Actions ──
"action:speakall" = { none = true, reason = "drawn as a boy talking (talk_1_,_to); OpenMoji's speaking head is a silhouette with no gender, age or skin" }
"listen" = { symbol = "hear_,_to", reason = "hand cupped to ear, the conventional 'listen'" }
"call" = { symbol = "telephone_2_,_to", reason = "person making a phone call" }
"sleep" = { symbol = "sleep_male_,_to", reason = "person asleep" }
"wash" = { symbol = "wash_hands_,_to", reason = "washing hands, the everyday 'wash'" }
"climb" = { symbol = "climb_up_,_to", reason = "person climbing" }
"start" = { symbol = "begin_start", reason = "the set's begin/start symbol" }
"ride" = { symbol = "ride_car_,_to", reason = "riding in a car" }
"show" = { symbol = "show_me_,_to", reason = "person showing another something" }
[openmoji]
# ── Wrong automatic matches (CLDR names that mean something else) ──
"close" = { none = true, reason = "annotation 'close' is the UI close cross, not closing something" }
"dizzy" = { symbol = "1F635-200D-1F4AB", reason = "CLDR 'dizzy' is a shooting star; face with spiral eyes is the feeling" }
"hold" = { none = true, reason = "annotation 'hold' is a touch-and-hold UI gesture" }
"move" = { none = true, reason = "annotation 'move' is a UI move icon" }
"share" = { none = true, reason = "annotation 'share' is the UI share icon, not sharing with people" }
"watch" = { none = true, reason = "vocabulary 'watch' is the verb; the emoji is a wristwatch" }
"dress" = { none = true, reason = "vocabulary 'dress' is the verb; the emoji is the garment" }
"chicken" = { symbol = "1F357", reason = "board 'chicken' is food: poultry leg, not the live bird" }
# ── Neutral pictures for words that name no gender or age (SPEC §4.3) ──
"eat" = { symbol = "1F37D", reason = "plate with fork and knife: eating, with no person to give an age or gender" }
"brush" = { symbol = "1FAA5", reason = "toothbrush (the vocabulary 'brush' is brushing teeth)" }
"taste" = { symbol = "1F445", reason = "tongue" }
# ── Feelings ──
"happy" = { symbol = "1F600", reason = "grinning face" }
"excited" = { symbol = "1F929", reason = "star-struck face: excitement, distinct from the grinning 'happy'" }
"funny" = { symbol = "1F602", reason = "face with tears of joy: laughing at something funny" }
"think" = { symbol = "1F914", reason = "thinking face" }
"delicious" = { symbol = "1F60B", reason = "face savouring food" }
"sad" = { symbol = "2639", reason = "frowning face" }
"angry" = { symbol = "1F620", reason = "angry face" }
"scared" = { symbol = "1F628", reason = "fearful face" }
"confused" = { symbol = "1F615", reason = "confused face" }
"worried" = { symbol = "1F61F", reason = "worried face" }
"surprised" = { symbol = "1F62E", reason = "face with open mouth" }
"tired" = { symbol = "1F971", reason = "yawning face, like Mulberry's yawn; the 'tired face' looks almost the same as the persevering face used for pain on the same boards" }
"sick" = { symbol = "1F912", reason = "face with thermometer" }
"silly" = { symbol = "1F92A", reason = "zany face" }
"nauseous" = { symbol = "1F922", reason = "nauseated face" }
"hurting" = { symbol = "1F623", reason = "persevering face: pain without pointing at a body part (the head-bandage face reads as a head injury)" }
"pain" = { symbol = "1F623", reason = "persevering face: on the medical board beside head/back/stomach the head-bandage face would say 'my head hurts'" }
"cold" = { symbol = "1F976", reason = "cold face (board: 'I'm cold')" }
"hot" = { symbol = "1F975", reason = "hot face (board: 'I'm hot')" }
"quiet" = { symbol = "1F92B", reason = "shushing face" }
"loud" = { symbol = "1F4E2", reason = "loudspeaker" }
"good" = { symbol = "1F44D", reason = "thumbs up" }
"bad" = { symbol = "1F44E", reason = "thumbs down" }
"love" = { symbol = "2764", reason = "red heart" }
"i love you" = { symbol = "2764", reason = "red heart, as for 'love'; the ASL love-you handshape is opaque to non-signers and looks like the insulting 'horns' at tile size" }
# ── Social ──
"hi" = { symbol = "1F44B", reason = "waving hand" }
"bye" = { none = true, reason = "the only candidate is the waving hand already used for 'hi'; falls back to Bliss 'goodbye' so hi and bye differ" }
"yes" = { symbol = "2705", reason = "check mark" }
"no" = { symbol = "274C", reason = "cross mark" }
"ok" = { symbol = "1F642", reason = "slightly smiling face (board: 'I'm OK'), in the face style of the other feelings; the OK hand is an insult or hate sign in many regions" }
"okay" = { symbol = "1F642", reason = "slightly smiling face, as for 'ok'; never the OK hand" }
"stop" = { symbol = "270B", reason = "raised hand, the conventional AAC 'stop'; the stop sign has the English word STOP baked in" }
"i don't know" = { symbol = "1F937", reason = "person shrugging, the standard AAC picture for 'I don't know' (medical YES / NO / I DON'T KNOW row)" }
"questions" = { symbol = "2753", reason = "question mark, as for 'question' (navigation cell to the question words)" }
"nav:back" = { symbol = "2B05", reason = "Back navigation cell: left arrow (not the BACK-lettered arrow; mirror in RTL scripts)" }
"question" = { symbol = "2753", reason = "question mark" }
"action:speakall" = { symbol = "1F5E3", reason = "speaking head (Speak action cell)" }
# ── People ──
"grandma" = { symbol = "1F475", reason = "old woman" }
"grandpa" = { symbol = "1F474", reason = "old man" }
"doctor" = { symbol = "1F9D1-200D-2695-FE0F", reason = "health worker" }
"friend" = { symbol = "1F9D1-200D-1F91D-200D-1F9D1", reason = "people holding hands" }
"police" = { symbol = "1F46E", reason = "police officer" }
"hug" = { symbol = "1FAC2", reason = "people hugging" }
# ── Places ──
"bathroom" = { symbol = "1F6BD", reason = "toilet (board: 'I need the bathroom')" }
"home" = { symbol = "1F3E0", reason = "house" }
"beach" = { symbol = "1F3D6", reason = "beach with umbrella" }
"park" = { symbol = "1F3DE", reason = "national park landscape" }
"playground" = { symbol = "1F6DD", reason = "playground slide" }
"store" = { symbol = "1F3EA", reason = "convenience store" }
"office" = { symbol = "1F3E2", reason = "office building" }
"emergency" = { symbol = "1F6A8", reason = "emergency light" }
"medical" = { symbol = "2695", reason = "medical symbol (navigation cell)" }
# ── Food and drink ──
"apple" = { symbol = "1F34E", reason = "red apple" }
"cheese" = { symbol = "1F9C0", reason = "cheese wedge" }
"rice" = { symbol = "1F35A", reason = "cooked rice" }
"milk" = { symbol = "1F95B", reason = "glass of milk" }
"juice" = { symbol = "1F9C3", reason = "juice box" }
"water" = { symbol = "1F4A7", reason = "droplet" }
"drink" = { symbol = "1F964", reason = "cup with straw" }
"food" = { symbol = "1F37D", reason = "plate with fork and knife" }
"medicine" = { symbol = "1F48A", reason = "pill" }
"birthday" = { symbol = "1F382", reason = "birthday cake" }
"party" = { symbol = "1F389", reason = "party popper" }
# ── Things ──
"ball" = { symbol = "26BD", reason = "ball (soccer ball)" }
"book" = { symbol = "1F4D5", reason = "closed book" }
"car" = { symbol = "1F697", reason = "automobile" }
"computer" = { symbol = "1F4BB", reason = "laptop" }
"game" = { symbol = "1F3B2", reason = "game die" }
"movie" = { symbol = "1F3AC", reason = "clapper board" }
"music" = { symbol = "1F3B5", reason = "musical note" }
"phone" = { symbol = "1F4F1", reason = "mobile phone" }
"toy" = { symbol = "1F9F8", reason = "teddy bear" }
"tv" = { symbol = "1F4FA", reason = "television" }
"paper" = { symbol = "1F4C4", reason = "sheet of paper" }
"shirt" = { symbol = "1F455", reason = "t-shirt" }
"pants" = { symbol = "1F456", reason = "jeans (US pants)" }
"teeth" = { symbol = "1F9B7", reason = "tooth" }
"wheelchair" = { symbol = "1F9BD", reason = "manual wheelchair" }
"breathing" = { symbol = "1FAC1", reason = "lungs (board: 'I can't breathe well')" }
# ── Actions and weather ──
"walk" = { symbol = "1F6B6", reason = "person walking" }
"run" = { symbol = "1F3C3", reason = "person running" }
"swim" = { symbol = "1F3CA", reason = "person swimming" }
"write" = { symbol = "270D", reason = "writing hand" }
"sleep" = { symbol = "1F634", reason = "sleeping face" }
"rain" = { symbol = "1F327", reason = "cloud with rain" }
"snow" = { symbol = "2744", reason = "snowflake" }
"tree" = { symbol = "1F333", reason = "deciduous tree" }
[bliss]
# ── Wrong automatic matches (a BCI-AV gloss with another sense) ──
"fast" = { symbol = "16446", reason = "quick/fast; the automatic match was 'fast, go without food'" }
"fit" = { none = true, reason = "only match is an epileptic fit; the vocabulary verb is 'to fit'" }
"so" = { symbol = "17708", reason = "so (therefore), the vocabulary's and page sets' sense; the automatic match was 'then, so, later'" }
"hot" = { symbol = "14900", reason = "hot (temperature); the automatic match was 'hot, spicy'" }
"light" = { symbol = "25336", reason = "vocabulary 'light' pairs with 'heavy' (weight)" }
"just" = { symbol = "12363", reason = "'just' as in only; the automatic match was 'just, fair'" }
"sweet" = { symbol = "17478", reason = "sweet (taste) beside sour/salty/spicy; the automatic match was 'sweet, confection'" }
"orange" = { symbol = "15931", reason = "the colour (BCI form, like the other colours); the automatic match was the fruit" }
"right" = { symbol = "13416", reason = "vocabulary 'right' is the opposite of 'wrong' (correct)" }
"wrong" = { symbol = "14935", reason = "incorrect/wrong, the opposite of 'right'" }
"old" = { symbol = "15915", reason = "old (opposite of new), paired with 'new' on the Describing board" }
"who" = { symbol = "18244", reason = "question 'who'; the automatic match was the relative pronoun" }
"they" = { symbol = "17713", reason = "they (persons); the automatic match was the indefinite form" }
"you" = { symbol = "18465", reason = "you (general); the automatic match was the plural form" }
"your" = { symbol = "18473", reason = "your (singular); the set has no unmarked form" }
"hold" = { symbol = "23532", reason = "hold (with hand); the automatic match was 'hold, contain'" }
"for" = { symbol = "14382", reason = "for (purpose), the general 'for'; the automatic match was 'in exchange for'" }
# ── Board senses ──
"break" = { symbol = "16497", reason = "board cell speaks 'I need a break' (rest period), not 'to break'" }
"recess" = { symbol = "16497", reason = "US recess = rest period at school" }
"chicken" = { symbol = "13165", reason = "board 'chicken' is food, not the bird" }
"dinner" = { symbol = "17468", reason = "US dinner = the evening meal (supper, dinner); the automatic match was 'lunch, dinner'" }
"hurting" = { symbol = "14913", reason = "hurt, pain (feel), suffer: the feeling, not an injury" }
"nav:back" = { symbol = "12613", reason = "Back navigation cell: backward, back (direction); plain 'back' is back (body)" }
# ── Navigation cells naming a board ──
"questions" = { symbol = "16445", reason = "question (navigation cell to the question words)" }
"feelings" = { symbol = "14164", reason = "feeling, emotion (navigation cell to the feelings board)" }
"places" = { symbol = "16193", reason = "place, area, location (navigation cell to the places board)" }
# ── Missing automatic matches ──
"hi" = { symbol = "14702", reason = "hello, greetings" }
"bye" = { symbol = "14454", reason = "goodbye, farewell" }
"phone" = { symbol = "17518", reason = "telephone" }
"tv" = { symbol = "17519", reason = "television" }
"shoes" = { symbol = "16959", reason = "shoe" }