<!-- https://getkonjo.com/design/voice/terms · source: docs/design/voice/terms.md -->

# Terms

One name per thing, per surface, so a person moving between the app, Studio and
the site is never told two names for one thing — or one name for two things.
Route names and test IDs stay as they are; only what a person reads changes.

Decided terms point at their decision. **Open** rows are collisions this file
records but does not settle: they are Galen's call, and until then each surface
keeps its current word.

| Thing | App (staff Teach tab) | Studio | Not | Source |
|---|---|---|---|---|
| A staff member's own list of things to act on | **Follow-ups** (the app's tasks section inside it is "Assigned to you") | **Follow-ups** | To do, Your work, Inbox, My work | **Decided D-114** (Galen, 2026-10-24): one word on both surfaces; the app's "To do" became "Follow-ups" (route `MyFollowUps`, test IDs and the old `/teach/to-do` address unchanged). |
| Asking another instructor to teach a class | **Subs** · "1 class needs a sub" · Request a sub · Claim | **Subs** (nav, page title; the class role is "Sub"), Coverage (route only) | Substitutes, cover, Coverage as a label | **Decided D-114** (Galen, 2026-10-24): Studio's "Substitutes" became "Subs" (route `/coverage` and test IDs unchanged). |
| Person-to-person chat in the app | **Messages** | — | DMs, chat, inbox | App navigation. |
| Staff email/text to members | — | **Messages** (Compose, Templates, Automations, Scheduled, Delivery log) | Blasts, campaigns, broadcasts in UI | Studio navigation. **Decided D-114** (Galen, 2026-10-24): both keep "Messages". |
| The forecast of what automations will send next | — | **Scheduled** (title, tab and nav) | What's about to send | PQ-15 (K-447). |
| The reason an incident's open tasks are not needed when it closes | — | **Reason the open task is not needed** / **Reason the N open tasks are not needed** | waiver | PQ-15 (K-371): "waiver" means a liability waiver everywhere else. |

## Formatting rules that go with the words

- **Recurrences** say the weekday in full and plural: "Thursdays at 6:00 PM" (`weekdayPlural`), never a short label with an "s" on it ("Thus").
- **Counts** pluralise the word, never "(s)": "1 open task", "2 open tasks".
- **Relative days** come from `Intl.RelativeTimeFormat` on the dojo's clock: "today", "yesterday", "3 days ago" — never "1 days ago".
- **Money** goes through `formatMoney` ("$3,447.00"). Only machine files keep bare decimals (the QuickBooks journal lines).
- **Possessives** go through `possessive()`: "Kestrel Martial Arts’", "Blue Heron’s".
- **Open ranges** are said in words: "Green and up", "Up to Brown" — never "Any – Kudan" or "Green+". A one-day range says one date.
- **Dates** in copy are the dojo's words ("Saturday, November 7"), never an ISO string; copy never names a route ("/members").

`scripts/verify/copy-check.mjs` (run by `npm run design:check`) fails on the two patterns a grep can catch reliably: a weekday built with a suffix (`}s at`) and a count followed by "(s)" inside a template or JSX text. A line that must keep one says `copy-check-ok`.
