Development record
maya-sees-how-every-decision-connects-one-relationship-chart
specclosedspc-39
Summary
spc-39 delivers itd-137's two views of the record over time: the
relationship chart at /record/graph/ — one chart, two build-time
arrangements, ego focus, the card with the date continuum and viewing
history — and the five-lane genealogy at /record/timeline/ as one static
SVG. The layouts are ported from build_data.py (the reference
implementation); the runtime behaviour is lifted from the prototype's CSS
tokens and JavaScript into site-src/, not rewritten from memory. On the
itd-140 boundary both pages are generic-side: they consume
record.json and nothing else.
Settled constraints
- Both arrangements are precomputed at build time into
record.json, deterministic across rebuilds of the same tree: the coil isbuild_data.py's greedy packer; the by-links view is a seeded spring embedding with the hub-dampening and radial decompression the script records. Ported in-repo, stdlib-only — an external layout library is a new dependency under the sign-off gate and is not assumed. - Every record is a circle; colour names only the three durable types;
issues are light grey, principles and the rest ink; lifecycle is fill;
size is link count. Arrowheads only on
builds_on,supersedes,implements; mirrored pairs collapse; body mentions off by default. - Dashed stubs, never invented positions: supersession arcs draw only where both ends exist; a target absent from the tree gets a dashed stub ending in ×, consistent with the baseline stubs ruling.
- Amendment traceability (interview ruling): the card's last-touched date links the record's commit history on GitHub.
- Perfect at 390 px or removed from the phone view; full behaviour
under
prefers-reduced-motionis: no animation, nothing drifts at rest, the list view offered in place of the chart.
Mechanism
Build-time layouts (in internal/core/site, shipped in record.json)
layout.goports the coil: records placed in effective-date order (frontmatter date, else first-commit date; ties by type then id), each next bubble beside the last, a little further round and as close in as placed bubbles allow; month zones recorded as the first record of each month; an overlap sanity count must be zero. Radii follow the script's formula; positions normalised to the unit disk.- The by-links arrangement: connected components over typed links only; islands of three or more laid out by the seeded spring embedding with degree-weighted springs, percentile radial decompression, the largest island centred; pairs ringed outside it; unlinked records on the rim in date order, spaced by bubble size. Seeds are fixed constants; a golden test pins the output for a fixture tree.
- The genealogy SVG is emitted at build: five lanes (releases, decisions,
intents, specs, issues) over one axis; releases from CHANGELOG headings
linking their GitHub release; decisions at frontmatter dates; the rest
at first-commit dates from the same git pass as the card's continuum;
crowded days become capsules with counts; issues render as a per-day
histogram (resolved solid, open outlined); supersession arcs and dashed
×-stubs as ruled; the first-commit marker is a dashed vertical; every
mark links
/record/graph/?focus=<id>.
Runtime (lifted from the prototype into site-src/)
- The prototype's CSS token system (light base, dark redefinition, both
prefers-color-schemeand explicitdata-theme) and its chart script are lifted intosite-src/assets and adapted only where the hash router becomes real URLs: the canvas stage, tap-to-focus ego view with ring-and-fade, drag/pan, wheel/pinch/double-click zoom with corner buttons and reset, the explicit two-state arrangement control, the Filters pop (type chips, mentions toggle, legend), search with hit list, full screen with the fixed-overlay fallback, the settling pass behind the "Stand by…" overlay, and the corner discipline — controls in the corners, the middle belongs to the chart. - The card: title; type and state pills in the GitHub palette; every date of the record on one continuum (frontmatter diamond, in-tree dot, state ring, last touched) spoken as one sentence to screen readers; the linked-records pull-out phrased from the focused record; the GitHub link; the last-touched date links the record's commit history; back and forward buttons and Alt+arrows walk the viewing history, a fresh pick dropping the forward trail. Anchored bottom-left, growing upward to the control row; on phones a full-width bottom sheet with the chart panning to keep the focused bubble visible.
- "Browse as a list" beneath the stage is the keyboard path and accessible twin, reaching every record and every link the chart shows.
Acceptance-criteria mapping
- AC 1 (two arrangements by an explicit control, precomputed, deterministic, ported from the reference scripts, no new dependency) → build-time layouts.
- AC 2 (mirrored pairs collapse; arrowheads only on directed relations;
mentions off by default) →
record.jsonedges + chart rendering. - AC 3 (the card: pills, continuum, phrased pull-out, GitHub link, history-linking last-touched, back/forward) → the card.
- AC 4 (keyboard visitor reaches everything via the list twin) → list twin.
- AC 5 (five-lane static SVG; one git pass; capsules; arcs only where both ends exist; dashed ×-stubs) → genealogy SVG.
- AC 6 (
prefers-reduced-motionremoves animation; list offered) → runtime behaviour. - AC 7 (390 px bottom sheet, pan-to-visible, no horizontal scroll) → mobile rules + static checks + CI screenshots.
Out of scope
- Tombstone files for retired ADRs (ruled out; dashed stubs only).
- Body-mention edges on by default; a fourth categorical hue.
- Any runtime layout simulation beyond the glide-and-settle pass.
Frontmatter
| id | spc-39 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-39-maya-sees-how-every-decision-connects.md
open on GitHub ↗ · commit history ↗
References1
- itd-137Maya sees how every decision connects — one relationship chart with a date coil and a links-only layout, and a five-lane genealogy of the record over timeimplements
mentions10
- dcn-26082300000000042026-08-23 — Manual-test triage rulings (maintainer): (1) spc-38's "every
- iss-12memory shipped versus planned is ambiguous: docs say spc-38/spc-39 shipped, but itd-36 lives in planned and intents README says shipped is empty until Go capabilities ship.
- iss-2608230752154346Maintainer re-rule 2026-08-23 amends spc-38's 'every visual has a table twin': a table twin is dropped wherever the visual already presents the same labels and numbers as text. Drop the twins on the dashboard seg bars, Assisted-by trailers, and the Genealogy release-cadence list; the cadence chart absorbs its dates; the relationship chart's Browse-as-a-list twin stays (spc-39 AC 4 keyboard path). Spec amendment to be recorded with the change (reports 11, 15, 20).
- iss-2609020734198139The v0.7.1 brief-surface crosscheck (Direction A, tier full, over the sixteen first surface chapters) found four false claims in the design record, none in a user-facing page. 01-ahoy.md line 225 says every non-SessionStart shim attempts hooks/bootstrap.sh when the plugin-root binary is missing; hooks.json wires bootstrap into UserPromptSubmit, SessionStart, PreToolUse and PreCompact but not SessionEnd, which resolves the plugin root, then a vouched PATH abcd, then fails loudly, so a machine with no plugin-root binary never stages its transcript at exit and the chapter says otherwise. 01-ahoy.md line 28 lists status among the sub-verbs that ship on the CLI; abcd ahoy status exits 2, status being a plugin-side alias for the bare render, and the chapter's own sub-verb table omits it. 07-memory.md line 3 disambiguates spc-38 and spc-39 by saying the store's ids stop well short of spc-38; the store now runs to spc-70 and both ids name unrelated specs, so a dozen bare references on the page point at the wrong records. 07-memory.md line 116 enumerates launch --dry-run's gates as five, omitting semantic-receipts, which 04-launch.md documents. Each is a one-line correction; the receipt for the v0.7.1 cut defers them to this record.
- iss-2609290448510918The predecessor-store qualifier sweep reaches past the six intents iss-2609261536147903 named: outside drafts/ and those six, 192 citation sites across about forty intents name a spc-N at or below spc-70 that is not the citing intent's own spec, with no '(predecessor store)' on the line. Some are live cross-references (the cold-reading family's intents cite each other's live specs), and some are the predecessor store's (itd-4, itd-6, itd-29, itd-47 and itd-49 describe pre-rebuild work in its terms), so each site needs the same reading against the live spec it collides with; the specs charter's Two spc-N Namespaces section is the rule. Found while sweeping the pattern of iss-2609261536147903 in lane drainDrift3; a census script over intents/{planned,shipped,disciplines} reproduces the count.
- iss-2609300025372991Two shipped intents' Implementing specs sections misstate where their predecessor-store spec ids stand: itd-36 says its frontmatter spec_id records spc-38 as the primary delivering spec, while the frontmatter records spc-2609211905174684 and live spc-38 and spc-39 are itd-136's record explorer and itd-137's relationship chart; itd-4 says its spc-20 to spc-23 do not exist in the native spec store, while the live store holds all four as other specs (banlist, fresh install, stale-binary warning, tier placement). Found while qualifying predecessor-store citations for iss-2609290448510918.
- itd-36Knowledge That Compounds, Not Knowledge That Re-Derives
- itd-140The Generic/Specific Boundary of the Site Generator Is a Gate, Not a Hope
- spc-37iris-opens-abcdev-app-and-understands-who-abcd-is-for-what-t
- spc-38alice-opens-the-record-explorer-and-reads-the-whole-developm