Crisis BFT consensus protocol — Go PoC, Python recorder, and CrisisViz: a native macOS scrubbable curriculum visualizer (10 chapters, ~18 minutes at 1×, signed-speed slider with reverse playback).
Find a file
saymrwulf 2d353b2208 Ch01: unify scenes 0-3 onto lane-anchored gossip dramatization
Three problems landed together:

1. Scenes 0/1/2 ("Aaron speaks", "Ben joins", "Carl arrives") showed
   a static cast vertex on each scene's lane and trusted the user to
   imagine the writing and the message flying. The user wanted to
   SEE Aaron compose α in slo-mo, see α physically fly across the
   canvas to Ben, and see Ben compose β with α's hash inside.

2. Scene 3 (gossip dramatization) used a 3-up triangle layout that
   ignored the lane lifelines — Aaron wasn't on Aaron's row, Ben
   wasn't on Ben's row, etc. The 6/36→7/36 transition was a hard cut
   into a totally different visual idiom.

3. The composing box was placed 100pt above the author. For the
   triangle layout that was OK, but for ANY lane layout the upper
   lane (Aaron, lane 0 ≈ y=116) put the box off-canvas (y≈-24).

Replace `renderStagedBeat` and `renderGossipDramatization` with one
`renderGossipBeats(scriptT:)` helper that:

  - Anchors all three cast circles to their actual lane centers
    (`castLaneY(0)` for Aaron, `castLaneY(1)` for Ben, etc.),
    staircased on X so flight diagonals don't cross other circles.
    Lifeline rule satisfied across scenes 0–3.
  - Drives writing/flight/view-bubble updates from
    `GossipScript.state(at: scriptT)`. Each scene maps its 0..N local
    seconds onto a different time window of the script:
      Scene 0 (8s)  → script 0..6.5  : Aaron writes α + sends
      Scene 1 (8s)  → script 4..14   : α flies, Ben writes β
      Scene 2 (8s)  → script 9..22   : Carl writes γ before β arrives
      Scene 3 (24s) → script 0..24   : full asymmetric replay
  - Renders the composing slot in a fixed top-center box just under
    the perspective panel with a colored connector to the active
    author — guaranteed on-canvas regardless of which lane the
    author sits on.
  - `drawCastBubble` now takes an explicit `BubbleSide` so view
    bubbles attach to the correct side of each cast circle without
    depending on NSScreen geometry.

Drops dead helpers `renderStagedBeat`, `drawStagedPerspectivePanel`,
and `drawComposingBox` (replaced by the unified renderer +
`drawComposingSlot`). Net −73 lines; harness still 55/55 invariants,
0 audit errors, 281 PNGs clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 20:58:57 +02:00
CrisisViz Ch01: unify scenes 0-3 onto lane-anchored gossip dramatization 2026-05-06 20:58:57 +02:00
src/crisis Masterclass redesign: cast lifelines, narrative invariants, video harness 2026-05-06 19:11:36 +02:00
tests Initial implementation of the Crisis protocol (Richter, 2019) 2026-04-23 13:20:30 +02:00
.gitignore Add macOS .app bundle with native Dock icon and activation policy 2026-04-30 20:21:18 +02:00
Crisis.mirco-richter-2019.pdf Initial implementation of the Crisis protocol (Richter, 2019) 2026-04-23 13:20:30 +02:00
crisis_data.json Add JSON export pipeline + event recorder for visualization 2026-04-30 20:06:21 +02:00
pyproject.toml Initial implementation of the Crisis protocol (Richter, 2019) 2026-04-23 13:20:30 +02:00