Full Removal of the Blog ADR Graph Feature
SummaryRemove the mermaid-based ADR relationship graph added in Sprint 189 (the dedicated /adr/graph page + the mini graph in the detail sidebar) in full. Delete 5 graph-only components, lib logic (buildGraph/getSubgraph/filterAdjacency), dead data (outgoingLinks), 44 i18n keys, and fixtures F7/F8 — while preserving the graph-independent 'Related ADRs' text links, blog body mermaid, and the --diagram-bg/grid tokens. tsc 0, build (routes gone), 7 gates no-regression, Critic 0 findings, CI #339 37 pass / 0 fail.
Date
ImpactHigh
Goal
- Remove the mermaid-based ADR relationship graph from the tech blog (
blog/) ADR section entirely. - Delete both ① the dedicated graph page (
/adr/graph, KR/EN — legend, filters, full graph) and ② the mini relationship graph (1-hop subgraph) in the ADR detail page sidebar, both introduced in Sprint 189. - Preserve graph-independent functionality (the text representation of relationship data, blog body diagrams), clean up dependencies, and guarantee gate no-regression and KR/EN parity.
Background
- The user's
/startargument directed: "Remove the graph feature from the Blog ADR." On kickoff, a key ambiguity surfaced — "graph feature" had two possible scopes. - Exploration revealed that the ADR detail sidebar (
adr-meta-sidebar.tsx) contained two separate things: ① "Related ADRs" (RelatedLinks, text links based onmeta.relatedAdrs— not a graph), and ② the mini relationship graph (RelatedAdrGraph, mermaid visualization). That is, relationship data was already shown as text links, and the mini graph was an additional visualization layered on top. - Additionally, the blog body mermaid diagrams (
blog/src/components/blog/mermaid.tsx, etc.) were a completely separate feature unrelated to the ADR graph.
Decision
D1. Deletion scope — the entire graph visualization (user)
- Confirmed scope via AskUserQuestion → "remove the entire graph feature." Remove the dedicated page + sidebar mini graph + all graph components, lib logic, and i18n keys.
- Preserve: the sidebar "Related ADRs" text link list (not a graph), the blog body mermaid diagrams, and the
--diagram-bg/gridCSS tokens (potentially shared with blog body mermaid, harmless).
D2. lib graph logic — remove all
getSubgraphwas used to build the mini graph in the 6 detail routes, but since the mini graph itself is deleted,getSubgraph,buildGraph,mergeTargets,filterAdjacency, theAdrIndex.graphfield, and theAdjacencyListtype are removed together. Non-graph lib (buildUrl/filterAdrsByTopic/groupByKind/mapBySprint) is kept.
D3. Remove dead data (outgoingLinks) alongside
AdrDoc.outgoingLinkswas graph-only data consumed solely bybuildGraph/mergeTargets. After graph removal it becomes a dead field, so the extraction logic inparser.ts(extractOutgoingLinks) and its dedicated regexADR_LINK_REare removed too.normalizeAdrIdis kept since it is also used in related_adrs extraction.
D4. fixtures F7/F8 — removed (no loss of regression coverage)
- F7/F8 were graph-only regressions that directly verified
index.graph.edges. WithAdrIndex.graphremoved, they lose meaning, so both fixtures are deleted (12→10). ADR relationship regression is still covered by F6 (relatedAdrsnon-empty).
Implementation
Implementation commit (1 commit, PR #339 squash → 81c62e8)
b1da63dchore(blog) — full removal of the ADR graph feature (20 files, +15 / −845)- Deleted (5):
adr/graph/page.tsx(KR/EN),adr-graph-view.tsx,adr-graph-cta.tsx,related-adr-graph.tsx - Components (4):
adr-header(nav "Graph" link),adr-landing-view(graph CTA),adr-meta-sidebar(mini graph block + its sole consumer, the now-unusedprefixvariable),adr-detail-view(miniGraphprop) - Routes (6): sprints/permanent/topics × KR/EN — removed
getSubgraph/buildAdrIndex().graph/miniGraphpassing - lib:
index-builder(buildGraph/mergeTargets/getSubgraph/filterAdjacency + graph field),types(AdjacencyList·AdrIndex.graph·AdrDoc.outgoingLinks),parser(extractOutgoingLinks·ADR_LINK_RE) - i18n: removed 22 graph keys each in KR/EN
- fixtures: removed F7/F8 (12→10) + header comment update
- Deleted (5):
Verification
- Type/build:
tsc --noEmitsource errors 0 (the remaining 6 are stale.next/typescache referencing deleted pages — gone after.nextregeneration).next buildsucceeds → output confirms/adr/graph·/en/adr/graphroutes are gone, while the rest of the ADR/posts/about routes work in both KR/EN. - 7 gates no-regression: doc-refs 347 (0 broken) · adr-en-coverage 139/139 · i18n-residue 2.19% (<8%) · adr-index-count consistent · blog-crosscheck KR10/EN10 (0 violations) · adr-links 0 broken · adr-conversion 139 all passed.
- Full grep of residual references: 0 references to graph-only symbols or the
/adr/graphroute (only comment mentions cleaned up). - lint: blog has no ESLint config (N/A) — quality gates are tsc/build.
- Critic:
codex review --base main— 0 findings ("removal is internally consistent: source references to removed components/types/helpers were cleaned up, and TypeScript passes. No actionable regressions"). - CI #339: Passed 37 / Failed 0 — Build Blog (SSG) pass (2m21s) · Coverage Gate · E2E Programmers pass.