Agent docs

16 · Microcopy

The words in an app are part of the interface, and the kit is opinionated about them.

The words in an app are part of the interface, and the kit is opinionated about them. This doc is the copy guide ruled at sitting 1 (D5, 2026-10-23). The checks that read it start as notes, and a note becomes a failure only after the owner says so. Case rules live in doc 12, validation messages in doc 13 §A7, and empty values in the overview's fifth law.

Audience: an agent (or person) writing or reviewing the text in a screen.

§A The rules#

1. Sentence case everywhere. Buttons, titles, tabs, labels and chips. Table headers stay Title Case (doc 6). Acronyms and identifiers keep their form.

2. A subtitle is one sentence of about 90 characters. It says what the page is for, not how it works, and never lists features. The check's hard line is 100 characters and no semicolon.

3. Helper text is one short, direct sentence. No semicolon chains and no figures of speech. Over about 90 characters is a note.

4. A placeholder is an example or the default. Never an instruction, never an ellipsis. "Generated when empty" and "Key, job id, file name" are right. "Enter your name..." is not.

5. Tab and section labels are one to three neutral words. "Settings" and "Inference" are right. "How files are read" is not.

6. A panel intro never restates API paths, field names or engine mechanics. It says what the panel is for.

7. Alerts and empty states are formal, plain and third person. They state what happened and what to do next. No "Oops", no "just", no "gone for good".

8. A destructive confirm has five parts. A title shaped "Delete ?", a body that names the object and what goes with it, the line "This action cannot be undone.", a confirm button named for the verb and the thing ("Delete job") in solid error colour, and a back button that reads "Cancel". The one sanctioned change is "Keep " when the action verb is itself cancel. ConfirmModal preset="delete" supplies the parts (doc 10 §A5).

9. Toasts and errors are sentences a person would say. Never a status code, JSON, a duration or a memory figure. The code goes to a "Details" link or the console. This extends doc 13 §A7 beyond fields.

10. Enum values and identifiers. An enum shown in prose, a list or a read-only input is labelled ("Single select"). An identifier stays as typed and goes in mono (doc 12).

11. A control that cannot act says why. A disabled save is bricked with a tooltip that names the missing thing ("Change a value to save"), or a hint sits beside it. A tooltip on a truly disabled button never shows, so it is not a reason.

12. An icon-only button has a name that shows on hover. Two adjacent dismiss-like icons are never both bare: label one, or merge them into one "Close".

13. No em dashes in rendered copy.

§B Before and after#

The pairs come from real screens in the three apps and the playground.

WhereBeforeAfterRule
Delete job confirmTitle "Delete this job?", button "Yes, delete", body says the parts are "gone for good"Title "Delete job?", body names the job and what is kept, then "This action cannot be undone.", button "Delete job" in error colour7, 8
Cancel job confirm"Stop this job for good?" with buttons "Cancel job" and "Keep it""Cancel this job? Saved output stays available. This action cannot be undone." with "Cancel job" and "Keep job"7, 8
Confirms that vary their back button"Not now", "Keep it", "Cancel""Cancel" on every confirm; the confirm button is the verb ("Continue job")8
Dashboard alert"Most failures are ambiguous SKU columns: open a job for the per-row report.""Some jobs failed. Open a job to see the failed rows."7
Save and publish toasts"Save failed (409)" and a raw JSON detail"Could not save. Reload and try again."9
Type columnsingle_select"Single select"10
Ingest placeholder"ik_...""Example: ik_3f9a", or no placeholder4
Disabled saveAn icon-only Save whose tooltip never showsSave is bricked with the tooltip "Choose a value to save"11, 12
Log note"Human decisions only, a module's own run is logged in its..." with an em dash"Human decisions only. A module's own run is logged on its job page."13

§C What reads this#

The kit standard reads these as notes: a subtitle or helper over 90 characters or with a semicolon, a tab label over three words, a placeholder that ends in an ellipsis or starts with "Enter", an em dash in rendered text, a raw token shaped like single_select outside mono, a toast with a status code, a destructive confirm without its irreversibility line, an icon-only button with no tooltip, and a disabled button with no reason. Text checks are heuristic and will misfire on user data, which is why they start as notes.

@versable-git/ui · reference, canon, and method, read in place