[{"data":1,"prerenderedAt":1024},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fmcp\u002Fsample_outputs":135,"\u002Fdocs\u002Fmcp\u002Fsample_outputs-surround":1019},[4],{"title":5,"path":6,"stem":7,"children":8,"page":134},"Docs","\u002Fdocs","docs",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130],{"title":10,"path":11,"stem":12},"AI harnesses: LLM tools, MCP servers and agents","\u002Fdocs\u002Fai-tools","docs\u002Fai-tools",{"title":14,"path":15,"stem":16},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002Farchitecture",{"title":18,"path":19,"stem":20},"Web \u002F native bridges","\u002Fdocs\u002Fbridges","docs\u002Fbridges",{"title":22,"path":23,"stem":24},"Broadcast channels and tests","\u002Fdocs\u002Fchannels-and-tests","docs\u002Fchannels-and-tests",{"title":26,"path":27,"stem":28},"CLI reference","\u002Fdocs\u002Fcli","docs\u002Fcli",{"title":30,"path":31,"stem":32},"Completeness: how far an answer reaches","\u002Fdocs\u002Fcompleteness","docs\u002Fcompleteness",{"title":34,"path":35,"stem":36},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",{"title":38,"path":39,"stem":40},"External systems","\u002Fdocs\u002Fexternal","docs\u002Fexternal",{"title":42,"path":43,"stem":44},"Generated, copied and vendored files","\u002Fdocs\u002Fgenerated","docs\u002Fgenerated",{"title":46,"path":47,"stem":48},"Installing and updating cg","\u002Fdocs\u002Finstall","docs\u002Finstall",{"title":50,"path":51,"stem":52},"Java","\u002Fdocs\u002Fjava","docs\u002Fjava",{"title":54,"path":55,"stem":56},"Kotlin","\u002Fdocs\u002Fkotlin","docs\u002Fkotlin",{"title":58,"path":59,"stem":60},"Known limitations","\u002Fdocs\u002Flimitations","docs\u002Flimitations",{"title":62,"path":63,"stem":64,"children":65},"MCP server","\u002Fdocs\u002Fmcp","docs\u002Fmcp",[66],{"title":67,"path":68,"stem":69},"code-graph MCP: sample outputs (real calls via the MCP Python SDK stdio client)","\u002Fdocs\u002Fmcp\u002Fsample_outputs","docs\u002Fmcp\u002Fsample_outputs",{"title":71,"path":72,"stem":73},"Rust, C and C++","\u002Fdocs\u002Fnative","docs\u002Fnative",{"title":75,"path":76,"stem":77},"Port gaps: cg parity","\u002Fdocs\u002Fparity","docs\u002Fparity",{"title":79,"path":80,"stem":81},"PHP","\u002Fdocs\u002Fphp","docs\u002Fphp",{"title":83,"path":84,"stem":85},"Planned changes","\u002Fdocs\u002Fplans","docs\u002Fplans",{"title":87,"path":88,"stem":89},"Platform-specific code","\u002Fdocs\u002Fplatforms","docs\u002Fplatforms",{"title":91,"path":92,"stem":93},"Protocol links","\u002Fdocs\u002Fprotocols","docs\u002Fprotocols",{"title":95,"path":96,"stem":97},"Python","\u002Fdocs\u002Fpython","docs\u002Fpython",{"title":99,"path":100,"stem":101},"Quick start","\u002Fdocs\u002Fquickstart","docs\u002Fquickstart",{"title":103,"path":104,"stem":105},"Graph schema","\u002Fdocs\u002Fschema","docs\u002Fschema",{"title":107,"path":108,"stem":109},"Attack surface","\u002Fdocs\u002Fsurface","docs\u002Fsurface",{"title":111,"path":112,"stem":113},"Swift","\u002Fdocs\u002Fswift","docs\u002Fswift",{"title":115,"path":116,"stem":117},"TypeScript \u002F JavaScript frameworks","\u002Fdocs\u002Fts-frameworks","docs\u002Fts-frameworks",{"title":119,"path":120,"stem":121},"How we validate","\u002Fdocs\u002Fvalidation","docs\u002Fvalidation",{"title":123,"path":124,"stem":125},"Validation log","\u002Fdocs\u002Fvalidation-log","docs\u002Fvalidation-log",{"title":127,"path":128,"stem":129},"Value facts and resolutions","\u002Fdocs\u002Fvalue-facts","docs\u002Fvalue-facts",{"title":131,"path":132,"stem":133},"Visual view","\u002Fdocs\u002Fviz","docs\u002Fviz",false,{"id":136,"title":67,"body":137,"description":1013,"extension":1014,"meta":1015,"navigation":1016,"path":68,"seo":1017,"stem":69,"__hash__":1018},"docs\u002Fdocs\u002Fmcp\u002Fsample_outputs.md",{"type":138,"value":139,"toc":954},"minimark",[140,161,166,438,445,455,465,472,478,484,491,497,503,510,516,522,529,535,541,548,554,560,567,573,580,587,593,599,606,612,618,625,631,637,644,650,656,663,669,675,682,688,694,701,707,713,720,726,732,739,745,751,758,764,770,777,783,789,796,802,808,815,821,827,834,840,846,853,859,865,872,878,884,891,897,903,910,916,922,929,935,941,948],[141,142,143,144,148,149,152,153,156,157,160],"p",{},"Server: ",[145,146,147],"code",{},"code-graph",", DB: combined graph of ",[145,150,151],{},"examples\u002Fbookstore-api"," + ",[145,154,155],{},"examples\u002Fbookstore-web",". Generated by ",[145,158,159],{},"tests\u002Fmcp_e2e.py",". Volatile values (index timestamps and durations) are replaced by placeholders, so regenerating the file on unchanged code gives identical bytes.",[162,163,165],"h2",{"id":164},"toolslist","tools\u002Flist",[167,168,169,176,182,188,194,200,210,220,244,260,266,272,278,284,290,296,302,308,314,324,330,336,342,348,354,360,366,372,378,384,390,396,402,408,414,420,426,432],"ul",{},[170,171,172,175],"li",{},[145,173,174],{},"reaches",": Use before changing a column, table, connection, env key or symbol: everything that depends on it.",[170,177,178,181],{},[145,179,180],{},"impact",": Use before editing a function: what a change to it affects. Reverse callers of a method (Class::method, short or FQN) up to entry points, with the shortest call path",[170,183,184,187],{},[145,185,186],{},"callers",": Use to see who calls X right now. Direct callers of a function \u002F method \u002F class (one level: CALLS, INSTANTIATES, dispatch and framework edges",[170,189,190,193],{},[145,191,192],{},"siblings",": Code parallel to a symbol that often needs the same change: classes sharing its parent\u002Finterface\u002Ftrait,",[170,195,196,199],{},[145,197,198],{},"resolutions",": Every place a concept (e.g. 'timezone', 'locale') is resolved, deterministically: assignment\u002Freturn sites",[170,201,202,205,206,209],{},[145,203,204],{},"roundtrip",": Heuristic (#88): does a stored property ",[145,207,208],{},"Type.prop"," round-trip through a lossy transform? Each write site with",[170,211,212,215,216,219],{},[145,213,214],{},"lint_async_state",": Heuristic (#88 phase 3); ",[145,217,218],{},"rules"," is a comma-separated subset (default all). stale-async-result: a write of",[170,221,222,225,226,229,230,233,234,233,237,240,241],{},[145,223,224],{},"readers",": Who reads a DB table, a column or a stored property. ",[145,227,228],{},"prop"," is ",[145,231,232],{},"table",", ",[145,235,236],{},"table:X",[145,238,239],{},"table.column"," \u002F ",[145,242,243],{},"column:table.column",[170,245,246,249,250,229,252,233,254,233,256,240,258],{},[145,247,248],{},"writers",": Who writes a DB table, a column or a stored property. ",[145,251,232],{},[145,253,232],{},[145,255,236],{},[145,257,239],{},[145,259,243],{},[170,261,262,265],{},[145,263,264],{},"channels",": Broadcast channels (Laravel Broadcast::channel, events' broadcastOn, Echo \u002F pusher-js subscriptions on a combined",[170,267,268,271],{},[145,269,270],{},"bridges",": Web \u002F native bridge calls: Capacitor plugins (registerPlugin \u002F Plugins.X -> @CapacitorPlugin @PluginMethod,",[170,273,274,277],{},[145,275,276],{},"protocol_links",": Every protocol endpoint in one view (#31 model): HTTP client endpoints and routes (http \u002F ws \u002F graphql), Pusher",[170,279,280,283],{},[145,281,282],{},"external_systems",": External systems the code connects to (#40): databases, caches, brokers, mail relays, directories, file-transfer",[170,285,286,289],{},[145,287,288],{},"attack_surface",": Security views over recorded facts (#47): findings plus the inbound \u002F outbound attack surface, with file:line",[170,291,292,295],{},[145,293,294],{},"llm_tools",": LLM tools and MCP primitives (#66): tools offered to a model (OpenAI \u002F Anthropic schema literals, LangChain @tool \u002F",[170,297,298,301],{},[145,299,300],{},"tests_covering",": Tests that exercise a symbol, route or table. DIRECT: the test code itself calls \u002F instantiates it or sends an",[170,303,304,307],{},[145,305,306],{},"affected",": Tests and entry points a change reaches. files are whole repo-relative paths; base is a git",[170,309,310,313],{},[145,311,312],{},"node",": Use to inspect a symbol without reading its file. Details of one node: kind, FQN, file:line span, module, entry kinds, docblock (PHPDoc), and edge counts",[170,315,316,319,320,323],{},[145,317,318],{},"snippet",": Use instead of opening a whole file. Source of one symbol: a ",[145,321,322],{},"path:start-end"," header then the body with line numbers. Resolves a",[170,325,326,329],{},[145,327,328],{},"search",": Use first to find a symbol instead of grep. Finds nodes by name \u002F FQN substring (case-insensitive), optionally filtered by kind",[170,331,332,335],{},[145,333,334],{},"explore",": Start here for a broad question (\"how does X work\") or a spec you have not pinned down.",[170,337,338,341],{},[145,339,340],{},"routes",": Use for route, auth and middleware questions. Routes with their middleware \u002F guards \u002F auth, in one call. Optional scope: writes=\"*\" (routes that reach any",[170,343,344,347],{},[145,345,346],{},"doctor",": What this cg installation can index: versions of cg and the tools it uses, whether the Node \u002F PHP \u002F Dart",[170,349,350,353],{},[145,351,352],{},"coverage",": Use when cg finds nothing or you need to know if a file is indexed. Which languages and files this index covers. Per language: parser mode (exact, heuristic only when an",[170,355,356,359],{},[145,357,358],{},"starters",": Starter queries derived from this graph, each with the tool call to run: the write route without an auth guard",[170,361,362,365],{},[145,363,364],{},"stats",": Index metadata and node\u002Fedge counts by kind.",[170,367,368,371],{},[145,369,370],{},"downstream",": Use to see what X ends up calling or reading (page -> routes -> tables). Forward dependencies of a node. On a combined graph a frontend page goes",[170,373,374,377],{},[145,375,376],{},"path",": Use to answer \"how does A reach B\". Shortest forward evidence chain from source to target (e.g. page:\u002Freports\u002F:id ->",[170,379,380,383],{},[145,381,382],{},"platforms",": Platform-specific code in this graph: the targets (declared in .cg.yaml platforms.targets, or detected from",[170,385,386,389],{},[145,387,388],{},"platform_divergence",": Where per-platform implementations diverge: VARIANTS (a symbol implemented per platform, by platform files,",[170,391,392,395],{},[145,393,394],{},"api_calls",": Frontend HTTP calls (method + path template) with call sites, request keys and the matched backend",[170,397,398,401],{},[145,399,400],{},"plan_list",": List planned-change files (plans\u002F*.yaml): name, status, title, counts, schema errors.",[170,403,404,407],{},[145,405,406],{},"plan_load",": Show one plan (name or path): planned nodes (+), modified targets with intent (~), planned edges, forbidden",[170,409,410,413],{},[145,411,412],{},"plan_validate",": Schema check + does every referenced existing node resolve in the graph (unresolved \u002F ambiguous specs with",[170,415,416,419],{},[145,417,418],{},"plan_check",": Deterministic check of a plan against the real graph. Default reply: a compact summary (counts per section and",[170,421,422,425],{},[145,423,424],{},"plan_baseline",": Fingerprint (sha1 of source lines) every modified target of a plan before implementing it, so",[170,427,428,431],{},[145,429,430],{},"index",": Use after editing so later answers see the change. Re-index (static analysis only: never boots the app or touches a database).",[170,433,434,437],{},[145,435,436],{},"graphs",": Use when unsure which graph a question belongs to. Lists the graphs this server can query: name, repo roots, languages, indexed commit and freshness.",[162,439,441,444],{"id":440},"stats-1337-chars",[145,442,443],{},"stats {}","  (1337 chars)",[446,447,452],"pre",{"className":448,"code":450,"language":451},[449],"language-text","project=bookstore-api+bookstore-web root=None indexed_at=\u003Cindexed_at> index_seconds=None\nnodes: method×53, column×30, class×27, config×18, property×14, route×14, request_key×12, external_class×10, http×10, env×8, function×7, module×6, script×6, composable×5, table×5, resolution×4, connection×3, page×3, setting×3, external×2, field×2, i18n×2, type×2, admin×1, channel×1, channel_sub×1, command×1, component×1, event×1, layout×1, store×1\nedges: CONTAINS×114, CALLS×30, READS_COLUMN×28(gated 1), EXTENDS×21, WRITES_COLUMN×20, VALIDATES×17, REFERENCES×16, READS_ENV×16, ROUTES_TO×14, READS_PROP×14, CONFIG_CONTAINS×14, READS_INPUT×12, HTTP_CALLS×10, WRITES_TABLE×8, CONNECTS_TO×7, USES_COMPOSABLE×6, FALLS_BACK_TO×6, CONFIGURED_BY×6, USES_CONNECTION×5(gated 1), MATCHES_ROUTE×5, INJECTS×5, VALIDATED_BY×4, MAPS_TO_TABLE×4, INSTANTIATES×4, HAS_RESOLUTION×4, HANDLED_BY×4, USES_LAYOUT×3, READS_SETTING×3, READS_CONFIG×3, WRITES_PROP×2, USES_TRAIT×2, USES_I18N×2, REGISTERS_CONNECTION×2, REFERS_TO×2, REFERENCES_TYPE×2, IMPORTS×2, WRITES_CONFIG×1, USES_STORE×1, SUBSCRIBES_CHANNEL×1, RENDERS×1, READS_TABLE×1, MENTIONS_COLUMN×1, MATCHES_CHANNEL×1, LISTENS_FOR×1, IMPLEMENTS×1, HAS_RELATION×1, DISPATCHES×1, BROADCASTS_ON×1, BINDS×1\ncoverage bookstore-api: php 32 exact\ncoverage bookstore-web: typescript 12 exact | generated: 4 files excluded\n","text",[145,453,450],{"__ignoreMap":454},"",[141,456,457,458,461,462],{},"structured ",[145,459,460],{},"completeness",": ",[145,463,464],{},"{\"complete\": true, \"languages\": {\"bookstore-api\u002Fphp\": {\"complete\": true, \"discovered\": 32, \"indexed\": 32, \"mode\": \"exact\"}, \"bookstore-web\u002Ftypescript\": {\"complete\": true, \"discovered\": 12, \"excluded\": 1, \"indexed\": 11, \"mode\": \"exact\"}}}",[162,466,468,471],{"id":467},"search-name-reserve-516-chars",[145,469,470],{},"search {'name': 'reserve'}","  (516 chars)",[446,473,476],{"className":474,"code":475,"language":451},[449],"route      route:POST \u002Fv1\u002Fstock\u002Freserve  bookstore-api\u002Froutes\u002Fapi.php:22\nmethod     method:App\\Services\\StockService::reserve  bookstore-api\u002Fapp\u002FServices\u002FStockService.php:10\nmethod     method:App\\Services\\StockService::reserveLocal  bookstore-api\u002Fapp\u002FServices\u002FStockService.php:20\nmethod     method:App\\Http\\Controllers\\StockController::reserve  bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FStockController.php:14\nmethod     method:App\\Services\\StockService::reserveFromWarehouse  bookstore-api\u002Fapp\u002FServices\u002FStockService.php:30\n",[145,477,475],{"__ignoreMap":454},[141,479,457,480,461,482],{},[145,481,460],{},[145,483,464],{},[162,485,487,490],{"id":486},"search-name-auth-217-chars",[145,488,489],{},"search {'name': 'auth'}","  (217 chars)",[446,492,495],{"className":493,"code":494,"language":451},[449],"middleware \u002F guards \u002F auth matching 'auth' (route attributes): 2 name(s) on 2 route(s)\n  auth:api  (middleware) on 1 route(s): POST \u002Fv1\u002Forders\n  auth:sanctum  (middleware) on 1 route(s): POST \u002Fv1\u002Forders\u002F{order}\u002Frefund\n",[145,496,494],{"__ignoreMap":454},[141,498,457,499,461,501],{},[145,500,460],{},[145,502,464],{},[162,504,506,509],{"id":505},"routes-writes-2509-chars",[145,507,508],{},"routes {'writes': '*'}","  (2509 chars)",[446,511,514],{"className":512,"code":513,"language":451},[449],"routes reaching a write (any table): 6 of 14 routes\nauth guard: 3 with, 3 without (auth = a framework preset auth guard or a name matching the auth pattern)\nauth guards by source: preset laravel 2\n\nDELETE \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002F{report}  @bookstore-api\u002Froutes\u002Fapi.php:15  NO AUTH\n    guards: (none)\n    writes orders via Services\\SalesReportService::remove conf=resolved  ROUTES_TO@api.php:15 → CALLS@ReportController.php:40~r → WRITES_TABLE@SalesReportService.php:24~r → table:orders\n    called from: page:app\u002Fpages\u002Findex.vue @index.vue:4\n\nPOST \u002Fv1\u002Fadmin\u002Fbooks  @bookstore-api\u002Froutes\u002Fapi.php:26  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::store conf=resolved  ROUTES_TO@api.php:26 → WRITES_COLUMN@BookController.php:15~r → column:books.store_id\n\nPUT \u002Fv1\u002Fadmin\u002Fbooks\u002F{id}  @bookstore-api\u002Froutes\u002Fapi.php:27  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::update conf=resolved  ROUTES_TO@api.php:27 → WRITES_TABLE@BookController.php:30~r → table:books\n\nPOST \u002Fv1\u002Fwarehouse\u002Fsync  @bookstore-api\u002Froutes\u002Fapi.php:29\n    guards: (none)\n    inline: ensureValidSecret (hash_equals config:bookstore.sync_secret) [secret] WarehouseSyncController::ensureValidSecret\n    writes orders via Http\\Controllers\\WarehouseSyncController::__invoke conf=resolved  ROUTES_TO@api.php:29 → WRITES_TABLE@WarehouseSyncController.php:13~r → table:orders\n\nPOST \u002Fv1\u002Forders  @bookstore-api\u002Froutes\u002Fapi.php:24\n    guards: auth:api [auth]\n    writes books via Services\\StockService::recordSale conf=resolved  ROUTES_TO@api.php:24 → CALLS@OrderController.php:26~r → WRITES_COLUMN@StockService.php:42~r → column:books.sold_count\n    writes orders via Http\\Controllers\\OrderController::store conf=resolved  ROUTES_TO@api.php:24 → WRITES_COLUMN@OrderController.php:20~r → column:orders.user_id\n\nPOST \u002Fv1\u002Forders\u002F{order}\u002Frefund  @bookstore-api\u002Froutes\u002Fapi.php:28\n    guards: auth:sanctum [auth]\n    inline: hasPermission('orders.refund') [permission] RefundController::store\n    writes orders via Http\\Controllers\\RefundController::store conf=resolved  ROUTES_TO@api.php:28 → WRITES_COLUMN@RefundController.php:13~r → column:orders.user_id\n\nguards: route-level and global enhancers per framework; Laravel kernel middleware and Django's MIDDLEWARE setting apply to every route and are not repeated per route.\ninline: access checks the handler runs before its own work (Laravel). --unguarded hides an unconditional one; --unguarded --strict counts route guards only.\n",[145,515,513],{"__ignoreMap":454},[141,517,457,518,461,520],{},[145,519,460],{},[145,521,464],{},[162,523,525,528],{"id":524},"routes-reaches-connectionwarehouse-unguarded-true-880-chars",[145,526,527],{},"routes {'reaches': ['connection:warehouse'], 'unguarded': True}","  (880 chars)",[446,530,533],{"className":531,"code":532,"language":451},[449],"routes reaching connection:warehouse: 3 of 14 routes | filter: no auth guard -> 2\nauth guard: 0 with, 2 without (auth = a framework preset auth guard or a name matching the auth pattern)\n\nGET \u002Fv1\u002F{store}\u002Fadmin\u002Finventory  @bookstore-api\u002Froutes\u002Fapi.php:16  NO AUTH\n    guards: (none)\n    reaches connection:warehouse [gated-only] conf=resolved  ROUTES_TO@api.php:16 → USES_CONNECTION@InventoryController.php:17~r → connection:warehouse\n\nPOST \u002Fv1\u002Fstock\u002Freserve  @bookstore-api\u002Froutes\u002Fapi.php:22  NO AUTH\n    guards: (none)\n    reaches connection:warehouse conf=resolved  ROUTES_TO@api.php:22 → CALLS@StockController.php:16~r → CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → connection:warehouse\n\nguards: route-level and global enhancers per framework; Laravel kernel middleware and Django's MIDDLEWARE setting apply to every route and are not repeated per route.\n",[145,534,532],{"__ignoreMap":454},[141,536,457,537,461,539],{},[145,538,460],{},[145,540,464],{},[162,542,544,547],{"id":543},"routes-writes-books-missing-authapi-866-chars",[145,545,546],{},"routes {'writes': 'books', 'missing': 'auth:api'}","  (866 chars)",[446,549,552],{"className":550,"code":551,"language":451},[449],"routes reaching a write to books: 3 of 14 routes | filter: missing a guard matching 'auth:api' -> 2\nauth guard: 0 with, 2 without (auth = a framework preset auth guard or a name matching the auth pattern)\n\nPOST \u002Fv1\u002Fadmin\u002Fbooks  @bookstore-api\u002Froutes\u002Fapi.php:26  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::store conf=resolved  ROUTES_TO@api.php:26 → WRITES_COLUMN@BookController.php:15~r → column:books.store_id\n\nPUT \u002Fv1\u002Fadmin\u002Fbooks\u002F{id}  @bookstore-api\u002Froutes\u002Fapi.php:27  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::update conf=resolved  ROUTES_TO@api.php:27 → WRITES_TABLE@BookController.php:30~r → table:books\n\nguards: route-level and global enhancers per framework; Laravel kernel middleware and Django's MIDDLEWARE setting apply to every route and are not repeated per route.\n",[145,553,551],{"__ignoreMap":454},[141,555,457,556,461,558],{},[145,557,460],{},[145,559,464],{},[162,561,563,566],{"id":562},"reaches-targets-connectionwarehouse-tablewarehouse_stock-max_per_group-12-1531-chars",[145,564,565],{},"reaches {'targets': ['connection:warehouse', 'table:warehouse_stock'], 'max_per_group': 12}","  (1531 chars)",[446,568,571],{"className":569,"code":570,"language":451},[449],"targets: connection:warehouse→1, table:warehouse_stock→1 | gate=new_inventory | conf>=heuristic\ndependents: 7 code (operator 1, runtime 5, gated 1); entry points 4 (3 live): command×1, route×3\n\n## RUNTIME (5)\n[Http\u002FControllers]\n  Http\\Controllers\\OrderController::store  route×1 d3  CALLS@OrderController.php:19~r → CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → connection:warehouse\n  Http\\Controllers\\StockController::reserve  route×1 d3  CALLS@StockController.php:16~r → CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → connection:warehouse\n[Models\u002FWarehouse]\n  Models\\Warehouse\\WarehouseItem::isSoldOut  route×2 d1  READS_COLUMN@WarehouseItem.php:16~h conn=warehouse → column:warehouse_stock.stock\n[Services]\n  Services\\StockService::reserveFromWarehouse  route×2 d1  USES_CONNECTION@StockService.php:32~r → connection:warehouse\n  Services\\StockService::reserve  route×2 d2  CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → connection:warehouse\n\n## OPERATOR (1)\n[Console\u002FCommands]\n  Console\\Commands\\SyncWarehouseCommand::handle  cmd×1 d1  READS_TABLE@SyncWarehouseCommand.php:16~r conn=warehouse → table:warehouse_stock\n\n## GATED (1)\n[Http\u002FControllers\u002FAdmin]\n  Http\\Controllers\\Admin\\InventoryController::index  route×1 d1  gated_target guard InventoryController.php:16 hop USES_CONNECTION@InventoryController.php:17\n\n## ENTRY POINTS (4)\ncommand (1): bookstore:sync-warehouse\nroute (3): GET \u002Fv1\u002F{store}\u002Fadmin\u002Finventory [gated]; POST \u002Fv1\u002Forders; POST \u002Fv1\u002Fstock\u002Freserve\n",[145,572,570],{"__ignoreMap":454},[141,574,457,575,461,577],{},[145,576,460],{},[145,578,579],{},"{\"complete\": true, \"languages\": {\"bookstore-api\u002Fphp\": {\"complete\": true, \"discovered\": 32, \"indexed\": 32, \"mode\": \"exact\"}}}",[162,581,583,586],{"id":582},"reaches-targets-envwarehouse_db_-group_by-entry_kind-1711-chars",[145,584,585],{},"reaches {'targets': ['env:WAREHOUSE_DB_*'], 'group_by': 'entry_kind'}","  (1711 chars)",[446,588,591],{"className":589,"code":590,"language":451},[449],"targets: env:WAREHOUSE_DB_*→2 | gate=new_inventory | conf>=heuristic\ndependents: 7 code (no-entry 1, operator 1, runtime 4, gated 1); entry points 4 (3 live): command×1, route×3\n\n## RUNTIME (4)\n[route]\n  Services\\StockService::reserveFromWarehouse  route×2 d3  USES_CONNECTION@StockService.php:32~r → CONNECTS_TO@database.php:11~h → CONFIGURED_BY@None:None~h → env:WAREHOUSE_DB_HOST\n  Services\\StockService::reserve  route×2 d4  CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → CONNECTS_TO@database.php:11~h → CONFIGURED_BY@None:None~h → env:WAREHOUSE_DB_HOST\n  Http\\Controllers\\OrderController::store  route×1 d5  CALLS@OrderController.php:19~r → CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → CONNECTS_TO@database.php:11~h → CONFIGURED_BY@None:None~h → env:WAREHOUSE_DB_HOST\n  Http\\Controllers\\StockController::reserve  route×1 d5  CALLS@StockController.php:16~r → CALLS@StockService.php:17 → USES_CONNECTION@StockService.php:32~r → CONNECTS_TO@database.php:11~h → CONFIGURED_BY@None:None~h → env:WAREHOUSE_DB_HOST\n\n## OPERATOR (1)\n[cmd]\n  Console\\Commands\\SyncWarehouseCommand::handle  cmd×1 d3  READS_TABLE@SyncWarehouseCommand.php:16~r conn=warehouse → CONNECTS_TO@None:None~h → CONFIGURED_BY@None:None~h → env:WAREHOUSE_DB_HOST\n\n## GATED (1)\n[route]\n  Http\\Controllers\\Admin\\InventoryController::index  route×1 d3  gated_target guard InventoryController.php:16 hop USES_CONNECTION@InventoryController.php:17\n\n## NO-ENTRY (1)\n[-]\n  script:config\u002Fdatabase.php  - d1  READS_ENV@database.php:13 → env:WAREHOUSE_DB_HOST\n\n## ENTRY POINTS (4)\ncommand (1): bookstore:sync-warehouse\nroute (3): GET \u002Fv1\u002F{store}\u002Fadmin\u002Finventory [gated]; POST \u002Fv1\u002Forders; POST \u002Fv1\u002Fstock\u002Freserve\n",[145,592,590],{"__ignoreMap":454},[141,594,457,595,461,597],{},[145,596,460],{},[145,598,579],{},[162,600,602,605],{"id":601},"impact-method-stockservicerecordsale-248-chars",[145,603,604],{},"impact {'method': 'StockService::recordSale'}","  (248 chars)",[446,607,610],{"className":608,"code":609,"language":451},[449],"targets: Services\\StockService::recordSale\ntransitive callers: 1; entry points: 1\n\n## http_route (1)\n  POST \u002Fv1\u002Forders  ROUTES_TO@api.php:24 → CALLS@OrderController.php:26~r → Services\\StockService::recordSale\n\ncallers by module: Http\u002FControllers×1\n",[145,611,609],{"__ignoreMap":454},[141,613,457,614,461,616],{},[145,615,460],{},[145,617,579],{},[162,619,621,624],{"id":620},"callers-symbol-stockservicereserve-219-chars",[145,622,623],{},"callers {'symbol': 'StockService::reserve'}","  (219 chars)",[446,626,629],{"className":627,"code":628,"language":451},[449],"targets: Services\\StockService::reserve\ndirect callers: 2 (2 sites)\n  Http\\Controllers\\OrderController::store  CALLS@OrderController.php:19 ~r\n  Http\\Controllers\\StockController::reserve  CALLS@StockController.php:16 ~r\n",[145,630,628],{"__ignoreMap":454},[141,632,457,633,461,635],{},[145,634,460],{},[145,636,579],{},[162,638,640,643],{"id":639},"tests_covering-target-stockservicereserve-382-chars",[145,641,642],{},"tests_covering {'target': 'StockService::reserve'}","  (382 chars)",[446,645,648],{"className":646,"code":647,"language":451},[449],"targets: 1 node(s): Services\\StockService::reserve\ntests: 0 direct, 0 nearby transitive (app depth \u003C= 3) (of 0 test cases in the graph)\nno indexed test reaches the target (the graph has no test code: no test files or test cases were indexed)\ncoverage: every source file cg found is indexed (php, typescript); code outside these languages or generated at runtime is not in the graph.\n",[145,649,647],{"__ignoreMap":454},[141,651,457,652,461,654],{},[145,653,460],{},[145,655,579],{},[162,657,659,662],{"id":658},"coverage-553-chars",[145,660,661],{},"coverage {}","  (553 chars)",[446,664,667],{"className":665,"code":666,"language":451},[449],"coverage bookstore-api: php 32 exact\n  frameworks: laravel | presets: common, php, laravel | config: no .cg.yaml\ncoverage bookstore-web: typescript 12 exact | generated: 4 files excluded\n  frameworks: nuxt | presets: common, typescript, nuxt | config: no .cg.yaml\n  generated: 4 files excluded (Nuxt build output (.nuxt\u002F) 4)\n    Nuxt build output (.nuxt\u002F): .nuxt\u002Faxios-shim.d.ts, .nuxt\u002Fnuxt.d.ts, .nuxt\u002Ftypes\u002Fcomponents.d.ts, .nuxt\u002Ftypes\u002Fimports.d.ts\nevery source file cg found is indexed; edges still carry their own exact \u002F resolved \u002F heuristic label.\n",[145,668,666],{"__ignoreMap":454},[141,670,457,671,461,673],{},[145,672,460],{},[145,674,464],{},[162,676,678,681],{"id":677},"siblings-symbol-stockservicereservelocal-limit-6-478-chars",[145,679,680],{},"siblings {'symbol': 'StockService::reserveLocal', 'limit': 6}","  (478 chars)",[446,683,686],{"className":684,"code":685,"language":451},[449],"target: Services\\StockService::reserveLocal\nshared resources:\n  Http\\Controllers\\Admin\\BookController::store: column:books.is_active, column:books.isbn, column:books.price\n  Http\\Controllers\\Admin\\BookController::update: column:books.is_active, column:books.isbn, column:books.price\n  Services\\StockService::recordSale: column:books.id\n  Http\\Controllers\\Admin\\InventoryController::index: column:books.is_active\n  Console\\Commands\\SyncWarehouseCommand::handle: column:books.isbn\n",[145,687,685],{"__ignoreMap":454},[141,689,457,690,461,692],{},[145,691,460],{},[145,693,464],{},[162,695,697,700],{"id":696},"siblings-symbol-stockservicereserve-793-chars",[145,698,699],{},"siblings {'symbol': 'StockService::reserve'}","  (793 chars)",[446,702,705],{"className":703,"code":704,"language":451},[449],"target: Services\\StockService::reserve\nno siblings found for Services\\StockService::reserve: its class has no parent class, interface or trait shared with other classes; it touches no table, column, config, env key or connection directly; all 2 of its callees are in its own class, which co-caller matching skips.\ntry: siblings('Services\\StockService::reserveLocal') (a callee that touches data); siblings('Services\\StockService::reserveFromWarehouse') (a callee that touches data); impact('Services\\StockService::reserve') for its callers and entry points; downstream('Services\\StockService::reserve') for the tables, config and connections it reaches\ncoverage: every source file cg found is indexed (php, typescript); code outside these languages or generated at runtime is not in the graph.\n",[145,706,704],{"__ignoreMap":454},[141,708,457,709,461,711],{},[145,710,460],{},[145,712,464],{},[162,714,716,719],{"id":715},"writers-table-books-605-chars",[145,717,718],{},"writers {'table': 'books'}","  (605 chars)",[446,721,724],{"className":722,"code":723,"language":451},[449],"table books: 17 write edges from 4 writers\n[Console\u002FCommands]\n  Console\\Commands\\SyncWarehouseCommand::handle  cmd×1  cols: (row)  @ SyncWarehouseCommand.php:19  conf=resolved\n[Http\u002FControllers\u002FAdmin]\n  Http\\Controllers\\Admin\\BookController::store  route×1  cols: is_active,isbn,price,stock,store_id,title  @ BookController.php:15  conf=resolved\n  Http\\Controllers\\Admin\\BookController::update  route×1  cols: age_rating,is_active,isbn,price,stock,title  @ BookController.php:30  conf=resolved\n[Services]\n  Services\\StockService::recordSale  route×1  cols: sold_count  @ StockService.php:42  conf=resolved\n",[145,725,723],{"__ignoreMap":454},[141,727,457,728,461,730],{},[145,729,460],{},[145,731,464],{},[162,733,735,738],{"id":734},"writers-table-booksage_rating-441-chars",[145,736,737],{},"writers {'table': 'books.age_rating'}","  (441 chars)",[446,740,743],{"className":741,"code":742,"language":451},[449],"column books.age_rating: 2 write edges from 2 writers\n[Http\u002FControllers\u002FAdmin]\n  App\\Http\\Controllers\\Admin\\BookController::update  WRITES_COLUMN column:books.age_rating  @BookController.php:30 (resolved)  entries: http_route\ntable-level writes of books (columns not recorded):\n[Console\u002FCommands]\n  App\\Console\\Commands\\SyncWarehouseCommand::handle  WRITES_TABLE table:books  @SyncWarehouseCommand.php:19 (resolved)  entries: artisan_command\n",[145,744,742],{"__ignoreMap":454},[141,746,457,747,461,749],{},[145,748,460],{},[145,750,464],{},[162,752,754,757],{"id":753},"readers-prop-booksis_active-374-chars",[145,755,756],{},"readers {'prop': 'books.is_active'}","  (374 chars)",[446,759,762],{"className":760,"code":761,"language":451},[449],"column books.is_active: 2 read edges from 2 readers\n[Http\u002FControllers\u002FAdmin]\n  App\\Http\\Controllers\\Admin\\InventoryController::index  READS_COLUMN column:books.is_active  @InventoryController.php:20 (resolved)  entries: http_route\n[Services]\n  App\\Services\\StockService::reserveLocal  READS_COLUMN column:books.is_active  @StockService.php:22 (resolved)  entries: http_route\n",[145,763,761],{"__ignoreMap":454},[141,765,457,766,461,768],{},[145,767,460],{},[145,769,464],{},[162,771,773,776],{"id":772},"readers-prop-bookstitel-158-chars",[145,774,775],{},"readers {'prop': 'books.titel'}","  (158 chars)",[446,778,781],{"className":779,"code":780,"language":451},[449],"table books has no column 'titel'; similar: title. columns: id, store_id, isbn, title, price, is_active, stock, sold_count, age_rating, created_at, updated_at\n",[145,782,780],{"__ignoreMap":454},[141,784,457,785,461,787],{},[145,786,460],{},[145,788,464],{},[162,790,792,795],{"id":791},"node-id_or_symbol-apphttpcontrollersadmininventorycontrollerindex-675-chars",[145,793,794],{},"node {'id_or_symbol': 'App\\\\Http\\\\Controllers\\\\Admin\\\\InventoryController::index'}","  (675 chars)",[446,797,800],{"className":798,"code":799,"language":451},[449],"method:App\\Http\\Controllers\\Admin\\InventoryController::index\nkind=method module=Http\u002FControllers\u002FAdmin at bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FAdmin\u002FInventoryController.php:13-21\nreached by: route×1\nattrs: {\"repo\":\"bookstore-api\"}\ndoc:\n\u002F** Stock list; stores still on the old warehouse read it from there. *\u002F\nout: CALLS×1, READS_COLUMN×2, READS_SETTING×1, USES_CONNECTION×1\n  CALLS: Models\\Store::getSetting@16\n  READS_COLUMN: column:warehouse_stock.is_active@17!g; column:books.is_active@20\n  READS_SETTING: setting:features.new_inventory.enabled@16\n  USES_CONNECTION: connection:warehouse@17!g\nin: CONTAINS×1, ROUTES_TO×1\n  ROUTES_TO: route:GET \u002Fv1\u002F{store}\u002Fadmin\u002Finventory@16\n",[145,801,799],{"__ignoreMap":454},[141,803,457,804,461,806],{},[145,805,460],{},[145,807,464],{},[162,809,811,814],{"id":810},"path-source-page-target-salesreportserviceremove-460-chars",[145,812,813],{},"path {'source': 'page:\u002F', 'target': 'SalesReportService::remove'}","  (460 chars)",[446,816,819],{"className":817,"code":818,"language":451},[449],"page:app\u002Fpages\u002Findex.vue\n  -HTTP_CALLS[resolved @ bookstore-web\u002Fapp\u002Fpages\u002Findex.vue:4]-> http:DELETE \u002Fapi\u002Fv1\u002Fmain\u002Fadmin\u002Freports\u002F{id}\n  -MATCHES_ROUTE[resolved @ bookstore-api\u002Froutes\u002Fapi.php:15]-> route:DELETE \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002F{report}\n  -ROUTES_TO[exact @ bookstore-api\u002Froutes\u002Fapi.php:15]-> Http\\Controllers\\ReportController::destroy\n  -CALLS[resolved @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FReportController.php:40]-> Services\\SalesReportService::remove\n",[145,820,818],{"__ignoreMap":454},[141,822,457,823,461,825],{},[145,824,460],{},[145,826,464],{},[162,828,830,833],{"id":829},"downstream-target-pagereportsid-max_per_kind-10-570-chars",[145,831,832],{},"downstream {'target': 'page:\u002Freports\u002F:id', 'max_per_kind': 10}","  (570 chars)",[446,835,838],{"className":836,"code":837,"language":451},[449],"targets: page:app\u002Fpages\u002Freports\u002F[id].vue | reached 35 nodes | gate=new_inventory\ntables touched (2): orders, stores\n\n## route (2)\n  route:GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop d3  CALLS@[id].vue:10~r → HTTP_CALLS@useReports.ts:9~r → MATCHES_ROUTE@api.php:12~r → route:GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop\n  route:GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop\u002Fexport.{format} d3  CALLS@[id].vue:19~r → HTTP_CALLS@useReports.ts:12~r → MATCHES_ROUTE@api.php:14~r → route:GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop\u002Fexport.{format}\n\n## column (2)\n  column:orders.placed_at d7\n  column:stores.settings d8\n",[145,839,837],{"__ignoreMap":454},[141,841,457,842,461,844],{},[145,843,460],{},[145,845,464],{},[162,847,849,852],{"id":848},"api_calls-filter-unmatched-692-chars",[145,850,851],{},"api_calls {'filter': 'unmatched'}","  (692 chars)",[446,854,857],{"className":855,"code":856,"language":451},[449],"5 client endpoints (0 matched)\nGET \u002Fapi\u002Fv1\u002Fmain\u002Fadmin\u002Fsession  ⇒ UNMATCHED\n   ← useSessionStore.load (useSessionStore.ts) @ useSessionStore.ts:7\nGET \u002Fversion.json  ⇒ UNMATCHED\n   ← useAppVersion (useReports.ts) @ useReports.ts:19\n      query keys: t\nPOST \u002Fpayments  ⇒ UNMATCHED\n   ← Services\\PaymentsClient::createPayment @ PaymentsClient.php:14 via PaymentsClient::request\n      body keys: order_id, amount\nPOST \u002Fpayments\u002F{id}\u002Fcancel  ⇒ UNMATCHED\n   ← Services\\PaymentsClient::cancelPayment @ PaymentsClient.php:19 via PaymentsClient::request\nPOST \u002Frefunds  ⇒ UNMATCHED\n   ← Services\\PaymentsClient::createRefund @ PaymentsClient.php:24 via PaymentsClient::send\n      body keys: reason, note\n",[145,858,856],{"__ignoreMap":454},[141,860,457,861,461,863],{},[145,862,460],{},[145,864,464],{},[162,866,868,871],{"id":867},"resolutions-concept-timezone-2934-chars",[145,869,870],{},"resolutions {'concept': 'timezone'}","  (2934 chars)",[446,873,876],{"className":874,"code":875,"language":451},[449],"concept: timezone (head-word forms: timezone, timezones)\nbackend resolution sites: 2 in 2 distinct fallback chains; request keys of the concept: timezone; request-driven chains: A, B\n\n== FALLBACK CHAINS (deterministic, grouped by signature)\n[A] input:timezone > column:orders.customer_timezone > setting:locale.timezone > column:stores.default_timezone > 'UTC'   (1 site)\n    ReportController::resolveTimezone  return  (returns)  @bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FReportController.php:43\n        1. request key 'timezone' via $validated[...] (param $explicit from 1 call site(s))  @app\u002FHttp\u002FControllers\u002FReportController.php:28\n        2. column orders.customer_timezone (->value() (argument of Http\\Controllers\\ReportController::summary))  @app\u002FHttp\u002FControllers\u002FReportController.php:49\n        3. setting 'locale.timezone' (Store::getSetting) default '' [trim]  @app\u002FHttp\u002FControllers\u002FReportController.php:54\n        4. column stores.default_timezone (Store->default_timezone) [trim]  @app\u002FHttp\u002FControllers\u002FReportController.php:58\n        5. literal 'UTC'  @app\u002FHttp\u002FControllers\u002FReportController.php:64\n        reached from 1 route(s): GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Fsummary\n[B] input:timezone > setting:reports.timezone > 'UTC'   (1 site)\n    SalesReportService::build  $timezone  (expr)  @bookstore-api\u002Fapp\u002FServices\u002FSalesReportService.php:17\n        1. request key 'timezone' via $filters[...]; flow: Services\\SalesReportService::report @app\u002FServices\u002FSalesReportService.php:12 passes param $filters \u003C- Http\\Controllers\\ReportController::top @app\u002FHttp\u002FControllers\u002FReportController.php:21 passes $request->validated()  @app\u002FServices\u002FSalesReportService.php:17\n        2. setting 'reports.timezone' (Store::getSetting) default 'UTC'  @app\u002FServices\u002FSalesReportService.php:17\n        3. literal 'UTC' (getSetting default)  @app\u002FServices\u002FSalesReportService.php:17\n        reached from 1 route(s): GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop\n\n== DIVERGENCE between request-driven chains (A, B)\n  [A] vs [B]: same up to input:timezone; then [A] column:orders.customer_timezone vs [B] setting:reports.timezone; same final fallback 'UTC'\n\n== CLIENT (frontend endpoints reaching request-driven sites)\n  GET \u002Fapi\u002Fv1\u002Fmain\u002Fadmin\u002Freports\u002Ftop  -> chain B via GET \u002Fv1\u002F{store}\u002Fadmin\u002Freports\u002Ftop\n     app\u002Fcomposables\u002FuseReports.ts#useReports.fetchTop @bookstore-web\u002Fapp\u002Fcomposables\u002FuseReports.ts:9 (1 caller(s)) => 'timezone': never sent (builder key is conditional and no call site passes it); client fallback @bookstore-web\u002Fapp\u002Fpages\u002Freports\u002F[id].vue:12: rows.value[0]?.timezone ?? 'UTC'\n\n== SENT BUT NOT FORWARDED (a call site passes the key; the request it calls never sends it)\n  app\u002Fpages\u002Freports\u002F[id].vue @bookstore-web\u002Fapp\u002Fpages\u002Freports\u002F[id].vue:10 passes date_from to app\u002Fcomposables\u002FuseReports.ts#useReports.fetchTop; the request @bookstore-web\u002Fapp\u002Fcomposables\u002FuseReports.ts:9 (GET \u002Fapi\u002Fv1\u002Fmain\u002Fadmin\u002Freports\u002Ftop) sends only category_id, mode, timezone\n",[145,877,875],{"__ignoreMap":454},[141,879,457,880,461,882],{},[145,881,460],{},[145,883,464],{},[162,885,887,890],{"id":886},"plan_list-180-chars",[145,888,889],{},"plan_list {}","  (180 chars)",[446,892,895],{"className":893,"code":894,"language":451},[449],"preorders [agreed] Pre-order books: signed-in customers only, never filled from warehouse stock | +1 nodes ~3 modified +3 edges 1 forbidden 1 required | issues #7 | schema errors 0\n",[145,896,894],{"__ignoreMap":454},[141,898,457,899,461,901],{},[145,900,460],{},[145,902,464],{},[162,904,906,909],{"id":905},"plan_check-name-preorders-2193-chars",[145,907,908],{},"plan_check {'name': 'preorders'}","  (2193 chars)",[446,911,914],{"className":912,"code":913,"language":451},[449],"PLAN CHECK preorders [plan mode] Pre-order books: signed-in customers only, never filled from warehouse stock\nplan examples\u002Fplans\u002Fpreorders.yaml | graph bookstore-api+bookstore-web indexed \u003Cindexed_at>\nsummary: refs 15\u002F15 resolve | MISSING FROM PLAN 10 | review 10 | covered 7 | forbidden paths present 1 | open findings touching 2 (unlinked 1) | requirements failed 1\nrequire POST \u002Fv1\u002Fstock\u002Freserve: MISSING auth:api (has none @api.php:22)\nmiddleware: POST \u002Fv1\u002Fstock\u002Freserve lacks auth:api which peer route(s) POST \u002Fv1\u002Forders have\n\n2 MISSING FROM PLAN (10) by check: caller 2, entry_point 2, admin_surface 1, api_resource 1, external_client 1, model_fillable 1, table_writer 1, validation 1\n  - [admin_surface] Filament\\Resources\\BookResource::form: Filament form for Book ($model @BookResource.php:11); saves bypass the graph's WRITES edges — must expose preorder_until @ bookstore-api\u002Fapp\u002FFilament\u002FResources\u002FBookResource.php:13\n  - [api_resource] Http\\Resources\\BookResource::toArray: serializes Book in API responses (built at BookController.php:24, BookController.php:32); decide whether to expose preorder_until @ bookstore-api\u002Fapp\u002FHttp\u002FResources\u002FBookResource.php:9\n  - [caller] OrderController::store: calls modified StockService::reserve @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FOrderController.php:19\n  - [caller] StockController::reserve: calls modified StockService::reserve @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FStockController.php:16\n  - [entry_point] route:POST \u002Fv1\u002Fadmin\u002Fbooks: http_route reaching modified Admin\\BookController::store @ bookstore-api\u002Froutes\u002Fapi.php:26\n  … +5 more\n  REVIEW (10) by check: table_reader 3, parallel_method 2, text_mention 2, referencing_column 1, relation 1, table_writer 1\n\n3 CONFLICTS\n  forbid no-warehouse-for-preorders: path STILL PRESENT (when the book is a pre-order (books.preorder_until set))\n  #7 [open, linked in plan] Pre-orders can be reserved without an account\n  #8 [open, NOT LINKED in plan] Sold-out check ignores pending reservations\n  #9 [closed, touches gaps only] Order book relation (closed)\n\ndetails=true for every item with file:line evidence and call chains (CLI: plan check without --summary); max_items=N shows more top items.\n",[145,915,913],{"__ignoreMap":454},[141,917,457,918,461,920],{},[145,919,460],{},[145,921,579],{},[162,923,925,928],{"id":924},"plan_check-name-preorders-details-true-max_items-30-5991-chars",[145,926,927],{},"plan_check {'name': 'preorders', 'details': True, 'max_items': 30}","  (5991 chars)",[446,930,933],{"className":931,"code":932,"language":451},[449],"PLAN CHECK preorders [plan mode] Pre-order books: signed-in customers only, never filled from warehouse stock\ngraph bookstore-api+bookstore-web indexed \u003Cindexed_at>; plan examples\u002Fplans\u002Fpreorders.yaml\nsummary: refs 15\u002F15 resolve | MISSING FROM PLAN 10 | review 10 | covered 7 | forbidden paths present 1 | open findings touching 2 (unlinked 1) | requirements failed 1\n\n1 RESOLVE: all plan references resolve to graph nodes\n  planned column:books.preorder_until: new\n  changed tables: books (+preorder_until)\n  modified: StockService::reserve, StockService::reserveLocal, Admin\\BookController::store\n  require POST \u002Fv1\u002Fstock\u002Freserve [auth:api]: MISSING auth:api (has  @api.php:22)\n  middleware: POST \u002Fv1\u002Fstock\u002Freserve lacks auth:api which peer route(s) POST \u002Fv1\u002Forders have (both reach StockService::reserve)\n\n2 MISSING FROM PLAN (10): affected by the planned change, not covered by any plan entry\n  - [admin_surface] Filament\\Resources\\BookResource::form: Filament form for Book ($model @BookResource.php:11); saves bypass the graph's WRITES edges — must expose preorder_until\n      @ bookstore-api\u002Fapp\u002FFilament\u002FResources\u002FBookResource.php:13\n  - [api_resource] Http\\Resources\\BookResource::toArray: serializes Book in API responses (built at BookController.php:24, BookController.php:32); decide whether to expose preorder_until\n      @ bookstore-api\u002Fapp\u002FHttp\u002FResources\u002FBookResource.php:9, bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FAdmin\u002FBookController.php:24, bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FAdmin\u002FBookController.php:32\n  - [caller] OrderController::store: calls modified StockService::reserve\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FOrderController.php:19\n  - [caller] StockController::reserve: calls modified StockService::reserve\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FStockController.php:16\n  - [entry_point] route:POST \u002Fv1\u002Fadmin\u002Fbooks: http_route reaching modified Admin\\BookController::store\n      @ bookstore-api\u002Froutes\u002Fapi.php:26\n  - [entry_point] route:POST \u002Fv1\u002Forders: http_route reaching modified StockService::reserve\n      @ bookstore-api\u002Froutes\u002Fapi.php:24\n  - [external_client] client:example\u002Fbookstore-mobile\u002Fpages\u002Fcart.vue: POST \u002Fstock\u002Freserve -> POST \u002Fv1\u002Fstock\u002Freserve [snapshot, read]; sends isbn\n      @ example\u002Fbookstore-mobile@4f2c9e1:pages\u002Fcart.vue:12\n  - [model_fillable] Book::$fillable [property]: Book::$fillable lacks preorder_until (mass assignment would drop it)\n      @ bookstore-api\u002Fapp\u002FModels\u002FBook.php:9\n  - [table_writer] Admin\\BookController::update: writes books (age_rating, is_active, isbn, price, stock…); must set\u002Fkeep new preorder_until [bypasses StockService::reserve]\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FAdmin\u002FBookController.php:30\n  - [validation] Admin\\UpdateBookRequest::rules: validates 6 books fields (age_rating, is_active, isbn, price…) but not preorder_until\n      @ bookstore-api\u002Fapp\u002FHttp\u002FRequests\u002FAdmin\u002FUpdateBookRequest.php:11\n  REVIEW (10): related; confirm unaffected or add to covers\u002Fout_of_scope\n  - [parallel_method] Warehouse\\WarehouseItem::isSoldOut: mirror of Book::isSoldOut; reached from modified code\n      @ bookstore-api\u002Fapp\u002FModels\u002FWarehouse\u002FWarehouseItem.php:14\n  - [parallel_method] StockService::reserveFromWarehouse: same-class sibling of modified StockService::reserve (reserve*)\n      @ bookstore-api\u002Fapp\u002FServices\u002FStockService.php:30\n  - [referencing_column] OrderController::store: writes column orders.book_id (refers to books)\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FOrderController.php:20\n  - [relation] Order::book: Eloquent relation to Book\n      @ bookstore-api\u002Fapp\u002FModels\u002FOrder.php:15\n  - [table_reader] Admin\\InventoryController::index: reads books (is_active) [bypasses StockService::reserve]\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FAdmin\u002FInventoryController.php:20\n  - [table_reader] Book::isSoldOut: reads books (sold_count, stock)\n      @ bookstore-api\u002Fapp\u002FModels\u002FBook.php:13\n  - [table_reader] ArchiveService::legacyBooks: reads books (store_id) [bypasses StockService::reserve]\n      @ bookstore-api\u002Fapp\u002FServices\u002FArchiveService.php:13\n  - [table_writer] SyncWarehouseCommand::handle: writes books (row) [bypasses StockService::reserve]\n      @ bookstore-api\u002Fapp\u002FConsole\u002FCommands\u002FSyncWarehouseCommand.php:19\n  - [text_mention] OrderController::place: mentions book_id (text-match, no graph edge)\n      @ bookstore-api\u002Fapp\u002FHttp\u002FControllers\u002FOrderController.php:36\n  - [text_mention] StoreOrderRequest::rules: mentions book_id (text-match, no graph edge)\n      @ bookstore-api\u002Fapp\u002FHttp\u002FRequests\u002FStoreOrderRequest.php:12\n  COVERED by plan (7 items, 7 nodes): Admin\\BookController::store, Admin\\StoreBookRequest::rules, StockService::recordSale, StockService::reserve, StockService::reserveLocal, route:POST \u002Fv1\u002Fstock\u002Freserve, table:warehouse_stock\n  PRECEDENT atomic counter \u002Fincrement\\(\u002F: 1 hit(s)\n    StockService::recordSale @StockService.php:42: Book::where('id', $bookId)->increment('sold_count');\n\n3 CONFLICTS\n  forbid no-warehouse-for-preorders: path STILL PRESENT (when the book is a pre-order (books.preorder_until set)); guard (StockService::reserve reads column:books.preorder_until): ABSENT\n    StockService::reserve -CALLS@StockService.php:17-> StockService::reserveFromWarehouse -READS_COLUMN@StockService.php:32-> column:warehouse_stock.is_active\n  #7 [open, linked in plan] Pre-orders can be reserved without an account\n    StockService::reserve* L10-18\n  #8 [open, NOT LINKED in plan] Sold-out check ignores pending reservations\n    StockService::reserveLocal* L22\n  #9 [closed, touches gaps only] Order book relation (closed)\n    Order::book L13\n    (* = node the plan modifies\u002Freferences)\n\nENTRY CHAINS (entry point -> modified code)\n  route:POST \u002Fv1\u002Fadmin\u002Fbooks -ROUTES_TO@api.php:26-> Admin\\BookController::store\n  route:POST \u002Fv1\u002Forders -ROUTES_TO@api.php:24-> OrderController::store -CALLS@OrderController.php:19-> StockService::reserve\n  route:POST \u002Fv1\u002Fstock\u002Freserve -ROUTES_TO@api.php:22-> StockController::reserve -CALLS@StockController.php:16-> StockService::reserve\n",[145,934,932],{"__ignoreMap":454},[141,936,457,937,461,939],{},[145,938,460],{},[145,940,579],{},[162,942,944,947],{"id":943},"index-gating-fixture-temp-db-554-chars",[145,945,946],{},"index (gating fixture, temp db)","  (554 chars)",[446,949,952],{"className":950,"code":951,"language":451},[449],"indexed tests\u002Fgating_fixture -> fixture.db: 25 nodes, 78 edges in \u003Cs>s; gated edges {'new_inventory': 20}\nproject=gating_fixture root=tests\u002Fgating_fixture indexed_at=\u003Cindexed_at> index_seconds=\u003Cs>\nnodes: method×16, class×5, property×3, constant×1\nedges: CALLS×30(gated 10), READS_PROP×23(gated 10), CONTAINS×20, INJECTS×3, USES_VALUE×1, REFERENCES×1\ngate predicates: [new_inventory] Support\\FeatureGate::oldMode=false; [new_inventory] Support\\FeatureGate::usesNewInventory=true; [new_inventory] Support\\Flags::on=true\ncoverage gating_fixture: php 1 exact\n",[145,953,951],{"__ignoreMap":454},{"title":454,"searchDepth":955,"depth":956,"links":957},4,2,[958,959,961,963,965,967,969,971,973,975,977,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1009,1011],{"id":164,"depth":956,"text":165},{"id":440,"depth":956,"text":960},"stats {}  (1337 chars)",{"id":467,"depth":956,"text":962},"search {'name': 'reserve'}  (516 chars)",{"id":486,"depth":956,"text":964},"search {'name': 'auth'}  (217 chars)",{"id":505,"depth":956,"text":966},"routes {'writes': '*'}  (2509 chars)",{"id":524,"depth":956,"text":968},"routes {'reaches': ['connection:warehouse'], 'unguarded': True}  (880 chars)",{"id":543,"depth":956,"text":970},"routes {'writes': 'books', 'missing': 'auth:api'}  (866 chars)",{"id":562,"depth":956,"text":972},"reaches {'targets': ['connection:warehouse', 'table:warehouse_stock'], 'max_per_group': 12}  (1531 chars)",{"id":582,"depth":956,"text":974},"reaches {'targets': ['env:WAREHOUSE_DB_*'], 'group_by': 'entry_kind'}  (1711 chars)",{"id":601,"depth":956,"text":976},"impact {'method': 'StockService::recordSale'}  (248 chars)",{"id":620,"depth":956,"text":978},"callers {'symbol': 'StockService::reserve'}  (219 chars)",{"id":639,"depth":956,"text":980},"tests_covering {'target': 'StockService::reserve'}  (382 chars)",{"id":658,"depth":956,"text":982},"coverage {}  (553 chars)",{"id":677,"depth":956,"text":984},"siblings {'symbol': 'StockService::reserveLocal', 'limit': 6}  (478 chars)",{"id":696,"depth":956,"text":986},"siblings {'symbol': 'StockService::reserve'}  (793 chars)",{"id":715,"depth":956,"text":988},"writers {'table': 'books'}  (605 chars)",{"id":734,"depth":956,"text":990},"writers {'table': 'books.age_rating'}  (441 chars)",{"id":753,"depth":956,"text":992},"readers {'prop': 'books.is_active'}  (374 chars)",{"id":772,"depth":956,"text":994},"readers {'prop': 'books.titel'}  (158 chars)",{"id":791,"depth":956,"text":996},"node {'id_or_symbol': 'App\\\\Http\\\\Controllers\\\\Admin\\\\InventoryController::index'}  (675 chars)",{"id":810,"depth":956,"text":998},"path {'source': 'page:\u002F', 'target': 'SalesReportService::remove'}  (460 chars)",{"id":829,"depth":956,"text":1000},"downstream {'target': 'page:\u002Freports\u002F:id', 'max_per_kind': 10}  (570 chars)",{"id":848,"depth":956,"text":1002},"api_calls {'filter': 'unmatched'}  (692 chars)",{"id":867,"depth":956,"text":1004},"resolutions {'concept': 'timezone'}  (2934 chars)",{"id":886,"depth":956,"text":1006},"plan_list {}  (180 chars)",{"id":905,"depth":956,"text":1008},"plan_check {'name': 'preorders'}  (2193 chars)",{"id":924,"depth":956,"text":1010},"plan_check {'name': 'preorders', 'details': True, 'max_items': 30}  (5991 chars)",{"id":943,"depth":956,"text":1012},"index (gating fixture, temp db)  (554 chars)","Server: code-graph, DB: combined graph of examples\u002Fbookstore-api + examples\u002Fbookstore-web. Generated by tests\u002Fmcp_e2e.py. Volatile values (index timestamps and durations) are replaced by placeholders, so regenerating the file on unchanged code gives identical bytes.","md",{},true,{"title":67,"description":1013},"PHT_Qb82iOWwIQI2weXBV5uH1lLjbRXhkAzZ98lg0xc",[1020,1022],{"title":62,"path":63,"stem":64,"children":-1,"description":1021},"code-graph ships a stdio Model Context Protocol server. An agent gets callers, entry points and file:line evidence from the graph. It needs the mcp Python SDK (2.x). Use the installed cg-mcp command from Install.",{"title":71,"path":72,"stem":73,"description":1023,"children":-1},"What Rust, C, and C++ add beyond Install, CLI specs, and Graph schema: heuristic vs rust-analyzer \u002F scip-clang, the indexer flags, and the ids those pages do not spell out. Toolchain fit: cg doctor -h. Why a file stayed heuristic: cg coverage.",1792170238333]