One change, told in one page — where it stands and how it got there.
Answering it for one change means reading five sources that never reference each other — and on two of the repo's live changes those sources currently disagree, so the answer isn't just scattered, it's wrong.
Despite all our tooling, most of us still ask "what's going on?" and "what are we working on?" and that's surprisingly hard to answer. Start with a change as the unit of currency.
A read-only page at /changes/[id] that assembles one OpenSpec change from the repo and git: intent, a stage rail, every outcome with the kind of evidence behind it, a dated history that keeps its silences, and a band comparing what the change claims against what the record shows. Nothing is written back and no field has to be remembered.
Artifacts
Full index, kept in the repo: docs/artifacts.md
Thinking
OpenSpec change
- Proposal
- Requirements — change-page — 5 requirements, 15 scenarios
- Requirements — change-claim-verification — 2 requirements, 5 scenarios
- Design — Visual design table, 9 decisions, 6 risks
- Tasks — 30/38
Figma
openspec-change-visualizer — seventeen numbered pages. Every proposal iteration is its own page, so earlier passes stay intact. The shipped design is 02.13 Proposed, built on MVDS Core.
Code
- Route
app/changes/[id]/page.tsx - Readers
lib/change-visualizer/— git, gates, tasks, specs, prs, design-ref, drift - View
components/change-visualizer/ChangePageView.tsx - Tests
tests/lib/change-visualizer/— 37 passing
Live
/changes/<id> renders any of the 47 changes. The two the format was built against:
/changes/tell-the-story— one capability, a loop back to proposal, a 31-day silence, and the 3.11 disagreement/changes/pdf-metadata-viewer-cloud— three capabilities, workstream tasks that cannot be split, and the 2.1b disagreement