Skip to content

feat(playback): a Pool lights up as its first marker arrives, and a Converter shows a conversion mark (v0.23.0) - #342

Merged
MerciHanrim merged 1 commit into
mainfrom
feat/play-pool-converter
Oct 9, 2026
Merged

MerciHanrim merged 1 commit into
mainfrom
feat/play-pool-converter

Conversation

@MerciHanrim

Copy link
Copy Markdown
Owner

Summary

Part of #330: the second of its three playback pull requests (v0.23.0). Playback now shows what happens inside the nodes: a Pool lights up as its first marker arrives, and a Converter shows a conversion mark while its markers move, with their Focus, reduced-motion and forced-colours forms. A presentation layer only: the engine, the RNG, files, share links, digests, simulation results, node sizes and text placement are unchanged.

What changes

  • Pool arrival pulse. A soft tint of the Pool's silhouette from 7 px inside the outline (clear of the flow-colour band and the focus ring), under the title and value, which stay on top. It starts when the Pool's first token of the step reaches it (the earliest arrive beat among its moved incoming connections, on their local τ) and runs a fixed 0.5 s, keyed on the step so the settle does not restart it; the next arrival starts a new one. The value and delta still change at settle. Past the 24 pairs and at L0, where no token is drawn, it plays at the same moment. It replaces the 15 px disc that played at settle, after the token had gone.
  • Conversion mark (option A). A 10 px two-arrow drawing (SVG) inside the Converter, from the Converter's own onset while its tokens move, faded after the settle; its inputs and output still share one onset. Each Converter has its own spot: the free square nearest the end of the mode text, at least 6 px inside the drawn outline and 1 px clear of the title, mode text and type chip, computed from the silhouette and the measured text once per change of the text, language, fonts or node size (never per frame, never while a step plays). The spot is the same at L1; at L0 the mark takes the type dot's place and size. No one fixed spot fits every Converter: a fixed spot after the mode text missed 20 of the 450 bundled instances.
  • Focus mode never dims either: both are cues inside a node (§LGR2.3).
  • Reduced motion: both are held static for the committed step at full strength, and clear on the next step or Reset.
  • Forced colours: no tint; the pulse is a 2 px Highlight line 7–9 px inside the outline, under the text, and the mark takes the same colour.

Contract changes

  • docs/simulation-playback.md: §PB2.1 (the Pool's inflow cue is the arrival pulse), the new §PB4.7 (pulse, mark, Focus, reduced motion, forced colours), §PB9 (the static forms).
  • docs/simulation-playback-ordering.md §PBO3: the conversion mark; onsets unchanged.
  • docs/large-graph-readability.md §LGR2.3: the pulse and the mark keep full strength.
  • docs/visual-language.md §VL9: the new motion and its reduced-motion form.

Tests

  • New e2e/playback-node-cues.spec.ts, 10 tests: 7 behaviour tests and 3 regression tests.
    • the Pool pulse starts at the arrival (none mid-travel), the value changes at settle, the same pulse element carries on across the settle, tint only outside forced colours
    • past the 24 pairs (30 moves, 6 past the cap) and at L0 every Pool that received pulses
    • the conversion mark is live from the Converter's onset, inside the drawn outline by 6 px and clear of its text, 10 px, and fades after the settle
    • at L0 the mark replaces the Converter's type dot (18 px); other nodes keep theirs
    • Focus mode: the pulse and the mark of nodes outside the focus set are at full strength while the node is at 0.26
    • reduced motion: both static, held through a pause, cleared on Reset
    • forced colours: no tint, a Highlight line 2 px wide under the text, the mark in Highlight
    • the regression, one test per Template with Converters (Equilibrium, Deadlock, Early MMO): every Converter in all 18 languages — 450 instances — has a spot inside the outline by 6 px and clear of its text and chip, and the same spot after a round trip through the other 17 languages
  • src/components/nodes/convMark.test.ts: the spot is inside and clear, the nearest free one, follows the mode text, is stable, null when nothing fits; the arrive-beat τ.
  • e2e/canvas-refresh-edges.spec.ts: the reduced-motion arrival cue is now the pulse (.nodef__pulse for .nodef__arrival); titles unchanged.
  • Test list: chromium 1,909 → 1,919 (+10), mobile 117 unchanged, total 2,042 → 2,052; no title renamed or removed.

Baselines

One replaced, approved after an off (main c4640bc) / on (this branch) capture of all 76, compared on every channel, each side's desktop set captured twice to separate noise: large-graph-readability run-distinction-states-chromium (under reduced motion the Store Pool holds the new inside tint where the old disc was). Four that differed were left as they are: frames-activity-chromium (the two handle rings of one connection re-rasterised; this baseline varies by more between two captures of main), matrix-light-L2-chromium (9 px at ±1 per channel), ko-long-label-and-tip-chromium and ko-desktop-app-chromium (the toolbar spot that varies between runs, 4 px at ±1). The other 71 are byte-identical.

Checks run locally

  • npx tsc -b, unit tests 3,286 passed, every source check:*, oxlint at its 39-warning baseline.
  • Every spec that owns baselines, 1 worker, twice in a row: chromium 243 passed and mobile 88 passed in both runs, 0 failed, 0 retried; after them the 75 other baselines are byte-identical to main.
  • The full e2e, 2 workers: chromium 1,916 passed and 3 skipped, mobile 113 passed and 4 skipped; 0 failed, 0 retried.

Release

v0.23.0: package.json, the release-note entry (three lines in 18 languages, 16 without native review; the Portuguese lines are identical in pt-BR and pt-PT), .changes/playback-node-cues.json, CHANGELOG.md, README.md. The release date is set to the Seoul day of the merge right before it.

…onverter shows a conversion mark (v0.23.0)

Part of #330 (PR 2 of 3). The cues inside a node, as a presentation
layer only: the engine, the RNG, files, share links, digests,
simulation results, node sizes and text placement are unchanged.

- Pool arrival pulse: a soft tint of the silhouette from 7 px inside,
  under the title and value, from the moment the Pool's first token of
  the step arrives; a fixed 0.5 s, keyed on the step so the settle does
  not restart it. The value still changes at settle. Past the 24 pairs
  and at L0 it plays at the same moment. It replaces the disc that
  played at settle.
- Conversion mark (option A): a 10 px two-arrow drawing inside the
  Converter from its onset while its tokens move, faded after the
  settle. Each Converter has its own spot, nearest the end of the mode
  text, at least 6 px inside the outline and clear of its text,
  computed once per text / language / font / size change; at L0 it
  takes the type dot's place.
- Focus mode never dims either; reduced motion holds both static for
  the step; forced colours draw the pulse as a 2 px Highlight line under
  the text and the mark in the same colour.

Docs: simulation-playback §PB2.1, new §PB4.7, §PB9; ordering §PBO3;
large-graph-readability §LGR2.3; visual-language §VL9. One approved
baseline replaced (run-distinction-states). Release notes v0.23.0 in
18 languages.
@MerciHanrim MerciHanrim added the enhancement New feature or request label Oct 9, 2026
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying cozy-loop-studio with  Cloudflare Pages  Cloudflare Pages

Latest commit: 3f7203a
Status: ✅  Deploy successful!
Preview URL: https://bf8a26dc.cozy-loop-studio.pages.dev
Branch Preview URL: https://feat-play-pool-converter.cozy-loop-studio.pages.dev

View logs

@MerciHanrim
MerciHanrim merged commit 1a1ce1b into main Oct 9, 2026
10 checks passed
@MerciHanrim
MerciHanrim deleted the feat/play-pool-converter branch October 9, 2026 01:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant