{
  "version": "1.0.0",
  "kind": "codebase",
  "project": {
    "name": "canonical-example",
    "languages": ["go", "typescript"],
    "frameworks": ["gin"],
    "description": "Canonical fixture covering all 21 node types and a representative edge mix. IDs match NormalizeNodeID output so neither validator emits auto-corrected node-id issues.",
    "analyzedAt": "2026-07-02T00:00:00.000Z",
    "gitCommitHash": "0000000000000000000000000000000000000000"
  },
  "nodes": [
    {"id": "file:cmd/server/main.go", "type": "file", "name": "main.go", "filePath": "cmd/server/main.go", "summary": "HTTP server entrypoint.", "tags": ["entrypoint"], "complexity": "moderate"},
    {"id": "function:cmd/server/main.go:runServer", "type": "function", "name": "runServer", "filePath": "cmd/server/main.go", "lineRange": [10, 40], "summary": "Boots the Gin server.", "tags": ["bootstrap"], "complexity": "simple"},
    {"id": "class:internal/store/memory.go:MemoryStore", "type": "class", "name": "MemoryStore", "filePath": "internal/store/memory.go", "lineRange": [12, 80], "summary": "In-memory store implementation.", "tags": ["storage"], "complexity": "moderate"},
    {"id": "module:auth", "type": "module", "name": "auth", "summary": "Authentication module.", "tags": ["auth"], "complexity": "moderate"},
    {"id": "concept:middleware-chain", "type": "concept", "name": "middleware-chain", "summary": "Middleware composition pattern.", "tags": ["pattern"], "complexity": "complex"},
    {"id": "config:config.yaml", "type": "config", "name": "config.yaml", "filePath": "config.yaml", "summary": "Runtime configuration.", "tags": ["config"], "complexity": "simple"},
    {"id": "document:README.md", "type": "document", "name": "README.md", "filePath": "README.md", "summary": "Project README.", "tags": ["docs"], "complexity": "simple"},
    {"id": "service:deploy/docker-compose.yml", "type": "service", "name": "api", "filePath": "deploy/docker-compose.yml", "summary": "API service.", "tags": ["deploy"], "complexity": "simple"},
    {"id": "table:migrations/001_init.sql:users", "type": "table", "name": "users", "filePath": "migrations/001_init.sql", "lineRange": [1, 20], "summary": "User table.", "tags": ["schema"], "complexity": "simple"},
    {"id": "endpoint:internal/router/router.go:GET-/health", "type": "endpoint", "name": "GET-/health", "filePath": "internal/router/router.go", "lineRange": [15, 22], "summary": "Health probe.", "tags": ["health"], "complexity": "simple"},
    {"id": "pipeline:.github/workflows/ci.yml", "type": "pipeline", "name": "test", "filePath": ".github/workflows/ci.yml", "summary": "CI test stage.", "tags": ["ci"], "complexity": "simple"},
    {"id": "schema:proto/api.proto", "type": "schema", "name": "User", "filePath": "proto/api.proto", "lineRange": [3, 18], "summary": "User proto schema.", "tags": ["proto"], "complexity": "simple"},
    {"id": "resource:infra/main.tf", "type": "resource", "name": "bucket", "filePath": "infra/main.tf", "lineRange": [1, 10], "summary": "Storage bucket.", "tags": ["infra"], "complexity": "simple"},
    {"id": "domain:billing", "type": "domain", "name": "billing", "summary": "Billing bounded context.", "tags": ["domain"], "complexity": "moderate", "domainMeta": {"entities": ["Invoice", "Receipt"], "businessRules": ["Invoices must be paid within 30 days."], "entryPoint": "POST /billing/charge", "entryType": "http"}},
    {"id": "flow:charge-flow", "type": "flow", "name": "charge-flow", "summary": "Charge processing flow.", "tags": ["flow"], "complexity": "moderate", "domainMeta": {"entryType": "http"}},
    {"id": "step:internal/billing/charge.go:validate-cart", "type": "step", "name": "validate-cart", "filePath": "internal/billing/charge.go", "summary": "Validate cart contents.", "tags": ["step"], "complexity": "simple"},
    {"id": "article:billing-md", "type": "article", "name": "billing.md", "summary": "Billing overview article.", "tags": ["docs"], "complexity": "simple", "knowledgeMeta": {"category": "engineering"}},
    {"id": "entity:invoice", "type": "entity", "name": "Invoice", "summary": "Invoice entity.", "tags": ["entity"], "complexity": "simple"},
    {"id": "topic:billing", "type": "topic", "name": "billing", "summary": "Billing topic.", "tags": ["topic"], "complexity": "simple"},
    {"id": "claim:invoicing-is-idempotent", "type": "claim", "name": "invoicing-is-idempotent", "summary": "Invoicing is idempotent.", "tags": ["claim"], "complexity": "simple"},
    {"id": "source:design-doc", "type": "source", "name": "design-doc", "summary": "Design doc.", "tags": ["source"], "complexity": "simple"}
  ],
  "edges": [
    {"source": "file:cmd/server/main.go", "target": "function:cmd/server/main.go:runServer", "type": "contains", "direction": "forward", "weight": 1},
    {"source": "function:cmd/server/main.go:runServer", "target": "class:internal/store/memory.go:MemoryStore", "type": "calls", "direction": "forward", "weight": 0.8},
    {"source": "file:cmd/server/main.go", "target": "module:auth", "type": "imports", "direction": "forward", "weight": 0.7},
    {"source": "class:internal/store/memory.go:MemoryStore", "target": "concept:middleware-chain", "type": "implements", "direction": "forward", "weight": 0.9},
    {"source": "config:config.yaml", "target": "service:deploy/docker-compose.yml", "type": "configures", "direction": "forward", "weight": 0.6},
    {"source": "document:README.md", "target": "file:cmd/server/main.go", "type": "documents", "direction": "forward", "weight": 0.5},
    {"source": "service:deploy/docker-compose.yml", "target": "endpoint:internal/router/router.go:GET-/health", "type": "serves", "direction": "forward", "weight": 0.5},
    {"source": "schema:proto/api.proto", "target": "table:migrations/001_init.sql:users", "type": "defines_schema", "direction": "forward", "weight": 0.8},
    {"source": "table:migrations/001_init.sql:users", "target": "resource:infra/main.tf", "type": "migrates", "direction": "forward", "weight": 0.7},
    {"source": "pipeline:.github/workflows/ci.yml", "target": "file:cmd/server/main.go", "type": "tested_by", "direction": "backward", "weight": 0.5},
    {"source": "domain:billing", "target": "flow:charge-flow", "type": "contains_flow", "direction": "forward", "weight": 0.7},
    {"source": "flow:charge-flow", "target": "step:internal/billing/charge.go:validate-cart", "type": "flow_step", "direction": "forward", "weight": 0.6},
    {"source": "domain:billing", "target": "topic:billing", "type": "cross_domain", "direction": "bidirectional", "weight": 0.5},
    {"source": "article:billing-md", "target": "source:design-doc", "type": "cites", "direction": "forward", "weight": 0.5},
    {"source": "claim:invoicing-is-idempotent", "target": "source:design-doc", "type": "builds_on", "direction": "forward", "weight": 0.5},
    {"source": "article:billing-md", "target": "topic:billing", "type": "categorized_under", "direction": "forward", "weight": 0.5},
    {"source": "entity:invoice", "target": "domain:billing", "type": "related", "direction": "bidirectional", "weight": 0.5}
  ],
  "layers": [
    {"id": "layer:cmd", "name": "Commands", "description": "Entrypoint commands.", "nodeIds": ["file:cmd/server/main.go"]},
    {"id": "layer:internal", "name": "Internal packages", "description": "Internal modules.", "nodeIds": ["module:auth", "class:internal/store/memory.go:MemoryStore"]}
  ],
  "tour": [
    {"order": 1, "title": "Read the README", "description": "Start with project context.", "nodeIds": ["document:README.md"]},
    {"order": 2, "title": "Server entrypoint", "description": "Trace how the server boots.", "nodeIds": ["file:cmd/server/main.go", "function:cmd/server/main.go:runServer"]}
  ]
}
