Bloom
A single Archimedean spiral the agent draws as it works. One shape, eleven jobs — Bindu and a twenty-one-particle field appear only when the state asks for them. Below: the size ladder, then eleven states across three thematic groups.
Size ladder
Three render tiers across eight target sizes. Hero keeps the canonical 3.5-turn pitch; mid tightens to 3.0 turns at heavier stroke; tiny drops to 2.25 turns with a wider radial pitch so the favicon still reads as a spiral, not a dot.
Lifecycle
When the agent simply is. First paint, resting, waiting on I/O, switched off — the moments where motion is about presence, not work in flight.
Activity
When the agent is doing. Each loop has a signature gesture so the kind of work is legible without a label — wandering thought, scanning, writing, give-and-take.
Status
When the agent is signalling outcome. Calibration, success, error — colour and held-frame carry the meaning; motion is restrained to confirmation, not celebration.
Brand applications
Six surfaces at their true rendered size, each picking the right tier automatically. The favicon at 16 px is the hardest test — it must read unmistakably as a spiral.
Implementation notes
Geometry is locked. Three render tiers chosen by CSS pixel size; the canonical Archimedean math is preserved at hero and mid. Tier-time deviations exist only at tiny so the favicon reads.
| Token | Value | Where used |
|---|---|---|
| viewBox | 0 0 240 240 | All renderings |
| centre | (120, 120) | Bindu, spiral origin |
| spiral · hero | 3.5 turns · stroke 1.10 · op 0.65 · ink | ≥120 px · primary identity |
| spiral · mid | 3.0 turns · stroke 1.50 · op 0.78 · ink | 48–80 px · readable at glance |
| spiral · tiny | 2.25 turns · stroke 2.40 · op 0.92 · ink | 16–32 px · favicon silhouette |
| particles | 21 · t = (i+0.5)/21 · suppress <48 px | State-active layer |
| Bindu | r = 5 px · only on reveal/success/error/sync/cal | State-marker, not constant |
| ghost spiral | stroke 0.5 · #D6D1CB · op 0.10 · ≥120 px | Receipt of work; never small |
| house easing | cubic-bezier(0.22, 1, 0.36, 1) | Default for transitions |
| wobble cycle | seeds 7 → 13 → 21 · 4 200 ms · async | "Still alive" tell · ≥48 px |