l-domain-vocabulary
Look up the canonical zudo-text domain vocabulary before writing any user-visible wording — command palette labels, settings headings and field labels, button/menu text, aria-labels, tooltips, disable...
Domain Vocabulary
The words this app shows the user. Code identifiers are deliberately NOT governed by this skill — see Identifiers are not in scope.
Sources of truth for the shipped strings:
Command palette —
tauri-app/ renderer/ data/ app- commands. tsx Shortcut group labels —
tauri-app/ renderer/ components/ settings/ sections/ shortcut- groups. ts Settings labels —
packages/,settings- sections/ src/ sections/ general- settings. tsx settings-search-metadata.tsFrame titles / provider display names —
tauri-app/ renderer/ view- providers/ *. tsx User docs —
doc/,src/ content/ docs/ {manual,guide,overview}/ ** manual/(the Japanese end-user manual)src/ content/ docs/ **
The core rule
A control is never named after the frame it lives in.
If a command moves, toggles, or configures a part of a frame, its label must name that part, qualified by the frame — not the frame alone. Move Note Tray: Top is wrong because it reads as "move the whole Note Tray frame"; the command actually moves the toolbar inside that frame. The correct shape is Move Note Tray Toolbar: Top.
The same rule applies to aria-label, tooltips, disabledReason text, and settings headings. When in doubt, read the label out loud with no UI in front of you and ask: what exactly would I expect to move?
Canonical terms — Note Tray area
| Term | Names | Must NOT be used for |
|---|---|---|
| Note Tray | The frame type / view provider core.inbox. Backs both the Inbox pin (directory: "inbox") and the Archives pin (directory: "archives"). Its frame title is literally Note Tray (or Note Tray — <dir>). | The toolbar inside it. Any single note. The editor or preview pane. |
| Note Tray toolbar | The bar of note pills + document actions rendered inside the Note Tray frame header (the DraftBar component). Has four positions and, on a vertical rail, a collapsed/expanded presentation. | The frame. The app-level top toolbar. The action cluster alone. |
| note | One entry in a Note Tray — a numbered N.md or a named non-numeric .md file. | A "draft". A "message". A "document". |
| pill | The collapsed presentation of a note in the toolbar — a numbered rounded-rect (top/bottom) or circle (left/right). | The expanded presentation. |
| title row | The expanded presentation — a full-width row showing the note number plus its derived title. Left/right rail only. | The collapsed pill. |
| rail | The toolbar in its left or right position (vertical). | The horizontal form. |
| strip | The toolbar in its top or bottom position (horizontal). | The vertical form. |
| action cluster | The document-actions group (schema badge, publish, view-mode toggle, archive, configured "Move to…" buttons) at the trailing edge of a strip / foot of a rail. | The whole toolbar. |
| Pile View | The search/browse surface opened from any Note Tray. | The Note Tray itself. |
Short forms. Once "Note Tray toolbar" has been established in the same paragraph or dialog section, plain "the toolbar" is fine. Never shorten to "the tray" (that means the frame) or "the bar" in a new context (ambiguous with the app toolbar and the EFE tab bar).
Retired spellings — never reintroduce
| Retired | Use instead | Why |
|---|---|---|
Draft Bar / draft bar | Note Tray toolbar | Doubly stale: the component is not "the draft bar" in any shipped UI, and draft itself was retired in favour of note by epic #3426. |
DraftBar (in user docs) | Note Tray toolbar | A code identifier leaking into user-facing prose. Fine in doc/, which document the code. |
draft as the noun for a Note Tray entry | note | Epic #3426. Scoped narrowly: only the tray-entry sense is retired. draft remains valid elsewhere — a frameset draft mode, draft CSS in the Theme Creator, a draft status in a frontmatter schema, "drafting a message" as a verb. Surviving draft* identifiers are frozen (see below) and do not license the word in new strings. |
draft buffer | note — or slot for the numbered position | #4103. A Note Tray entry is always a persisted, autosaved note (a real file such as inbox/ locally; an encrypted workspace entry in cloud-workspace mode), never a memory-only buffer, so there is no unsaved-buffer concept to name. A modifier grants no exemption from the retired draft noun above. Where editor-side in-memory state genuinely needs naming (the kanban docked-card editor), say "unsaved changes" — a state, not an entity noun. |
Move Note Tray: <Pos> | Move Note Tray Toolbar: <Pos> | Names the frame for a control that moves the toolbar. This is the exact bug #4095 reported. |
| "utilbar" / "util bar" | toolbar | User shorthand from #4095, not English and not in the codebase. The user was asking for a qualifier, not for that token. |
vault / Vault | workspace | Epic #4991: the account-level data container was renamed app-wide, user-facing and internal, from "vault" to "workspace" — never reintroduce "vault" in new user-facing strings, command-palette labels, or docs prose. Applies everywhere in the app, not just the Note Tray area. As with draft* below, surviving vault* code identifiers not yet swept by a later wave of the rename are frozen residuals, not license to use the word in new strings. |
| Directory View as a frame/provider | External File Editor's embedded directory tree or, after the frame is established, directory tree / file tree | Directory View was retired as a standalone provider. The setting/shortcut identifiers are frozen compatibility names, not user vocabulary. |
Casing
Note Tray is always Title Case in every surface — it is the provider's display name. Only the qualifier varies:
The Note Tray toolbar's own command-palette labels are Title Case, because their neighbours already are:
Move Note Tray Toolbar: Bottom,Cycle Note Tray Toolbar Position,Tidy Up Notes,Timeline View,Switch to Nth Note.Everywhere else — settings headings, field labels,
aria-label, tooltips,disabledReason, docs prose — the qualifier is lowercase:Note Tray toolbar,Note Tray toolbar position,Note Tray layout.
This is not a claim that the whole palette is Title Case. app-commands.tsx also holds plenty of sentence-case labels (Check diff, Slide settings, Toggle scroll sync, Toggle minimap). Match the casing of the entries a new command sits among; do not retitle unrelated commands to "fix" them.
Identifiers are not in scope
This skill governs strings the user reads. It does not govern:
Component / prop / hook / constant names —
DraftBar,draftBarPosition,draftBarOrder,draftBarExpanded,DRAFT_BAR_POSITIONS,setDraftBarPositionSettings keys —
AppSettings.layout.draftBarPosition,draftBarOrder,draftBarExpandedCommand ids —
set-draft-bar-position-top,cycle-draft-bar-position,toggle-draft-bar-expandedShortcut keys —
cycleDraftBarPosition,toggleDraftBarExpandedEvent names —
draft-bar:set-position,draft-bar:cycle-position,draft-bar:toggle-expandeddata-testidvalues, e2e spec filenames anddescribe()titles, file paths (draft-bar.tsx)Settings-search keyword aliases (
keywords: ["draft bar"]) — those exist precisely so a user who remembers the old name still finds the control
Command ids key persisted user settings (shortcut bindings, palette ordering). Renaming them is a breaking change to user data for zero user benefit, and the repo's pre-release "no migration code" rule makes such a rename possible but not valuable. A string/identifier mismatch is normal and expected here.
Corollary: a legacy identifier is never evidence that the legacy word is still acceptable in a label.
Before you write a user-facing string — checklist
Does the string name a part of a frame? Then qualify it with the frame's name; do not use the frame's name alone.
Is the noun in the retired list? Replace it.
Does the same control already have a name somewhere else (settings heading,
aria-label, settings-search label, docs)? Reuse the same words. One control, one name across the palette, Settings, a11y, and the manual. Casing follows the destination surface, per Casing —Move Note Tray Toolbar: Topin the palette andNote Tray toolbar positionin Settings are the same name correctly cased, not a mismatch to reconcile.If you changed a label, did you change it in both
commandMetadataandbuildAppCommands()? The repo's Feature Implementation Checklist requires both; a mismatch silently desyncs the settings UI from the runtime palette.Did you update the user manual to the same words?
doc/lists palette entries verbatim.src/ content/ docs/ manual/ command- palette. mdx Does any unit test or e2e spec assert the old string?
grepthe exact literal before you finish.
Worked example — #4095 → #4099 → #4100
One surface answered to three names at once:
| Surface | Said |
|---|---|
| Command palette | Move Note Tray: Top — the frame's name |
| Settings → General | Note Tray toolbar |
| User manual | Draft Bar |
The user's report (#4095 topic 4) was not "the words Note Tray are wrong" — it was that the palette used the frame's name for a control that moves something inside the frame:
"the UI says 'Note Tray' here, but 'Note Tray' is a word that points the frame type. so maybe about this case, Move Note Tray utilbar to... might be proper."
So the fix was to add the qualifier, not to replace the noun: Move Note Tray Toolbar: Top. "Note Tray toolbar" won over "Note Tray utilbar" and "Draft Bar" on precedent — it was already the settings key (AppSettings.layout.noteTrayToolbar), the Settings → General heading, every settings-search id (note-tray-toolbar-*), the provider description, the e2e spec name (note-tray-toolbar-controls.spec.ts), and the epic title itself.
Decision record: #4099. Mechanical application: #4100.
Vocabulary outside the Note Tray area
Documented here for reference; renaming these is out of scope for the Note Tray toolbar epic. File a follow-up issue (label agent-found) rather than renaming opportunistically.
| Term | Names |
|---|---|
| frameset | The persisted window layout — a tree of splits ending in leaves. One singleton per window. |
| frame / leaf | One pane in the frameset. A leaf hosts exactly one view provider instance. |
| pin | A sidebar entry that acts as a template for a frameset. Inbox and Archives are the two built-in pins; both activate the core.inbox (Note Tray) provider at different directories. |
| Space | The user-facing name for the splittable working area. |
External File Editor (core.external-file-editor, including its embedded file tree), Mind Map | Sibling frame types. Same rule applies: their internal controls must not be labelled with the frame's name alone (the EFE tab strip is the closest analogue to the Note Tray toolbar). |
| Doc Cloud | The core.doc-cloud frame/provider and Settings section. Not the embedded outline, a page tab, or Content preview. |
| Doc Cloud outline | The service-style category/page tree pane embedded in Doc Cloud. Use Collapse Doc Cloud outline / Expand Doc Cloud outline for its seam button. Never call it a frame, file chooser, or Directory View. |
| Doc Cloud page tab | One remote page opened inside the same Doc Cloud frame. A tab is not a frameset leaf. |
| Content preview | The labelled Doc Cloud rendering surface. The qualifier is load-bearing: it promises content/Markdown parity, not the published site's theme or chrome. |
| Projects | The Doc Cloud project-list surface and fallback when a default slug is unavailable. Capitalize when naming the UI destination. |
| calling token | The pasted Doc Cloud bearer credential. Connect with token is the working primary action; “browser handoff” is future copy, not a current sign-in control. Never say API key or expose grant/expiry claims the service cannot introspect. |
| ROOT / LEAF / text app / writing app | Generator vocabulary. Defined in the root CLAUDE.md § Vocabulary — that section, not this skill, is the source of truth for those four. |