Docs authoring guide
How to write and keep E-School user docs accurate to the live product.
Gold page shape (reviewed)
- One or two sentences for the page purpose.
- Who can use this - roles.
- Path - exact app route.
- Dependencies - named upstream screens (or explicit
- Nonewhen truly none). - Screenshot - both desktop and mobile embeds are required:
...--desktop.png(1440x900)...--mobile.png(390x844, real mobile chrome with hamburger - not desktop UI squeezed)
- Steps - operator procedure with concrete UI labels (buttons, tabs, filters). Never invent. Never use formula skeletons. Under each numbered step embed annotated desktop + mobile shots (
...--step-N--desktop.png/...--step-N--mobile.png) with a red arrow on the control being used. Generate withnpm run capture:stepsthennpm run embeds:steps. - Fields and actions - list real controls (deduplicated).
- Common mistakes - cross-screen failures users hit.
- Related - markdown links to hubs, how-tos, and screens.
Optional: one short Mobile: note only when the mobile layout truly differs (not a copy-paste about toolbars wrapping).
Dialog pages also need Dialog appears when and prefer 2-3 sequence shots (each sequence step: desktop + mobile).
How-to journeys: each key operation in the flow should embed desktop + mobile shots (not only one hero image).
Interaction Fidelity (fidelity: interaction)
reviewed alone is not enough for operator-grade paths. Pages in an Interaction Fidelity (IF) wave add frontmatter fidelity: interaction and must document open UI states, not only closed screenshots.
Use this level when the operator must open a dropdown, menu, filter popover, dialog, or hub card - the same depth as the Printouts hub → Report cards → Academic year option examples.
Required on every IF screen
| Requirement | Screenshot must show |
|---|---|
| Navigation | Arrow on sidebar item or hub card (for example Printouts → Report cards) |
| Closed control | Arrow on the trigger (dropdown, Filters, overflow, Configure columns) |
| Open state | Same control expanded; list or popup visible |
| Option | Arrow on a specific list option (for example 2026), not only the closed field |
| CTA | Arrow on the action button (Generate / Save / Print / Release) |
| Dialog / wizard | Sequence of 2-3 frames: open → fill → confirm (desktop + mobile) |
| Empty / gate | Real empty state plus what to fix upstream - do not fake a full table |
Banned for IF: one hero PNG plus vague “pick year and term” with no open-list frame.
Extra MDX sections (IF)
- Controls inventory - every visible control with type:
button,select,menu,dialog,tab,table-action,link-card. - Interaction path - numbered steps with one UI target per step. Under each step embed:
...--if-N--desktop.png...--if-N--mobile.png
- Options - for each critical select/menu, list live options (or note “depends on school seed”) and point critical choices with dedicated IF frames.
Keep Steps only as a short summary, or replace the operator procedure entirely with Interaction path. check-coverage accepts either ## Steps or ## Interaction path for reviewed pages; IF pages must include Interaction path, Controls inventory, and matching --if-N-- embeds.
Scenario files
Each IF module has a YAML scenario under docs-site/interaction-paths/{module-id}.yaml (kebab file name matching the doc slug, for example admin-report-cards.yaml).
Supported step actions:
goto- navigate to a routeclick- click button/link/tab by labelopenSelect- open a combobox/select by field labelpointOption- point the red arrow at a list option (does not have to click unlessselect: true)openMenu- open an overflow / Filters / Configure menuopenDialog- click a control that opens a dialog, then wait for dialogscreenshot- capture annotated frame (implicit after point/open actions whenshot: true)
Capture with npm run capture:interaction then npm run embeds:interaction.
Wave rollout
- Gold path: Printouts hub + Report cards (template for all later waves).
- School Admin modules.
- Other school roles (shared routes link to the canonical page).
- Landing (marketing).
- PDF packs generated from the same IF assets.
Banned template phrases
Do not use:
Use the primary actions on this screenReview the page purpose:When finished, follow **Related**Complete the primary action described in the product UIConfirm the page heading matchesPrimary actions on this screenUse the live tabs/sectionsverify the next screen in Related before telling usersIf the view is empty, check class/term/stream filters and Related dependenciesMobile: toolbar may wrap; open Filters before looking for missing columns
npm run check-coverage fails if these appear on draft/reviewed pages.
Workflow (live UI)
- Open the screen in the local demo as the correct role.
- List visible buttons, tabs, filters, dialogs, and every select/menu that must open.
- Edit the MDX under
docs-site/docs/. - Set
status: reviewedand, for IF waves,fidelity: interaction. - Author
interaction-paths/{slug}.yamlfor open-state shots. - Capture:
npm run capture/npm run capture:dialogs/npm run capture:interaction(throttled logins; reuse session cookies). - Ensure embeds:
npm run embeds/npm run embeds:interactionthenREQUIRE_RELEASE=1 npm run check-coverage. - Sync Polish under
i18n/pl/...after English gold edits.
Commands
npm run embeds- ensure every screen/dialog MDX embeds desktop + mobile.npm run audit:live-ui- compare live labels to MDX.npm run capture/npm run capture:dialogs- refresh PNG pairs.npm run capture:stepsthennpm run embeds:steps- per-step annotated desktop + mobile shots.npm run capture:interactionthennpm run embeds:interaction- IF path shots (open selects, options, dialogs).npm run inventory:interaction- crawl live controls intointeraction-inventory.json.npm run pdf:if-pack- build a client PDF pack from IF pages (Wave 4).- Never
FORCE_STUBS=1or enrichFORCE=1after reviewed content exists. - Do not run
promote-reviewedover hand gold pages you want to keep.
ASCII only
Use hyphen -, never Unicode em dash.