{ "version": "1.1", "id": "route-fanout", "title": "라우트 하나가 건드리는 손 목록과 검출 시점", "question": "새 라우트 하나가 어디까지 퍼지고, 빠뜨린 항목은 어느 시점에 처음 드러나는가?", "type": "dependency", "direction": "LR", "audience": [ "프론트엔드 개발자", "배포 파이프라인 유지보수자" ], "summary": "Route Contract에서 런타임·빌드·CI·nginx 쪽 손 목록으로 갈라지고, 누락은 빌드 매니페스트·배포 직전·배포 뒤 서로 다른 시점에 드러난다.", "alt": "새 Route가 Route Contract를 거쳐 Runtime 계약, 배포 전 검사, Edge 서빙 세 묶음으로 갈라지는 팬아웃 그림. 각 묶음에는 누락이 처음 드러나는 시점이 적혀 있다.", "long_description": "왼쪽의 새 Route가 Route Contract로 들어간 뒤 세 갈래로 퍼진다. Runtime 계약에는 runtime 등록과 메시지 카탈로그가 있다. 배포 전 검사에는 vite chunk 이름 표와 접근성 증거·아티팩트 기준선·gate digest가 묶여 있고 누락은 빌드 매니페스트 또는 배포 직전에 드러난다. Edge 서빙 규칙 누락은 하드 로드나 새로고침 때 배포 뒤 404로 드러난다.", "source_context": { "document": "docs/TechLog/final/document.md", "document_sha256": "c3a7de37b778fff7b6ea555a3ad7338c91c6fb15d685e7734f89472b4924d955", "anchor": { "kind": "heading", "value": "8. 라우트를 하나 더하면 함께 울리는 손 목록", "line": 814 } }, "composition": { "profile": "query-fanout", "diagram_only": true, "reference_ids": [ "metrics-query-fanout" ], "rationale": "본문의 핵심은 새 Route 하나가 여러 손 목록으로 퍼지는 fan-out이다. 정확한 여덟 위치는 표가 맡고, 그림은 네 소유 묶음과 검출 시점 차이를 보여 준다.", "focus_node": "route-contract" }, "groups": [], "nodes": [ { "id": "route", "label": "새 Route", "kind": "request", "role": "query", "evidence": [ { "start_line": 816, "end_line": 821 } ], "assumption": false }, { "id": "route-contract", "label": "Route Contract", "kind": "component", "role": "router", "details": [ "tech-log-route-contract.ts" ], "evidence": [ { "start_line": 819, "end_line": 831 } ], "assumption": false, "emphasis": "primary" }, { "id": "runtime", "label": "Runtime 계약", "kind": "component", "role": "store", "details": [ "route-runtime-contract", "메시지 카탈로그", "검출: 실행 경로" ], "evidence": [ { "start_line": 824, "end_line": 826 } ], "assumption": false }, { "id": "predeploy", "label": "배포 전 검사", "kind": "component", "role": "store", "details": [ "vite chunk 표 · 빌드 매니페스트", "접근성 증거 · 아티팩트 기준선 · gate digest", "검출: 빌드 / 배포 직전" ], "evidence": [ { "start_line": 828, "end_line": 831 }, { "start_line": 854, "end_line": 877 } ], "assumption": false }, { "id": "nginx", "label": "Edge serving", "kind": "component", "role": "store", "details": [ "nginx serving contract", "검출: 배포 뒤 404" ], "evidence": [ { "start_line": 827, "end_line": 827 }, { "start_line": 834, "end_line": 852 } ], "assumption": false } ], "edges": [ { "id": "register", "from": "route", "to": "route-contract", "label": "등록", "kind": "request", "evidence": [ { "start_line": 819, "end_line": 831 } ], "assumption": false }, { "id": "runtime-edge", "from": "route-contract", "to": "runtime", "label": "반영", "kind": "data", "evidence": [ { "start_line": 824, "end_line": 826 } ], "assumption": false }, { "id": "predeploy-edge", "from": "route-contract", "to": "predeploy", "label": "대조", "kind": "data", "evidence": [ { "start_line": 828, "end_line": 831 }, { "start_line": 854, "end_line": 877 } ], "assumption": false }, { "id": "nginx-edge", "from": "route-contract", "to": "nginx", "label": "서빙 패턴", "kind": "data", "evidence": [ { "start_line": 827, "end_line": 827 }, { "start_line": 834, "end_line": 852 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "8개 항목을 같은 카드로 반복하지 않고, 독자가 먼저 알아야 할 fan-out과 검출 시점만 묶었다. 정확한 항목 수와 커밋별 수치는 본문 표에 남긴다.", "layout_note": "세 fan-out 가지를 한 화면에 유지한다. 9px shared-edge-run advisory가 남더라도 의미상 간선이 다른 노드를 통과하지 않는지 overlap 검사와 PNG preview에서 재확인한다." } }