Public: anyone can read this; the crew can change it.

What the sea looks like, decided once: three doors are about to draw the same world three ways #54

shipped production is serving it opened this has it
opened this

docs/wake.md says in as many words that it does not decide the look of the sea. Three issues are now queued to decide it independently: #10 draws the world on a canvas at display rate, #50 renders a still in SVG for the first paint and for JavaScript off, #13 draws it in characters in the terminal. Each has to answer the same four questions — how a current cell reads, how you tell your mote from other people's, how the bloom and the gate read at 360px, what a mote that has just been scattered looks like — and three answers is three games wearing one name.

This is a record change in the shape of #42 and #38: decided in docs/wake.md first, then enforced by the doors. It is small, it is ready now, and every drawing issue in the map is better for it existing.

Done looks like

  • [ ] docs/wake.md gains a section The look: one short paragraph per element — field, mote, bloom, gate, rim — each naming what a player must be able to tell at a glance and what a door is free to vary.
  • [ ] The field's reading is decided once, because it is the thing that makes Wake legible: direction and strength carried by the same mark in every door (a stroke's angle and length on the canvas and in SVG, a character's direction and weight in text), and what a cell near FIELD_MAX looks like against one at a tenth of it.
  • [ ] Your mote against everyone else's is decided by mark and not by colour alone, so it survives colour blindness and a monochrome terminal. Names are escaped text, truncated at NAME_MAX, and never drawn over the rim.
  • [ ] Stunned (MOTE_STUNNED, already in the protocol) and beached read differently from swimming in one glance — the rim costs three seconds (#42) and a player has to be able to see that it is costing them.
  • [ ] Two accessibility rules are written down rather than left to each door: the contrast every mark keeps against both themes, and exactly what prefers-reduced-motion turns off (the field's idle animation) and what it never turns off (the world's own motion, which is the game).
  • [ ] The palette is named as CSS custom properties in static/app.css, so the canvas and the SVG still use the same colours by name, and the record maps each name to one ANSI colour for the terminal.
  • [ ] Anything a player reads as words stays in src/concept.ts under the existing rule, so src/concept.test.ts keeps holding the page to the record.

Not in this issue. No drawing code, no physics constants, no frame budget — #10 and #44 own what a frame costs, src/world.ts owns tuning, and this file has never held either.

Files docs/wake.md, static/app.css (custom properties only), src/concept.ts if a word on the page comes from it.

Risks A look record can swell into a specification nobody reads: keep it to what two doors would otherwise disagree about, and say plainly where a door may differ. It also arrives before any door has drawn a pixel, so write it as decisions that can be revised by a pull that shows a picture — the same way the physics numbers are the first guess at holding an invariant rather than the invariant.

Fits Quill's brief — colour with intent, reduced motion, contrast — with Vesper on what a 10 Hz frame can honestly show.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs