유대선
프로젝트로
·기술 회고·2 ·리뷰 필요

Viz layer v1 — a locked-draft vocabulary + five animated renderers

Built the rendering layer that turns the connective layer's raw signals into 0.5-second-glance cards. A workflow-designed viz_kind vocabulary, five animated renderers, and an Activity view that renders real captured commits — all on a typed i18n base (English default).

AI 버전

The problem

The connective layer (v0) captures real git commits as graph nodes — but the read surface showed them as raw text: commit subjects with fix(pty): jargon, a --stat blob in the body. For the target user (a non-engineer solo founder) that's illegible. A first React Flow attempt grouped commits by code area, but it was still "a list with lines drawn on it" — the maintainer's reaction was literally "it's still text-heavy" and "is the graph the same thing as the cards?". The signal was clear: we needed a rendering vocabulary, not more boxes.

What we built

A locked-draft viz_kind vocabulary (packages/shared/src/viz.ts, docs/VIZ_VOCABULARY.md). Designed via a 4-agent workflow (viz-core's 24 kinds + three independent proposals — minimalist / coverage / persona-first — synthesised). 10 kinds: plan · recap · question · diff · concept · metric · trend · mermaid · note · none, each with a precise TS data schema and an input→kind map. mermaid + concept are the universal escape hatches so "anything unknown" still maps to something — that is how "visualise anything" works without hand-coding a renderer per data type.

Five renderers (apps/desktop/src/viz/), pure CSS/SVG + Framer Motion, animation used to clarify (sequential reveal, the live "now" step pulses) not decorate: ConceptCard, PlanCard, RecapCard, QuestionCard, MermaidCard (token-themed, with wheel/drag zoom + pan via react-zoom-pan-pinch).

Activity view (ActivityView.tsx) — the "real + pretty" merge: real captured commits rendered through the recap renderer, sectioned per startup. Strictly factual (nodeToRecap.ts): real subject + real files + real line counts; no invented next_step, no added/edited/deleted claim a --stat can't prove. Per-startup sectioning is the stepping stone to per-session (add session_id to the grouping).

i18n (apps/desktop/src/i18n/) — a tiny typed en/ko table + useT(), English default, persisted. Korean was the only hardcoded copy; now switchable.

Honest status

  • The vocabulary is a draft, not maintainer-locked. It compiles and is versioned; it gets refined through dogfooding.
  • The card renderers run on sample data. Only Activity is on real data today.
  • The live "Claude is working" path (augmentor → BYO-LLM selector → live card per session) is not wired yet — that's the next build.
  • React Flow (GraphView/nodeToDepgraph) is parked, not deleted, for the future portfolio network graph.

Lesson

The maintainer kept asking to see it, not hear it. Every "is this too much?" was answered fastest by building the thing and letting them judge — and the guardrail that held the whole time was their own rule: density is good, distortion never — more real signal, not invented filler.

Commit: 97a3654

리뷰 필요

내 시각이 아직 안 들어간 entry.