27Density + Localisation
Two hundred tasks. Forty-eight rows.
A list is not a surface. When a person has two hundred tasks Milo does not show two hundred rows; it triages what needs them, groups the rest by project, tucks past five, and keeps the done pile closed. The same discipline applies to words: every label is built for the longest language, not the shortest.
RULE TRIAGE → GROUP → TUCK PAST 5WINDOW content-visibility PAST 1,000LANGUAGES EN · DE · FI · EL · JA · STRESS
Density27.1
The rule, on real numbers.
Switch between the rule and the flat list. Both hold the same two hundred tasks; only one of them is a surface a person can act on.
The density rule, stated
| 1 · Triage first | Needs you, Running and Failed rows come first, in that order, capped at eight in view; the rest of the triage set is one disclosure away. |
|---|---|
| 2 · Group by project | Everything else is grouped by project, largest group first, five rows visible per group, the remainder tucked with a count. |
| 3 · Done is closed | Completed tasks live behind one closed disclosure with a count. Undo reaches them; the eye does not have to. |
| 4 · Filter before scroll | A search field is always present above a surface with more than 20 rows. Recognition over recall: it matches project names and titles. |
| 5 · Window past a thousand | Rows use content-visibility: auto with a 64px intrinsic size; only rows near the viewport are laid out. No virtual-scroll library; no fake scrollbar. |
| 6 · Milo may propose, never hide | Milo can reorder a group's visible five (a proposal, undoable). It cannot remove a task from the surface; a person does that. |
| Applies to | Tasks, Activity, Files, the Fleet run log, the Costs ledger. Today is exempt: it is one thing, then three, then "n more". |
Localisation27.2
Built for the longest word.
Pick a language. The same components re-flow with real translations and a doubled-letter stress string; the readout says whether anything clipped.
MILO
MILO
↩ · esc◇ FAM · ⌁ local
Localisation rules
| Width | Every control is sized by content, never by a fixed width; buttons wrap to a second line before they clip. German runs ~30% longer than English, Finnish ~40%; the stress string is 100%. |
|---|---|
| Type | Inter covers Latin, Greek and Cyrillic; Japanese falls to the system CJK stack (font-family already lists it). Instrument Serif is Latin only: display statements in CJK use the system serif, and this is expected. |
| Direction | Layout uses logical properties (margin-inline, padding-inline) where it matters; RTL is untested and listed open. |
| Glyphs | State glyphs (○ ● ◉ □ ◇ △ ✓ ✕ ⌁) are script-independent and always sit before the label, so the pair survives translation. |
| Numbers, dates, durations | Mono metadata uses the locale's formatter (Intl); "2m 14s" is the English short form, others use their own. |
| Voice | The pill shows live transcription in the spoken language; the state word is translated, the transcript is not. |
| Open | RTL (Arabic, Hebrew); vertical CJK; a real translation pass by a speaker — the strings here are working translations for stress, not shipping copy. |