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 06ef8234d5 Foundation redesign: persistent cast, sidebars, story-beat titles
The previous chapter-by-chapter visualization felt disconnected — every
scene used a different idiom and the cast was anonymous "honest-0". This
commit lays the foundation for a coherent end-to-end story:

Cast (Sources/CrisisViz/Model/Cast.swift):
- Four named validators with stable color slots — Aaron (coral), Ben (teal),
  Carl (amber), Dave (violet, Byzantine). The first three honest nodes claim
  the lead slots; the byzantine node always plays Dave; surplus honest
  nodes become muted "Peer-N" fallbacks.
- buildAssignment(nodes:) does the mapping once at load time and is cached
  on DataManager so every render is a dictionary lookup.

DataManager:
- nodeColors / nodeNames now serve cast colors and cast display names so
  every existing call site that reads them automatically picks up the new
  naming with no chapter-by-chapter changes required.
- castRole(for:), castColor(for:), laneIndex(for:), castOrderedNodes() —
  helpers chapters can opt into when they want lane order to follow the
  cast (Aaron→Ben→Carl→Dave) rather than the simulation's raw node order.

Persistent sidebars (Sources/CrisisViz/Views/Sidebars.swift):
- CastSidebar (180pt left edge): one card per lead with color swatch,
  display name, and personality cue. BYZ badge on Dave.
- LegendSidebar (200pt right edge): persistent encoding rules — color
  = validator, stripe = round, border = vertex state, edge style =
  parent link. The answer to "every view looks different".
- ImmersiveView wraps the SceneRouter in an HStack(CastSidebar, scene,
  LegendSidebar) so chapters get a slightly narrower canvas without
  needing to know the sidebars exist.

Story-beat titles (ChapterDefinitions + SceneNarrations):
- Chapter titles are now full sentences with a [Technical: ...] suffix
  ("Aaron speaks. Ben listens. The graph begins. [Technical: gossip
  & DAG]"). Story-beat for the noob, technical handle for the engineer.
- Scene titles likewise rewritten as continuous narrative beats.
- All chapter narrations rewritten to address the cast by name and walk
  the reader through what is happening rather than asserting it.

Decisions saved to memory at project_redesign_decisions.md so future
sessions know cast names, title format, and morph-not-cut policy.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 11:18:11 +02:00
CrisisViz Foundation redesign: persistent cast, sidebars, story-beat titles 2026-05-04 11:18:11 +02:00
src/crisis Extend testbed 10x; fix window resize regressions; @MainActor delegate 2026-05-04 00:07:29 +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