[{"data":1,"prerenderedAt":14376},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fvalidation-log":135,"\u002Fdocs\u002Fvalidation-log-surround":14371},[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":123,"body":137,"description":14365,"extension":14366,"meta":14367,"navigation":14368,"path":124,"seo":14369,"stem":125,"__hash__":14370},"docs\u002Fdocs\u002Fvalidation-log.md",{"type":138,"value":139,"toc":14295},"minimark",[140,148,160,171,176,410,421,424,457,477,504,508,667,670,723,725,748,755,759,778,929,932,1028,1032,1043,1115,1119,1155,1297,1353,1401,1437,1440,1451,1783,1789,1866,1870,1884,1974,1980,1984,2017,2188,2211,2226,2229,2251,2460,2463,2596,2599,2602,2732,2735,2742,2853,2856,2875,2880,2898,3127,3148,3181,3207,3210,3215,3334,3344,3402,3406,3422,3578,3587,3693,3716,3739,3812,3815,3831,4030,4032,4279,4282,4391,4484,4488,4501,4598,4721,4732,4737,4839,4879,4883,4903,4977,4981,4986,5111,5158,5207,5243,5247,5263,5425,5537,5541,5565,5683,5685,5862,5866,5878,5979,5981,6065,6069,6082,6279,6318,6321,6325,6328,6424,6446,6452,6546,6550,6564,6679,6758,6762,6801,6815,6819,6844,6851,6952,6958,6962,6965,7142,7167,7175,7178,7438,7456,7460,7641,7658,7662,7680,7865,7873,7877,8084,8101,8105,8381,8414,8498,8502,8751,8775,8835,8839,9021,9031,9098,9102,9206,9260,9264,9433,9464,9468,9666,9712,9716,9825,9869,9873,9979,10020,10024,10102,10116,10120,10246,10285,10289,10447,10529,10533,10710,10767,10771,11052,11117,11121,11251,11276,11280,11283,11519,11559,11563,11606,11610,11676,11680,11753,11757,11803,11807,11823,11960,11967,11971,12014,12018,12034,12038,12067,12071,12120,12198,12202,12223,12227,12230,12474,12480,12484,12879,12899,12902,13017,13024,13051,13255,13258,13269,13276,13352,13371,13404,13440,13498,13501,13532,13551,13570,13574,13585,13653,13692,13696,13702,13799,13809,13840,13859,13875,13878,13888,14179,14186,14197,14291],[141,142,143,144,147],"p",{},"Per-corpus tables behind ",[145,146,119],"a",{"href":120},". Shallow clones, default branch, October 2026. \"Unchanged corpora\" notes stay here.",[141,149,150,151,155,156,159],{},"The Python\u002FDjango and Dart\u002FFlutter plugins, Laravel broadcasting and test indexing, the Nuxt layout\nhandling, the framework presets with their starter queries and route-guard classification, and generated-file detection were checked against shallow clones of well-known open-source projects\n(default branch, October 2026). Numbers are from ",[152,153,154],"code",{},"python -m codegraph.cli index \u003Crepo>"," on a single 8-core Linux box;\nwall time includes the Dart extractor (facts cache cold) but not the one-off ",[152,157,158],{},"dart compile exe"," of the extractor.",[141,161,162,163,166,167,170],{},"\"Spot check\" means: 20 routes (or every route when there are fewer) sampled at random from the graph and compared by\nhand with the source line they cite: HTTP method, full path including every ",[152,164,165],{},"include()","\u002F",[152,168,169],{},"add_router()","\u002Frouter prefix,\npath parameters, and the handler symbol.",[172,173,175],"h2",{"id":174},"django-python","Django \u002F Python",[177,178,179,210],"table",{},[180,181,182],"thead",{},[183,184,185,189,192,195,198,201,204,207],"tr",{},[186,187,188],"th",{},"Project",[186,190,191],{},"What it exercises",[186,193,194],{},".py files parsed",[186,196,197],{},"Index",[186,199,200],{},"Nodes \u002F edges",[186,202,203],{},"Routes",[186,205,206],{},"Spot check",[186,208,209],{},"Parse failures",[211,212,213,244,268,297,330,354,385],"tbody",{},[183,214,215,219,222,225,228,231,238,241],{},[216,217,218],"td",{},"django-ninja (repo incl. docs)",[216,220,221],{},"NinjaAPI, Router, add_router, path params, auth, schemas",[216,223,224],{},"183 \u002F 185",[216,226,227],{},"1.7 s",[216,229,230],{},"2,269 \u002F 5,877",[216,232,233,234,237],{},"300 (33 mounted through urls; the rest are doc\u002Ftest snippet routers, emitted with ",[152,235,236],{},"mounted=0",")",[216,239,240],{},"20\u002F20",[216,242,243],{},"0",[183,245,246,249,252,255,258,261,264,266],{},[216,247,248],{},"Django-Styleguide-Example",[216,250,251],{},"APIView-based services, nested includes, Celery",[216,253,254],{},"162 \u002F 190",[216,256,257],{},"0.5 s",[216,259,260],{},"806 \u002F 1,440",[216,262,263],{},"22",[216,265,240],{},[216,267,243],{},[183,269,270,273,280,283,286,289,292,295],{},[216,271,272],{},"channels-examples",[216,274,275,276,279],{},"Channels ",[152,277,278],{},"URLRouter",", consumers, function views",[216,281,282],{},"25 \u002F 28",[216,284,285],{},"0.1 s",[216,287,288],{},"93 \u002F 109",[216,290,291],{},"7 (2 websocket)",[216,293,294],{},"6\u002F6 paths; 2 handlers are Django's own auth views (external)",[216,296,243],{},[183,298,299,302,313,316,319,322,325,328],{},[216,300,301],{},"paperless-ngx",[216,303,304,305,308,309,312],{},"DRF routers, ViewSets, ",[152,306,307],{},"@action"," (incl. regex ",[152,310,311],{},"url_path","), Channels, Celery, signals",[216,314,315],{},"353 \u002F 407",[216,317,318],{},"10 s",[216,320,321],{},"7,672 \u002F 31,332",[216,323,324],{},"223",[216,326,327],{},"20\u002F20 paths; 3 handlers external (RedirectView, allauth)",[216,329,243],{},[183,331,332,335,338,341,344,347,350,352],{},[216,333,334],{},"netbox",[216,336,337],{},"large DRF API, plugin URL registries",[216,339,340],{},"980 \u002F 1,290",[216,342,343],{},"29 s",[216,345,346],{},"23,917 \u002F 112,393",[216,348,349],{},"956",[216,351,240],{},[216,353,243],{},[183,355,356,359,365,368,370,373,376,383],{},[216,357,358],{},"wagtail",[216,360,361,362,364],{},"admin viewsets, hooks, many ",[152,363,165],{}," levels",[216,366,367],{},"1,058 \u002F 1,324",[216,369,343],{},[216,371,372],{},"22,395 \u002F 69,911",[216,374,375],{},"195",[216,377,378,379,382],{},"20\u002F20 paths; 5 handlers unresolved (viewset registry ",[152,380,381],{},"as_view",", external LoginView)",[216,384,243],{},[183,386,387,390,393,396,399,402,405,408],{},[216,388,389],{},"saleor",[216,391,392],{},"GraphQL-first API",[216,394,395],{},"2,867 \u002F 4,335",[216,397,398],{},"68 s",[216,400,401],{},"30,521 \u002F 134,683",[216,403,404],{},"9",[216,406,407],{},"n\u002Fa (GraphQL root fields are protocol endpoints, see #34 below)",[216,409,243],{},[141,411,412,413,416,417,420],{},"The difference between files and parsed files is migrations (skipped by default; ",[152,414,415],{},"python_include_migrations"," turns\nthem on) and files over the size cap. No file failed ",[152,418,419],{},"ast.parse",".",[141,422,423],{},"Gaps seen:",[425,426,427,447,454],"ul",{},[428,429,430,431,434,435,438,439,442,443,446],"li",{},"netbox: the API prefix comes from an f-string over ",[152,432,433],{},"settings.BASE_PATH",", rendered as ",[152,436,437],{},"{?}","; views registered through\n",[152,440,441],{},"register_model_view()"," \u002F ",[152,444,445],{},"get_model_urls()"," are partly unresolved.",[428,448,449,450,453],{},"wagtail: ",[152,451,452],{},"page_viewset_registry"," \u002F hook-generated URL lists resolve paths but not always the handler.",[428,455,456],{},"saleor: one GraphQL endpoint; resolvers\u002Fmutations are not routes.",[141,458,459,460,463,464,467,468,472,473,420],{},"Python source-root detection (",[152,461,462],{},"src\u002F"," and ",[152,465,466],{},"lib\u002F"," layouts, monorepos, namespace packages) is validated on\nfastapi\u002Ffull-stack-fastapi-template, opentelemetry-python, ansible, flask, pytest and netbox: see\n",[145,469,471],{"href":470},"\u002Fdocs\u002Fpython#validation","validation",". Test indexing (pytest, unittest, fixtures, Django \u002F DRF test clients) is validated on\nthe same projects: see ",[145,474,476],{"href":475},"\u002Fdocs\u002Fpython#tests-pytest-and-unittest","pytest and unittest",[141,478,479,482,483,485,486,488,489,491,492,495,496,499,500,503],{},[152,480,481],{},"tests.py"," modules and collection chains, checked on django (211 ",[152,484,481],{}," files), netbox, saleor, ansible,\nopentelemetry-python, mkdocs, flake8, httpie, beets, sphinx and pylint: every graph is identical before and after (same\nnodes, edges and attributes; index time within noise, for example django 50.5 s -> 52.2 s, saleor 62.8 s -> 62.7 s).\nThe Django ",[152,487,481],{}," files hold test cases and stay test code, and no collection call gained or lost an edge. On cg's\nown source, the two plugin modules named ",[152,490,481],{}," that application code imports became application code (136\nnodes, 148 test edges back to calls), and ",[152,493,494],{},"index_project"," gained the 9 calls through its framework and language plugin\nlists (every framework plugin's ",[152,497,498],{},"contribute",", the SCIP indexer plugins' ",[152,501,502],{},"index","), all correct.",[172,505,507],{"id":506},"flutter-dart","Flutter \u002F Dart",[177,509,510,533],{},[180,511,512],{},[183,513,514,516,518,521,523,525,528,531],{},[186,515,188],{},[186,517,191],{},[186,519,520],{},".dart files",[186,522,197],{},[186,524,200],{},[186,526,527],{},"HTTP call sites (endpoints)",[186,529,530],{},"Pages",[186,532,209],{},[211,534,535,560,593,618,642],{},[183,536,537,540,543,546,549,552,555,558],{},[216,538,539],{},"flutter\u002Fsamples (whole repo)",[216,541,542],{},"package:http, dart:io HttpClient, go_router (nested + ShellRoute), Navigator",[216,544,545],{},"465",[216,547,548],{},"1.2 s",[216,550,551],{},"5,391 \u002F 11,366",[216,553,554],{},"31 (25)",[216,556,557],{},"62",[216,559,243],{},[183,561,562,565,576,579,582,585,588,591],{},[216,563,564],{},"lichess mobile",[216,566,567,568,571,572,575],{},"custom ",[152,569,570],{},"http.BaseClient",", ",[152,573,574],{},"Uri(path:)",", Riverpod, Dart 3.13 primary constructors",[216,577,578],{},"735",[216,580,581],{},"21 s",[216,583,584],{},"131,930 \u002F 284,800",[216,586,587],{},"148 (123)",[216,589,590],{},"92",[216,592,243],{},[183,594,595,598,601,604,607,610,613,616],{},[216,596,597],{},"localsend",[216,599,600],{},"Rust\u002FFFI networking, enum-built URL table, custom router",[216,602,603],{},"383",[216,605,606],{},"5 s",[216,608,609],{},"33,979 \u002F 74,062",[216,611,612],{},"7",[216,614,615],{},"1",[216,617,243],{},[183,619,620,623,626,629,632,635,638,640],{},[216,621,622],{},"flutter_clean_arch",[216,624,625],{},"Dio + BaseOptions(baseUrl), bloc, auto_route v4",[216,627,628],{},"49",[216,630,631],{},"0.04 s",[216,633,634],{},"196 \u002F 479",[216,636,637],{},"4 (3)",[216,639,243],{},[216,641,243],{},[183,643,644,647,650,653,656,659,662,665],{},[216,645,646],{},"mova",[216,648,649],{},"Dio, URL helper class, bloc",[216,651,652],{},"61",[216,654,655],{},"0.07 s",[216,657,658],{},"319 \u002F 770",[216,660,661],{},"9 (7)",[216,663,664],{},"3",[216,666,243],{},[141,668,669],{},"Spot checks:",[425,671,672,694,712],{},[428,673,674,675,678,679,682,683,686,687,690,691,693],{},"flutter\u002Fsamples: 12 sampled HTTP calls all correct (method, host, path, ",[152,676,677],{},"{id}"," params); 2 calls whose whole URL is a\nruntime value are labelled ",[152,680,681],{},"dynamic",". All 13 go_router routes of ",[152,684,685],{},"navigation_and_routing"," (nested paths joined to their\nparent, ",[152,688,689],{},":id"," → ",[152,692,677],{},") and their screens are correct.",[428,695,696,697,699,700,703,704,707,708,711],{},"lichess: 18\u002F20 HTTP calls correct; the two imprecise ones are an env-hosted CDN URL rendered with a leading ",[152,698,166],{}," and a\nHEAD whose URI comes from a list. 105 call sites keep an ",[152,701,702],{},"unknown"," origin because the host is added in the client's\n",[152,705,706],{},"send()"," override. Pages come from the project's ",[152,709,710],{},"buildScreenRoute(screen: X())"," helper (89 call sites in the source).",[428,713,714,715,718,719,722],{},"mova and flutter_clean_arch: every HTTP call correct, including the Dio ",[152,716,717],{},"baseUrl"," path prefix (",[152,720,721],{},"\u002Fauth\u002Flogin",").",[141,724,423],{},[425,726,727,730,741],{},[428,728,729],{},"localsend talks to peers through a Rust bridge and an enum whose constructor builds the paths; neither is modelled.",[428,731,732,733,736,737,740],{},"auto_route v4 annotation configs (",[152,734,735],{},"@MaterialAutoRouter(routes: [...])",") are not read; v6 ",[152,738,739],{},"@RoutePage"," classes are pages\nwithout a path.",[428,742,743,744,747],{},"Data-driven route lists (",[152,745,746],{},"demos.map((d) => GoRoute(path: d.route, ...))",") leave navigation targets unresolved.",[141,749,750,751,754],{},"Before the analyzer 10 upgrade, 499 lichess files failed to parse (Dart 3.13 primary constructors); they now parse with\nthe ",[152,752,753],{},"primary-constructors"," experiment fallback.",[172,756,758],{"id":757},"laravel-broadcasting-and-tests","Laravel broadcasting and tests",[141,760,761,762,765,766,769,770,773,774,777],{},"Shallow clones of Laravel apps that use ",[152,763,764],{},"Broadcast::channel"," (default branch, October 2026). \"Channels\" lists the\ndeclared and undeclared channels found; publishers were compared by hand with every ",[152,767,768],{},"ShouldBroadcast"," event's\n",[152,771,772],{},"broadcastOn()",", subscriptions and listened events with every ",[152,775,776],{},"Echo"," \u002F pusher call in the repo's own JS.",[177,779,780,801],{},[180,781,782],{},[183,783,784,786,789,792,795,798],{},[186,785,188],{},[186,787,788],{},"Channels",[186,790,791],{},"Publishers (events → channel)",[186,793,794],{},"Client subscriptions matched",[186,796,797],{},"Listened events matched",[186,799,800],{},"Notes",[211,802,803,830,859,881,907],{},[183,804,805,808,811,814,820,827],{},[216,806,807],{},"UNIT3D",[216,809,810],{},"2 (presence chatroom, private chatter)",[216,812,813],{},"4 \u002F 4",[216,815,816,817,237],{},"2 \u002F 2 (Alpine + Echo in ",[152,818,819],{},"resources\u002Fjs",[216,821,822,823,826],{},"3 \u002F 3 that have a backend event (",[152,824,825],{},".new.ping"," and whispers have none)",[216,828,829],{},"presence visibility comes from the publishers",[183,831,832,835,838,841,847,849],{},[216,833,834],{},"koel",[216,836,837],{},"2",[216,839,840],{},"2 \u002F 2",[216,842,843,844,237],{},"2 \u002F 2 (Echo and pusher-js ",[152,845,846],{},"private-…",[216,848,840],{},[216,850,851,852,854,855,858],{},"the base event's ",[152,853,772],{}," returns ",[152,856,857],{},"[]"," (correctly no channel)",[183,860,861,864,867,870,873,876],{},[216,862,863],{},"invoiceninja",[216,865,866],{},"4 (2 declared, 2 undeclared public)",[216,868,869],{},"10 \u002F 10 events that name a channel",[216,871,872],{},"n\u002Fa (the frontend is a separate repo)",[216,874,875],{},"n\u002Fa",[216,877,878,879],{},"one broadcast event returns ",[152,880,857],{},[183,882,883,886,889,892,895,897],{},[216,884,885],{},"pixelfed",[216,887,888],{},"4",[216,890,891],{},"9 \u002F 9",[216,893,894],{},"n\u002Fa (no Echo client in the repo)",[216,896,875],{},[216,898,899,902,903,906],{},[152,900,901],{},"live.chat.{id}"," has a callback but its 7 events publish on a public ",[152,904,905],{},"Channel",": flagged PUBLIC PUBLISH",[183,908,909,912,914,917,924,926],{},[216,910,911],{},"coolify",[216,913,837],{},[216,915,916],{},"18 \u002F 18",[216,918,919,920,923],{},"0: listeners are Livewire ",[152,921,922],{},"echo-private:"," keys in PHP (not modelled)",[216,925,875],{},[216,927,928],{},"route middleware given as arrays is skipped",[141,930,931],{},"Tests: TEST_HTTP edges, 10 sampled at random per project and checked against the cited source line (verb, path or\nroute name, target route): 40 \u002F 40 correct.",[177,933,934,952],{},[180,935,936],{},[183,937,938,940,943,946,949],{},[186,939,188],{},[186,941,942],{},"Test cases",[186,944,945],{},"HTTP test calls",[186,947,948],{},"Matched to a route",[186,950,951],{},"Unmatched (main reason)",[211,953,954,970,996,1012],{},[183,955,956,958,961,964,967],{},[216,957,807],{},[216,959,960],{},"861 (852 Pest)",[216,962,963],{},"601",[216,965,966],{},"538",[216,968,969],{},"59 (incl. 9 calls to a route name shared by a whole route group, left out on purpose)",[183,971,972,974,977,987,990],{},[216,973,834],{},[216,975,976],{},"1,673 PHPUnit (+ Vitest)",[216,978,979,980,442,983,986],{},"741 (449 through ",[152,981,982],{},"getAs()",[152,984,985],{},"postAs()"," helpers)",[216,988,989],{},"502",[216,991,992,993,237],{},"237 (Subsonic routes are registered in a ",[152,994,995],{},"foreach",[183,997,998,1000,1003,1006,1009],{},[216,999,863],{},[216,1001,1002],{},"5,981 PHPUnit (+ Playwright)",[216,1004,1005],{},"2,023",[216,1007,1008],{},"1,970",[216,1010,1011],{},"46",[183,1013,1014,1016,1019,1022,1025],{},[216,1015,885],{},[216,1017,1018],{},"1,410 (1,175 Pest)",[216,1020,1021],{},"592",[216,1023,1024],{},"566",[216,1026,1027],{},"20",[172,1029,1031],{"id":1030},"nuxt-layouts-and-clean-checkouts","Nuxt layouts and clean checkouts",[141,1033,1034,1035,1038,1039,1042],{},"Shallow clones indexed without ",[152,1036,1037],{},"npm install"," and without ",[152,1040,1041],{},".nuxt"," (the clean-checkout path):",[177,1044,1045,1060],{},[180,1046,1047],{},[183,1048,1049,1051,1054,1057],{},[186,1050,188],{},[186,1052,1053],{},"Layout",[186,1055,1056],{},"Pages \u002F layouts \u002F components found",[186,1058,1059],{},"Checks",[211,1061,1062,1091],{},[183,1063,1064,1067,1070,1073],{},[216,1065,1066],{},"breeze-nuxt (Nuxt 3 client for a Laravel Breeze API)",[216,1068,1069],{},"source at the repo root",[216,1071,1072],{},"8 \u002F 2 \u002F 14 (all)",[216,1074,1075,1076,1079,1080,1083,1084,1087,1088],{},"8 \u002F 8 HTTP calls found with method and path (7 through a ",[152,1077,1078],{},"$fetch.create"," instance auto-imported from ",[152,1081,1082],{},"utils\u002F","); the ",[152,1085,1086],{},"runtimeConfig.public.backendUrl"," default resolves from ",[152,1089,1090],{},"nuxt.config.ts",[183,1092,1093,1096,1101,1104],{},[216,1094,1095],{},"elk",[216,1097,1098],{},[152,1099,1100],{},"app\u002F",[216,1102,1103],{},"59 \u002F 2 \u002F 196 (all)",[216,1105,1106,1107,1110,1111,1114],{},"RENDERS edges: 20 \u002F 20 sampled correct; of the 25 components without a RENDERS edge, 14 are rendered through ",[152,1108,1109],{},"\u003Ccomponent :is>"," and 11 from TS (",[152,1112,1113],{},"h()",", TipTap node views)",[172,1116,1118],{"id":1117},"presets-starter-queries-and-route-guards","Presets, starter queries and route guards",[141,1120,1121,1124,1125,1128,1129,463,1132,1135,1136,571,1139,1142,1143,1146,1147,1150,1151,1154],{},[152,1122,1123],{},"cg index \u003Crepo>"," with no flags and no ",[152,1126,1127],{},".cg.yaml",", then ",[152,1130,1131],{},"cg starters",[152,1133,1134],{},"cg routes --unguarded",". Monorepos are\nindexed per app (",[152,1137,1138],{},"immich\u002Fserver",[152,1140,1141],{},"cal.com\u002Fapps\u002Fweb",", ...). \"Starters\" counts the starter queries that resolve to\nexisting nodes out of those generated; \"auth by\" counts auth guards by the rule that recognised them (",[152,1144,1145],{},"preset X",": the\nframework preset lists the guard by its own name; ",[152,1148,1149],{},"name pattern",": the shared auth token pattern; ",[152,1152,1153],{},"framework",": the\nplugin knows the check, e.g. Laravel broadcast channel callbacks). Index time includes the starters (last column).",[177,1156,1157,1185],{},[180,1158,1159],{},[183,1160,1161,1163,1166,1169,1172,1175,1178,1181,1183],{},[186,1162,188],{},[186,1164,1165],{},"Commit",[186,1167,1168],{},"Frameworks detected",[186,1170,1171],{},"Presets applied (+ common)",[186,1173,1174],{},"Starters",[186,1176,1177],{},"Routes \u002F with auth \u002F unguarded",[186,1179,1180],{},"Auth by",[186,1182,197],{},[186,1184,1174],{},[211,1186,1187,1216,1243,1270],{},[183,1188,1189,1192,1195,1198,1201,1204,1207,1210,1213],{},[216,1190,1191],{},"koel\u002Fkoel",[216,1193,1194],{},"295d8c1",[216,1196,1197],{},"laravel",[216,1199,1200],{},"php, typescript, laravel",[216,1202,1203],{},"5 \u002F 5",[216,1205,1206],{},"191 \u002F 166 \u002F 23",[216,1208,1209],{},"preset laravel 161, name pattern 8, framework 2",[216,1211,1212],{},"12.22 s",[216,1214,1215],{},"0.08 s",[183,1217,1218,1221,1224,1226,1228,1231,1234,1237,1240],{},[216,1219,1220],{},"laravelio\u002Flaravel.io",[216,1222,1223],{},"24be489",[216,1225,1197],{},[216,1227,1200],{},[216,1229,1230],{},"6 \u002F 6",[216,1232,1233],{},"64 \u002F 0 \u002F 64",[216,1235,1236],{},"–",[216,1238,1239],{},"2.55 s",[216,1241,1242],{},"0.01 s",[183,1244,1245,1248,1251,1254,1257,1259,1262,1265,1268],{},[216,1246,1247],{},"netbox-community\u002Fnetbox",[216,1249,1250],{},"251458b",[216,1252,1253],{},"django, djangorestframework",[216,1255,1256],{},"python, django, djangorestframework",[216,1258,1230],{},[216,1260,1261],{},"956 \u002F 92 \u002F 864",[216,1263,1264],{},"name pattern 105, preset django 31, preset djangorestframework 2",[216,1266,1267],{},"34.78 s",[216,1269,548],{},[183,1271,1272,1275,1278,1281,1284,1286,1289,1291,1294],{},[216,1273,1274],{},"saleor\u002Fsaleor",[216,1276,1277],{},"8385ca6",[216,1279,1280],{},"django",[216,1282,1283],{},"python, django",[216,1285,1230],{},[216,1287,1288],{},"9 \u002F 0 \u002F 9",[216,1290,1236],{},[216,1292,1293],{},"68.31 s",[216,1295,1296],{},"0.37 s",[141,1298,1299,1300,1303,1304,571,1307,571,1310,571,1313,571,1316,571,1319,1322,1323,690,1326,1329,1330,463,1333,1336,1337,1340,1341,1344,1345,1348,1349,1352],{},"Laravel resource routes follow ",[152,1301,1302],{},"ResourceRegistrar"," (#118). On koel the six nested registrations (",[152,1305,1306],{},"albums.songs",[152,1308,1309],{},"artists.albums",[152,1311,1312],{},"artists.songs",[152,1314,1315],{},"playlist-folders.playlists",[152,1317,1318],{},"playlists.songs",[152,1320,1321],{},"podcasts.episodes",") expand to the registrar's URLs with singular parameters (",[152,1324,1325],{},"playlist-folders",[152,1327,1328],{},"{playlist_folder}","), and no resource route is left with a dotted path segment (only ",[152,1331,1332],{},"GET \u002Fmanifest.json",[152,1334,1335],{},"GET \u002Fmanifest-remote.json"," keep a dot, as registered). The route count is unchanged.\n| immich-app\u002Fimmich ",[152,1338,1339],{},"server\u002F"," | c5e06dc | nest, express | typescript, nest, express | 4 \u002F 4 | 295 \u002F 295 \u002F 0 | name pattern 295, preset nest 295 | 12.3 s | 0.28 s |\n| immich-app\u002Fimmich ",[152,1342,1343],{},"mobile\u002F"," | c5e06dc | flutter | python, dart | 3 \u002F 3 | – | – | 3.79 s | 0.07 s |\n| calcom\u002Fcal.com ",[152,1346,1347],{},"apps\u002Fapi\u002Fv2"," | 54343aa | nest | typescript, nest | 3 \u002F 3 | 162 \u002F 140 \u002F 22 | name pattern 217 | 7.76 s | 0.01 s |\n| calcom\u002Fcal.com ",[152,1350,1351],{},"apps\u002Fweb"," | 54343aa | nextjs | typescript, nextjs | 4 \u002F 4 | 99 \u002F 0 \u002F 99 | – | 11.28 s | 0.06 s |\n| brocoders\u002Fnestjs-boilerplate | 9620f15 | nest | typescript, nest | 6 \u002F 6 | 22 \u002F 11 \u002F 11 | preset nest 16 | 2.6 s | 0.01 s |\n| hagopj13\u002Fnode-express-boilerplate | 179ae84 | express | typescript, express | 2 \u002F 2 | 14 \u002F 6 \u002F 8 | name pattern 6 | 2.18 s | 0.0 s |\n| elk-zone\u002Felk | 8a90074 | nuxt | typescript, nuxt | 3 \u002F 3 | – | – | 4.29 s | 0.01 s |\n| BurntSushi\u002Fripgrep | 3fce3b5 | – | rust | 3 \u002F 3 | – | – | 27.59 s | 0.05 s |\n| redis\u002Fredis | b540ca4 | – | python, c_cpp | 3 \u002F 3 | – | – | 5.53 s | 0.09 s |\n| pallets\u002Fflask | d73fa1c | – | python | 3 \u002F 3 | – | – | 0.74 s | 0.01 s |",[141,1354,1355,1356,1359,1360,1366,1367,1370,1371,1374,1375,1378,1379,1382,1383,1386,1387,1392,1393,1396,1397,1400],{},"saleor sets ",[152,1357,1358],{},"testpaths = [\"saleor\"]",", its application package. Since\n",[145,1361,1365],{"href":1362,"rel":1363},"https:\u002F\u002Fgithub.com\u002Fcyberchronos00\u002Fcode-graph\u002Fissues\u002F18",[1364],"nofollow","#18"," only the files pytest collects there (plus ",[152,1368,1369],{},"conftest.py","\nand ",[152,1372,1373],{},"tests\u002F"," directories) are test code: test modules 2,866 -> 1,718, ",[152,1376,1377],{},"CALLS"," edges 0 -> 11,848 (",[152,1380,1381],{},"TEST_CALLS","\n58,676 -> 42,370), the same 12,866 test cases, and 6 starters instead of 1. ",[152,1384,1385],{},"impact saleor.order.utils.invalidate_order_prices"," now lists 1,152 application callers (before: none, only tests). On\nthe now connected call graph the starters took 63 s at first, almost all of it in the unguarded-write-routes report\n(one reverse closure per written table, 95 tables). Since\n",[145,1388,1391],{"href":1389,"rel":1390},"https:\u002F\u002Fgithub.com\u002Fcyberchronos00\u002Fcode-graph\u002Fissues\u002F25",[1364],"#25"," the route report walks the graph once for all write\ntargets, limited to what the routes reach, with the same output (",[152,1394,1395],{},"cg routes --writes --unguarded"," and the 6 starters\nare identical), and the starters keep to a 20 s budget (",[152,1398,1399],{},"starters_skipped"," names any left out). Index time, best of\nthree on the same box:",[177,1402,1403,1415],{},[180,1404,1405],{},[183,1406,1407,1409,1412],{},[186,1408,188],{},[186,1410,1411],{},"Before #25: index \u002F starters",[186,1413,1414],{},"After #25: index \u002F starters",[211,1416,1417,1427],{},[183,1418,1419,1421,1424],{},[216,1420,389],{},[216,1422,1423],{},"124.41 s \u002F 57.47 s",[216,1425,1426],{},"68.31 s \u002F 0.37 s",[183,1428,1429,1431,1434],{},[216,1430,334],{},[216,1432,1433],{},"29.96 s \u002F 0.98 s",[216,1435,1436],{},"27.91 s \u002F 0.27 s",[141,1438,1439],{},"Every starter resolved on every project. Index time on netbox, best of three on the same box: 34.1 s before (v0.4.0)\nand 33.5 s after, with 1.1 s of that spent on the starters; the shared skip lists and presets add no measurable cost.",[141,1441,1442,1450],{},[1443,1444,1445,1446,1449],"strong",{},"Hand-checked ",[152,1447,1448],{},"routes --unguarded"," samples."," For each framework, the first unguarded routes and a sample of the\nguarded ones were compared with the source:",[177,1452,1453,1468],{},[180,1454,1455],{},[183,1456,1457,1459,1462,1465],{},[186,1458,188],{},[186,1460,1461],{},"Guards found by the framework preset",[186,1463,1464],{},"Unguarded routes, checked against the source",[186,1466,1467],{},"Needs a project pattern or a later feature",[211,1469,1470,1508,1537,1599,1611,1644,1688,1719,1750],{},[183,1471,1472,1475,1484,1506],{},[216,1473,1474],{},"koel (Laravel)",[216,1476,1477,571,1480,1483],{},[152,1478,1479],{},"auth",[152,1481,1482],{},"auth:sanctum","-style aliases on route groups (161)",[216,1485,1486,571,1489,1492,1493,571,1496,571,1499,571,1502,1505],{},[152,1487,1488],{},"GET \u002Fapi\u002Fping",[152,1490,1491],{},"POST \u002Fapi\u002Fme"," (login), ",[152,1494,1495],{},"POST \u002Fapi\u002Fforgot-password",[152,1497,1498],{},"POST \u002Fapi\u002Freset-password",[152,1500,1501],{},"GET \u002Fapi\u002Finvitations",[152,1503,1504],{},"GET \u002Fdemo\u002Fnew-session",": public by design",[216,1507,1236],{},[183,1509,1510,1513,1515,1534],{},[216,1511,1512],{},"laravel.io (Laravel)",[216,1514,1236],{},[216,1516,1517,571,1520,571,1523,571,1526,1529,1530,1533],{},[152,1518,1519],{},"POST \u002Fforum\u002F{thread}\u002Flock",[152,1521,1522],{},"PUT \u002Fforum\u002F{thread}\u002Fmark-solution\u002F{reply}",[152,1524,1525],{},"POST \u002Farticles",[152,1527,1528],{},"PUT \u002Fadmin\u002Farticles\u002F{article}\u002Fpinned",": protected by ",[152,1531,1532],{},"$this->middleware(Authenticate::class, ...)"," in the controller constructor",[216,1535,1536],{},"controller-constructor middleware (planned)",[183,1538,1539,1542,1564,1584],{},[216,1540,1541],{},"netbox (Django + DRF)",[216,1543,1544,571,1547,571,1550,1553,1554,571,1557,463,1560,1563],{},[152,1545,1546],{},"LoginRequiredMixin",[152,1548,1549],{},"UserPassesTestMixin",[152,1551,1552],{},"IsAuthenticated","; netbox's own ",[152,1555,1556],{},"ConditionalLoginRequiredMixin",[152,1558,1559],{},"ObjectPermissionRequiredMixin",[152,1561,1562],{},"IsSuperuser"," by name pattern",[216,1565,1566,1567,1570,1571,1574,1575,571,1578,571,1581,1505],{},"851 REST API routes (",[152,1568,1569],{},"POST \u002Fapi\u002Fwireless\u002Fwireless-links\u002F",", ...): protected by ",[152,1572,1573],{},"REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES']"," in settings; ",[152,1576,1577],{},"GET \u002Flogin\u002F",[152,1579,1580],{},"GET \u002Flogout\u002F",[152,1582,1583],{},"POST \u002Foauth\u002Fbegin\u002F{backend}\u002F",[216,1585,1586,1587,1590,1591,1594,1595,1598],{},"DRF settings defaults (planned); ",[152,1588,1589],{},"IsAuthenticatedOrLoginNotRequired"," (anonymous access when ",[152,1592,1593],{},"LOGIN_REQUIRED"," is off) counts once listed in ",[152,1596,1597],{},"auth.extra_patterns",": 864 → 860",[183,1600,1601,1604,1606,1609],{},[216,1602,1603],{},"saleor (Django)",[216,1605,1236],{},[216,1607,1608],{},"9 plain Django views (the GraphQL endpoint, plugin webhook endpoints, thumbnails, images, JWKS, static files): public endpoints; the GraphQL API checks permissions per resolver and each plugin checks its own requests",[216,1610,1236],{},[183,1612,1613,1619,1629,1642],{},[216,1614,1615,1616,1618],{},"immich ",[152,1617,1339],{}," (NestJS)",[216,1620,1621,1624,1625,1628],{},[152,1622,1623],{},"AuthGuard"," on all 295 routes (with immich's ",[152,1626,1627],{},"MaintenanceAuthGuard"," by name pattern)",[216,1630,1631,1632,1635,1636,1641],{},"none; the 2 routes the test setups in ",[152,1633,1634],{},"test\u002Fmedium\u002Fspecs\u002F*.spec.ts"," build are test code since ",[145,1637,1640],{"href":1638,"rel":1639},"https:\u002F\u002Fgithub.com\u002Fcyberchronos00\u002Fcode-graph\u002Fissues\u002F19",[1364],"#19"," (297 \u002F 2 unguarded before)",[216,1643,1236],{},[183,1645,1646,1651,1663,1678],{},[216,1647,1648,1649,1618],{},"cal.com ",[152,1650,1347],{},[216,1652,1653,1654,571,1657,571,1660,1563],{},"cal.com's ",[152,1655,1656],{},"ApiAuthGuard",[152,1658,1659],{},"PermissionsGuard",[152,1661,1662],{},"OAuthClientGuard",[216,1664,1665,571,1668,571,1671,1674,1675],{},[152,1666,1667],{},"GET \u002Fhealth",[152,1669,1670],{},"GET \u002Fv2\u002Fatoms\u002Fevent-types\u002F{eventSlug}\u002Fpublic",[152,1672,1673],{},"POST \u002Fv2\u002Fauth\u002Foauth2\u002Ftoken",", OAuth callbacks: public by design; ",[152,1676,1677],{},"POST \u002Fv2\u002Fwebhooks\u002Fvercel\u002Fdeployment-promoted",[216,1679,1680,1683,1684,1687],{},[152,1681,1682],{},"VercelWebhookGuard"," counts as a signature check once listed in ",[152,1685,1686],{},"secret.extra_patterns"," (22 → 21)",[183,1689,1690,1695,1697,1716],{},[216,1691,1648,1692,1694],{},[152,1693,1351],{}," (Next.js)",[216,1696,1236],{},[216,1698,1699,571,1702,1705,1706,1709,1710,571,1713,1505],{},[152,1700,1701],{},"POST \u002Fapi\u002Fauth\u002Ftwo-factor\u002Ftotp\u002Fdisable",[152,1703,1704],{},"POST \u002Fapi\u002Favailability\u002Fcalendar",": the handler calls ",[152,1707,1708],{},"getServerSession()"," and returns 401 itself; ",[152,1711,1712],{},"POST \u002Fapi\u002Fauth\u002Fsignup",[152,1714,1715],{},"POST \u002Fapi\u002Fauth\u002Fforgot-password",[216,1717,1718],{},"session checks inside the handler body",[183,1720,1721,1724,1733,1748],{},[216,1722,1723],{},"nestjs-boilerplate (NestJS)",[216,1725,1726,571,1729,1732],{},[152,1727,1728],{},"AuthGuard('jwt')",[152,1730,1731],{},"RolesGuard"," (16)",[216,1734,1735,571,1738,571,1741,571,1744,1747],{},[152,1736,1737],{},"POST \u002Fv1\u002Fauth\u002Femail\u002Flogin",[152,1739,1740],{},"\u002Fregister",[152,1742,1743],{},"\u002Fforgot\u002Fpassword",[152,1745,1746],{},"\u002Freset\u002Fpassword",", social logins: public by design",[216,1749,1236],{},[183,1751,1752,1755,1762,1781],{},[216,1753,1754],{},"node-express-boilerplate (Express)",[216,1756,1757,1758,1761],{},"the project's ",[152,1759,1760],{},"auth()"," middleware by name pattern",[216,1763,1764,571,1767,571,1769,571,1772,571,1775,571,1778,1505],{},[152,1765,1766],{},"POST \u002Flogin",[152,1768,1740],{},[152,1770,1771],{},"\u002Frefresh-tokens",[152,1773,1774],{},"\u002Fforgot-password",[152,1776,1777],{},"\u002Freset-password",[152,1779,1780],{},"\u002Fverify-email",[216,1782,1236],{},[141,1784,1785,1786,1788],{},"A ",[152,1787,1127],{}," for the two project patterns above:",[1790,1791,1796],"pre",{"className":1792,"code":1793,"language":1794,"meta":1795,"style":1795},"language-yaml shiki shiki-themes cg-light cg-light cg-dark","auth:\n  extra_patterns: [\"IsAuthenticatedOrLoginNotRequired\"]   # netbox\nsecret:\n  extra_patterns: [\"WebhookGuard$\"]                        # cal.com apps\u002Fapi\u002Fv2\n","yaml","",[152,1797,1798,1810,1837,1845],{"__ignoreMap":1795},[1799,1800,1803,1806],"span",{"class":1801,"line":1802},"line",1,[1799,1804,1479],{"class":1805},"s4LKg",[1799,1807,1809],{"class":1808},"sZ_TN",":\n",[1799,1811,1813,1816,1819,1822,1825,1828,1830,1833],{"class":1801,"line":1812},2,[1799,1814,1815],{"class":1805},"  extra_patterns",[1799,1817,1818],{"class":1808},":",[1799,1820,1821],{"class":1808}," [",[1799,1823,1824],{"class":1808},"\"",[1799,1826,1589],{"class":1827},"sha9Y",[1799,1829,1824],{"class":1808},[1799,1831,1832],{"class":1808},"]",[1799,1834,1836],{"class":1835},"seS0s","   # netbox\n",[1799,1838,1840,1843],{"class":1801,"line":1839},3,[1799,1841,1842],{"class":1805},"secret",[1799,1844,1809],{"class":1808},[1799,1846,1848,1850,1852,1854,1856,1859,1861,1863],{"class":1801,"line":1847},4,[1799,1849,1815],{"class":1805},[1799,1851,1818],{"class":1808},[1799,1853,1821],{"class":1808},[1799,1855,1824],{"class":1808},[1799,1857,1858],{"class":1827},"WebhookGuard$",[1799,1860,1824],{"class":1808},[1799,1862,1832],{"class":1808},[1799,1864,1865],{"class":1835},"                        # cal.com apps\u002Fapi\u002Fv2\n",[172,1867,1869],{"id":1868},"monorepo-apps","Monorepo apps",[141,1871,1872,1873,1876,1877,1879,1880,1883],{},"One ",[152,1874,1875],{},"cg index \u003Croot>"," with ",[152,1878,1127],{}," ",[152,1881,1882],{},"apps"," (the file was written for the run and removed afterwards), compared\nwith indexing each app and linking each pair one by one: every per-app and per-pair graph has the same nodes and\nedges.",[177,1885,1886,1904],{},[180,1887,1888],{},[183,1889,1890,1893,1895,1898,1901],{},[186,1891,1892],{},"repo",[186,1894,1882],{},[186,1896,1897],{},"one command",[186,1899,1900],{},"per app (nodes \u002F edges)",[186,1902,1903],{},"links (endpoints matched)",[211,1905,1906,1927,1953],{},[183,1907,1908,1911,1918,1921,1924],{},[216,1909,1910],{},"immich",[216,1912,1913,1914,1917],{},"server, ml (",[152,1915,1916],{},"machine-learning","), web, mobile",[216,1919,1920],{},"20.6 s",[216,1922,1923],{},"server 8,028 \u002F 36,234; ml 727 \u002F 1,956; web 2,351 \u002F 3,670; mobile 7,443 \u002F 22,990",[216,1925,1926],{},"web → server 0\u002F0, mobile → server 0\u002F0 (both call through generated SDKs that are not in the checkout)",[183,1928,1929,1932,1940,1943,1946],{},[216,1930,1931],{},"cal.com",[216,1933,1934,1935,1937,1938,237],{},"api-v2 (",[152,1936,1347],{},"), web (",[152,1939,1351],{},[216,1941,1942],{},"18.5 s",[216,1944,1945],{},"api-v2 3,813 \u002F 12,304; web 5,689 \u002F 12,571",[216,1947,1948,1949,1952],{},"web → api-v2 0\u002F28 (the web app calls its own Next ",[152,1950,1951],{},"\u002Fapi"," routes)",[183,1954,1955,1958,1965,1968,1971],{},[216,1956,1957],{},"bundled samples",[216,1959,1960,1961,1964],{},"api (",[152,1962,1963],{},"bookstore-django","), web, flutter, android, ios",[216,1966,1967],{},"2.0 s",[216,1969,1970],{},"api 207 \u002F 341",[216,1972,1973],{},"flutter 6\u002F7, android 3\u002F3, ios 3\u002F3, web 0\u002F6 (it targets the Laravel sample)",[141,1975,1976,1977,1979],{},"Taking the extractor skip lists from the presets changed no graph: immich server \u002F web \u002F mobile, cal.com ",[152,1978,1351],{},",\nelk, social-app and nestjs-boilerplate index to the same nodes and edges as before.",[172,1981,1983],{"id":1982},"generated-and-copied-files","Generated and copied files",[141,1985,1986,1124,1988,1990,1991,1994,1995,1998,1999,463,2001,2004,2005,2008,2009,2012,2013,2016],{},[152,1987,1123],{},[152,1989,1127],{}," (default: generated, copied and vendored files excluded), then again\nwith ",[152,1992,1993],{},"--include-generated","; \"before\" is v0.4.0 plus the presets change. The Nuxt row is the ",[152,1996,1997],{},"nuxt\u002Fstarter"," template\n(v4 branch) after ",[152,2000,1037],{},[152,2002,2003],{},"nuxi prepare",", so ",[152,2006,2007],{},".nuxt\u002F"," exists as in a developer checkout; the\nIonic\u002FCapacitor row is a public Angular + Capacitor app with its ",[152,2010,2011],{},"android\u002F"," project and ",[152,2014,2015],{},"www\u002F"," build committed.",[177,2018,2019,2038],{},[180,2020,2021],{},[183,2022,2023,2025,2027,2030,2033],{},[186,2024,188],{},[186,2026,1165],{},[186,2028,2029],{},"Files classified, by reason",[186,2031,2032],{},"Discovered source files (before → after)",[186,2034,2035,2036],{},"Nodes \u002F edges before → default → ",[152,2037,1993],{},[211,2039,2040,2057,2077,2097,2121,2138,2159],{},[183,2041,2042,2045,2048,2051,2054],{},[216,2043,2044],{},"ionic-team\u002Fcapacitor-plugins",[216,2046,2047],{},"87c0bb8",[216,2049,2050],{},"– (no build output or copies committed)",[216,2052,2053],{},"TS 96 → 96",[216,2055,2056],{},"28 \u002F 45 → 28 \u002F 45 → 28 \u002F 45",[183,2058,2059,2062,2065,2071,2074],{},[216,2060,2061],{},"abritopach\u002Fangular-ionic-master-detail",[216,2063,2064],{},"ba286ac",[216,2066,2067,2068,2070],{},"copy of ",[152,2069,2015],{}," (Capacitor webDir) 107, web build output (webDir) 104",[216,2072,2073],{},"TS 351 → 140",[216,2075,2076],{},"38 \u002F 50 → 38 \u002F 50 → 38 \u002F 50",[183,2078,2079,2082,2085,2091,2094],{},[216,2080,2081],{},"nuxt\u002Fstarter (v4)",[216,2083,2084],{},"9b0ac50",[216,2086,2087,2088,2090],{},"Nuxt build output (",[152,2089,2007],{},") 27",[216,2092,2093],{},"TS 29 → 2",[216,2095,2096],{},"1 \u002F 0 → 1 \u002F 0 → 1 \u002F 0",[183,2098,2099,2105,2108,2115,2118],{},[216,2100,2101,2102],{},"grpc\u002Fgrpc ",[152,2103,2104],{},"examples\u002F",[216,2106,2107],{},"e124571",[216,2109,2110,2111,2114],{},"protoc Python 40, protoc \u002F gRPC banner 16, protoc JS 4, ",[152,2112,2113],{},"\u003Cauto-generated>"," header 1",[216,2116,2117],{},"Python 143 → 103, PHP 20 → 11, TS 13 → 9",[216,2119,2120],{},"1364 \u002F 1835 → 1154 \u002F 1670 → 1364 \u002F 1835",[183,2122,2123,2126,2129,2132,2135],{},[216,2124,2125],{},"jellyfin\u002Fjellyfin-sdk-typescript",[216,2127,2128],{},"1ef0625",[216,2130,2131],{},"OpenAPI Generator banner 409",[216,2133,2134],{},"TS 507 → 98",[216,2136,2137],{},"3082 \u002F 9489 → 345 \u002F 857 → 3082 \u002F 9489",[183,2139,2140,2143,2146,2153,2156],{},[216,2141,2142],{},"openfga\u002Fjs-sdk",[216,2144,2145],{},"d6d4035",[216,2147,2148,2149,2152],{},"OpenAPI Generator banner 10, ",[152,2150,2151],{},".openapi-generator\u002FFILES"," 4",[216,2154,2155],{},"TS 54 → 40",[216,2157,2158],{},"685 \u002F 3219 → 453 \u002F 2063 → 685 \u002F 3219",[183,2160,2161,2164,2167,2182,2185],{},[216,2162,2163],{},"flutter\u002Fsamples",[216,2165,2166],{},"a05867d",[216,2168,2169,2170,2173,2174,2177,2178,2181],{},"Flutter plugin registrant 60, ",[152,2171,2172],{},"*.g.dart"," 46, ",[152,2175,2176],{},"*.freezed.dart"," 18, Flutter ",[152,2179,2180],{},"ephemeral\u002F"," 2",[216,2183,2184],{},"Dart 484 → 420, C\u002FC++ 210 → 162",[216,2186,2187],{},"5394 \u002F 11368 → 4631 \u002F 10141 → 6091 \u002F 12666",[141,2189,2190,2191,2194,2195,2197,2198,2201,2202,2204,2205,2207,2208,722],{},"In every default index no node comes from a classified file, and ",[152,2192,2193],{},"cg coverage"," lists each one by reason. In every\n",[152,2196,1993],{}," index, every node from a classified file carries ",[152,2199,2200],{},"attrs.generated"," (0 unlabelled): 210 on grpc,\n2737 on jellyfin, 232 on openfga, 1478 on flutter\u002Fsamples. flutter\u002Fsamples grows past \"before\" with the flag, because\n",[152,2203,2176],{}," output, which the Dart plugin always skipped, is indexed too. On the Ionic app and on capacitor-plugins\nthe node count does not move: the TS plugin only reads ",[152,2206,462],{},", so the 211 copies were never parsed, but they were\ncounted as unindexed TypeScript and inflated the coverage gap. Linking the JS side of a Capacitor plugin to its\nAndroid\u002FiOS implementation needs the Kotlin\u002FJava and Swift plugins (see ",[145,2209,2210],{"href":43},"Generated files",[141,2212,2213,2214,2217,2218,2221,2222,2225],{},"Bundled examples are unchanged except ",[152,2215,2216],{},"bookstore-flutter"," (90 \u002F 171 → 87 \u002F 164: the ",[152,2219,2220],{},"book.g.dart"," json_serializable\noutput is no longer a node; ",[152,2223,2224],{},"PARSES_JSON"," is unchanged, because the file is still read for the exact JSON keys). The classification scan\ntakes 0.00–0.08 s on these projects; index time on netbox (no generated files),\nmedian of five alternating runs on a shared box: 35.6 s before and 36.0 s after (run-to-run spread 33–37 s), with\nthe scan itself at 0.07 s.",[172,2227,87],{"id":2228},"platform-specific-code",[141,2230,2231,1124,2233,1128,2235,2238,2239,2242,2243,2246,2247,2250],{},[152,2232,1123],{},[152,2234,1127],{},[152,2236,2237],{},"cg platforms divergence",". \"Before\" is the index without\nplatform tags; node counts are identical before and after on every project, and the added edges are the\n",[152,2240,2241],{},"platform_variant_of"," copies that give each sibling variant the callers of the one the resolver picked (plus Rust\n",[152,2244,2245],{},"cfg-inactive"," references, which carry the condition instead of being dropped). Targets come from the project itself:\nFlutter folders, React Native and its ",[152,2248,2249],{},"react-native-web"," dependency, or the desktop default for native code, plus every\nOS a condition names.",[177,2252,2253,2279],{},[180,2254,2255],{},[183,2256,2257,2259,2261,2264,2267,2270,2273,2276],{},[186,2258,188],{},[186,2260,1165],{},[186,2262,2263],{},"Targets",[186,2265,2266],{},"Conditions (not evaluable)",[186,2268,2269],{},"Tagged nodes \u002F edges",[186,2271,2272],{},"Edges before → after",[186,2274,2275],{},"Variants \u002F API differences \u002F missing callees",[186,2277,2278],{},"Platforms pass",[211,2280,2281,2307,2332,2358,2383,2409,2435],{},[183,2282,2283,2286,2289,2292,2295,2298,2301,2304],{},[216,2284,2285],{},"BurntSushi\u002Fripgrep",[216,2287,2288],{},"3fce3b5",[216,2290,2291],{},"windows, linux, macos",[216,2293,2294],{},"106 (7)",[216,2296,2297],{},"59 \u002F 316",[216,2299,2300],{},"25765 → 25812",[216,2302,2303],{},"17 \u002F 0 \u002F 0",[216,2305,2306],{},"0.29 s",[183,2308,2309,2312,2315,2317,2320,2323,2326,2329],{},[216,2310,2311],{},"alacritty\u002Falacritty",[216,2313,2314],{},"d692748",[216,2316,2291],{},[216,2318,2319],{},"480 (18)",[216,2321,2322],{},"324 \u002F 1167",[216,2324,2325],{},"23135 → 23303",[216,2327,2328],{},"18 \u002F 0 \u002F 0",[216,2330,2331],{},"0.13 s",[183,2333,2334,2337,2340,2343,2346,2349,2352,2355],{},[216,2335,2336],{},"libuv\u002Flibuv (C, heuristic)",[216,2338,2339],{},"49b1c06",[216,2341,2342],{},"windows, linux, macos, ios, android",[216,2344,2345],{},"1153 (211)",[216,2347,2348],{},"5300 \u002F 30318",[216,2350,2351],{},"52483 → 61235",[216,2353,2354],{},"235 \u002F 0 \u002F 85",[216,2356,2357],{},"0.77 s",[183,2359,2360,2363,2366,2368,2371,2374,2377,2380],{},[216,2361,2362],{},"curl\u002Fcurl (C, compile database)",[216,2364,2365],{},"d4dc7d1",[216,2367,2291],{},[216,2369,2370],{},"476 (212)",[216,2372,2373],{},"527 \u002F 2486",[216,2375,2376],{},"113311 → 115781",[216,2378,2379],{},"114 \u002F 0 \u002F 0",[216,2381,2382],{},"0.28 s",[183,2384,2385,2388,2391,2394,2397,2400,2403,2406],{},[216,2386,2387],{},"dart-lang\u002Fhttp",[216,2389,2390],{},"47c57df",[216,2392,2393],{},"6 Flutter folders",[216,2395,2396],{},"88 (0)",[216,2398,2399],{},"104 \u002F 204",[216,2401,2402],{},"11365 → 11378",[216,2404,2405],{},"30 \u002F 1 \u002F 1",[216,2407,2408],{},"0.21 s",[183,2410,2411,2414,2417,2420,2423,2426,2429,2432],{},[216,2412,2413],{},"bluesky-social\u002Fsocial-app (React Native)",[216,2415,2416],{},"db23528",[216,2418,2419],{},"ios, android, web",[216,2421,2422],{},"240 (3)",[216,2424,2425],{},"1038 \u002F 4328",[216,2427,2428],{},"44842 → 47065",[216,2430,2431],{},"108 \u002F 9 \u002F 102",[216,2433,2434],{},"1.13 s",[183,2436,2437,2440,2443,2445,2448,2451,2454,2457],{},[216,2438,2439],{},"localsend\u002Flocalsend (Flutter)",[216,2441,2442],{},"c5bbe36",[216,2444,2393],{},[216,2446,2447],{},"132 (64)",[216,2449,2450],{},"10 \u002F 95",[216,2452,2453],{},"10860 → 10860",[216,2455,2456],{},"1 \u002F 0 \u002F 0",[216,2458,2459],{},"0.15 s",[141,2461,2462],{},"What the findings are, from spot checks:",[425,2464,2465,2485,2521,2551,2579],{},[428,2466,2467,2470,2471,442,2474,2477,2478,442,2481,2484],{},[1443,2468,2469],{},"ripgrep, alacritty, curl:"," every variant group is a real per-OS definition set (",[152,2472,2473],{},"#[cfg(unix)]",[152,2475,2476],{},"#[cfg(windows)]","\npairs, ",[152,2479,2480],{},"#ifdef WIN32",[152,2482,2483],{},"#else"," function and macro pairs), and no reference lacks a callee on any target.",[428,2486,2487,2490,2491,442,2494,442,2497,2500,2501,2504,2505,2508,2509,2512,2513,2516,2517,2520],{},[1443,2488,2489],{},"dart-lang\u002Fhttp:"," the conditional imports (",[152,2492,2493],{},"client_stub.dart",[152,2495,2496],{},"io_client.dart",[152,2498,2499],{},"browser_client.dart",",\n",[152,2502,2503],{},"connect_stub.dart"," \u002F …) form the variant groups, including imports whose default is an SDK library (",[152,2506,2507],{},"dart:isolate",").\nThe one API difference and missing callee are ",[152,2510,2511],{},"connect"," in ",[152,2514,2515],{},"browser_web_socket.dart",", a top-level\n",[152,2518,2519],{},"const connect = BrowserWebSocket.connect"," tear-off the Dart extractor does not record as a symbol.",[428,2522,2523,2526,2527,442,2530,442,2533,442,2536,2539,2540,571,2543,2546,2547,2550],{},[1443,2524,2525],{},"social-app:"," the ",[152,2528,2529],{},".ios",[152,2531,2532],{},".android",[152,2534,2535],{},".native",[152,2537,2538],{},".web"," file groups. Sampled findings come from variant files\nthat re-export the symbol (",[152,2541,2542],{},"export {x}",[152,2544,2545],{},"export {a as b} from 'react-dom'","), which the TS extractor does not record\nas a definition in that file, and from ",[152,2548,2549],{},".web.ts"," files that tests call directly.",[428,2552,2553,2556,2557,463,2560,2563,2564,2512,2567,2570,2571,2574,2575,2578],{},[1443,2554,2555],{},"libuv:"," the per-OS function sets of ",[152,2558,2559],{},"src\u002Funix\u002F*",[152,2561,2562],{},"src\u002Fwin\u002F*",". Missing callees come from the C heuristic\nextractor: functions generated by macros (",[152,2565,2566],{},"SOCKOPT_SETTER",[152,2568,2569],{},"src\u002Fwin\u002Fudp.c","), functions after a region tree-sitter\ncannot parse (",[152,2572,2573],{},"src\u002Fwin\u002Ftty.c","), and one macro defined in two ",[152,2576,2577],{},"#if"," branches of one header.",[428,2580,2581,2584,2585,442,2588,2591,2592,2595],{},[1443,2582,2583],{},"localsend:"," almost all platform logic is runtime ",[152,2586,2587],{},"Platform.isX",[152,2589,2590],{},"defaultTargetPlatform"," checks inside shared code;\n64 of them use ",[152,2593,2594],{},"TargetPlatform"," values that do not exist on web, so the web count of unevaluated conditions is high\nand those branches stay in for web.",[141,2597,2598],{},"Index time on netbox (no platform-specific code), best of three alternating runs on a shared box: 43.2 s before and\n42.7 s after (spread 42.7–45.4 s); nodes and edges are identical (38028 \u002F 140181).",[141,2600,2601],{},"Divergence false positives removed in #63 (before → after on the same commits):",[177,2603,2604,2624],{},[180,2605,2606],{},[183,2607,2608,2610,2612,2615,2618,2621],{},[186,2609,188],{},[186,2611,1165],{},[186,2613,2614],{},"missing_callee",[186,2616,2617],{},"variants",[186,2619,2620],{},"Edges",[186,2622,2623],{},"What changed",[211,2625,2626,2656,2686,2716],{},[183,2627,2628,2631,2633,2636,2639,2642],{},[216,2629,2630],{},"libuv",[216,2632,2339],{},[216,2634,2635],{},"38 → 35 (+3 counted, built for no target)",[216,2637,2638],{},"496 → 495",[216,2640,2641],{},"70889 → 70826",[216,2643,2644,2647,2648,2651,2652,2655],{},[152,2645,2646],{},"alloc_buffer"," of the separate ",[152,2649,2650],{},"docs\u002Fcode\u002F*"," programs is no variant group (63 mirrored edges between programs gone); ",[152,2653,2654],{},"strnlen"," (sunos.c) ×2 and an aix.c helper not listed",[183,2657,2658,2661,2664,2667,2670,2673],{},[216,2659,2660],{},"SwiftUIX",[216,2662,2663],{},"3a99044",[216,2665,2666],{},"51 → 49",[216,2668,2669],{},"103 → 103",[216,2671,2672],{},"unchanged",[216,2674,2675,2678,2679,2682,2683],{},[152,2676,2677],{},"Path(...)"," bound to a project ",[152,2680,2681],{},"extension Path { init }"," under ",[152,2684,2685],{},"#if canImport(UIKit)",[183,2687,2688,2691,2693,2696,2699,2702],{},[216,2689,2690],{},"social-app",[216,2692,2416],{},[216,2694,2695],{},"155 → 155",[216,2697,2698],{},"108 → 108",[216,2700,2701],{},"60563 → 60559",[216,2703,2704,2707,2708,2711,2712,2715],{},[152,2705,2706],{},"bootstrap.test.ts"," imports ",[152,2709,2710],{},".\u002Findex.web"," explicitly: its 4 test edges to ",[152,2713,2714],{},"index.ts"," are gone",[183,2717,2718,2721,2724,2726,2728,2730],{},[216,2719,2720],{},"mattermost-mobile, IceCubesApp",[216,2722,2723],{},"e5be311, 9efcb16",[216,2725,2672],{},[216,2727,2672],{},[216,2729,2672],{},[216,2731],{},[172,2733,54],{"id":2734},"kotlin",[141,2736,2737,2738,2741],{},"Heuristic mode (tree-sitter-kotlin 1.1.0), shallow clones, ",[152,2739,2740],{},"cg index"," on the default branch:",[177,2743,2744,2766],{},[180,2745,2746],{},[183,2747,2748,2751,2754,2757,2760,2763],{},[186,2749,2750],{},"Repository",[186,2752,2753],{},"Kotlin files",[186,2755,2756],{},"Declarations",[186,2758,2759],{},"Calls resolved \u002F unresolved",[186,2761,2762],{},"Framework facts",[186,2764,2765],{},"Index time",[211,2767,2768,2788,2808,2827],{},[183,2769,2770,2773,2776,2779,2782,2785],{},[216,2771,2772],{},"android\u002Fnowinandroid",[216,2774,2775],{},"350",[216,2777,2778],{},"1,219",[216,2780,2781],{},"1,608 \u002F 5,696",[216,2783,2784],{},"4 Retrofit endpoints, 3 activities, 1 service, 2 workers, 2 deep links",[216,2786,2787],{},"0.8 s",[183,2789,2790,2793,2796,2799,2802,2805],{},[216,2791,2792],{},"ktorio\u002Fktor-samples",[216,2794,2795],{},"204",[216,2797,2798],{},"570",[216,2800,2801],{},"652 \u002F 5,635",[216,2803,2804],{},"77 Ktor routes, 115 Ktor client endpoints, 10 KMP source-set files",[216,2806,2807],{},"0.4 s",[183,2809,2810,2813,2816,2819,2822,2825],{},[216,2811,2812],{},"spring-petclinic\u002Fspring-petclinic-kotlin",[216,2814,2815],{},"40",[216,2817,2818],{},"139",[216,2820,2821],{},"112 \u002F 548",[216,2823,2824],{},"19 Spring routes",[216,2826,285],{},[183,2828,2829,2832,2835,2838,2841,2851],{},[216,2830,2831],{},"touchlab\u002FKaMPKit",[216,2833,2834],{},"38",[216,2836,2837],{},"114",[216,2839,2840],{},"167 \u002F 562",[216,2842,2843,2844,690,2847,2850],{},"2 ",[152,2845,2846],{},"expect",[152,2848,2849],{},"actual"," links, 5 KMP source-set files, 1 activity",[216,2852,285],{},[141,2854,2855],{},"Unresolved calls are mostly library and standard-library calls (Compose, coroutines, collections), which have no\nnode in the graph.",[141,2857,2858,2859,2862,2863,2866,2867,2870,2871,2874],{},"Framework facts added with exact mode (same corpora, before → after; every other node and edge unchanged apart from\ncalls now owned by the new page \u002F route-handler nodes): nowinandroid 2 → 7 pages (Navigation 3 ",[152,2860,2861],{},"entry\u003CKey>","), 0 → 3\n",[152,2864,2865],{},"NAVIGATES_TO","; ktor-samples 77 → 90 routes (type-safe resources), 3 Exposed tables with 14 reads \u002F writes, 8 → 11\nKtor client calls (builder blocks); spring-petclinic-kotlin 4 tables with 17 Spring Data reads \u002F writes (plus 38 from\ntests). KaMPKit (URL built in a helper) and android\u002Farchitecture-samples (routes from ",[152,2868,2869],{},"const val"," strings) are unchanged.\nNo corpus has a ",[152,2872,2873],{},"SecurityFilterChain","; the fixture covers it.",[2876,2877,2879],"h3",{"id":2878},"kotlin-exact-mode-scip-java","Kotlin exact mode (scip-java)",[141,2881,2882,2883,2886,2887,2890,2891,2893,2894,2897],{},"scip-java 0.12.3 standalone launcher, JDK 17, ",[152,2884,2885],{},"CODEGRAPH_KOTLIN_SCIP_FILE"," pointing at the index. scip-java's\nsemanticdb-kotlinc plugin only loads into Kotlin ≤ 2.1, and these builds use Kotlin 2.4: each was indexed from a copy\nwith the Kotlin Gradle plugin pinned to 2.1.20 (Ktor samples also with ",[152,2888,2889],{},"-Xskip-metadata-version-check",", since Ktor 3.6\nis compiled with Kotlin 2.3 metadata); the sources are unchanged. Precision: share of heuristic call edges (",[152,2892,1377],{}," \u002F\n",[152,2895,2896],{},"INSTANTIATES",", same source and target) that the index confirms; recall: share of compiler edges the heuristic layer\nfound.",[177,2899,2900,2930],{},[180,2901,2902],{},[183,2903,2904,2906,2909,2912,2915,2918,2921,2924,2927],{},[186,2905,188],{},[186,2907,2908],{},"Kotlin files in index",[186,2910,2911],{},"Defs matched \u002F unmatched",[186,2913,2914],{},"Heuristic edges",[186,2916,2917],{},"Exact edges",[186,2919,2920],{},"Agree",[186,2922,2923],{},"Precision",[186,2925,2926],{},"Recall",[186,2928,2929],{},"scip-java run",[211,2931,2932,2960,2989,3014,3039,3064,3093],{},[183,2933,2934,2937,2940,2943,2946,2949,2951,2954,2957],{},[216,2935,2936],{},"spring-petclinic-kotlin",[216,2938,2939],{},"38 \u002F 38",[216,2941,2942],{},"140 \u002F 4",[216,2944,2945],{},"98",[216,2947,2948],{},"96",[216,2950,2948],{},[216,2952,2953],{},"0.98",[216,2955,2956],{},"1.00",[216,2958,2959],{},"~2 min cold, 24 s warm",[183,2961,2962,2965,2968,2971,2974,2977,2980,2983,2986],{},[216,2963,2964],{},"ktor-samples\u002Fkweet",[216,2966,2967],{},"16 \u002F 16",[216,2969,2970],{},"74 \u002F 7",[216,2972,2973],{},"77",[216,2975,2976],{},"95",[216,2978,2979],{},"74",[216,2981,2982],{},"0.96",[216,2984,2985],{},"0.78",[216,2987,2988],{},"28 s",[183,2990,2991,2994,2997,3000,3003,3006,3008,3010,3012],{},[216,2992,2993],{},"ktor-samples\u002Fmvc-web",[216,2995,2996],{},"12 \u002F 12",[216,2998,2999],{},"30 \u002F 1",[216,3001,3002],{},"25",[216,3004,3005],{},"32",[216,3007,3002],{},[216,3009,2956],{},[216,3011,2985],{},[216,3013,581],{},[183,3015,3016,3019,3021,3024,3026,3029,3031,3033,3036],{},[216,3017,3018],{},"ktor-samples\u002Fyoukube",[216,3020,891],{},[216,3022,3023],{},"24 \u002F 2",[216,3025,3002],{},[216,3027,3028],{},"29",[216,3030,3002],{},[216,3032,2956],{},[216,3034,3035],{},"0.86",[216,3037,3038],{},"27 s",[183,3040,3041,3044,3047,3050,3053,3055,3057,3059,3061],{},[216,3042,3043],{},"ktor-samples\u002Fpostgres",[216,3045,3046],{},"7 \u002F 7",[216,3048,3049],{},"14 \u002F 1",[216,3051,3052],{},"11",[216,3054,3052],{},[216,3056,3052],{},[216,3058,2956],{},[216,3060,2956],{},[216,3062,3063],{},"24 s",[183,3065,3066,3069,3072,3075,3078,3081,3084,3087,3090],{},[216,3067,3068],{},"8 smaller ktor-samples (1–2 files each)",[216,3070,3071],{},"11 \u002F 11",[216,3073,3074],{},"100 \u002F 12",[216,3076,3077],{},"17",[216,3079,3080],{},"28",[216,3082,3083],{},"15",[216,3085,3086],{},"0.88",[216,3088,3089],{},"0.54",[216,3091,3092],{},"17–26 s",[183,3094,3095,3100,3103,3106,3109,3112,3115,3120,3125],{},[216,3096,3097],{},[1443,3098,3099],{},"Total (13 Gradle builds)",[216,3101,3102],{},"93",[216,3104,3105],{},"382 \u002F 27",[216,3107,3108],{},"253",[216,3110,3111],{},"291",[216,3113,3114],{},"246",[216,3116,3117],{},[1443,3118,3119],{},"0.97",[216,3121,3122],{},[1443,3123,3124],{},"0.85",[216,3126],{},[141,3128,3129,3130,3133,3134,3137,3138,3140,3141,3144,3145,722],{},"The heuristic layer's misses are mostly extension functions called on a library receiver (",[152,3131,3132],{},"call.redirect(...)","),\noverloads and lambda receivers (",[152,3135,3136],{},"it.area()","); its few disagreeing edges attribute a call to the file instead of the\nenclosing function, or pick a same-named function. Unmatched definitions (SCIP definitions with no syntax-layer\ndeclaration on that line) get no edges. Not run: chat, h2, opentelemetry (the build does not\nconfigure with the pinned plugin), httpbin (needs Kotlin 2.2 language features), and the Android projects\n(nowinandroid, KaMPKit, architecture-samples: no Android SDK on the validation machine). Without a JDK, or with the\nunpinned Kotlin 2.4 build, the index completes in heuristic mode and ",[152,3139,2193],{}," names the reason (",[152,3142,3143],{},"no JDK",", or\n",[152,3146,3147],{},"scip-java run failed (exit 1: ...)",[141,3149,3150,3151,3154,3155,442,3158,3161,3162,3165,3166,3169,3170,3173,3174,442,3177,3180],{},"Kotlin 2.2 and mixed Kotlin \u002F Java (scip-java 0.13.1 launcher next to 0.12.3, ",[152,3152,3153],{},"CODEGRAPH_KOTLIN_SCIP=1",", build not\nedited): statsig-io\u002Fjava-server-sdk 9edc7ca, Kotlin 2.2.10, Gradle 8.5 wrapper, 86 Kotlin + 12 Java (test) files. cg\nread Kotlin 2.2.10 from the build, ran 0.13.1 (93 s cold): 84 Kotlin files exact, 944 \u002F 59 definitions matched \u002F\nunmatched (compiler-generated members such as data class ",[152,3156,3157],{},"copy",[152,3159,3160],{},"componentN"," and anonymous objects not counted),\n2,207 references resolved to project code; heuristic precision 0.91, recall 0.81 (1,434 of 1,573 heuristic edges\nconfirmed, 1,779 exact). Java: 13 documents, 30 classes and 192 methods as ",[152,3163,3164],{},"java"," nodes, 358 exact Java -> Kotlin \u002F Java edges;\ncoverage ",[152,3167,3168],{},"kotlin 86 exact; java 12 scip"," (heuristic mode: ",[152,3171,3172],{},"java 12 unsupported","). Graph 1,003 -> 1,097 nodes,\n3,226 -> 3,852 edges. The same Gradle fixture on Kotlin 2.1.20 (0.12.3) and 2.2.10 (0.13.1) gives identical edges;\non 2.2.21, 2.3.21 and 2.4.20 neither release loads (",[152,3175,3176],{},"NoSuchMethodError",[152,3178,3179],{},"AnalyzerRegistrar is incompatible",") and\ncoverage names the version.",[141,3182,3183,3184,571,3187,3190,3191,3194,3195,3198,3199,3202,3203,3206],{},"Android: android\u002Farchitecture-samples ee66e15 (Kotlin 2.1.10, modules ",[152,3185,3186],{},"app",[152,3188,3189],{},"shared-test",") with an Android SDK\ninstalled in the user's home (command-line tools + ",[152,3192,3193],{},"sdkmanager \"platforms;android-35\" \"build-tools;35.0.0\"",", no\nsudo). The default scip-java run fails on the settings' ",[152,3196,3197],{},"FAIL_ON_PROJECT_REPOS","; cg reports that and names both\nAndroid modules. With an init script switching the mode to ",[152,3200,3201],{},"PREFER_SETTINGS"," and the variant tasks requested\nexplicitly (",[152,3204,3205],{},":app:compileDebugKotlin","), the build compiles (1 min 27 s) but scip-java 0.12.3's Gradle plugin attaches\nno compiler plugin to Android variant tasks: no SemanticDB output, so the index stays heuristic (61 Kotlin files).",[172,3208,111],{"id":3209},"swift",[141,3211,3212,3213,2741],{},"Heuristic mode (tree-sitter-swift 0.7.3) on Linux without Xcode, shallow clones, ",[152,3214,2740],{},[177,3216,3217,3234],{},[180,3218,3219],{},[183,3220,3221,3223,3226,3228,3230,3232],{},[186,3222,2750],{},[186,3224,3225],{},"Swift files",[186,3227,2756],{},[186,3229,2759],{},[186,3231,2762],{},[186,3233,2765],{},[211,3235,3236,3263,3289,3311],{},[183,3237,3238,3241,3244,3247,3250,3260],{},[216,3239,3240],{},"Alamofire\u002FAlamofire",[216,3242,3243],{},"101",[216,3245,3246],{},"2,019",[216,3248,3249],{},"3,817 \u002F 8,170",[216,3251,3252,3253,3255,3256,3259],{},"198 extensions, 33 ",[152,3254,2577],{}," platform blocks, 5 ",[152,3257,3258],{},"AF.request"," endpoints (the example apps)",[216,3261,3262],{},"1.1 s",[183,3264,3265,3268,3271,3274,3277,3287],{},[216,3266,3267],{},"Dimillian\u002FIceCubesApp",[216,3269,3270],{},"428",[216,3272,3273],{},"2,156",[216,3275,3276],{},"3,537 \u002F 8,174",[216,3278,3279,3280,3283,3284,3286],{},"21 SwiftUI pages, 21 navigations, 14 ",[152,3281,3282],{},"@main"," entries (app, extensions, widgets), 259 ",[152,3285,2577],{}," platform blocks",[216,3288,548],{},[183,3290,3291,3294,3297,3300,3303,3309],{},[216,3292,3293],{},"pointfreeco\u002Fisowords",[216,3295,3296],{},"388",[216,3298,3299],{},"1,729",[216,3301,3302],{},"2,606 \u002F 7,794",[216,3304,3305,3306,3308],{},"17 SwiftUI pages, 12 navigations, 12 ",[152,3307,3282],{}," entries, 1 URLSession endpoint",[216,3310,3262],{},[183,3312,3313,3316,3318,3321,3324,3331],{},[216,3314,3315],{},"vapor\u002Ftemplate",[216,3317,404],{},[216,3319,3320],{},"16",[216,3322,3323],{},"20 \u002F 81",[216,3325,3326,3327,3330],{},"3 Vapor routes with their ",[152,3328,3329],{},"RouteCollection"," handlers",[216,3332,3333],{},"\u003C 0.1 s",[141,3335,3336,3337,3340,3341,722],{},"Unresolved calls are mostly SDK calls (SwiftUI modifiers, Foundation, Combine), which have no node in the graph.\nIceCubesApp and isowords call their APIs through typed endpoint enums and a swift-parsing router, which are not HTTP\nclient forms the plugin reads yet. The Vapor template's ",[152,3338,3339],{},"routes.swift"," contains Mustache markup, so its two\nclosure routes do not parse. Since exact mode, the body of an overloaded method is owned by its (merged) method node\nrather than the enclosing type: Alamofire 3,825 → 3,817 resolved calls (overloads calling each other became self\ncalls), isowords gained one URLSession endpoint (built inside an overloaded ",[152,3342,3343],{},"request",[141,3345,3346,3347,3350,3351,3354,3355,3358,3359,3362,3363,3366,3367,3370,3371,2500,3374,3377,3378,3381,3382,3385,3386,3389,3390,3393,3394,3397,3398,3401],{},"Moya and Fluent: none of the four corpora uses Moya (the fixture ",[152,3348,3349],{},"tests\u002Fswift_facts_fixture"," covers it, including a\n",[152,3352,3353],{},"TargetType"," with a relative base linked to Vapor routes). The Vapor template rendered with Fluent (",[152,3356,3357],{},"fluent: true",",\nSQLite, no Leaf) gives ",[152,3360,3361],{},"table:todos"," (",[152,3364,3365],{},"MAPS_TO_TABLE"," from ",[152,3368,3369],{},"Todo","), 2 migration writes, 2 reads (",[152,3372,3373],{},"Todo.query",[152,3375,3376],{},"Todo.find",") and 1 write (",[152,3379,3380],{},"todo.delete(on:)",") from ",[152,3383,3384],{},"TodoController",", and 2 test uses; the unrendered template gives\nthe same. ",[152,3387,3388],{},"create"," saves the model returned by ",[152,3391,3392],{},"TodoDTO.toModel()",", whose type is not inferred. No corpus has\n",[152,3395,3396],{},"@available(iOS \u002F macOS, unavailable)"," or a call to a function defined per ",[152,3399,3400],{},"#if os(...)"," branch (the fixture covers\nboth). Apart from these and the overload change above, the four corpora index as before.",[2876,3403,3405],{"id":3404},"swift-exact-mode-index-store","Swift exact mode (index store)",[141,3407,3408,3409,3412,3413,3416,3417,442,3419,3421],{},"Swift 6.3.2 for Linux (Debian 12 build), ",[152,3410,3411],{},"libIndexStore.so"," from the same toolchain, ",[152,3414,3415],{},"swift build --enable-index-store"," (debug). Precision: share of heuristic call edges (",[152,3418,1377],{},[152,3420,2896],{},", same source and\ntarget) in the files the store covers that the index confirms; recall: share of compiler edges the heuristic layer\nfound.",[177,3423,3424,3448],{},[180,3425,3426],{},[183,3427,3428,3430,3433,3435,3437,3439,3441,3443,3445],{},[186,3429,188],{},[186,3431,3432],{},"Swift files in store",[186,3434,2911],{},[186,3436,2914],{},[186,3438,2917],{},[186,3440,2920],{},[186,3442,2923],{},[186,3444,2926],{},[186,3446,3447],{},"Build",[211,3449,3450,3486,3518,3545],{},[183,3451,3452,3462,3465,3468,3471,3474,3477,3480,3483],{},[216,3453,3454,3455,3458,3459,237],{},"Alamofire\u002FAlamofire (",[152,3456,3457],{},"swift build",", via ",[152,3460,3461],{},"CODEGRAPH_SWIFT_INDEX=1",[216,3463,3464],{},"44 \u002F 96",[216,3466,3467],{},"868 \u002F 15",[216,3469,3470],{},"655",[216,3472,3473],{},"833",[216,3475,3476],{},"544",[216,3478,3479],{},"0.83",[216,3481,3482],{},"0.65",[216,3484,3485],{},"7 s cold, cache hit 0.4 s",[183,3487,3488,3495,3498,3501,3503,3506,3509,3512,3515],{},[216,3489,3490,3491,3494],{},"pointfreeco\u002Fisowords (",[152,3492,3493],{},"swift build --product server",", existing store)",[216,3496,3497],{},"104 \u002F 384",[216,3499,3500],{},"424 \u002F 17",[216,3502,3114],{},[216,3504,3505],{},"345",[216,3507,3508],{},"157",[216,3510,3511],{},"0.64",[216,3513,3514],{},"0.46",[216,3516,3517],{},"41 s (dependencies built)",[183,3519,3520,3523,3526,3529,3531,3534,3536,3539,3542],{},[216,3521,3522],{},"vapor\u002Ftemplate (rendered with Fluent + SQLite, existing store)",[216,3524,3525],{},"7 \u002F 8",[216,3527,3528],{},"17 \u002F 0",[216,3530,3052],{},[216,3532,3533],{},"10",[216,3535,404],{},[216,3537,3538],{},"0.82",[216,3540,3541],{},"0.90",[216,3543,3544],{},"~2 min cold with dependencies",[183,3546,3547,3552,3555,3558,3561,3564,3567,3571,3576],{},[216,3548,3549],{},[1443,3550,3551],{},"Total",[216,3553,3554],{},"155",[216,3556,3557],{},"1,309 \u002F 32",[216,3559,3560],{},"912",[216,3562,3563],{},"1,188",[216,3565,3566],{},"710",[216,3568,3569],{},[1443,3570,2985],{},[216,3572,3573],{},[1443,3574,3575],{},"0.60",[216,3577],{},[141,3579,3580,3581,3586],{},"After the heuristic precision fixes of ",[145,3582,3585],{"href":3583,"rel":3584},"https:\u002F\u002Fgithub.com\u002Fcyberchronos00\u002Fcode-graph\u002Fissues\u002F58",[1364],"#58"," (same stores,\nsame sources; SDK initializers of extended types, initializer argument labels, standard-library collection methods,\nand the exact layer's initializers declared in extensions of SDK types):",[177,3588,3589,3605],{},[180,3590,3591],{},[183,3592,3593,3595,3597,3599,3601,3603],{},[186,3594,188],{},[186,3596,2914],{},[186,3598,2917],{},[186,3600,2920],{},[186,3602,2923],{},[186,3604,2926],{},[211,3606,3607,3629,3651,3670],{},[183,3608,3609,3611,3614,3617,3620,3626],{},[216,3610,3240],{},[216,3612,3613],{},"655 → 585",[216,3615,3616],{},"833 → 848",[216,3618,3619],{},"544 → 552",[216,3621,3622,3623],{},"0.83 → ",[1443,3624,3625],{},"0.94",[216,3627,3628],{},"0.65 → 0.65",[183,3630,3631,3634,3637,3640,3643,3648],{},[216,3632,3633],{},"pointfreeco\u002Fisowords (server product)",[216,3635,3636],{},"246 → 174",[216,3638,3639],{},"345 → 374",[216,3641,3642],{},"157 → 163",[216,3644,3645,3646],{},"0.64 → ",[1443,3647,3625],{},[216,3649,3650],{},"0.46 → 0.44",[183,3652,3653,3655,3658,3661,3664,3667],{},[216,3654,3315],{},[216,3656,3657],{},"11 → 11",[216,3659,3660],{},"10 → 10",[216,3662,3663],{},"9 → 9",[216,3665,3666],{},"0.82 → 0.82",[216,3668,3669],{},"0.90 → 0.90",[183,3671,3672,3676,3679,3682,3685,3690],{},[216,3673,3674],{},[1443,3675,3551],{},[216,3677,3678],{},"912 → 770",[216,3680,3681],{},"1,188 → 1,232",[216,3683,3684],{},"710 → 724",[216,3686,3687,3688],{},"0.78 → ",[1443,3689,3625],{},[216,3691,3692],{},"0.60 → 0.59",[141,3694,3695,3696,3699,3700,571,3703,571,3706,571,3709,463,3712,3715],{},"The exact edges grew by the initializers projects declare in extensions of SDK types (",[152,3697,3698],{},"extension Data { init(hex:) }","), which the layer used to drop; recall moves by that denominator, not by lost heuristic edges. The whole\ngraph also loses the SDK-initializer edges in files without a store (all edges: Alamofire 7,321 → 6,756, isowords\n4,973 → 4,295, mostly ",[152,3701,3702],{},"Result",[152,3704,3705],{},"Data",[152,3707,3708],{},"URL",[152,3710,3711],{},"URLRequest",[152,3713,3714],{},"UUID"," constructions in tests).",[141,3717,3718,3719,3722,3723,3725,3726,3729,3730,3732,3733,3736,3737,722],{},"What a Linux build covers: Alamofire's ",[152,3720,3721],{},"Source\u002F"," (tests and example apps need Apple frameworks); isowords' server\nmodules (the full ",[152,3724,3457],{}," stops at SwiftUI; the server product needs ",[152,3727,3728],{},"libsqlite3-dev","), the rest of its 384 files\nkeep heuristic edges and ",[152,3731,2193],{}," counts them; the Vapor app's ",[152,3734,3735],{},"App"," target (its test target was not built). Not\nrun: Dimillian\u002FIceCubesApp (iOS-only SwiftUI app, no Linux build; heuristic, with the reason in ",[152,3738,2193],{},[141,3740,3741,3742,2500,3745,571,3748,3751,3752,3755,3756,3759,3760,3763,3764,3767,3768,442,3771,3774,3775,3778,3779,3781,3782,3785,3786,3788,3789,3792,3793,3795,3796,3799,3800,3802,3803,571,3806,2500,3809,722],{},"Where they disagreed before #58: the heuristic layer linked initializers of SDK types the project extends (",[152,3743,3744],{},"URL(...)",[152,3746,3747],{},"Date(...)",[152,3749,3750],{},"UUID(...)"," → the extension's class node, while the compiler resolves them to Foundation) and picked\nsame-named methods (",[152,3753,3754],{},"xs.first(where:)"," → a project ",[152,3757,3758],{},"first","; now fixed; a Fluent migration's ",[152,3761,3762],{},".create()"," still matches\n",[152,3765,3766],{},"TodoController.create","); it misses initializer calls\nthrough ",[152,3769,3770],{},"Self(...)",[152,3772,3773],{},".init(...)"," \u002F nested types, calls to explicit ",[152,3776,3777],{},"init"," declarations (the index adds a ",[152,3780,1377],{}," to\n",[152,3783,3784],{},"T.init"," next to ",[152,3787,2896],{},"), and members reached through inferred types (",[152,3790,3791],{},".live",", closure parameters). In\nAlamofire, 247 heuristic edges sit in inactive ",[152,3794,2577],{}," branches (Apple-only code); they are kept with\n",[152,3797,3798],{},"via: \"not-compiled\"",". Without the opt-in or a toolchain the index completes in heuristic mode and ",[152,3801,2193],{},"\nnames the reason (",[152,3804,3805],{},"Swift toolchain found but the package was not built ...",[152,3807,3808],{},"no Package.swift ...",[152,3810,3811],{},"swift build failed (exit 1: ...)",[172,3813,18],{"id":3814},"web-native-bridges",[141,3816,3817,1124,3819,1128,3821,3362,3824,3826,3827,3830],{},[152,3818,1123],{},[152,3820,1127],{},[152,3822,3823],{},"cg bridges",[145,3825,18],{"href":19},"). The two Capacitor\nrepositories are monorepos without a root ",[152,3828,3829],{},"tsconfig.json","; the TypeScript plugin indexes their per-package\ntsconfigs as one program (capacitor: 794 \u002F 1664 → 1633 \u002F 4521 nodes \u002F edges, before that the plugin did not run;\ncapacitor-plugins: 589 \u002F 640 → 959 \u002F 1367, 20 package tsconfigs instead of 3–4 files picked up by the fallback). Index time is one run each on a shared box (the spread between repeated\nruns of the same build was 2–4 s); the bridge pass itself takes the time shown.",[177,3832,3833,3858],{},[180,3834,3835],{},[183,3836,3837,3839,3841,3844,3847,3850,3852,3855],{},[186,3838,188],{},[186,3840,1165],{},[186,3842,3843],{},"Endpoints",[186,3845,3846],{},"Linked",[186,3848,3849],{},"Receivers (stubs)",[186,3851,1059],{},[186,3853,3854],{},"Bridge pass",[186,3856,3857],{},"Index before → after",[211,3859,3860,3884,3906,3930,3954,3978,4002],{},[183,3861,3862,3865,3868,3871,3873,3876,3879,3882],{},[216,3863,3864],{},"ionic-team\u002Fcapacitor (framework)",[216,3866,3867],{},"ba28569",[216,3869,3870],{},"24",[216,3872,615],{},[216,3874,3875],{},"39 (19)",[216,3877,3878],{},"4 external, 1 missing_on, 19 no_sender",[216,3880,3881],{},"0.10 s",[216,3883],{},[183,3885,3886,3889,3891,3894,3896,3899,3902,3904],{},[216,3887,3888],{},"ionic-team\u002Fcapacitor-plugins (library)",[216,3890,2047],{},[216,3892,3893],{},"81",[216,3895,243],{},[216,3897,3898],{},"159 (86)",[216,3900,3901],{},"2 missing_on, 75 no_sender",[216,3903,3881],{},[216,3905],{},[183,3907,3908,3911,3913,3916,3918,3921,3924,3927],{},[216,3909,3910],{},"flutter\u002Fsamples (platform_channels, add_to_app, pigeon, platform_view_swift)",[216,3912,2166],{},[216,3914,3915],{},"14",[216,3917,3915],{},[216,3919,3920],{},"21 (7)",[216,3922,3923],{},"none",[216,3925,3926],{},"0.05 s",[216,3928,3929],{},"599 \u002F 999 → 605 \u002F 1023",[183,3931,3932,3935,3938,3941,3943,3946,3949,3951],{},[216,3933,3934],{},"mattermost\u002Fmattermost-mobile (React Native)",[216,3936,3937],{},"e5be311",[216,3939,3940],{},"42",[216,3942,3005],{},[216,3944,3945],{},"71 (30)",[216,3947,3948],{},"3 no_sender",[216,3950,3926],{},[216,3952,3953],{},"23.1–24.2 s → 24.3–25.0 s; 21639 \u002F 81163 → 21711 \u002F 81297 nodes \u002F edges",[183,3955,3956,3959,3961,3964,3966,3969,3972,3975],{},[216,3957,3958],{},"bluesky-social\u002Fsocial-app (Expo modules)",[216,3960,2416],{},[216,3962,3963],{},"33",[216,3965,615],{},[216,3967,3968],{},"62 (0)",[216,3970,3971],{},"4 missing_on, 32 no_sender",[216,3973,3974],{},"0.03 s",[216,3976,3977],{},"15.6–19.2 s → 16.7–18.1 s; 9900 \u002F 47568 → 9933 \u002F 47632",[183,3979,3980,3986,3988,3990,3993,3995,3998,4000],{},[216,3981,3982,3983],{},"social-app with ",[152,3984,3985],{},"include: [modules]",[216,3987,2416],{},[216,3989,3963],{},[216,3991,3992],{},"21",[216,3994,3968],{},[216,3996,3997],{},"12 no_sender",[216,3999,3974],{},[216,4001],{},[183,4003,4004,4010,4013,4016,4019,4022,4025,4027],{},[216,4005,4006,4007,4009],{},"immich-app\u002Fimmich ",[152,4008,1343],{}," (Flutter, Pigeon)",[216,4011,4012],{},"c5e06dc",[216,4014,4015],{},"45",[216,4017,4018],{},"43",[216,4020,4021],{},"86 (0)",[216,4023,4024],{},"3 missing_on, 2 no_sender",[216,4026,1215],{},[216,4028,4029],{},"7443 \u002F 22989 → 7488 \u002F 23131",[141,4031,2462],{},[425,4033,4034,4060,4081,4134,4190,4241,4273],{},[428,4035,4036,4039,4040,4043,4044,4047,4048,4051,4052,4055,4056,4059],{},[1443,4037,4038],{},"capacitor:"," the framework's own core plugins (CapacitorHttp, CapacitorCookies, WebView, Console) are received on\nboth platforms; ",[152,4041,4042],{},"CapacitorHttp#request"," is the one method the framework's own web code sends (through\n",[152,4045,4046],{},"nativePromise","), the others are the plugins' public API, called by apps. ",[152,4049,4050],{},"Console#log"," exists on iOS only (Android logs through the web\nview). The external endpoints are test literals and ",[152,4053,4054],{},"App#exitApp"," from the ",[152,4057,4058],{},"@capacitor\u002Fapp"," package.",[428,4061,4062,4065,4066,4069,4070,442,4073,4076,4077,4080],{},[1443,4063,4064],{},"capacitor-plugins:"," a library repository, so no senders. The two ",[152,4067,4068],{},"missing_on"," are real: ",[152,4071,4072],{},"TextZoom.get",[152,4074,4075],{},"set","\nare Android methods (iOS has ",[152,4078,4079],{},"getPreferred"," only).",[428,4082,4083,4086,4087,4090,4091,3381,4094,4097,4098,4101,4102,4105,4106,4109,4110,4113,4114,4116,4117,463,4120,4123,4124,4105,4127,571,4130,4133],{},[1443,4084,4085],{},"immich mobile:"," 11 Pigeon APIs (10 ",[152,4088,4089],{},"@HostApi",", 1 ",[152,4092,4093],{},"@FlutterApi",[152,4095,4096],{},"mobile\u002Fpigeon\u002F*.dart"," (the generated\nfiles are git-ignored): 50 Dart sends, 86 Kotlin \u002F Swift receivers, 3 native sends to the Dart\n",[152,4099,4100],{},"BackgroundWorkerBgService",". Kotlin implementations inherit shared methods from ",[152,4103,4104],{},"NativeSyncApiImplBase","\n(",[152,4107,4108],{},"hashAssets"," is received there on Android and in ",[152,4111,4112],{},"NativeSyncApiImpl"," on iOS). The ",[152,4115,4068],{}," are real\n(",[152,4118,4119],{},"BackgroundWorkerLockApi",[152,4121,4122],{},"ViewIntentHostApi"," are implemented on Android only), as are the two ",[152,4125,4126],{},"no_sender",[152,4128,4129],{},"NetworkApi#addCertificate",[152,4131,4132],{},"NativeSyncApi#clearSyncCheckpoint"," have no Dart caller).",[428,4135,4136,4139,4140,4143,4144,4147,4148,4151,4152,4155,4156,4159,4160,442,4163,4166,4167,4170,4171,4173,4174,4177,4178,4181,4182,4185,4186,4189],{},[1443,4137,4138],{},"flutter\u002Fsamples:"," every channel method is linked on both platforms. Native → Dart: ",[152,4141,4142],{},"reportCounter","\n(add_to_app fullscreen, Kotlin and Swift), ",[152,4145,4146],{},"setCount"," (multiple_flutters) and ",[152,4149,4150],{},"setCellNumber"," (android_view list\ncells) are sent by ",[152,4153,4154],{},"invokeMethod"," and received by the Dart ",[152,4157,4158],{},"setMethodCallHandler","; the books sample's Pigeon\n",[152,4161,4162],{},"HostBookApi",[152,4164,4165],{},"FlutterBookApi"," link both ways. ",[152,4168,4169],{},"platform_view_swift"," is an iOS-only app\n(no ",[152,4172,2011],{}," next to its ",[152,4175,4176],{},"pubspec.yaml","), so its ",[152,4179,4180],{},"switchView"," is not reported missing on Android. The stubs are\nSwift methods the Swift plugin does not index (multi-line ",[152,4183,4184],{},"application(...)"," signatures, ",[152,4187,4188],{},"viewDidLoad"," overrides).",[428,4191,4192,4195,4196,4199,4200,2500,4203,4206,4207,4210,4211,571,4214,4217,4218,4221,4222,4225,4226,4229,4230,4233,4234,4237,4238,420],{},[1443,4193,4194],{},"mattermost-mobile:"," the app imports its modules from local ",[152,4197,4198],{},"file:"," packages (",[152,4201,4202],{},"@mattermost\u002Frnutils",[152,4204,4205],{},"@mattermost\u002Fcalls-native",", ...) without ",[152,4208,4209],{},"node_modules","; they resolve to their source, through\n",[152,4212,4213],{},"isTurboModuleEnabled ? require('.\u002FNativeX').default : NativeModules.X",[152,4215,4216],{},"X || new Proxy(...)"," and\n",[152,4219,4220],{},"Object.assign(X, { onEvent })"," (whose helpers are not endpoints). ",[152,4223,4224],{},"setNavigationBarColor"," is Android-only and its\nonly call is under ",[152,4227,4228],{},"Platform.OS === 'android'",", so it is not missing on iOS. The 3 senderless ",[152,4231,4232],{},"MattermostShare","\nmethods are called from ",[152,4235,4236],{},"share_extension\u002F",", which the default source dirs do not index; the module is declared\n",[152,4239,4240],{},"codegenConfig.platforms: [\"android\"]",[428,4242,4243,4245,4246,4249,4250,4252,4253,4256,4257,4260,4261,4264,4265,4268,4269,4272],{},[1443,4244,2525],{}," the Expo modules are called from wrapper functions inside ",[152,4247,4248],{},"modules\u002F*\u002Fsrc",", which is outside the\ndefault source dirs; with ",[152,4251,3985],{}," 21 methods link and no platform gap remains\n(",[152,4254,4255],{},"ExpoBlueskyReferrer"," is called from an ",[152,4258,4259],{},".android.ts"," file, ",[152,4262,4263],{},"setAudioActive"," after\n",[152,4266,4267],{},"if (Platform.OS !== 'ios') return","). The senderless methods are view-ref methods (",[152,4270,4271],{},"GifView.playAsync",") and\nnotification-extension preferences.",[428,4274,4275,4278],{},[1443,4276,4277],{},"immich:"," the mobile app talks to native code through Pigeon-generated APIs only, which are not modelled yet.",[141,4280,4281],{},"Native events, Cordova and dynamic names (#61), before → after on the same commits:",[177,4283,4284,4304],{},[180,4285,4286],{},[183,4287,4288,4290,4292,4294,4296,4299,4302],{},[186,4289,188],{},[186,4291,1165],{},[186,4293,3843],{},[186,4295,3846],{},[186,4297,4298],{},"New endpoints",[186,4300,4301],{},"Unresolved (dynamic)",[186,4303,200],{},[211,4305,4306,4327,4353,4373],{},[183,4307,4308,4311,4313,4316,4319,4322,4324],{},[216,4309,4310],{},"mattermost-mobile",[216,4312,3937],{},[216,4314,4315],{},"42 → 49",[216,4317,4318],{},"32 → 33",[216,4320,4321],{},"7 react-native-event",[216,4323,888],{},[216,4325,4326],{},"23813 \u002F 95635 → 23820 \u002F 95643",[183,4328,4329,4332,4334,4337,4340,4347,4350],{},[216,4330,4331],{},"capacitor-plugins (library)",[216,4333,2047],{},[216,4335,4336],{},"81 → 96",[216,4338,4339],{},"0 → 0",[216,4341,4342,4343,4346],{},"15 capacitor-event (29 ",[152,4344,4345],{},"notifyListeners"," sends)",[216,4348,4349],{},"6",[216,4351,4352],{},"1192 \u002F 1847 → 1221 \u002F 1876",[183,4354,4355,4358,4361,4364,4366,4369,4371],{},[216,4356,4357],{},"EddyVerbruggen\u002FToast-PhoneGap-Plugin (Cordova)",[216,4359,4360],{},"55856bc",[216,4362,4363],{},"0 → 2",[216,4365,4363],{},[216,4367,4368],{},"2 cordova",[216,4370,243],{},[216,4372],{},[183,4374,4375,4377,4379,4382,4385,4387,4389],{},[216,4376,2690],{},[216,4378,2416],{},[216,4380,4381],{},"33 → 33",[216,4383,4384],{},"1 → 1",[216,4386,3923],{},[216,4388,243],{},[216,4390,2672],{},[425,4392,4393,4425,4440,4467],{},[428,4394,4395,1879,4397,4400,4401,4404,4405,4408,4409,4412,4413,4416,4417,4420,4421,4424],{},[1443,4396,4194],{},[152,4398,4399],{},"DimensionsChanged"," links the Swift ",[152,4402,4403],{},"sendEvent(name:)"," to ",[152,4406,4407],{},"useWindowDimensions","'\n",[152,4410,4411],{},"NativeEventEmitter(RNUtils)"," listener (the Android side emits through an enum value, not followed). Three native\nevents have \"no JS listener found\": their listeners sit in the local ",[152,4414,4415],{},"@mattermost\u002F*"," packages and take the name from\na constant object or a ",[152,4418,4419],{},"switch"," on the event. Three ",[152,4422,4423],{},"DeviceEventEmitter"," listeners belong to the app's JS event bus\n(emitted with names built elsewhere) and are not flagged. No existing endpoint or check changed.",[428,4426,4427,4429,4430,571,4433,4436,4437,4439],{},[1443,4428,4064],{}," a library, so the events have no JS listener; ",[152,4431,4432],{},"appRestoredResult",[152,4434,4435],{},"backButton"," and the\nlocal \u002F push notification action events are emitted on Android only. The unresolved sends are ",[152,4438,4345],{},"\ncalls with a variable name (Browser, StatusBar).",[428,4441,4442,1879,4445,442,4448,3366,4451,4454,4455,4458,4459,4462,4463,4466],{},[1443,4443,4444],{},"Toast-PhoneGap-Plugin:",[152,4446,4447],{},"show",[152,4449,4450],{},"hide",[152,4452,4453],{},"www\u002FToast.js"," link to the Java ",[152,4456,4457],{},"execute"," actions (compared with\n",[152,4460,4461],{},"ACTION_SHOW_EVENT.equals(action)"," constants) and the Objective-C ",[152,4464,4465],{},"CDVPlugin"," methods on both platforms.",[428,4468,4469,4471,4472,4475,4476,4479,4480,4483],{},[1443,4470,2525],{}," no native events or Cordova calls; its ",[152,4473,4474],{},"addListener"," calls are navigation, ",[152,4477,4478],{},"Keyboard"," and a web-only\n",[152,4481,4482],{},"EventEmitter",", none of which became endpoints.",[172,4485,4487],{"id":4486},"desktop-process-boundaries-electron-tauri-and-declared-targets","Desktop process boundaries (Electron, Tauri) and declared targets",[141,4489,4490,1124,4492,1128,4494,4496,4497,4500],{},[152,4491,1123],{},[152,4493,1127],{},[152,4495,3823],{},"; Rust in heuristic mode\n(",[152,4498,4499],{},"CODEGRAPH_RUST_SCIP=0","). Index times are one run each on a shared box.",[177,4502,4503,4520],{},[180,4504,4505],{},[183,4506,4507,4509,4511,4513,4515,4517],{},[186,4508,188],{},[186,4510,1165],{},[186,4512,3843],{},[186,4514,3846],{},[186,4516,1059],{},[186,4518,4519],{},"Index before → after (nodes \u002F edges)",[211,4521,4522,4542,4562],{},[183,4523,4524,4527,4530,4533,4536,4539],{},[216,4525,4526],{},"electron\u002Ffiddle",[216,4528,4529],{},"a63225b",[216,4531,4532],{},"87 electron-ipc, 62 electron-preload",[216,4534,4535],{},"87, 60",[216,4537,4538],{},"2 no_sender",[216,4540,4541],{},"4.1 s → 3.8 s; 2195 \u002F 5811 → 2456 \u002F 6319",[183,4543,4544,4547,4550,4553,4556,4559],{},[216,4545,4546],{},"clash-verge-rev\u002Fclash-verge-rev (Tauri 2, React)",[216,4548,4549],{},"3607e66",[216,4551,4552],{},"90 tauri",[216,4554,4555],{},"89",[216,4557,4558],{},"1 no_sender",[216,4560,4561],{},"5.4 s → 5.0 s; 5263 \u002F 15540 → 5353 \u002F 15720",[183,4563,4564,4573,4576,4586,4588,4591],{},[216,4565,4566,4567,4569,4570,237],{},"tauri-apps\u002Ftauri ",[152,4568,2104],{}," (no root ",[152,4571,4572],{},"Cargo.toml",[216,4574,4575],{},"30da1fd",[216,4577,4578,4579,4582,4583,237],{},"7 tauri (2 of them ",[152,4580,4581],{},"plugin:app-menu|…"," from a plugin ",[152,4584,4585],{},"Builder",[216,4587,243],{},[216,4589,4590],{},"7 no_sender",[216,4592,4593,4594,4597],{},"the frontends are ",[152,4595,4596],{},".svelte"," \u002F plain HTML, which the TypeScript extractor does not read: no senders",[425,4599,4600,4636,4654],{},[428,4601,4602,4605,4606,4609,4610,4613,4614,4617,4618,4620,4621,4217,4624,4627,4628,4631,4632,4635],{},[1443,4603,4604],{},"fiddle:"," channels are ",[152,4607,4608],{},"IpcEvents"," enum members, registered through an ",[152,4611,4612],{},"ipcMainManager"," wrapper; main → renderer\nmessages go to a preload ",[152,4615,4616],{},"addEventListener"," that maps event names to channels through a lookup table (a\nunion-typed channel). Every channel is linked. The two ",[152,4619,4126],{}," members are real: ",[152,4622,4623],{},"getTemplateValues",[152,4625,4626],{},"removeAllListeners"," of the isolated run-button API are exposed but never called. ",[152,4629,4630],{},"impact"," on the main process's\n",[152,4633,4634],{},"readThemeFile"," went from 5 callers (main only) to 18, through the preload script into the renderer components.",[428,4637,4638,4641,4642,4645,4646,4649,4650,4653],{},[1443,4639,4640],{},"clash-verge-rev:"," 90 ",[152,4643,4644],{},"#[tauri::command]"," functions, all registered in ",[152,4647,4648],{},"generate_handler!","; 89 are invoked from\nthe TypeScript services. ",[152,4651,4652],{},"perf_state"," (a command in a perf script crate) has no sender.",[428,4655,4656,4657,4660,4661,3362,4663,4666,4667,4670,4671,442,4674,4677,4678,690,4680,4683,4684,4687,4688,4691,4692,690,4695,3362,4698,571,4701,571,4704,571,4707,571,4710,571,4713,4716,4717,4720],{},"Declared targets: swift-Alamofire ",[152,4658,4659],{},"windows, linux, macos, ios"," (desktop default) → ",[152,4662,2342],{},[152,4664,4665],{},"Package.swift"," platforms, plus the targets its ",[152,4668,4669],{},"#if os(Linux) || os(Windows) || os(Android)"," names);\n",[152,4672,4673],{},"canImport",[152,4675,4676],{},"targetEnvironment"," conditions take it from 33 to 103 platform conditions and from 26 to 370 tagged\nnodes. KaMPKit ",[152,4679,2342],{},[152,4681,4682],{},"ios, android"," (the ",[152,4685,4686],{},"kotlin { }"," block of\n",[152,4689,4690],{},"shared\u002Fbuild.gradle.kts","); Kotlin\u002Fkotlinx-datetime (c73ca37) ",[152,4693,4694],{},"windows, linux, macos, web",[152,4696,4697],{},"windows, linux, macos, ios, android, web",[152,4699,4700],{},"mingwX64()",[152,4702,4703],{},"linuxX64()",[152,4705,4706],{},"macosArm64()",[152,4708,4709],{},"iosArm64()",[152,4711,4712],{},"androidNativeArm64()",[152,4714,4715],{},"js()","; a\nplain ",[152,4718,4719],{},"jvm()"," is not a platform target). Graph edges are unchanged on all three.",[172,4722,4724,4725,442,4728,4731],{"id":4723},"overrides-in-tests-reaches-inherited-specs-typescript-class-hierarchy","Overrides in ",[152,4726,4727],{},"tests",[152,4729,4730],{},"reaches",", inherited specs, TypeScript class hierarchy",[141,4733,4734,4736],{},[152,4735,1123],{}," before and after (#53), no flags. TypeScript graphs gain only class hierarchy edges (no node and no\nother edge changes); Python graphs are identical (the change is in the queries).",[177,4738,4739,4752],{},[180,4740,4741],{},[183,4742,4743,4745,4747,4749],{},[186,4744,188],{},[186,4746,1165],{},[186,4748,2272],{},[186,4750,4751],{},"Added",[211,4753,4754,4772,4785,4798,4814,4826],{},[183,4755,4756,4759,4762,4765],{},[216,4757,4758],{},"brocoders\u002Fnestjs-boilerplate",[216,4760,4761],{},"9620f15",[216,4763,4764],{},"2097 → 2147",[216,4766,4767,4768,4771],{},"EXTENDS 8, IMPLEMENTS 6, IMPLEMENTED_BY 36 (repositories ",[152,4769,4770],{},"implements"," an abstract repository class)",[183,4773,4774,4777,4779,4782],{},[216,4775,4776],{},"bluesky-social\u002Fsocial-app",[216,4778,2416],{},[216,4780,4781],{},"47632 → 47650",[216,4783,4784],{},"IMPLEMENTS 13, EXTENDS 2, OVERRIDDEN_BY 3",[183,4786,4787,4790,4792,4795],{},[216,4788,4789],{},"mattermost\u002Fmattermost-mobile",[216,4791,3937],{},[216,4793,4794],{},"81297 → 81308",[216,4796,4797],{},"IMPLEMENTS 8, EXTENDS 3",[183,4799,4800,4805,4808,4811],{},[216,4801,4802,4803],{},"calcom\u002Fcal.com ",[152,4804,1347],{},[216,4806,4807],{},"54343aa",[216,4809,4810],{},"12304 → 12322",[216,4812,4813],{},"EXTENDS 9, IMPLEMENTS 9",[183,4815,4816,4819,4821,4823],{},[216,4817,4818],{},"elk-zone\u002Felk, breeze-nuxt, node-express-boilerplate",[216,4820],{},[216,4822,2672],{},[216,4824,4825],{},"(no class hierarchies)",[183,4827,4828,4831,4834,4837],{},[216,4829,4830],{},"sphinx-doc\u002Fsphinx (Python)",[216,4832,4833],{},"b04a210",[216,4835,4836],{},"33264 → 33264",[216,4838,3923],{},[141,4840,4841,4842,442,4845,4847,4848,4851,4852,4855,4856,4859,4860,4863,4864,4867,4868,4871,4872,1876,4875,4878],{},"Spot checks: every added edge was a real ",[152,4843,4844],{},"extends",[152,4846,4770],{}," \u002F override. On social-app,\n",[152,4849,4850],{},"impact MergeFeedSource_Following._getFeed"," had no callers and now lists ",[152,4853,4854],{},"MergeFeedSource._fetchNextInner"," (via the\nbase ",[152,4857,4858],{},"_getFeed",") up to ",[152,4861,4862],{},"fetchNext","; on nestjs-boilerplate the repository implementations were already reached through\nNest's BOUND_TO edges and now also state ",[152,4865,4866],{},"overrides: FileRepository.create",". Calls on a TypeScript ",[1443,4869,4870],{},"interface"," type\n(",[152,4873,4874],{},"api.fetch()",[152,4876,4877],{},"api: FeedAPI",") still had no target node then; #55 below adds interface members.",[172,4880,4882],{"id":4881},"receiver-types-on-inherited-calls-in-kotlin-swift-dart-and-php-62","Receiver types on inherited calls in Kotlin, Swift, Dart and PHP (#62)",[141,4884,4885,4887,4888,4891,4892,442,4894,442,4896,4898,4899,4902],{},[152,4886,2740],{}," before and after on the same commits: nodes and edges unchanged, calls into an inherited method now\ncarry ",[152,4889,4890],{},"attrs.recv"," (the receiver's class), which ",[152,4893,4630],{},[152,4895,4730],{},[152,4897,4727],{}," on ",[152,4900,4901],{},"Sub.method"," use to leave out\ncalls on sibling subclasses.",[177,4904,4905,4921],{},[180,4906,4907],{},[183,4908,4909,4911,4913,4915],{},[186,4910,188],{},[186,4912,1165],{},[186,4914,200],{},[186,4916,4917,4918],{},"Calls with ",[152,4919,4920],{},"recv",[211,4922,4923,4936,4950,4963],{},[183,4924,4925,4928,4931,4934],{},[216,4926,4927],{},"android\u002Fnowinandroid (Kotlin)",[216,4929,4930],{},"a49ed25",[216,4932,4933],{},"1824 \u002F 3414 unchanged",[216,4935,4363],{},[183,4937,4938,4941,4944,4947],{},[216,4939,4940],{},"Dimillian\u002FIceCubesApp (Swift)",[216,4942,4943],{},"9efcb16",[216,4945,4946],{},"4028 \u002F 8945 unchanged",[216,4948,4949],{},"0 → 65",[183,4951,4952,4955,4957,4960],{},[216,4953,4954],{},"koel\u002Fkoel (PHP)",[216,4956,1194],{},[216,4958,4959],{},"15865 \u002F 33158 unchanged",[216,4961,4962],{},"0 → 708",[183,4964,4965,4968,4971,4974],{},[216,4966,4967],{},"dart-lang\u002Fdart_style (Dart)",[216,4969,4970],{},"60f31a6",[216,4972,4973],{},"1610 \u002F 6365 unchanged",[216,4975,4976],{},"0 → 150",[172,4978,4980],{"id":4979},"interface-members-receiver-narrowed-inherited-specs-container-bindings-as-dispatch-55","Interface members, receiver-narrowed inherited specs, container bindings as dispatch (#55)",[141,4982,4983,4985],{},[152,4984,1123],{}," before and after, no flags; queries with the old and the new code on the old and the new graph.",[177,4987,4988,5012],{},[180,4989,4990],{},[183,4991,4992,4994,4996,4999,5002,5005,5008],{},[186,4993,188],{},[186,4995,1165],{},[186,4997,4998],{},"Nodes \u002F edges before → after",[186,5000,5001],{},"Interface members",[186,5003,5004],{},"Calls into them",[186,5006,5007],{},"IMPLEMENTED_BY added (structural)",[186,5009,4917,5010],{},[152,5011,4920],{},[211,5013,5014,5033,5052,5073,5094],{},[183,5015,5016,5018,5020,5023,5026,5028,5031],{},[216,5017,4776],{},[216,5019,2416],{},[216,5021,5022],{},"9933 \u002F 47648 → 9959 \u002F 47724",[216,5024,5025],{},"26",[216,5027,3320],{},[216,5029,5030],{},"34 (8)",[216,5032,888],{},[183,5034,5035,5037,5039,5042,5044,5047,5049],{},[216,5036,4789],{},[216,5038,3937],{},[216,5040,5041],{},"21711 \u002F 81269 → 21735 \u002F 81384",[216,5043,3870],{},[216,5045,5046],{},"91",[216,5048,243],{},[216,5050,5051],{},"224",[183,5053,5054,5058,5060,5063,5065,5067,5070],{},[216,5055,4006,5056],{},[152,5057,1339],{},[216,5059,4012],{},[216,5061,5062],{},"8028 \u002F 36415 → 8038 \u002F 36450",[216,5064,3533],{},[216,5066,1027],{},[216,5068,5069],{},"5 (0)",[216,5071,5072],{},"1062",[183,5074,5075,5079,5081,5084,5087,5089,5092],{},[216,5076,4802,5077],{},[152,5078,1347],{},[216,5080,4807],{},[216,5082,5083],{},"3813 \u002F 12322 → 3821 \u002F 12341",[216,5085,5086],{},"8",[216,5088,243],{},[216,5090,5091],{},"11 (0)",[216,5093,243],{},[183,5095,5096,5098,5100,5103,5105,5107,5109],{},[216,5097,4758],{},[216,5099,4761],{},[216,5101,5102],{},"764 \u002F 2147 → unchanged",[216,5104,243],{},[216,5106,243],{},[216,5108,243],{},[216,5110,243],{},[141,5112,5113,5114,5116,5117,5120,5121,5124,5125,5128,5129,571,5132,2500,5135,5138,5139,5142,5143,5146,5147,5150,5151,5146,5154,5157],{},"No edge was lost: the only edges that changed source are 22 REFERENCES_TYPE from an interface to the types its\nmember signatures use, which now start at the member. Precision, from spot checks: all 50 added IMPLEMENTED_BY\nedges are real (",[152,5115,4770],{}," declarations; the 8 structural ones are ",[152,5118,5119],{},"return new AuthorFeedAPI(...)"," etc. in a\nfunction returning the other ",[152,5122,5123],{},"FeedAPI"," interface of social-app's ",[152,5126,5127],{},"followingV2","), and the 36 sampled calls into\ninterface members are calls on values typed with that interface (",[152,5130,5131],{},"api.peekLatest()",[152,5133,5134],{},"bulk.getAssetIds(...)",[152,5136,5137],{},"Intl.formatMessage",", mattermost's REST client mixins). ",[152,5140,5141],{},"impact AuthorFeedAPI.peekLatest"," (social-app) 0 → 48\ncallers via ",[152,5144,5145],{},"FeedAPI.peekLatest","; ",[152,5148,5149],{},"impact MemoryRepository.getAssetIds"," (immich) 0 → 15 callers, 7 entry points via\n",[152,5152,5153],{},"IBulkAsset.getAssetIds",[152,5155,5156],{},"impact BaseConfig.getCommand"," 0 → 3. mattermost's REST client implements its interfaces\nthrough mixin class expressions, so those members have callers but no IMPLEMENTED_BY yet.",[141,5159,5160,5161,5164,5165,5168,5169,5172,5173,5176,5177,5180,5181,2893,5184,5146,5187,5190,5191,5194,5195,5198,5199,5202,5203,5206],{},"Inherited specs: ",[152,5162,5163],{},"impact AppDataOperator.handleRecords"," (mattermost) leaves out 4 of 42 calls into\n",[152,5166,5167],{},"BaseDataOperator.handleRecords",", all ",[152,5170,5171],{},"this.handleRecords(...)"," in the sibling ",[152,5174,5175],{},"ServerDataOperatorBase"," (656 → 339\ntransitive callers); ",[152,5178,5179],{},"ExifTestContext.newUser"," (immich tests) 123 of 624 calls on ",[152,5182,5183],{},"LibraryTestContext",[152,5185,5186],{},"SyncTestContext",[152,5188,5189],{},"MergeFeedSource_Custom.take"," (social-app) the call on ",[152,5192,5193],{},"MergeFeedSource_Following",". Calls on\nmattermost's ",[152,5196,5197],{},"ServerDataOperator"," (a class built with ",[152,5200,5201],{},"mix(ServerDataOperatorBase).with(...)"," merged with an\ninterface) are kept, since the graph does not know that class's ancestry. Container bindings: on\nnestjs-boilerplate all 36 bound repository implementations listed the abstract method as a d=1 caller (284 callers\nin total); now 0, the abstract method is under ",[152,5204,5205],{},"overrides:"," (248 callers, exactly those 36 fewer).",[141,5208,5209,5210,4898,5212,5215,5216,5219,5220,5222,5223,5226,5227,5230,5231,5234,5235,5238,5239,5242],{},"Queries on sphinx (graph unchanged): ",[152,5211,4730],{},[152,5213,5214],{},"ASTBaseBase._stringify"," (135 overrides) 26 → 31 dependents (5 via\noverride), on ",[152,5217,5218],{},"Builder.write_doc"," 25 → 26; ",[152,5221,4727],{}," counts unchanged there, since sphinx's calls land on the base\ndeclarations. ",[152,5224,5225],{},"DirectoryHTMLBuilder.write_doc"," (inherited) answered \"no method matches\" and now resolves to\n",[152,5228,5229],{},"StandaloneHTMLBuilder.write_doc"," (27 callers, 504 tests). On cg itself ",[152,5232,5233],{},"tests FrameworkPlugin.contribute"," goes from 0\nto 226 tests (via the plugins' overrides) and ",[152,5236,5237],{},"impact FlaskPlugin.contribute"," resolves to the inherited\n",[152,5240,5241],{},"_PyWebPlugin.contribute",". Index times are unchanged within noise (social-app 18.4 → 16.8 s, mattermost 25.7 → 26.4 s,\ncal.com api v2 7.2 → 7.0 s, sphinx 7.9 → 7.8 s; single runs).",[172,5244,5246],{"id":5245},"exact-index-per-target-swift-availability-re-exports-in-variant-files-c-macro-gaps-56","Exact index per target, Swift availability, re-exports in variant files, C macro gaps (#56)",[141,5248,5249,5251,5252,5255,5256,5259,5260,5262],{},[152,5250,1123],{}," before and after, no flags (Rust in exact mode with rust-analyzer, ",[152,5253,5254],{},"CODEGRAPH_RUST_TARGETS","\ndefault ",[152,5257,5258],{},"auto","); ",[152,5261,2237],{}," counts are variants \u002F API surface \u002F missing callee. Index times are one\nrun each on a shared box.",[177,5264,5265,5280],{},[180,5266,5267],{},[183,5268,5269,5271,5273,5275,5278],{},[186,5270,188],{},[186,5272,1165],{},[186,5274,2272],{},[186,5276,5277],{},"Divergence before → after",[186,5279,800],{},[211,5281,5282,5299,5316,5334,5357,5378,5393,5408],{},[183,5283,5284,5286,5288,5291,5293],{},[216,5285,2285],{},[216,5287,2288],{},[216,5289,5290],{},"25812 → 25845",[216,5292],{},[216,5294,5295,5296,5298],{},"extra runs windows + web: 47 exact references; ",[152,5297,2245],{}," edges 16 → 2; 16.9 → 33.8 s",[183,5300,5301,5303,5305,5308,5310],{},[216,5302,2311],{},[216,5304,2314],{},[216,5306,5307],{},"23303 → 23586",[216,5309],{},[216,5311,5312,5313,5315],{},"windows 275 + macos 126 exact references; ",[152,5314,2245],{}," 123 → 5; 14.5 → 41.0 s",[183,5317,5318,5321,5323,5326,5328],{},[216,5319,5320],{},"tauri-apps\u002Ftauri",[216,5322,4575],{},[216,5324,5325],{},"47065 → 48953",[216,5327],{},[216,5329,5330,5331,5333],{},"windows 787 \u002F macos 1869 \u002F android 301 exact references; ",[152,5332,2245],{}," 1208 → 137; target runs 149 + 108 + 59 s cold",[183,5335,5336,5338,5340,5343,5346],{},[216,5337,2336],{},[216,5339,2339],{},[216,5341,5342],{},"61235 → 70877",[216,5344,5345],{},"235 \u002F 0 \u002F 85 → 496 \u002F 0 \u002F 43",[216,5347,5348,5349,5352,5353,5356],{},"33 macro-generated functions, 29 recovered definitions; calls into ",[152,5350,5351],{},"src\u002Funix"," + ",[152,5354,5355],{},"src\u002Fwin"," pairs; 3.4 → 3.5 s",[183,5358,5359,5361,5363,5366,5369],{},[216,5360,2387],{},[216,5362,2390],{},[216,5364,5365],{},"11448 → 11529",[216,5367,5368],{},"30 \u002F 1 \u002F 1 → 30 \u002F 0 \u002F 0",[216,5370,5371,5374,5375,5377],{},[152,5372,5373],{},"export"," IMPORTS edges; the ",[152,5376,2511],{}," tear-off",[183,5379,5380,5382,5384,5387,5390],{},[216,5381,4776],{},[216,5383,2416],{},[216,5385,5386],{},"47724 → 47887",[216,5388,5389],{},"108 \u002F 9 \u002F 102 → 108 \u002F 5 \u002F 88",[216,5391,5392],{},"+163 re-export IMPORTS edges",[183,5394,5395,5398,5400,5403,5405],{},[216,5396,5397],{},"clash-verge-rev\u002Fclash-verge-rev",[216,5399,4549],{},[216,5401,5402],{},"15720 → 15747",[216,5404],{},[216,5406,5407],{},"+27 re-export IMPORTS edges",[183,5409,5410,5413,5416,5419,5422],{},[216,5411,5412],{},"expo\u002Fexpo (full monorepo)",[216,5414,5415],{},"c0cac77",[216,5417,5418],{},"245593 → 246979",[216,5420,5421],{},"738 \u002F 188 \u002F 886 → 738 \u002F 177 \u002F 879",[216,5423,5424],{},"88030 nodes; +1376 re-export IMPORTS edges; 105 → 110 s",[425,5426,5427,5451,5487,5510,5528],{},[428,5428,5429,5432,5433,5435,5436,442,5439,5442,5443,5446,5447,5450],{},[1443,5430,5431],{},"Rust:"," every lost edge was a ",[152,5434,2245],{}," name match the per-target index contradicts (ripgrep 6, alacritty\n22, tauri 343: e.g. a call matched to another type's ",[152,5437,5438],{},"load",[152,5440,5441],{},"height","), and owner attribution improved (tauri's\nWindows event loop ",[152,5444,5445],{},"new_any_thread"," now owns its Windows-only calls). The extra runs roughly double a cold Rust\nindex; rust-analyzer's cache makes later runs cheaper. ",[152,5448,5449],{},"CODEGRAPH_RUST_TARGETS=0"," turns them off.",[428,5452,5453,1879,5455,442,5458,5460,5461,5464,5465,5468,5469,5472,5473,5476,5477,3362,5480,571,5483,5486],{},[1443,5454,2555],{},[152,5456,5457],{},"UV_LOOP_WATCHER_DEFINE",[152,5459,2566],{}," expansions are functions now; ",[152,5462,5463],{},"kqueue.c","'s ",[152,5466,5467],{},"uv__io_poll"," had\nswallowed 6 following definitions and ",[152,5470,5471],{},"win\u002Ftty.c"," 14. Calls to a function defined once in ",[152,5474,5475],{},"src\u002Funix\u002F"," and once in\n",[152,5478,5479],{},"src\u002Fwin\u002F",[152,5481,5482],{},"uv_close",[152,5484,5485],{},"uv_tty_reset_mode",", ...) had no edge at all, since the file-qualified keys of the two\ndefinitions were not seen as one symbol; they now reach both (+9,600 CALLS, mostly from tests and docs examples).\n261 more per-platform definition groups (163 unix\u002Fwin pairs; 2 are same-named functions of separate docs\nprograms). 62 edges were lost: references inside a recovered definition that kept its head only, and calls the\nmain parse had attributed to a swallowing function.",[428,5488,5489,5492,5493,2500,5496,571,5499,5502,5503,5506,5507,722],{},[1443,5490,5491],{},"Re-exports:"," the findings removed on social-app (4 API surface, 14 missing callee), dart-lang\u002Fhttp and expo (15\nAPI surface, 7 missing callee) were re-exports (",[152,5494,5495],{},"export {LockScroll} from 'react-remove-scroll'",[152,5497,5498],{},"export { SymbolView } from '.\u002FSymbolView.ios'",[152,5500,5501],{},"const connect = IOWebSocketChannel.connect","). Expo gains 4\nAPI-surface findings, all web-only named exports the native variant does not have (",[152,5504,5505],{},"AudioPlayerWeb"," re-exported\nby ",[152,5508,5509],{},"AudioModule.web.ts",[428,5511,5512,5515,5516,5519,5520,5523,5524,5527],{},[1443,5513,5514],{},"Swift (expo):"," 194 declarations with ",[152,5517,5518],{},"@available"," versions (iOS 17: 53, iOS 18: 41, tvOS 17: 33, iOS 26: 30),\n13 deprecated, 316 ",[152,5521,5522],{},"#available"," branches with 254 references in them, 1 declaration unavailable everywhere\n(",[152,5525,5526],{},"BaseModule.init","). Spot checks of 8 matched the source.",[428,5529,5530,5531,3362,5534,722],{},"Expo's targets come from ",[152,5532,5533],{},"apps\u002Fbare-expo\u002Fapp.json",[152,5535,5536],{},"macos, ios, android, web",[172,5538,5540],{"id":5539},"protocol-links-shared-endpoint-model-31","Protocol links: shared endpoint model (#31)",[141,5542,5543,1124,5545,1128,5547,5550,5551,4105,5554,5556,5557,571,5559,463,5562,5564],{},[152,5544,2740],{},[152,5546,1127],{},[152,5548,5549],{},"cg link"," for the pairs and ",[152,5552,5553],{},"cg protocols",[145,5555,91],{"href":92},"). The existing links are read through adapters, so the graph and the outputs of\n",[152,5558,5549],{},[152,5560,5561],{},"cg channels",[152,5563,3823],{}," were compared before and after on every project below: nodes, edges and all\nthree outputs are identical. Index time is one run each on a shared box, within the run-to-run spread.",[177,5566,5567,5586],{},[180,5568,5569],{},[183,5570,5571,5573,5575,5578,5580,5584],{},[186,5572,188],{},[186,5574,1165],{},[186,5576,5577],{},"Protocols (endpoints \u002F linked)",[186,5579,1059],{},[186,5581,5582],{},[152,5583,5553],{},[186,5585,3857],{},[211,5587,5588,5608,5626,5643,5661],{},[183,5589,5590,5594,5596,5599,5602,5605],{},[216,5591,4006,5592],{},[152,5593,1339],{},[216,5595,4012],{},[216,5597,5598],{},"http 297 \u002F 0, nest-event-emitter 36 \u002F 0",[216,5600,5601],{},"1 external, 35 no_receiver, 1 no_sender",[216,5603,5604],{},"0.18 s",[216,5606,5607],{},"11.7 s → 11.4 s",[183,5609,5610,5612,5614,5617,5620,5623],{},[216,5611,1274],{},[216,5613,1277],{},[216,5615,5616],{},"celery 75 \u002F 69, django-signal 8 \u002F 7, http 9 \u002F 0",[216,5618,5619],{},"6 no_sender, 1 external, 9 unguarded",[216,5621,5622],{},"0.35 s",[216,5624,5625],{},"68.3 s → 70.2 s",[183,5627,5628,5630,5632,5635,5638,5640],{},[216,5629,1247],{},[216,5631,1250],{},[216,5633,5634],{},"django-signal 44 \u002F 10, http 956 \u002F 0",[216,5636,5637],{},"34 external, 857 unguarded",[216,5639,1296],{},[216,5641,5642],{},"27.4 s → 28.0 s",[183,5644,5645,5648,5650,5653,5656,5659],{},[216,5646,5647],{},"examples bookstore-nest + bookstore-next",[216,5649,1236],{},[216,5651,5652],{},"http 26 \u002F 6, bull 1 \u002F 1, nest-event 2 \u002F 0, nest-event-emitter 1 \u002F 1, nest-rpc 1, nest-ws 1",[216,5654,5655],{},"5 no_receiver, 15 no_sender, 17 unguarded, 1 + 1 nest-event",[216,5657,5658],{},"0.09 s",[216,5660],{},[183,5662,5663,5666,5668,5671,5674,5677],{},[216,5664,5665],{},"a private Laravel API + Vue client pair (~29k nodes)",[216,5667,1236],{},[216,5669,5670],{},"http 1,007 \u002F 823, pusher 25 \u002F 22, laravel-event 7 \u002F 6, laravel-queue 7 \u002F 7",[216,5672,5673],{},"4 external, 3 + 3 no_receiver, 83 test_sender_only, 91 no_sender, 40 unguarded",[216,5675,5676],{},"0.3 s",[216,5678,5679,5680,5682],{},"identical graph, ",[152,5681,5549],{}," 439 \u002F 441 unchanged",[141,5684,2462],{},[425,5686,5687,5706,5738,5755,5794,5821],{},[428,5688,5689,5692,5693,5695,5696,5699,5700,5702,5703,5705],{},[1443,5690,5691],{},"unguarded"," is the same classification as ",[152,5694,1134],{}," (the private pair: 40 = 40; netbox: 857 of\n",[152,5697,5698],{},"cg routes","' 864, the rest are admin and unmounted routes, which ",[152,5701,5549],{}," leaves out of its uncalled list too).\nA side is only judged when the graph holds the other side of that protocol, so a server indexed alone reports no\n",[152,5704,4126],{}," for its HTTP routes.",[428,5707,5708,5710,5711,5714,5715,5718,5719,5722,5723,5726,5727,5730,5731,5734,5735,5737],{},[1443,5709,4277],{}," the 35 events are emitted through immich's own ",[152,5712,5713],{},"EventRepository"," and received with its own\n",[152,5716,5717],{},"@OnEvent({ name })"," decorator (built on ",[152,5720,5721],{},"SetMetadata","). Since #101 the object's ",[152,5724,5725],{},"name"," is read: 44 named events,\nall 35 emitted ones meet their 86 listeners (before: one ",[152,5728,5729],{},"event:?"," endpoint; 20 sampled listener links correct). Its WebSocket gateway only emits (the web client listens through ",[152,5732,5733],{},"socket.io-client",") and its jobs use the\nsame ",[152,5736,5721],{}," system, so there are no gateway messages or BullMQ jobs to show yet (#32).",[428,5739,5740,1879,5743,5746,5747,5750,5751,5754],{},[1443,5741,5742],{},"bookstore-nest:",[152,5744,5745],{},"order.placed"," is emitted by ",[152,5748,5749],{},"ClientProxy.emit"," and the microservice handler listens to\n",[152,5752,5753],{},"order.shipped","; both ends are reported.",[428,5756,5757,5760,5761,571,5764,571,5767,5770,5771,5773,5774,5777,5778,5781,5782,5785,5786,5789,5790,5793],{},[1443,5758,5759],{},"Django signals:"," the first run reported netbox's ",[152,5762,5763],{},"post_save[Interface]",[152,5765,5766],{},"user_logged_in",[152,5768,5769],{},"request_finished","\n... as ",[152,5772,4126],{}," (10) or ",[152,5775,5776],{},"test_sender_only"," (24): Django sends them itself, so a ",[152,5779,5780],{},"django.*"," signal nobody in the\nrepo sends is ",[152,5783,5784],{},"external"," (\"sent by the framework\") now, as is saleor's ",[152,5787,5788],{},"post_migrate",". The 10 linked netbox signals\nare its own (",[152,5791,5792],{},"core.signals.job_start",", ...) and model signals fired by a resolved model write.",[428,5795,5796,5799,5800,2500,5803,5806,5807,4105,5810,5813,5814,5817,5818,722],{},[1443,5797,5798],{},"saleor:"," the 6 senderless Celery tasks are queued from data migrations (",[152,5801,5802],{},"delete_files_from_storage_task",[152,5804,5805],{},"update_discounted_prices_task","; migrations are not indexed), by the beat schedule in ",[152,5808,5809],{},"settings.py",[152,5811,5812],{},"observability_reporter_task",") or through a ",[152,5815,5816],{},".delay"," passed as a value (",[152,5819,5820],{},"handle_transaction_request_task.delay",[428,5822,5823,1879,5826,5829,5830,5833,5834,5837,5838,5841,5842,5845,5846,5849,5850,5853,5854,5857,5858,5861],{},[1443,5824,5825],{},"Socket.IO (first new protocol):",[152,5827,5828],{},"tests\u002Fprotocol_fixtures"," (a FastAPI service emitting through an\n",[152,5831,5832],{},"AsyncClient",", a Django worker with an ",[152,5835,5836],{},"AsyncServer",") links ",[152,5839,5840],{},"order:created"," and the template ",[152,5843,5844],{},"order:{status}",",\nreports the unreceived ",[152,5847,5848],{},"order:cancelled",", the external ",[152,5851,5852],{},"audit:order"," and the unguarded ",[152,5855,5856],{},"ping",", and\n",[152,5859,5860],{},"cg path \"route:POST \u002Forders\" table:orders"," crosses the two services through SENDS_TO \u002F RECEIVED_BY.",[172,5863,5865],{"id":5864},"ai-harnesses-llm-tools-mcp-servers-and-agents-66","AI harnesses: LLM tools, MCP servers and agents (#66)",[141,5867,5868,5870,5871,3362,5874,5877],{},[152,5869,2740],{}," with no flags, then ",[152,5872,5873],{},"cg tools",[145,5875,5876],{"href":11},"AI tools","). Graphs of projects without these SDKs are\nunchanged (bookstore-django 207 \u002F 341, netbox 38,028 \u002F 140,181, saleor 43,390 \u002F 210,377 nodes \u002F edges, identical\nbefore and after).",[177,5879,5880,5900],{},[180,5881,5882],{},[183,5883,5884,5886,5888,5891,5894,5897],{},[186,5885,188],{},[186,5887,1165],{},[186,5889,5890],{},"Server \u002F declared tools (handled)",[186,5892,5893],{},"Client calls (matched)",[186,5895,5896],{},"Agents",[186,5898,5899],{},"Other",[211,5901,5902,5921,5941,5958],{},[183,5903,5904,5907,5910,5913,5916,5918],{},[216,5905,5906],{},"modelcontextprotocol\u002Fpython-sdk",[216,5908,5909],{},"2118f14",[216,5911,5912],{},"128 tools (124), 35 resources, 18 prompts",[216,5914,5915],{},"264 tool \u002F 111 resource \u002F 28 prompt calls (58 \u002F 32 \u002F 6)",[216,5917,1236],{},[216,5919,5920],{},"11 s",[183,5922,5923,5926,5929,5932,5935,5938],{},[216,5924,5925],{},"openai\u002Fopenai-agents-python",[216,5927,5928],{},"81f0ccf",[216,5930,5931],{},"90 llm tools (42; 48 declared inside tests), 6 MCP tools",[216,5933,5934],{},"10 MCP tool calls (1)",[216,5936,5937],{},"497 (6 handoffs)",[216,5939,5940],{},"50 model calls, 39 s",[183,5942,5943,5946,5948,5951,5953,5955],{},[216,5944,5945],{},"code-graph itself",[216,5947,1236],{},[216,5949,5950],{},"29 MCP tools (29)",[216,5952,1236],{},[216,5954,1236],{},[216,5956,5957],{},"29 decorator references replaced",[183,5959,5960,5963,5966,5968,5970,5972],{},[216,5961,5962],{},"modelcontextprotocol\u002Fservers",[216,5964,5965],{},"f46d957",[216,5967,243],{},[216,5969,1236],{},[216,5971,1236],{},[216,5973,5974,5975,5978],{},"TypeScript servers; the Python ones branch on enum members (since #76: the 12 ",[152,5976,5977],{},"mcp-server-git"," tools)",[141,5980,2462],{},[425,5982,5983,6025,6059],{},[428,5984,5985,1879,5988,1879,5991,5994,5995,5998,5999,571,6002,571,6005,6008,6009,6012,6013,6016,6017,6020,6021,6024],{},[1443,5986,5987],{},"python-sdk:",[152,5989,5990],{},"examples\u002Fsnippets\u002Fclients\u002Fstdio_client.py",[152,5992,5993],{},"call_tool(\"add\")"," matches the ",[152,5996,5997],{},"add"," tool of three\nexample servers (",[152,6000,6001],{},"Demo",[152,6003,6004],{},"Calculator",[152,6006,6007],{},"audited","): the client does not name its server, so every server tool of\nthat name is a candidate. Most unmatched client calls went to servers built inside a factory function\n(",[152,6010,6011],{},"examples\u002Fstories\u002F*\u002Fserver.py",": ",[152,6014,6015],{},"def build(): mcp = MCPServer(...)"," with nested ",[152,6018,6019],{},"@mcp.tool()"," handlers) or inside\ntests. Since #76 these are endpoints received by the enclosing function: MCP endpoints 584 → 955, ",[152,6022,6023],{},"no_receiver","\ntool calls 30 → 10.",[428,6026,6027,1879,6030,3362,6033,6036,6037,6040,6041,6044,6045,6048,6049,6052,6053,571,6055,6058],{},[1443,6028,6029],{},"openai-agents-python:",[152,6031,6032],{},"appointment_referral_status_lookup",[152,6034,6035],{},"examples\u002Fsandbox\u002Fhealthcare_support",") links the\n",[152,6038,6039],{},"@function_tool"," handler to the module building the agent; ",[152,6042,6043],{},"ask_order_agent"," is offered in a realtime session\nconfig whose handler is ",[152,6046,6047],{},"agent.as_tool()"," (not modelled). The first run flagged 7 ",[152,6050,6051],{},"getattr(context, f.name)","-style\ncalls in the SDK itself as dynamic dispatch; only runtime tool names (",[152,6054,5725],{},[152,6056,6057],{},"tool_call.function.name",", ...) count now.",[428,6060,6061,6064],{},[1443,6062,6063],{},"langchain-ai\u002Flanggraph"," (7dc9195) did not finish indexing within 400 s, before and after this change (deep type\ninference in the Python plugin); not measured.",[172,6066,6068],{"id":6067},"external-systems-40","External systems (#40)",[141,6070,6071,5870,6073,3362,6076,6078,6079,6081],{},[152,6072,2740],{},[152,6074,6075],{},"cg external",[145,6077,38],{"href":39},"). The only graph change is additive:\n",[152,6080,5784],{}," nodes and their CONNECTS_TO \u002F CONFIGURED_BY \u002F CREDENTIAL_FROM edges; projects without env reads,\nconnections or settings dicts are unchanged.",[177,6083,6084,6101],{},[180,6085,6086],{},[183,6087,6088,6090,6092,6095,6098],{},[186,6089,188],{},[186,6091,1165],{},[186,6093,6094],{},"Systems",[186,6096,6097],{},"New nodes \u002F edges",[186,6099,6100],{},"What was found",[211,6102,6103,6159,6193,6233,6252],{},[183,6104,6105,6107,6109,6112,6115],{},[216,6106,1247],{},[216,6108,1250],{},[216,6110,6111],{},"3 postgres, 5 redis",[216,6113,6114],{},"+8 \u002F +12 (38,028 \u002F 140,181 before)",[216,6116,6117,463,6120,442,6123,2512,6126,463,6129,6132,6133,6136,6137,6140,6141,6144,6145,442,6148,6151,6152,6155,6156,237],{},[152,6118,6119],{},"DATABASES[default]",[152,6121,6122],{},"REDIS[tasks]",[152,6124,6125],{},"REDIS[caching]",[152,6127,6128],{},"configuration_example.py",[152,6130,6131],{},"configuration_testing.py"," (loopback hosts: ",[152,6134,6135],{},"config:\u003Cmodule>.\u003Csetting>"," targets with ",[152,6138,6139],{},"address_default",", literal test password as location only); ",[152,6142,6143],{},"scripts\u002Fsmoketest_configuration.py"," reads ",[152,6146,6147],{},"POSTGRES_HOST",[152,6149,6150],{},"REDIS_HOST"," with their password keys. Postgres comes from the dependencies (",[152,6153,6154],{},"DATABASE"," has no ",[152,6157,6158],{},"ENGINE",[183,6160,6161,6165,6167,6170,6173],{},[216,6162,4006,6163],{},[152,6164,1339],{},[216,6166,4012],{},[216,6168,6169],{},"1 postgres",[216,6171,6172],{},"+1 \u002F +2 (8,038 \u002F 36,450 before)",[216,6174,6175,6178,6179,442,6182,6185,6186,6189,6190],{},[152,6176,6177],{},"DB_URL"," (protocol from the ",[152,6180,6181],{},"pg",[152,6183,6184],{},"postgres"," dependencies); the env schema is a zod DTO, so the main reader is not seen and the one user is ",[152,6187,6188],{},"src\u002Fbin\u002Fsync-open-api.ts",", which assigns the variable; the compose files are under ",[152,6191,6192],{},"..\u002Fdocker",[183,6194,6195,6198,6201,6204,6207],{},[216,6196,6197],{},"outline\u002Foutline",[216,6199,6200],{},"478e812",[216,6202,6203],{},"1 postgres, 1 https",[216,6205,6206],{},"+1 \u002F +4 (13,358 \u002F 52,050 before)",[216,6208,6209,6212,6213,6216,6217,6220,6221,6224,6225,6228,6229,6232],{},[152,6210,6211],{},"DATABASE_URL"," read by ",[152,6214,6215],{},"server\u002Fconfig\u002Fdatabase.js",", resolved through ",[152,6218,6219],{},".env.sample"," to the compose service ",[152,6222,6223],{},"postgres:5432"," (resource outline, credential in the URL); ",[152,6226,6227],{},"updates.getoutline.com","; Redis \u002F S3 \u002F SMTP keys go through an ",[152,6230,6231],{},"environment.X"," wrapper and are missed; three example.com origins called only from tests are left out",[183,6234,6235,6238,6240,6243,6246],{},[216,6236,6237],{},"bookstore-django (examples)",[216,6239,1236],{},[216,6241,6242],{},"1 redis",[216,6244,6245],{},"+1 \u002F +2 (207 \u002F 341 before)",[216,6247,6248,6251],{},[152,6249,6250],{},"CELERY_BROKER_URL"," from the environment with a loopback default",[183,6253,6254,6257,6259,6262,6265],{},[216,6255,6256],{},"a private Laravel API + Vue client pair",[216,6258,1236],{},[216,6260,6261],{},"1 postgres, 1 redis, 1 memcached (API)",[216,6263,6264],{},"+3 \u002F +12 (API); client graph identical",[216,6266,6267,6268,442,6271,6274,6275,6278],{},"a custom connection with its host and password keys, the Redis keys read by ",[152,6269,6270],{},"config\u002Fdatabase.php",[152,6272,6273],{},"config\u002Freverb.php",", the memcached store of ",[152,6276,6277],{},"config\u002Fcache.php","; the default connection is sqlite (no network system). Link results identical",[141,6280,6281,6282,6285,6286,442,6289,6292,6293,6295,6296,6299,6300,6303,6304,6307,6308,6310,6311,463,6314,6317],{},"Fixture (",[152,6283,6284],{},"tests\u002Fexternal_fixture","): a Laravel API, an Express worker and a Django project sharing ",[152,6287,6288],{},"db",[152,6290,6291],{},"redis","\nservices: after ",[152,6294,5549],{}," the API's ",[152,6297,6298],{},"connection:pgsql"," and the worker's ",[152,6301,6302],{},"pool()"," use the same\n",[152,6305,6306],{},"external:postgres:db:5432",", and ",[152,6309,4730],{}," lists ",[152,6312,6313],{},"OrderController::index",[152,6315,6316],{},"POST \u002Fsync",". The fixture secrets\nappear nowhere in the database files.",[141,6319,6320],{},"Seen on the way: column nodes from Laravel migrations differ between two runs of the same commit (a few columns\nattributed to another table), with or without this change.",[172,6322,6324],{"id":6323},"swift-selectors-static-vs-instance-sdk-receivers-70","Swift: selectors, static vs instance, SDK receivers (#70)",[141,6326,6327],{},"Same stores and sources as for #58 (heuristic edges in the files the store covers, against the compiler's):",[177,6329,6330,6344],{},[180,6331,6332],{},[183,6333,6334,6336,6338,6340,6342],{},[186,6335,188],{},[186,6337,2914],{},[186,6339,2920],{},[186,6341,2923],{},[186,6343,2926],{},[211,6345,6346,6367,6386,6402],{},[183,6347,6348,6350,6353,6356,6361],{},[216,6349,3240],{},[216,6351,6352],{},"585 → 602",[216,6354,6355],{},"552 → 580",[216,6357,6358,6359],{},"0.94 → ",[1443,6360,2982],{},[216,6362,6363,6364],{},"0.65 → ",[1443,6365,6366],{},"0.68",[183,6368,6369,6371,6374,6377,6380],{},[216,6370,3633],{},[216,6372,6373],{},"174 → 180",[216,6375,6376],{},"163 → 167",[216,6378,6379],{},"0.94 → 0.93",[216,6381,6382,6383],{},"0.44 → ",[1443,6384,6385],{},"0.45",[183,6387,6388,6390,6393,6395,6400],{},[216,6389,3315],{},[216,6391,6392],{},"11 → 9",[216,6394,3663],{},[216,6396,6397,6398],{},"0.82 → ",[1443,6399,2956],{},[216,6401,3669],{},[183,6403,6404,6408,6411,6414,6418],{},[216,6405,6406],{},[1443,6407,3551],{},[216,6409,6410],{},"770 → 791",[216,6412,6413],{},"724 → 756",[216,6415,6358,6416],{},[1443,6417,2982],{},[216,6419,6420,6421],{},"0.59 → ",[1443,6422,6423],{},"0.61",[141,6425,6426,6427,571,6430,6433,6434,6437,6438,6441,6442,6445],{},"Recall goes up because labelled selectors on receivers cg cannot type (",[152,6428,6429],{},"client.put(endpoint:)",[152,6431,6432],{},"toastCenter.update(id:toast:)",")\nare bound again when exactly one project method fits, also for short names. Precision on isowords moves by two edges:\ncalls of ",[152,6435,6436],{},"Dictionary.transformKeys",", which isowords declares twice (in two modules); cg merges both into one node and\nthe compiler's target is the copy without a node, so these real calls count as disagreements. The Alamofire false\npositives left (about 50 in the heuristic-only graph, 55 before) are mostly owner differences (",[152,6439,6440],{},"HTTPHeaders.init","\ncalling ",[152,6443,6444],{},"HTTPHeader.init",") and Apple-only branches.",[141,6447,6448,6449,6451],{},"Dimillian\u002FIceCubesApp (",[152,6450,4943],{},", heuristic only, no Linux build), before → after:",[425,6453,6454,6471,6484,6506,6534],{},[428,6455,6456,6459,6460,5259,6463,6466,6467,6470],{},[152,6457,6458],{},"MediaUIAttachmentVideoViewModel.resume",": 20 callers → 1 (",[152,6461,6462],{},"viewModel.resume()",[152,6464,6465],{},"continuation.resume(returning:)","\ninside ",[152,6468,6469],{},"withCheckedContinuation"," is no longer bound.",[428,6472,6473,6476,6477,6480,6481,722],{},[152,6474,6475],{},"MastodonClient.post",": the 10 ",[152,6478,6479],{},"NotificationCenter.default.post(name:object:)"," calls are gone (64 → 54 edges, all\n",[152,6482,6483],{},"client.post(endpoint:)",[428,6485,6486,6489,6490,5259,6493,6495,6496,6499,6500,6503,6504,722],{},[152,6487,6488],{},"InAppSafariManager.open",": 9 → 1 (",[152,6491,6492],{},"safariManager.open(url)",[152,6494,2237],{}," missing-callee findings\n12 → 4 (the 8 ",[152,6497,6498],{},"UIApplication.shared.open"," findings are gone, the 4 left are the project's own ",[152,6501,6502],{},"close"," defined per\n",[152,6505,2577],{},[428,6507,6508,6509,690,6512,2500,6515,690,6518,6521,6522,6525,6526,6529,6530,6533],{},"Removed 46 call edges, all false (also ",[152,6510,6511],{},"data.write(to:)",[152,6513,6514],{},"DeepLUserAPIHandler.write",[152,6516,6517],{},"UserDefaults.standard.register(defaults:)",[152,6519,6520],{},"SoundEffectManager.register","); added 122 (labelled selectors on\nuntyped receivers, ",[152,6523,6524],{},"MediaContainer.pending(...)"," static factories, ",[152,6527,6528],{},"extension View"," modifiers on SDK view chains,\nmembers of nested types). ",[152,6531,6532],{},"calls_sdk_selector",": 2,132 calls left unbound by the SDK-selector rule.",[428,6535,6536,6538,6539,442,6542,6545],{},[152,6537,1131],{}," still suggests ",[152,6540,6541],{},"MastodonClient.get",[152,6543,6544],{},".post",", now with real callers only (76 \u002F 42 direct callers).",[172,6547,6549],{"id":6548},"swift-testing-xctest-and-kotlin-test-cases-71","Swift Testing, XCTest and Kotlin test cases (#71)",[141,6551,6552,6553,6556,6557,6560,6561,6563],{},"Test cases in ",[152,6554,6555],{},"cg tests",", before → after (before, Swift and Kotlin test functions were ",[152,6558,6559],{},"test"," entries but the header\ncounted only ",[152,6562,6559],{}," nodes, so every project read \"of 0 test cases\"; all graphs heuristic, sources at the commits\nnamed):",[177,6565,6566,6578],{},[180,6567,6568],{},[183,6569,6570,6572,6575],{},[186,6571,188],{},[186,6573,6574],{},"Before",[186,6576,6577],{},"After (per framework)",[211,6579,6580,6593,6605,6616,6628,6640,6653,6666],{},[183,6581,6582,6588,6590],{},[216,6583,6584,6585,237],{},"swiftlang\u002Fswift-testing (",[152,6586,6587],{},"b5c410c",[216,6589,243],{},[216,6591,6592],{},"1,010 (swift-testing 885, xctest 125)",[183,6594,6595,6600,6602],{},[216,6596,3454,6597,237],{},[152,6598,6599],{},"bda9ed5",[216,6601,243],{},[216,6603,6604],{},"834 (xctest 761, swift-testing 73)",[183,6606,6607,6611,6613],{},[216,6608,6448,6609,237],{},[152,6610,4943],{},[216,6612,243],{},[216,6614,6615],{},"65 (xctest 40, swift-testing 25)",[183,6617,6618,6623,6625],{},[216,6619,3490,6620,237],{},[152,6621,6622],{},"c727d3a",[216,6624,243],{},[216,6626,6627],{},"237 (xctest 237)",[183,6629,6630,6635,6637],{},[216,6631,6632,6633,237],{},"android\u002Fnowinandroid (",[152,6634,4930],{},[216,6636,243],{},[216,6638,6639],{},"232 (junit4 232)",[183,6641,6642,6648,6650],{},[216,6643,6644,6645,237],{},"touchlab\u002FKaMPKit (",[152,6646,6647],{},"4af0200",[216,6649,243],{},[216,6651,6652],{},"28 (kotlin-test 24, xctest 4)",[183,6654,6655,6661,6663],{},[216,6656,6657,6658,237],{},"spring-petclinic-kotlin (",[152,6659,6660],{},"c77f77b",[216,6662,243],{},[216,6664,6665],{},"41 (junit5 41)",[183,6667,6668,6674,6676],{},[216,6669,6670,6671,237],{},"ktorio\u002Fktor-samples (",[152,6672,6673],{},"1c9df7c",[216,6675,243],{},[216,6677,6678],{},"162 (kotlin-test 149, junit4 9, xctest 4)",[425,6680,6681,6708,6726,6741],{},[428,6682,6683,6684,6687,6688,6691,6692,2500,6695,6698,6699,6701,6702,6704,6705,6707],{},"Swift Testing cases are new (863 on swift-testing, 73 on Alamofire, 25 on IceCubesApp: every uncommented ",[152,6685,6686],{},"@Test","\nin Alamofire and IceCubesApp). On swift-testing's own suite, 137 are parameterized, 143 types are ",[152,6689,6690],{},"@Suite","s and\n29 nodes carry tags. Its raw-identifier suites (",[152,6693,6694],{},"struct `ABI.EncodedEvent Tests`",[152,6696,6697],{},"@Test func `Decode issueRecorded`()",") parse now: 2,831 → 2,953 nodes and 6,952 → 7,159 edges. 59 functions\nthat a parse error had turned into free functions are methods of their suite again. The ",[152,6700,6686],{}," lines still\nmissing are an ",[152,6703,6686],{}," inside ",[152,6706,2577],{}," in front of its function and a few declarations the grammar cannot read.",[428,6709,6710,6711,6714,6715,2500,6718,6721,6722,6725],{},"XCTest: 3 ",[152,6712,6713],{},"test*"," methods are no longer test cases, all helpers with parameters (",[152,6716,6717],{},"IssueTests.testThrowing(_:producesIssueMatching:)",[152,6719,6720],{},"BuiltInConformances.test(_:)"," on swift-testing, ",[152,6723,6724],{},"TimelineFilterTests.testCodableOn(filter:)"," on IceCubesApp). No\nother test case was lost, on any project.",[428,6727,6728,6729,6732,6733,6736,6737,6740],{},"Alamofire ",[152,6730,6731],{},"cg tests Instant",": 0 direct, 7 transitive (of 0 test cases) → 3 direct (the three ",[152,6734,6735],{},"InstantTests"," cases),\n8 transitive (a Swift Testing ",[152,6738,6739],{},"RequestInterceptorTests"," case joins the XCTest ones), of 834.",[428,6742,6743,6744,6746,6747,6750,6751,6753,6754,6757],{},"Kotlin numbers are unchanged; they now have a framework from the file's imports. Kotlin ",[152,6745,6686],{}," lines without a\ntest case: benchmarks in ",[152,6748,6749],{},"src\u002Fmain"," (nowinandroid, not test code by path), ",[152,6752,6686],{}," inside lint-test source strings,\nand on ktor-samples 30 expression-bodied tests (",[152,6755,6756],{},"fun anything() = testApplication { ... }",") in three httpbin files\nwhere the Kotlin grammar drops the class body's functions.",[172,6759,6761],{"id":6760},"python-inference-on-self-referencing-attributes-78","Python inference on self-referencing attributes (#78)",[141,6763,6764,6765,6768,6769,6772,6773,6776,6777,6780,6781,6784,6785,6787,6788,6791,6792,3362,6795,571,6798,722],{},"langchain-ai\u002Flanggraph (",[152,6766,6767],{},"7dc9195",", 461 ",[152,6770,6771],{},".py"," files) did not finish indexing in 400 s. ",[152,6774,6775],{},"PregelLoop"," re-assigns\n",[152,6778,6779],{},"self.checkpoint_pending_writes"," from list comprehensions over itself, several per method with one shared loop name\n",[152,6782,6783],{},"w","; inferring the attribute re-entered it once per binding of ",[152,6786,6783],{}," at every level, with a fresh per-function guard\neach time, until the depth limit of 40, so the work grew exponentially. Attribute types (",[152,6789,6790],{},"self.x"," assignments and\nclass attributes) are now memoised per class and attribute, an attribute already being inferred further up the stack\nis unknown, and one top-level inference stops after 5,000 steps. A result computed while a cycle was cut is not\nmemoised, so a partial answer is not reused elsewhere. The plugin stats report the cuts as\n",[152,6793,6794],{},"inference_limits",[152,6796,6797],{},"attr_cycles",[152,6799,6800],{},"budget_exhausted",[425,6802,6803,6806,6809],{},[428,6804,6805],{},"langgraph: indexes in 14 s, 9,774 nodes \u002F 38,141 edges, 34 cycle cuts, budget never reached.",[428,6807,6808],{},"The same graphs before and after (every node and every edge with kind and confidence identical), and times within\nnoise or faster, on django (259 cuts), flask, saleor, netbox (186; 39 → 29 s), pytest (372), sphinx (20), ansible (9;\n21 → 16 s), beets, flake8, httpie, microblog, mkdocs, pylint (17), opentelemetry-python (1,075) and\nfull-stack-fastapi-template. The work budget was not reached on any of them.",[428,6810,6811,6814],{},[152,6812,6813],{},"tests\u002Ftest_python_infer_cycles.py"," has the langgraph shape in a dozen lines: it indexed for more than 60 s before\n(stopped by the test's alarm) and takes 0.2 s now.",[172,6816,6818],{"id":6817},"laravel-graphs-independent-of-the-hash-seed-79","Laravel graphs independent of the hash seed (#79)",[141,6820,6821,6822,6825,6826,6829,6830,6833,6834,571,6837,463,6840,6843],{},"A property read on a receiver that can be several Eloquent models, in a ",[152,6823,6824],{},"??"," fallback chain, took the table of the\nfirst model a set iteration produced, so two indexes of one commit could differ (in the issue's repro, seed 3 picked\n",[152,6827,6828],{},"incomes"," where seeds 1, 2, 4, 5, 6 picked ",[152,6831,6832],{},"expenses","). Each such step now has one FALLS_BACK_TO edge per candidate\nmodel's column, all with the step's ",[152,6835,6836],{},"order",[152,6838,6839],{},"ambiguous: true",[152,6841,6842],{},"candidates","; the candidates are those whose\nmigrations declare the column, else those whose table the migrations create. A single-model read is unchanged.",[141,6845,6846,6847,6850],{},"Every graph below indexed under ",[152,6848,6849],{},"PYTHONHASHSEED"," 1 and 2 is identical (nodes, edges, attributes), and against the\nprevious version only the multi-model steps changed:",[177,6852,6853,6864],{},[180,6854,6855],{},[183,6856,6857,6859,6862],{},[186,6858,188],{},[186,6860,6861],{},"Edges before (seed 1) → after",[186,6863,2623],{},[211,6865,6866,6876,6910,6932],{},[183,6867,6868,6871,6873],{},[216,6869,6870],{},"koel, solidtime, firefly-iii, pixelfed, vito, panel, UNIT3D, akaunting, librenms, laravel.io",[216,6872,2672],{},[216,6874,6875],{},"no multi-model fallback step",[183,6877,6878,6881,6884],{},[216,6879,6880],{},"monica",[216,6882,6883],{},"34,205 → 34,211",[216,6885,6886,6887,571,6890,571,6893,6896,6897,4898,6900,463,6903,6906,6907,6909],{},"3 resolutions (",[152,6888,6889],{},"UpdateVCard",[152,6891,6892],{},"UpdateVCalendar",[152,6894,6895],{},"GetEtag","): ",[152,6898,6899],{},"distant_etag",[152,6901,6902],{},"vcard_resources",[152,6904,6905],{},"vcalendar_resources",", before ",[152,6908,6902],{}," only",[183,6911,6912,6914,6917],{},[216,6913,911],{},[216,6915,6916],{},"83,087 → 83,088",[216,6918,6919,6012,6922,4898,6925,463,6928,6931],{},[152,6920,6921],{},"Show::copyValue",[152,6923,6924],{},"value",[152,6926,6927],{},"environment_variables",[152,6929,6930],{},"shared_environment_variables",", before the latter only",[183,6933,6934,6936,6939],{},[216,6935,863],{},[216,6937,6938],{},"172,259 → 172,269",[216,6940,6941,463,6944,6947,6948,6951],{},[152,6942,6943],{},"line_items",[152,6945,6946],{},"design_id"," on credits, invoices, purchase_orders, quotes and recurring_invoices (before purchase_orders only); ",[152,6949,6950],{},"$entity->client"," on clients and vendors (no migration declares either column; before vendors only)",[141,6953,6954,6957],{},[152,6955,6956],{},"tests\u002Ftest_laravel_determinism.py"," indexes the issue's fixture under two seeds that differed before and compares the\nwhole graph.",[172,6959,6961],{"id":6960},"raw-tcp-udp-sockets-and-udp-application-protocols-39","Raw TCP \u002F UDP sockets and UDP application protocols (#39)",[141,6963,6964],{},"Socket and UDP-application edges on the corpora that use them (indexed at the commits shown):",[177,6966,6967,6981],{},[180,6968,6969],{},[183,6970,6971,6973,6976,6978],{},[186,6972,188],{},[186,6974,6975],{},"Endpoints (paired)",[186,6977,2620],{},[186,6979,6980],{},"What pairs",[211,6982,6983,7019,7051,7065,7086,7113],{},[183,6984,6985,6988,6991,6994],{},[216,6986,6987],{},"mini-redis 3d93b42",[216,6989,6990],{},"tcp 1 (1)",[216,6992,6993],{},"1 RECEIVED_BY, 4 SENDS_TO",[216,6995,6996,6997,442,7000,442,7003,7006,7007,7010,7011,7014,7015,7018],{},"the ",[152,6998,6999],{},"pub",[152,7001,7002],{},"sub",[152,7004,7005],{},"hello_world"," examples and the CLI (clap ",[152,7008,7009],{},"default_value_t = DEFAULT_PORT",") reach ",[152,7012,7013],{},"server::run"," through ",[152,7016,7017],{},"Client::connect","'s call sites on 6379",[183,7020,7021,7024,7027,7030],{},[216,7022,7023],{},"tokio examples 5d5cd8b",[216,7025,7026],{},"tcp 3 (2), udp 1 (1)",[216,7028,7029],{},"8 RECEIVED_BY, 3 SENDS_TO",[216,7031,7032,1876,7034,442,7037,7040,7041,7044,7045,1876,7048],{},[152,7033,7005],{},[152,7035,7036],{},"chat",[152,7038,7039],{},"graceful-shutdown"," on 6142, ",[152,7042,7043],{},"proxy"," with the 8080 servers, ",[152,7046,7047],{},"udp-client",[152,7049,7050],{},"echo-udp",[183,7052,7053,7056,7059,7062],{},[216,7054,7055],{},"statsd f7157b8",[216,7057,7058],{},"tcp 2, udp 1 (1)",[216,7060,7061],{},"3 RECEIVED_BY, 1 SENDS_TO",[216,7063,7064],{},"the Python example client with the Node UDP server on 8125; the TCP server and admin listeners (8125, 8126) have no client in the repo; the PHP example reads its port from an ini file and the Java \u002F Kotlin clients take it as a constructor parameter with no caller, so they are counted as unresolved",[183,7066,7067,7069,7072,7075],{},[216,7068,2630],{},[216,7070,7071],{},"tcp 5 (1), udp 6 (2)",[216,7073,7074],{},"99 RECEIVED_BY, 99 SENDS_TO",[216,7076,7077,7078,7081,7082,7085],{},"the tests on ",[152,7079,7080],{},"TEST_PORT"," 9123 (and ",[152,7083,7084],{},"TEST_PORT_2"," 9124); 10 ephemeral binds are counted, not linked",[183,7087,7088,7091,7094,7097],{},[216,7089,7090],{},"python-zeroconf f0c27b3",[216,7092,7093],{},"mdns 13 (1)",[216,7095,7096],{},"1 RECEIVED_BY, 5 SENDS_TO, 84 TEST_CALLS",[216,7098,7099,7102,7103,571,7106,442,7109,7112],{},[152,7100,7101],{},"examples\u002Fasync_registration.py"," advertises ",[152,7104,7105],{},"_http._tcp",[152,7107,7108],{},"async_browser.py",[152,7110,7111],{},"async_service_info_request.py"," browse it",[183,7114,7115,7118,7121,7124],{},[216,7116,7117],{},"aiocoap f867dc4",[216,7119,7120],{},"coap 29 (3)",[216,7122,7123],{},"12 RECEIVED_BY, 2 SENDS_TO, 35 TEST_CALLS",[216,7125,7126,5464,7129,463,7132,1876,7135,442,7138,7141],{},[152,7127,7128],{},"server.py",[152,7130,7131],{},"\u002Ftime",[152,7133,7134],{},"\u002Fother\u002Fblock",[152,7136,7137],{},"clientGET.py",[152,7139,7140],{},"clientPUT.py","; 6 doctest examples in docstrings are skipped",[141,7143,7144,7145,7148,7149,7152,7153,7155,7156,7159,7160,7163,7164,420],{},"tauri gains one edge, the CLI's built-in dev server listening on its default port 1430 (",[152,7146,7147],{},"port.unwrap_or(1430)",").\nNo edge changed on redis, httpie, flask, opentelemetry-python, the MCP python-sdk and servers, electron-fiddle,\nalacritty, ktor-samples, django, netbox, immich, outline, saleor, element-x-ios, eslint and ansible (whose ",[152,7150,7151],{},"SSH_AUTH_SOCK"," Unix-socket paths\nare not TCP ports). A random 20 of the new edges were checked by hand against the source: 20 correct (an earlier\nsample of 20 found a wrong ",[152,7154,166],{}," path for a concatenated CoAP URI, fixed before this one). ",[152,7157,7158],{},"tests\u002Ftest_sockets.py"," covers\neach language on ",[152,7161,7162],{},"tests\u002Fsockets_fixture"," and the BSD \u002F libuv C calls on ",[152,7165,7166],{},"tests\u002Fsockets_c_fixture",[172,7168,7170,7171,7174],{"id":7169},"grpc-services-from-proto-contracts-33","gRPC services from ",[152,7172,7173],{},".proto"," contracts (#33)",[141,7176,7177],{},"gRPC edges on the example trees of the gRPC implementations and on the OpenTelemetry demo (indexed at the commits\nshown; \"paired\" endpoints have both a server and a client in the graph):",[177,7179,7180,7196],{},[180,7181,7182],{},[183,7183,7184,7186,7189,7192,7194],{},[186,7185,188],{},[186,7187,7188],{},"Services \u002F methods",[186,7190,7191],{},"Paired",[186,7193,2620],{},[186,7195,800],{},[211,7197,7198,7225,7260,7287,7310,7336,7366,7400,7422],{},[183,7199,7200,7206,7209,7211,7214],{},[216,7201,7202,7203,7205],{},"grpc ",[152,7204,2104],{}," 724b3cc",[216,7207,7208],{},"11 \u002F 32",[216,7210,3320],{},[216,7212,7213],{},"77 RECEIVED_BY, 92 SENDS_TO",[216,7215,7216,7217,7220,7221,7224],{},"C++ and Python; 17 C++ servers whose class the C\u002FC++ parser lost after a file-level ",[152,7218,7219],{},"ABSL_FLAG(..);"," line were counted as ",[152,7222,7223],{},"server_class_without_methods"," until #131 (now 94 RECEIVED_BY); the PHP, Node and other trees are not indexed from this root. The released code stopped on this tree with an IndexError in the socket scan (fixed)",[183,7226,7227,7235,7238,7241,7244],{},[216,7228,7202,7229,1876,7232],{},[152,7230,7231],{},"examples\u002Fphp",[152,7233,7234],{},"examples\u002Fprotos",[216,7236,7237],{},"6 \u002F 18",[216,7239,7240],{},"5",[216,7242,7243],{},"5 RECEIVED_BY, 5 SENDS_TO",[216,7245,7246,442,7249,7252,7253,5146,7256,7259],{},[152,7247,7248],{},"Greeter",[152,7250,7251],{},"RouteGuideService extends ..Stub",", clients ",[152,7254,7255],{},"new ..Client(..)",[152,7257,7258],{},"echo\u002Fclient.php"," calls at file level, outside any function",[183,7261,7262,7268,7271,7273,7276],{},[216,7263,7264,7265,7267],{},"grpc-node ",[152,7266,2104],{}," e742b11",[216,7269,7270],{},"6 \u002F 13",[216,7272,3533],{},[216,7274,7275],{},"30 RECEIVED_BY, 34 SENDS_TO",[216,7277,7278,7279,7282,7283,7286],{},"plain-JS programs (not indexed before): ",[152,7280,7281],{},"addService"," handler maps, proto-loader ",[152,7284,7285],{},"new pkg.Svc(..)"," and static-codegen clients",[183,7288,7289,7295,7298,7300,7303],{},[216,7290,7291,7292,7294],{},"tonic ",[152,7293,2104],{}," 2681a7e",[216,7296,7297],{},"7 \u002F 15",[216,7299,612],{},[216,7301,7302],{},"34 RECEIVED_BY, 36 SENDS_TO",[216,7304,7305,7306,7309],{},"trait impls and ",[152,7307,7308],{},"XClient::connect","; reflection \u002F health services have no client in the tree",[183,7311,7312,7318,7321,7323,7326],{},[216,7313,7314,7315,7317],{},"grpc-kotlin ",[152,7316,2104],{}," fffe032",[216,7319,7320],{},"5 \u002F 8",[216,7322,5086],{},[216,7324,7325],{},"8 RECEIVED_BY, 6 SENDS_TO, 5 TEST_CALLS",[216,7327,7328,7331,7332,7335],{},[152,7329,7330],{},"CoroutineImplBase"," servers, ",[152,7333,7334],{},"CoroutineStub"," clients and server tests",[183,7337,7338,7348,7351,7354,7357],{},[216,7339,7340,7341,571,7344,7347],{},"grpc-dart ",[152,7342,7343],{},"example\u002Froute_guide",[152,7345,7346],{},"helloworld"," bdbcf3b",[216,7349,7350],{},"1 \u002F 4, 1 \u002F 1",[216,7352,7353],{},"4, 1",[216,7355,7356],{},"6 RECEIVED_BY, 7 SENDS_TO",[216,7358,7359,7331,7362,7365],{},[152,7360,7361],{},"ServiceBase",[152,7363,7364],{},"RouteGuideClient"," fields",[183,7367,7368,7378,7381,7383,7386],{},[216,7369,7370,7371,5352,7374,7377],{},"grpc-swift ",[152,7372,7373],{},"Examples\u002Fv1",[152,7375,7376],{},"Protos"," 65d0084",[216,7379,7380],{},"15 \u002F 42",[216,7382,404],{},[216,7384,7385],{},"13 RECEIVED_BY, 10 SENDS_TO",[216,7387,7388,7389,7392,7393,7396,7397,237],{},"providers, ",[152,7390,7391],{},"Echo_EchoAsyncClient"," parameters and ",[152,7394,7395],{},"Routeguide_RouteGuideAsyncClient"," members (",[152,7398,7399],{},"makeRecordRouteCall",[183,7401,7402,7405,7408,7410,7413],{},[216,7403,7404],{},"connect-es examples 1be3b33",[216,7406,7407],{},"2 \u002F 5",[216,7409,837],{},[216,7411,7412],{},"12 RECEIVED_BY, 38 SENDS_TO, 10 TEST_CALLS",[216,7414,7415,463,7418,7421],{},[152,7416,7417],{},"router.service(ElizaService, ..)",[152,7419,7420],{},"createClient(ElizaService, ..)"," across the framework examples",[183,7423,7424,7427,7430,7432,7435],{},[216,7425,7426],{},"opentelemetry-demo 7ea09b8",[216,7428,7429],{},"11 \u002F 21",[216,7431,615],{},[216,7433,7434],{},"2 RECEIVED_BY, 12 SENDS_TO",[216,7436,7437],{},"the TypeScript frontend's gateways and the Python recommendation service; the C++ currency, plain-JS payment and Rust shipping services sit in sub-projects that are not indexed from the repo root, and Go \u002F C# \u002F Java \u002F Ruby \u002F Elixir have no plugin",[141,7439,7440,7441,7444,7445,7448,7449,7452,7453,420],{},"No edge or node changed on the 20 corpora checked for #39 (electron-fiddle, immich, saleor, django, flask, httpie,\noutline, eslint, mcp-servers, netbox, opentelemetry-python, python-sdk, python-zeroconf, tauri, alacritty, redis,\naiocoap, ansible, ktor-samples, element-x-ios). A random 20 of the gRPC edges above were checked by hand against the\nsource: 20 correct. ",[152,7442,7443],{},"tests\u002Ftest_rpc.py"," covers Python, Node \u002F TypeScript, Connect, tonic and Kotlin on\n",[152,7446,7447],{},"tests\u002Frpc_fixture"," (including two packages with a ",[152,7450,7451],{},"RouteGuide"," service each) and grpc++ on ",[152,7454,7455],{},"tests\u002Frpc_cpp_fixture",[2876,7457,7459],{"id":7458},"thrift-trpc-and-json-rpc-33-part-2","Thrift, tRPC and JSON-RPC (#33 part 2)",[177,7461,7462,7474],{},[180,7463,7464],{},[183,7465,7466,7468,7470,7472],{},[186,7467,188],{},[186,7469,6975],{},[186,7471,2620],{},[186,7473,800],{},[211,7475,7476,7515,7541,7565,7587,7613],{},[183,7477,7478,7485,7488,7491],{},[216,7479,7480,7481,7484],{},"thrift ",[152,7482,7483],{},"tutorial\u002F"," 50bbda1",[216,7486,7487],{},"5 (4)",[216,7489,7490],{},"15 RECEIVED_BY, 18 SENDS_TO",[216,7492,7493,7494,442,7497,7500,7501,442,7504,7507,7508,7511,7512],{},"C++ ",[152,7495,7496],{},"CalculatorIf",[152,7498,7499],{},"CalculatorClient",", Python ",[152,7502,7503],{},"Processor(handler)",[152,7505,7506],{},"Client",", Dart; ",[152,7509,7510],{},"getStruct"," stays on ",[152,7513,7514],{},"shared.SharedService",[183,7516,7517,7524,7527,7530],{},[216,7518,7519,7520,7523],{},"the same tutorial's nodejs, rs, php trees with the ",[152,7521,7522],{},".thrift"," files",[216,7525,7526],{},"5 (4), 5 (5), 5 (0)",[216,7528,7529],{},"10 \u002F 10, 5 \u002F 7, 5 \u002F 0",[216,7531,7532,7533,7536,7537,7540],{},"Node ",[152,7534,7535],{},"createServer"," maps and top-level clients (module level); Rust ",[152,7538,7539],{},"SyncHandler"," impls and factory functions; PHP clients are top-level scripts without a module node. Java has no plugin",[183,7542,7543,7546,7549,7552],{},[216,7544,7545],{},"create-t3-turbo 8f945b7",[216,7547,7548],{},"6 (4)",[216,7550,7551],{},"6 RECEIVED_BY, 12 SENDS_TO",[216,7553,7554,7557,7558,571,7561,7564],{},[152,7555,7556],{},"satisfies TRPCRouterRecord"," routers mounted in ",[152,7559,7560],{},"appRouter",[152,7562,7563],{},"trpc.post.all.queryOptions()"," clients",[183,7566,7567,7570,7573,7576],{},[216,7568,7569],{},"cal.com 54343aa",[216,7571,7572],{},"174 (122)",[216,7574,7575],{},"174 RECEIVED_BY, 226 SENDS_TO",[216,7577,7578,7579,7582,7583,7586],{},"33 routers, imported mounts (",[152,7580,7581],{},"eventTypesRouter as heavyEventTypesRouter",") and procedure variables; 221 of 224 ",[152,7584,7585],{},"trpc.viewer.."," chains in the app name a declared path",[183,7588,7589,7592,7595,7598],{},[216,7590,7591],{},"jayson 4c368aa",[216,7593,7594],{},"28 (8)",[216,7596,7597],{},"39 RECEIVED_BY, 73 SENDS_TO, 79 TEST_CALLS",[216,7599,7600,7601,7604,7605,7608,7609,7612],{},"method maps and ",[152,7602,7603],{},"new jayson.Server(..)","; 14 handlers wrapped in ",[152,7606,7607],{},"jayson.Method(..)"," unresolved; tests name methods the server lacks (",[152,7610,7611],{},"add_4","), which stay send-only",[183,7614,7615,7621,7624,7627],{},[216,7616,7617,7618,7620],{},"jsonrpsee ",[152,7619,2104],{}," e6d59a0",[216,7622,7623],{},"20 (4)",[216,7625,7626],{},"33 RECEIVED_BY, 32 SENDS_TO",[216,7628,7629,7632,7633,7636,7637,7640],{},[152,7630,7631],{},"#[rpc(namespace = \"state\")]"," traits (",[152,7634,7635],{},"state_getKeys",", exact), ",[152,7638,7639],{},"register_method"," closures (heuristic, the registering function)",[141,7642,7643,7644,7647,7648,7650,7651,7654,7655,7657],{},"On the 20 #39 corpora the only change is in tauri: the CLI's jsonrpsee ",[152,7645,7646],{},"options"," method (",[152,7649,7639],{},",\nheuristic) and the three ",[152,7652,7653],{},"client.request(\"options\", ..)"," calls that reach it, all correct; the JSON-RPC scan skips\nMCP files, so mcp-servers and python-sdk are unchanged. On the gRPC corpora above only the connect-es top-level\nclients changed (6 SENDS_TO, 1 TEST_CALLS from module nodes). A random 20 of the new Thrift \u002F tRPC\n\u002F JSON-RPC edges were checked by hand: 20 correct. ",[152,7656,7443],{}," covers Thrift (Python, Node, C++), tRPC\n(inline, nested, imported, procedure-variable mounts and clients) and JSON-RPC (jayson, jsonrpcserver, payloads,\njsonrpsee) on the same fixtures.",[172,7659,7661],{"id":7660},"cc-file-level-macro-statements-and-lock-annotations-131","C\u002FC++: file-level macro statements and lock annotations (#131)",[141,7663,7664,7665,7667,7668,7671,7672,7675,7676,7679],{},"A file-level ",[152,7666,7219],{}," made tree-sitter-cpp read a function definition that ran to the next ",[152,7669,7670],{},"}",", swallowing\nthe class after it. Thread-safety annotations after a declarator (",[152,7673,7674],{},"void Write() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_) {",") became the declarator. Both are now blanked before parsing. Heuristic types and unique-name member calls stay\nwithin the files a caller can see, and the classes of separate programs (a ",[152,7677,7678],{},"main()"," per file) are not variants.\nBefore -> after on the C\u002FC++ corpora (heuristic mode):",[177,7681,7682,7695],{},[180,7683,7684],{},[183,7685,7686,7688,7690,7693],{},[186,7687,188],{},[186,7689,2620],{},[186,7691,7692],{},"Nodes",[186,7694,800],{},[211,7696,7697,7738,7780,7814,7834,7854],{},[183,7698,7699,7703,7706,7709],{},[216,7700,7202,7701,7205],{},[152,7702,2104],{},[216,7704,7705],{},"2,425 -> 2,088",[216,7707,7708],{},"1,331 -> 1,397",[216,7710,7711,7712,7714,7715,7718,7719,7722,7723,7726,7727,442,7730,7733,7734,7737],{},"28 classes, 48 methods and 32 fields recovered; gRPC RECEIVED_BY 77 -> 94 (",[152,7713,7223],{}," 17 -> 0). 382 USES_TYPE edges from each ",[152,7716,7717],{},"RunServer"," to the ",[152,7720,7721],{},"GreeterServiceImpl"," of every other example are gone. 25 functions named ",[152,7724,7725],{},"ABSL_FLAG",", a stray ",[152,7728,7729],{},"Run",[152,7731,7732],{},"HandleRpcs"," (now ",[152,7735,7736],{},"ServerImpl::"," methods) and 14 locals read as globals are gone",[183,7739,7740,7743,7746,7749],{},[216,7741,7742],{},"leveldb 7ee830d",[216,7744,7745],{},"8,107 -> 8,260",[216,7747,7748],{},"3,036 -> 3,075",[216,7750,7751,7752,571,7755,571,7758,7761,7762,7765,7766,442,7769,7772,7773,442,7776,7779],{},"21 methods and 28 fields recovered (",[152,7753,7754],{},"GUARDED_BY",[152,7756,7757],{},"LOCKS_EXCLUDED",[152,7759,7760],{},"SCOPED_LOCKABLE MutexLock","); +71 CALLS (",[152,7763,7764],{},"mutex_.Lock()"," and the like). 22 correct calls to ",[152,7767,7768],{},"CondVar::Wait",[152,7770,7771],{},"HandleTable::Remove"," became ambiguous with a recovered ",[152,7774,7775],{},"TestState::Wait",[152,7777,7778],{},"PosixLockTable::Remove"," and are dropped",[183,7781,7782,7785,7788,7791],{},[216,7783,7784],{},"googletest 988ea2c",[216,7786,7787],{},"4,609 -> 4,529",[216,7789,7790],{},"2,692 -> 2,692",[216,7792,7793,7794,7797,7798,7801,7802,7805,7806,7809,7810,7813],{},"19 functions ",[152,7795,7796],{},"GTEST_LOCK_EXCLUDED_"," are now their ",[152,7799,7800],{},"Mock::.."," methods. 111 cross-file guesses are gone (",[152,7803,7804],{},".str()"," -> a test mock's ",[152,7807,7808],{},"str"," 57, ",[152,7811,7812],{},".size()"," 25) and 52 calls to the recovered methods are added",[183,7815,7816,7819,7822,7824],{},[216,7817,7818],{},"libuv 49b1c06",[216,7820,7821],{},"48,893 -> 48,188",[216,7823,2672],{},[216,7825,7826,7827,7830,7831,7833],{},"702 USES_VALUE edges mirrored between the ",[152,7828,7829],{},"loop"," globals of the separate ",[152,7832,2650],{}," programs are gone",[183,7835,7836,7840,7843,7845],{},[216,7837,7480,7838,7484],{},[152,7839,7483],{},[216,7841,7842],{},"183 -> 178",[216,7844,2672],{},[216,7846,7847,7850,7851],{},[152,7848,7849],{},"client.ping()"," in the C++ client no longer binds to the server program's ",[152,7852,7853],{},"CalculatorHandler",[183,7855,7856,7859,7861,7863],{},[216,7857,7858],{},"redis b540ca4, flutter\u002Fsamples a05867d",[216,7860,2672],{},[216,7862,2672],{},[216,7864],{},[141,7866,7867,7868,442,7870,7872],{},"A random 20 of the added edges were checked by hand against the source: 20 correct. The removed edges were\nspot-checked by group (the cross-program USES_TYPE \u002F USES_VALUE mirrors and the ",[152,7869,7804],{},[152,7871,7812],{}," \u002F handler\nguesses were all wrong before), except the 22 leveldb calls above.",[172,7874,7876],{"id":7875},"graphql-root-fields-34-part-1","GraphQL root fields (#34 part 1)",[177,7878,7879,7892],{},[180,7880,7881],{},[183,7882,7883,7885,7888,7890],{},[186,7884,188],{},[186,7886,7887],{},"Root-field endpoints",[186,7889,2620],{},[186,7891,800],{},[211,7893,7894,7952,7981,8015,8041,8062],{},[183,7895,7896,7899,7902,7905],{},[216,7897,7898],{},"saleor 8385ca6 (graphene)",[216,7900,7901],{},"455 (448 in schema.graphql)",[216,7903,7904],{},"446 RECEIVED_BY, 6,106 TEST_CALLS",[216,7906,7907,442,7910,7913,7914,7917,7918,7921,7922,442,7925,7928,7929,7932,7933,7936,7937,442,7940,7943,7944,7947,7948,7951],{},[152,7908,7909],{},"Query(AccountQueries, ...)",[152,7911,7912],{},"Mutation(...)"," of ",[152,7915,7916],{},"build_federated_schema(..)",": 333 ",[152,7919,7920],{},"X.Field()"," mutations (262 own ",[152,7923,7924],{},"perform_mutation",[152,7926,7927],{},"mutate",", 71 inherited, heuristic), 89 ",[152,7930,7931],{},"resolve_*",", 24 ",[152,7934,7935],{},"resolver=","; the two schema fields without a resolver are federation's ",[152,7938,7939],{},"_entities",[152,7941,7942],{},"_service","; the 7 extra endpoints are test schemas. Tests post ",[152,7945,7946],{},"QUERY = \"\"\"...\"\"\""," constants and per-test ",[152,7949,7950],{},"query"," locals",[183,7953,7954,7957,7960,7963],{},[216,7955,7956],{},"saleor-dashboard f9093f2 (Apollo + graphql-codegen)",[216,7958,7959],{},"457 (schema copy)",[216,7961,7962],{},"625 SENDS_TO, 4 TEST_CALLS",[216,7964,7965,7966,442,7969,7972,7973,7976,7977,7980],{},"callers of 672 generated ",[152,7967,7968],{},"use\u003COp>Query",[152,7970,7971],{},"Mutation"," hooks and ",[152,7974,7975],{},"client.query({query: XDocument})","; 25 calls to hand-written ",[152,7978,7979],{},"use..Query"," wrappers name no operation (stats only)",[183,7982,7983,7992,7995,7998],{},[216,7984,7985,7986,5352,7989],{},"fullstack-tutorial fca98de, ",[152,7987,7988],{},"final\u002Fserver",[152,7990,7991],{},"final\u002Fclient",[216,7993,7994],{},"6 + 8",[216,7996,7997],{},"6 RECEIVED_BY, 6 TEST_CALLS; 7 SENDS_TO",[216,7999,8000,8001,442,8004,8007,8008,8011,8012,8014],{},"apollo-server resolver map (plain Node, now indexed); ",[152,8002,8003],{},"useQuery",[152,8005,8006],{},"useMutation"," clients; ",[152,8009,8010],{},"@client"," fields skipped; ",[152,8013,5549],{}," joins all 6 server fields with their client senders",[183,8016,8017,8020,8022,8025],{},[216,8018,8019],{},"strawberry-examples ff2bd0d",[216,8021,5086],{},[216,8023,8024],{},"9 RECEIVED_BY",[216,8026,8027,8028,442,8031,442,8034,8037,8038],{},"four apps; ",[152,8029,8030],{},"@strawberry.field",[152,8032,8033],{},"mutation",[152,8035,8036],{},"subscription"," roots of ",[152,8039,8040],{},"strawberry.Schema(..)",[183,8042,8043,8046,8049,8052],{},[216,8044,8045],{},"netbox 251458b (strawberry-django)",[216,8047,8048],{},"260",[216,8050,8051],{},"5 TEST_CALLS",[216,8053,8054,8057,8058,8061],{},[152,8055,8056],{},"strawberry_django.field()"," root fields are served by the default resolver (no function); ",[152,8059,8060],{},"auto_camel_case=False"," keeps snake_case",[183,8063,8064,8071,8074,8077],{},[216,8065,8066,8067,8070],{},"nest ",[152,8068,8069],{},"sample\u002F"," 12, 22, 23, 33 (35142c3)",[216,8072,8073],{},"4, 6, 5, 5",[216,8075,8076],{},"20 RECEIVED_BY",[216,8078,8079,8080,8083],{},"endpoint twins of the ",[152,8081,8082],{},"route:GRAPHQL"," routes",[141,8085,8086,8087,8090,8091,8094,8095,8097,8098,420],{},"The 20 #39 corpora are unchanged except netbox (the 5 TEST_CALLS above and 1 endpoint at snapshot time; 260\nendpoints with the final strawberry-django rule). A random 20 of the new edges across these corpora were checked by\nhand against the source: 20 correct. An earlier sample found per-test ",[152,8088,8089],{},"query = \"\"\"...\"\"\""," locals bound to the first\none in the file; the binding now prefers the calling function's own assignment, then module level, then an import.\n",[152,8092,8093],{},"tests\u002Ftest_graphql.py"," covers the document parser, SDL, resolver maps, Apollo clients, a codegen hook, Nest twins in\n",[152,8096,5553],{},", graphene, strawberry, ariadne and Python clients on ",[152,8099,8100],{},"tests\u002Fgraphql_fixture",[172,8102,8104],{"id":8103},"job-queues-celery-rq-dramatiq-bull-laravel-messenger-36","Job queues: Celery, RQ, Dramatiq, Bull, Laravel, Messenger (#36)",[177,8106,8107,8120],{},[180,8108,8109],{},[183,8110,8111,8113,8116,8118],{},[186,8112,188],{},[186,8114,8115],{},"Job \u002F queue endpoints",[186,8117,2620],{},[186,8119,800],{},[211,8121,8122,8155,8191,8220,8249,8270,8301,8335,8357],{},[183,8123,8124,8127,8130,8133],{},[216,8125,8126],{},"saleor 8385ca6 (Celery in Django)",[216,8128,8129],{},"75 jobs, 2 queues",[216,8131,8132],{},"75 RECEIVED_BY, 2 QUEUE_ROUTES, 1 SENDS_TO",[216,8134,8135,8136,3362,8139,8142,8143,8146,8147,8150,8151,8154],{},"Every task gets an endpoint twin of the Django plugin's job node. The plugin's 78 DISPATCHES are not repeated and its entries are unchanged. ",[152,8137,8138],{},"observability",[152,8140,8141],{},"@app.task(queue=OBSERVABILITY_QUEUE_NAME)",") is ",[152,8144,8145],{},"no_consumer",": the only worker command in the repo (pyproject ",[152,8148,8149],{},"celery worker -E",") consumes the default queue. The other ",[152,8152,8153],{},"queue=settings.X"," names are env settings with no default",[183,8156,8157,8160,8163,8166],{},[216,8158,8159],{},"authentik 2c6f657 (Dramatiq)",[216,8161,8162],{},"71 actors",[216,8164,8165],{},"71 RECEIVED_BY, 60 SENDS_TO, 82 TEST_CALLS",[216,8167,8168,8171,8172,442,8175,8178,8179,8182,8183,8186,8187,8190],{},[152,8169,8170],{},"@actor(description=_(..))"," decorators span lines. Sends are ",[152,8173,8174],{},".send()",[152,8176,8177],{},".send_with_options()"," plus ",[152,8180,8181],{},"ScheduleSpec(actor=x)"," registrations (heuristic): 46 of 71 actors are linked. Most of the rest are sync actors held as provider attributes (",[152,8184,8185],{},"self.sync_objects_task","). Workers start through ",[152,8188,8189],{},"ak worker",", so no consumer is known",[183,8192,8193,8196,8199,8202],{},[216,8194,8195],{},"netbox 251458b (django-rq)",[216,8197,8198],{},"1 job, 3 queues",[216,8200,8201],{},"1 RECEIVED_BY, 1 QUEUE_ROUTES, 1 SENDS_TO",[216,8203,8204,8207,8208,8211,8212,8215,8216,8219],{},[152,8205,8206],{},"rq_queue.enqueue('extras.webhooks.send_webhook')",". The systemd ",[152,8209,8210],{},"netbox-rq.service"," runs ",[152,8213,8214],{},"rqworker high default low",". ",[152,8217,8218],{},"JobRunner.enqueue"," jobs go through netbox's own wrapper and are not followed",[183,8221,8222,8225,8228,8231],{},[216,8223,8224],{},"microblog a975ef6 (RQ)",[216,8226,8227],{},"2 jobs, 1 queue",[216,8229,8230],{},"1 RECEIVED_BY, 1 QUEUE_ROUTES, 2 SENDS_TO, 1 MATCHES_ENDPOINT",[216,8232,8233,8236,8237,8240,8241,8244,8245,8248],{},[152,8234,8235],{},"current_app.task_queue.enqueue(f'app.tasks.{name}')"," is a template matching ",[152,8238,8239],{},"app.tasks.export_posts"," (heuristic). The ",[152,8242,8243],{},"microblog-tasks"," queue is consumed by the Procfile ",[152,8246,8247],{},"worker"," and by the supervisor program",[183,8250,8251,8254,8257,8260],{},[216,8252,8253],{},"flask (examples\u002Fcelery)",[216,8255,8256],{},"3 jobs",[216,8258,8259],{},"3 RECEIVED_BY, 3 SENDS_TO",[216,8261,8262,8263,8178,8266,8269],{},"Celery without Django: ",[152,8264,8265],{},"@shared_task",[152,8267,8268],{},".delay()"," from the views",[183,8271,8272,8275,8278,8281],{},[216,8273,8274],{},"pixelfed c7dc513 (Laravel + Horizon)",[216,8276,8277],{},"127 job twins, 15 queues",[216,8279,8280],{},"127 RECEIVED_BY, 87 QUEUE_ROUTES, 130 SENDS_TO",[216,8282,8283,8286,8287,571,8290,8293,8294,8297,8298,8300],{},[152,8284,8285],{},"X::dispatch(..)->onQueue('feed')"," (multi-line chains, ",[152,8288,8289],{},"self::dispatch",[152,8291,8292],{},"Bus::batch","): 157 queue sends, 1 left unresolved (a ",[152,8295,8296],{},"->catch()"," closure in between). The 4 Horizon supervisors consume all 15 queues, so none is ",[152,8299,8145],{},". Entries are unchanged",[183,8302,8303,8306,8309,8312],{},[216,8304,8305],{},"outline 478e812 (Bull)",[216,8307,8308],{},"4 queues, 4 queue-wide job templates",[216,8310,8311],{},"4 RECEIVED_BY, 4 QUEUE_ROUTES, 7 SENDS_TO",[216,8313,8314,8315,8318,8319,8322,8323,8326,8327,8330,8331,8334],{},"The ",[152,8316,8317],{},"createQueue(name)"," factory and the ",[152,8320,8321],{},"globalEventQueue()"," getters bind the queues. Sends are ",[152,8324,8325],{},".add(data)"," (queue only); receivers are the ",[152,8328,8329],{},".process(fn)"," blocks of the worker service. Task classes dispatched by class name (",[152,8332,8333],{},"BaseTask.schedule",") are a follow-up",[183,8336,8337,8340,8343,8346],{},[216,8338,8339],{},"laravel.io 24be489, koel 295d8c1",[216,8341,8342],{},"9 + 9 job twins",[216,8344,8345],{},"9 + 9 RECEIVED_BY",[216,8347,8348,8349,8352,8353,8356],{},"Only ",[152,8350,8351],{},"ShouldQueue"," classes get twins: 33 + 11 ",[152,8354,8355],{},"App\\Jobs"," classes run synchronously",[183,8358,8359,8365,8368,8371],{},[216,8360,8066,8361,8364],{},[152,8362,8363],{},"sample\u002F26-queues"," (35142c3)",[216,8366,8367],{},"1 job twin",[216,8369,8370],{},"1 RECEIVED_BY, 1 QUEUE_ROUTES",[216,8372,8373,8376,8377,8380],{},[152,8374,8375],{},"@Process('transcode')"," -> ",[152,8378,8379],{},"endpoint:job:bull:audio:transcode",", merged into the job node with the controller's DISPATCHES",[141,8382,8383,8384,8387,8388,442,8391,442,8394,8397,8398,8400,8401,8403,8404,8406,8407,8410,8411,1818],{},"The other 17 #39 corpora are unchanged (same nodes and edges; immich's BullMQ wrapper is a follow-up), and no corpus loses an edge. In saleor, netbox, flask\nand microblog the only entry rows added are those of the new endpoints. authentik's actors are new\n",[152,8385,8386],{},"message_handler"," entries, so the entry counts of the code they reach change. A random 20 of the 320 new edges were\nchecked by hand against the source: 20 correct (actor and task definitions, ",[152,8389,8390],{},".send",[152,8392,8393],{},"send_with_options",[152,8395,8396],{},"actor=","\ncall sites, test sends). For part 2, a random 20 of the 476 new edges of pixelfed, outline, laravel.io and koel were checked: 20 correct.\nAn earlier part-2 sample found a twin for a laravel.io ",[152,8399,8355],{}," class without ",[152,8402,8351],{}," (a synchronous job);\ntwins now need ",[152,8405,8351],{},". The queue edges were first RECEIVED_BY. On pixelfed that let an http route reach every\njob of the queue it sends to, and changed 5,485 entry rows; QUEUE_ROUTES does not propagate, and the entry rows are\nnow unchanged. ",[152,8408,8409],{},"tests\u002Ftest_jobs.py"," covers the cross-repo cases on ",[152,8412,8413],{},"tests\u002Fjobs_fixture",[425,8415,8416,8433,8446,8449,8459,8462,8477,8487],{},[428,8417,8418,8419,8422,8423,8425,8426,8429,8430,8432],{},"a Flask shop's ",[152,8420,8421],{},"send_task(\"billing.charge\")"," links to the billing worker's task with ",[152,8424,5549],{},", while\n",[152,8427,8428],{},"billing.refund"," stays ",[152,8431,6023],{},";",[428,8434,8435,8436,8439,8440,8443,8444,8432],{},"a ",[152,8437,8438],{},"task_routes"," queue missing from the Procfile's ",[152,8441,8442],{},"-Q"," is ",[152,8445,8145],{},[428,8447,8448],{},"RQ import paths and an f-string template resolve to the mailer repo's functions at link time;",[428,8450,8451,8452,442,8455,8458],{},"the compose ",[152,8453,8454],{},"rq worker",[152,8456,8457],{},"dramatiq -Q"," consumers are found;",[428,8460,8461],{},"Django twins keep their DISPATCHES.",[428,8463,8464,8465,8468,8469,8472,8473,8476],{},"a BullMQ ",[152,8466,8467],{},"emails.add(\"welcome\")"," links to another repo's ",[152,8470,8471],{},"new Worker(\"emails\", fn)"," through the ",[152,8474,8475],{},"emails:{name}","\ntemplate;",[428,8478,8479,8480,442,8483,8486],{},"Laravel ",[152,8481,8482],{},"$queue",[152,8484,8485],{},"->onQueue()"," sends and Horizon consumers;",[428,8488,8489,8490,8493,8494,8497],{},"Symfony Messenger handlers, ",[152,8491,8492],{},"messenger.yaml"," routing and ",[152,8495,8496],{},"messenger:consume"," workers.",[172,8499,8501],{"id":8500},"message-brokers-kafka-amqp-redis-mqtt-nats-35-part-1","Message brokers: Kafka, AMQP, Redis, MQTT, NATS (#35 part 1)",[177,8503,8504,8516],{},[180,8505,8506],{},[183,8507,8508,8510,8512,8514],{},[186,8509,188],{},[186,8511,3843],{},[186,8513,2620],{},[186,8515,800],{},[211,8517,8518,8588,8623,8655,8687,8711,8732],{},[183,8519,8520,8532,8535,8538],{},[216,8521,8522,8523,442,8526,442,8529],{},"rabbitmq-tutorials 6771f3e, ",[152,8524,8525],{},"python",[152,8527,8528],{},"php",[152,8530,8531],{},"javascript-nodejs",[216,8533,8534],{},"9 \u002F 9 \u002F 10",[216,8536,8537],{},"6 SENDS_TO, 6 RECEIVED_BY, 3 MATCHES_ENDPOINT each (js: 7 RECEIVED_BY)",[216,8539,8540,8541,571,8544,8547,8548,8551,8552,8555,8556,8559,8560,8563,8564,8567,8568,8571,8572,8575,8576,8579,8580,8583,8584,8587],{},"The six tutorial topologies in three languages. Hello \u002F work queues (",[152,8542,8543],{},"queue:hello",[152,8545,8546],{},"queue:task_queue",") and RPC (",[152,8549,8550],{},"queue:rpc_queue",") pair by queue name. Fanout ",[152,8553,8554],{},"logs",", direct ",[152,8557,8558],{},"direct_logs"," and topic ",[152,8561,8562],{},"topic_logs"," exchanges reach the consumers through the bindings of their server-named queues (pika ",[152,8565,8566],{},"result.method.queue",", amqplib ",[152,8569,8570],{},"q.queue",", php-amqplib ",[152,8573,8574],{},"list($queue_name, ,)","). Binding keys come from argv, so the bindings are ",[152,8577,8578],{},"\u003Cexchange>\u002F#"," (heuristic). The RPC reply (",[152,8581,8582],{},"props.reply_to",") and the callback queue held in ",[152,8585,8586],{},"self.callback_queue"," are counted as unresolved. The JS directory has no jsconfig, so it was indexed with one added (plain JS without a config was not indexed then; since #136 it is, with the same edges)",[183,8589,8590,8593,8596,8599],{},[216,8591,8592],{},"nats-by-example 232213c, Python and Node examples",[216,8594,8595],{},"9 + 8",[216,8597,8598],{},"17 + 10 SENDS_TO, 4 + 1 RECEIVED_BY, 4 + 4 MATCHES_ENDPOINT",[216,8600,8601,8604,8605,442,8608,8611,8612,8615,8616,8619,8620,8622],{},[152,8602,8603],{},"greet.*"," subscriptions match ",[152,8606,8607],{},"greet.joe",[152,8609,8610],{},"greet.bob"," publishes and requests. Nested ",[152,8613,8614],{},"cb=greet_handler"," functions have no node of their own, so the receiver is the enclosing ",[152,8617,8618],{},"main",". JetStream publishes have no core subscriber (",[152,8621,6023],{},"; stream consumers are part 2)",[183,8624,8625,8630,8632,8635],{},[216,8626,8627,8628],{},"kafkajs 55b0b41 ",[152,8629,2104],{},[216,8631,615],{},[216,8633,8634],{},"1 SENDS_TO, 1 RECEIVED_BY",[216,8636,8637,463,8640,8643,8644,8647,8648,8651,8652,237],{},[152,8638,8639],{},"producer.send({topic, messages})",[152,8641,8642],{},"consumer.subscribe({topic})"," with the shorthand ",[152,8645,8646],{},"{ topic }"," (the examples' ",[152,8649,8650],{},"require('..\u002Findex')"," was pointed at ",[152,8653,8654],{},"kafkajs",[183,8656,8657,8660,8662,8665],{},[216,8658,8659],{},"outline 478e812",[216,8661,888],{},[216,8663,8664],{},"2 SENDS_TO, 2 RECEIVED_BY, 2 MATCHES_ENDPOINT, 1 TEST_CALLS",[216,8666,8667,8668,8671,8672,8675,8676,8679,8680,8683,8684,8686],{},"ioredis ",[152,8669,8670],{},"publish(\\","${CHANNEL_PREFIX}:${documentId}`)",[152,8673,8674],{},"matches","psubscribe(`${CHANNEL_PREFIX}:*`)",[152,8677,8678],{},". 14 ",".publish(",[152,8681,8682],{},"calls on outline's own classes with a","publish",[152,8685,7647],{},"document.publish(ctx, ..)`) are skipped as wrapper calls",[183,8688,8689,8692,8694,8697],{},[216,8690,8691],{},"librenms 56761508 (php-amqplib)",[216,8693,615],{},[216,8695,8696],{},"1 SENDS_TO",[216,8698,8699,8700,8703,8704,8376,8707,8710],{},"The Canopsis alert transport publishes to the topic exchange ",[152,8701,8702],{},"canopsis.events"," with the key ",[152,8705,8706],{},"'.' . $msg_body['resource']",[152,8708,8709],{},"canopsis.events\u002F.{resource}"," (heuristic); the consumer is outside the repo. A commented-out assignment of the key is ignored",[183,8712,8713,8716,8718,8721],{},[216,8714,8715],{},"nest 35142c3",[216,8717,615],{},[216,8719,8720],{},"1 TEST_CALLS",[216,8722,8723,8724,8727,8728,8731],{},"An e2e spec's raw ioredis ",[152,8725,8726],{},"pub.publish(\\","${channel}.reply`)",[152,8729,8730],{},". The microservices package's own Redis \u002F RMQ \u002F MQTT \u002F NATS \u002F Kafka transports take channel and queue names at run time (counted as unresolved). graphql-subscriptions ","pubSub.publish('catCreated')` in the samples is in-process and is not taken for Redis",[183,8733,8734,8737,8739,8741],{},[216,8735,8736],{},"zigbee2mqtt 344b6e0",[216,8738,243],{},[216,8740,3923],{},[216,8742,8743,8744,3362,8747,8750],{},"Every publish goes through the app's own ",[152,8745,8746],{},"class Mqtt",[152,8748,8749],{},"this.mqtt.publish(\"bridge\u002Fevent\")","), which prefixes the base topic, so 87 wrapper calls are skipped instead of recorded under the wrong topic. The wrapper's own client calls use the run-time topic only (unresolved). Wrappers are part 2",[141,8752,8753,8754,2512,8757,4217,8760,8763,8764,8767,8768,8771,8772,1818],{},"The other #39 corpora are unchanged: immich, opentelemetry-demo, aiocoap, alacritty, ansible, authentik, django,\nelectron-fiddle, element-x-ios, eslint, flask, httpie, koel, ktor-samples, laravel.io, mcp-servers, microblog,\nnetbox, opentelemetry-python, pixelfed, python-sdk, python-zeroconf, redis, saleor and tauri, and so is invoiceninja. opentelemetry-demo's Kafka\nproducer is Go and its consumer Kotlin (part 2). A random 20 of the 95 new edges of the tutorial, example and outline rows were checked\nby hand against the source. In the first sample, 2 were wrong: a nested ",[152,8755,8756],{},"def callback",[152,8758,8759],{},"receive_logs.py",[152,8761,8762],{},"receive_logs_direct.py"," resolved to the same-named function of ",[152,8765,8766],{},"worker.py",". A handler in another file is now taken\nonly when it is imported. In a second sample, after the fix, all 20 were correct. ",[152,8769,8770],{},"tests\u002Ftest_brokers.py"," covers\n",[152,8773,8774],{},"tests\u002Fbrokers_fixture",[425,8776,8777,8784,8802,8812],{},[428,8778,8779,8780,8783],{},"a TS orders API producing to Kafka (enum topic, ",[152,8781,8782],{},"sendBatch",", env default), a topic exchange, the default exchange,\nRedis, MQTT and NATS request;",[428,8785,8786,8787,8790,8791,463,8794,8797,8798,8801],{},"a Python fulfilment worker consuming them (confluent-kafka with group and imported constants, a pika server-named\nqueue bound with ",[152,8788,8789],{},"order.eu.*",", redis-py ",[152,8792,8793],{},"subscribe(**{ch: handler})",[152,8795,8796],{},"psubscribe",", paho ",[152,8799,8800],{},"on_message",", nats-py\nqueue group);",[428,8803,8804,8805,571,8808,8811],{},"a Laravel notifier (",[152,8806,8807],{},"Redis::publish(self::CHANNEL)",[152,8809,8810],{},"Redis::subscribe",", php-amqplib);",[428,8813,6996,8814,8816,8817,8376,8820,8822,8823,8826,8827,571,8830,1879,8833,722],{},[152,8815,5549],{}," of the API and the worker (",[152,8818,8819],{},"order.{region}.created",[152,8821,8789],{}," heuristic, ",[152,8824,8825],{},"stock.check.{sku}","\n-> ",[152,8828,8829],{},"stock.check.*",[152,8831,8832],{},"orders.cancelled",[152,8834,6023],{},[172,8836,8838],{"id":8837},"message-brokers-kotlin-and-rust-clients-spring-listeners-35-part-2","Message brokers: Kotlin and Rust clients, Spring listeners (#35 part 2)",[177,8840,8841,8853],{},[180,8842,8843],{},[183,8844,8845,8847,8849,8851],{},[186,8846,188],{},[186,8848,3843],{},[186,8850,2620],{},[186,8852,800],{},[211,8854,8855,8898,8925,8960,8988],{},[183,8856,8857,8862,8864,8867],{},[216,8858,8522,8859],{},[152,8860,8861],{},"kotlin-java-client",[216,8863,3052],{},[216,8865,8866],{},"7 SENDS_TO, 7 RECEIVED_BY, 4 MATCHES_ENDPOINT",[216,8868,8869,8870,8873,8874,8877,8878,8881,8882,8885,8886,8889,8890,8893,8894,8897],{},"The RabbitMQ Java client from Kotlin: ",[152,8871,8872],{},"queueDeclare().queue"," server-named queues, ",[152,8875,8876],{},"DefaultConsumer"," objects passed to ",[152,8879,8880],{},"basicConsume",", and exchange names in companion constants (",[152,8883,8884],{},"EmitLog.EXCHANGE_NAME",", taken from the file that declares the class, because every tutorial declares its own ",[152,8887,8888],{},"EXCHANGE_NAME","). The tutorials' top-level ",[152,8891,8892],{},"fun main"," functions share one node id in the default package, so most edges are on the file node. The RPC reply to ",[152,8895,8896],{},"replyTo"," is unresolved",[183,8899,8900,8906,8908,8911],{},[216,8901,8902,8903,8905],{},"rabbitmq-tutorials ",[152,8904,2734],{}," (kourier)",[216,8907,404],{},[216,8909,8910],{},"6 SENDS_TO, 6 RECEIVED_BY, 3 MATCHES_ENDPOINT",[216,8912,8913,8914,8917,8918,8921,8922,8924],{},"Named arguments (",[152,8915,8916],{},"exchange = \"logs\", routingKey = \"\"","), ",[152,8919,8920],{},"queueDeclared.queueName",", keys from a loop (",[152,8923,8578],{},", heuristic)",[183,8926,8927,8932,8934,8936],{},[216,8928,8902,8929],{},[152,8930,8931],{},"rust-lapin",[216,8933,404],{},[216,8935,8910],{},[216,8937,8938,8939,8942,8943,442,8946,442,8949,8215,8952,8955,8956,8959],{},"The same six topologies with lapin: ",[152,8940,8941],{},"queue.name().as_str()"," bindings, ",[152,8944,8945],{},"ExchangeKind::Fanout",[152,8947,8948],{},"Direct",[152,8950,8951],{},"Topic",[152,8953,8954],{},"rust-amqprs"," (argument builders such as ",[152,8957,8958],{},"BasicPublishArguments::new(..)",") gives 5 unresolved sends and no edges",[183,8961,8962,8965,8967,8970],{},[216,8963,8964],{},"nats-by-example 232213c, Rust examples",[216,8966,5025],{},[216,8968,8969],{},"40 SENDS_TO, 7 RECEIVED_BY, 7 MATCHES_ENDPOINT",[216,8971,8972,8973,442,8975,442,8977,5146,8980,8983,8984,8987],{},"async-nats ",[152,8974,8683],{},[152,8976,3343],{},[152,8978,8979],{},"subscribe",[152,8981,8982],{},"format!(\"cars.{}\", i)"," publishes match ",[152,8985,8986],{},"cars.>",". A loop over a subject array is unresolved (2)",[183,8989,8990,8997,8999,9002],{},[216,8991,8992,8993,8996],{},"opentelemetry-demo, ",[152,8994,8995],{},"src\u002Ffraud-detection"," (Kotlin)",[216,8998,615],{},[216,9000,9001],{},"1 RECEIVED_BY",[216,9003,9004,1876,9007,9010,9011,1879,9014,3366,9017,9020],{},[152,9005,9006],{},"KafkaConsumer(props).apply { subscribe(listOf(topic)) }",[152,9008,9009],{},"val topic = System.getenv(\"KAFKA_TOPIC\") ?: \"orders\""," (heuristic) and ",[152,9012,9013],{},"attrs.group",[152,9015,9016],{},"fraud-detection",[152,9018,9019],{},"GROUP_ID_CONFIG",". The producer is Go, which has no plugin",[141,9022,9023,9024,9027,9028,9030],{},"The Rust examples of nats-by-example were copied into one crate (",[152,9025,9026],{},"src\u002Fbin\u002F\u003Cexample>.rs",") for indexing. The other\nKotlin and Rust corpora have no broker clients and get no broker edges: KaMPKit, nowinandroid, spring-petclinic-kotlin,\nelement-x-android, bitwarden-android, grpc-kotlin, ktor-samples, tokio, tonic, mini-redis (its own client crate is\nnot taken for redis-rs), jsonrpsee, ripgrep, clash-verge-rev, alacritty and tauri. The part 1 corpora (JS \u002F TS,\nPython, PHP) are unchanged as well. A random 20 of the 103 new edges of the tutorial, nats-by-example and\nfraud-detection rows were checked by hand against the source; all 20 were correct. ",[152,9029,8770],{}," adds:",[425,9032,9033,9068,9089],{},[428,9034,9035,9036,1876,9039,571,9042,9045,9046,9049,9050,571,9053,571,9056,9059,9060,9063,9064,9067],{},"a Kotlin \u002F Spring billing service: ",[152,9037,9038],{},"@KafkaListener",[152,9040,9041],{},"groupId",[152,9043,9044],{},"@RabbitListener"," with a ",[152,9047,9048],{},"QueueBinding"," on a\ntopic exchange and with ",[152,9051,9052],{},"queues",[152,9054,9055],{},"KafkaTemplate.send(Topics.INVOICES)",[152,9057,9058],{},"basicPublish"," to a ",[152,9061,9062],{},"getenv ?: \"d\"","\nexchange, a jnats publish with a ",[152,9065,9066],{},"${x}"," template;",[428,9069,9070,9071,1876,9074,9077,9078,9081,9082,9085,9086,8432],{},"a Rust ledger: lapin ",[152,9072,9073],{},"basic_publish",[152,9075,9076],{},"format!",", a ",[152,9079,9080],{},"queue.name()"," binding, rdkafka ",[152,9083,9084],{},"subscribe(&[topic.as_str()])","\nwith ",[152,9087,9088],{},"env::var(..).unwrap_or_else(..)",[428,9090,6996,9091,9093,9094,9097],{},[152,9092,5549],{}," of the two (",[152,9095,9096],{},"billing.invoices"," linked).",[172,9099,9101],{"id":9100},"plain-javascript-without-tsconfig-jsconfig-136","Plain JavaScript without tsconfig \u002F jsconfig (#136)",[177,9103,9104,9117],{},[180,9105,9106],{},[183,9107,9108,9110,9112,9115],{},[186,9109,188],{},[186,9111,6574],{},[186,9113,9114],{},"After",[186,9116,800],{},[211,9118,9119,9145,9174,9188],{},[183,9120,9121,9124,9127,9130],{},[216,9122,9123],{},"request 3c0cddc",[216,9125,9126],{},"no JS program",[216,9128,9129],{},"74 modules, 195 functions, 14 http nodes; 1,064 edges besides CONTAINS (816 TEST_CALLS, 215 CALLS)",[216,9131,9132,9133,571,9136,571,9138,9140,9141,9144],{},"Plain CommonJS at the root (",[152,9134,9135],{},"index.js",[152,9137,466],{},[152,9139,1373],{},"), no typescript dependency. Exactly the graph a hand-written ",[152,9142,9143],{},"jsconfig.json"," gives (1,064 of 1,064 edges equal)",[183,9146,9147,9150,9153,9156],{},[216,9148,9149],{},"node-gyp 399f6fa",[216,9151,9152],{},"Python only (gyp)",[216,9154,9155],{},"plus 33 JS modules, 117 functions, 43 methods, 121 tests; 845 JS edges",[216,9157,9158,463,9161,9163,9164,571,9167,463,9170,9173],{},[152,9159,9160],{},"bin\u002F",[152,9162,466],{}," are the source dirs; ",[152,9165,9166],{},"commitlint.config.mjs",[152,9168,9169],{},"eslint.config.js",[152,9171,9172],{},".github\u002Fscripts"," are left out (coverage lists them as excluded \u002F unmapped). The Python graph is unchanged",[183,9175,9176,9180,9182,9185],{},[216,9177,8902,9178],{},[152,9179,8531],{},[216,9181,9126],{},[216,9183,9184],{},"12 modules, 14 functions, 16 broker edges",[216,9186,9187],{},"Identical to the #35 run with a jsconfig added (same nodes and edges)",[183,9189,9190,9198,9200,9203],{},[216,9191,8902,9192,9195,9196],{},[152,9193,9194],{},"javascript-nodejs-stream",", kafkajs ",[152,9197,2104],{},[216,9199,9126],{},[216,9201,9202],{},"4 modules each",[216,9204,9205],{},"Root-level example scripts",[141,9207,9208,9209,9212,9213,9215,9216,9219,9220,9223,9224,571,9227,571,9230,9233,9234,8771,9237,9240,9241,9244,9245,9248,9249,571,9252,9255,9256,9259],{},"Unchanged (same nodes and edges): django, sphinx, koel, thrift, full-stack-fastapi-template (other-language roots\nwhose package.json only carries tooling or a frontend workspace), and statsd, jayson, kafkajs, eslint,\ncordova-toast, capacitor-plugins, create-t3-turbo, ws, express and amqplib, which one of the earlier rules already\npicked up. A scan of every corpus root finds no other project that the new rule adds. A random 20 of the 1,909 edges\nadded in request and node-gyp were checked by hand against the source. 15 were correct and 1 was imprecise: ",[152,9210,9211],{},"request.get(..)","\nresolves to ",[152,9214,3343],{},", because ",[152,9217,9218],{},"get"," is assigned at run time. 4 were wrong, all from one pattern the JS extractor\nalready had: a variable that holds a call with a callback (",[152,9221,9222],{},"var server = http.createServer(function (req, res) {..})",")\nbecomes a function node, and its later uses (",[152,9225,9226],{},"server.url",[152,9228,9229],{},"s2.listen(..)",[152,9231,9232],{},"return l",") are recorded as calls of it.\nA jsconfig-configured index gives the same edges; the pattern is tracked in #138. ",[152,9235,9236],{},"tests\u002Ftest_plain_js.py",[152,9238,9239],{},"tests\u002Fplainjs_fixture",": a CommonJS app (functions, ",[152,9242,9243],{},"require"," calls, a mocha test, an amqplib endpoint; its\n",[152,9246,9247],{},"webpack.config.js"," is ignored), an ESM library (",[152,9250,9251],{},"\"type\": \"module\"",[152,9253,9254],{},"exports","), and a Python project with a tooling-only\n",[152,9257,9258],{},"package.json",", which gets no JS program.",[172,9261,9263],{"id":9262},"socketio-in-js-ts-32-part-1","Socket.IO in JS \u002F TS (#32 part 1)",[177,9265,9266,9281],{},[180,9267,9268],{},[183,9269,9270,9272,9274,9277,9279],{},[186,9271,188],{},[186,9273,3843],{},[186,9275,9276],{},"Sends \u002F receivers",[186,9278,3846],{},[186,9280,800],{},[211,9282,9283,9316,9350,9369,9392,9417],{},[183,9284,9285,9288,9293,9296,9299],{},[216,9286,9287],{},"excalidraw-room 03ff435 + excalidraw ed10ac7",[216,9289,9290,9291,237],{},"11 (after ",[152,9292,5549],{},[216,9294,9295],{},"11 \u002F 10",[216,9297,9298],{},"10 of 11",[216,9300,9301,9302,9305,9306,9309,9310,9313,9314,237],{},"Room server and collab client. ",[152,9303,9304],{},"WS_EVENTS.*"," constants and the ",[152,9307,9308],{},"volatile ? A : B"," event pair resolve; ",[152,9311,9312],{},"broadcast-unfollow"," really has no listener (",[152,9315,6023],{},[183,9317,9318,9321,9323,9326,9329],{},[216,9319,9320],{},"immich c5e06dc",[216,9322,3992],{},[216,9324,9325],{},"31 \u002F 17",[216,9327,9328],{},"12",[216,9330,9331,9332,442,9335,442,9338,9341,9342,9345,9346,9349],{},"30 of the sends go through the ",[152,9333,9334],{},"clientSend",[152,9336,9337],{},"clientBroadcast",[152,9339,9340],{},"serverSend"," wrappers and are resolved at their callers. The web listeners are chained (",[152,9343,9344],{},"websocket.on(..).on(..)",") or come through ",[152,9347,9348],{},"$lib\u002Fstores\u002Fwebsocket",". Most unmatched events are only listened to by the Dart mobile app (part 3)",[183,9351,9352,9354,9357,9360,9362],{},[216,9353,8659],{},[216,9355,9356],{},"54",[216,9358,9359],{},"11 \u002F 54",[216,9361,3052],{},[216,9363,9364,9365,9368],{},"The server sends most events as ",[152,9366,9367],{},"emit(event.name, ..)",", which is not a literal (left out)",[183,9370,9371,9374,9377,9380,9382],{},[216,9372,9373],{},"open-webui 8bd8b4f",[216,9375,9376],{},"19",[216,9378,9379],{},"34 \u002F 16",[216,9381,4349],{},[216,9383,9384,9385,9388,9389,9391],{},"The python-socketio server is created under ",[152,9386,9387],{},"if WEBSOCKET_MANAGER == 'redis'"," and was not found before. It now pairs with the TS collaboration client. The rest of the client lives in ",[152,9390,4596],{}," files, which are not scanned",[183,9393,9394,9396,9399,9402,9404],{},[216,9395,8715],{},[216,9397,9398],{},"10 (tests only)",[216,9400,9401],{},"18 TEST_CALLS",[216,9403,875],{},[216,9405,8314,9406,9409,9410,463,9413,9416],{},[152,9407,9408],{},"net"," \u002F TCP sockets of ",[152,9411,9412],{},"@nestjs\u002Fmicroservices",[152,9414,9415],{},"httpServer.on('connection')"," produce nothing",[183,9418,9419,9422,9425,9428,9430],{},[216,9420,9421],{},"socket.io 1eaa582",[216,9423,9424],{},"19 (tests only)",[216,9426,9427],{},"19 TEST_CALLS",[216,9429,875],{},[216,9431,9432],{},"Only the test suites use the public API",[141,9434,9435,9436,9439,9440,9443,9444,8215,9447,8771,9450,9453,9454,9456,9457,9459,9460,9463],{},"Unchanged (same nodes and edges): ws, express, request, node-gyp, mocha, pino, nodemailer, amqplib, kafkajs, jayson,\ncommander.js, electron-fiddle, nestjs-boilerplate, node-express-boilerplate, zigbee2mqtt, mcp-servers, elk,\ngrpc-node, opentelemetry-demo, create-t3-app, saleor-dashboard, mattermost-mobile, social-app, cal.com and\nfull-stack-fastapi-template. No edges were removed anywhere. A random 20 of the 154 new JS \u002F TS edges in the five\nprojects above were checked by hand against the source, and all 20 were correct. They include multi-line\n",[152,9437,9438],{},"socket.on(\\n \"event\", ..)"," calls, a ",[152,9441,9442],{},"WS_EVENTS.USER_FOLLOW_CHANGE"," constant, wrapper sends with their room\nargument, and immich's server-to-server ",[152,9445,9446],{},"server.on('AppRestart')",[152,9448,9449],{},"tests\u002Ftest_realtime.py",[152,9451,9452],{},"tests\u002Frealtime_fixture",": a server with a namespace, middleware, rooms, an ack, a template event, an emit wrapper and\na ",[152,9455,9408],{}," socket that is not Socket.IO; a socket.io-client app with chained listeners; and a Nest gateway with a guard.\nBoth pairs are linked with ",[152,9458,5549],{},", and a python-socketio server created under a module-level ",[152,9461,9462],{},"if"," is also covered.",[172,9465,9467],{"id":9466},"websocket-connections-and-sse-32-part-2","WebSocket connections and SSE (#32 part 2)",[177,9469,9470,9481],{},[180,9471,9472],{},[183,9473,9474,9476,9479],{},[186,9475,188],{},[186,9477,9478],{},"New",[186,9480,800],{},[211,9482,9483,9510,9532,9553,9571,9587,9603,9616,9632,9648],{},[183,9484,9485,9487,9493],{},[216,9486,8659],{},[216,9488,9489,9492],{},[152,9490,9491],{},"route:WS \u002Fcollaboration\u002F{rest*}",", 1 test client",[216,9494,9495,9498,9499,9502,9503,9505,9506,9509],{},[152,9496,9497],{},"new WebSocket.Server({ noServer: true })"," behind ",[152,9500,9501],{},"req.url?.startsWith(path)"," in the upgrade handler: a prefix route (heuristic) handled by ",[152,9504,3777],{},". The collaboration client is a Hocuspocus provider, not a ",[152,9507,9508],{},"WebSocket"," call",[183,9511,9512,9514,9519],{},[216,9513,8736],{},[216,9515,9516],{},[152,9517,9518],{},"route:WS \u002F{path}",[216,9520,9521,9522,1876,9525,9528,9529],{},"Two ",[152,9523,9524],{},"new WebSocket.Server(..)",[152,9526,9527],{},"path: posix.join(this.baseUrl, \"api\")","; the path stays unresolved (heuristic) and both route to ",[152,9530,9531],{},"Frontend.onWebSocketConnection",[183,9533,9534,9537,9542],{},[216,9535,9536],{},"coolify 0ed423a",[216,9538,9539],{},[152,9540,9541],{},"http:WS \u002Fterminal\u002Fws",[216,9543,9544,9545,9548,9549,9552],{},"The terminal client builds ",[152,9546,9547],{},"${protocol}:\u002F\u002F${host}${port}${path}"," from an object literal; the server in ",[152,9550,9551],{},"docker\u002Fcoolify-terminal\u002F"," is outside the indexed tree",[183,9554,9555,9557,9562],{},[216,9556,7117],{},[216,9558,9559],{},[152,9560,9561],{},"route:WS \u002F",[216,9563,9564,9567,9568],{},[152,9565,9566],{},"websockets.asyncio.server.serve(functools.partial(self._new_connection, ..), host, port)",": handler ",[152,9569,9570],{},"_new_connection",[183,9572,9573,9575,9581],{},[216,9574,9373],{},[216,9576,9577,9578],{},"16 routes ",[152,9579,9580],{},"stream: sse",[216,9582,9583,9586],{},[152,9584,9585],{},"StreamingResponse(.., media_type='text\u002Fevent-stream')"," in the chat, message, file-status and Ollama \u002F OpenAI proxy handlers; the proxies stream only when the upstream does",[183,9588,9589,9591,9594],{},[216,9590,8715],{},[216,9592,9593],{},"9 test clients",[216,9595,9596,442,9599,9602],{},[152,9597,9598],{},"new WebSocket('ws:\u002F\u002Flocalhost:8080')",[152,9600,9601],{},"new EventSource(url + '\u002Fsse')"," in e2e specs (TEST_HTTP)",[183,9604,9605,9607,9610],{},[216,9606,9421],{},[216,9608,9609],{},"2 test clients",[216,9611,9612,9615],{},[152,9613,9614],{},"ws:\u002F\u002Flocalhost:${port}\u002Fengine.io"," in the engine.io tests",[183,9617,9618,9620,9625],{},[216,9619,7591],{},[216,9621,9622,9624],{},[152,9623,9561],{}," (port 12345), 1 client",[216,9626,9627,9628,9631],{},"The typings test file starts a server and a client on a literal port (",[152,9629,9630],{},"origin_kind: other",", not matched)",[183,9633,9634,9637,9639],{},[216,9635,9636],{},"vito 661e497",[216,9638,3923],{},[216,9640,9641,9644,9645,9647],{},[152,9642,9643],{},"new WebSocket(","${tokenData.url}?token=..",[152,9646,237],{},": the whole URL comes from the server, so no endpoint",[183,9649,9650,9653,9655],{},[216,9651,9652],{},"openai-agents-python 81f0ccf",[216,9654,3923],{},[216,9656,9657,9658,9661,9662,9665],{},"Every ",[152,9659,9660],{},"websockets.serve"," is in a test (not an entry point); the FastAPI WS routes were already there. The browser clients live in ",[152,9663,9664],{},"examples\u002F*\u002Fstatic\u002F",", which is not indexed",[141,9667,9668,9669,9672,9673,9676,9677,9680,9681,8771,9684,9687,9688,9690,9691,9694,9695,9697,9698,2500,9700,571,9703,463,9706,9709,9710,420],{},"Unchanged (same nodes and edges): ws, express, immich, excalidraw, excalidraw-room, authentik, tauri, gen, python-sdk,\nlanggraph, httpie, invoiceninja, firefly-iii, opentelemetry-demo, mattermost-mobile, elk, social-app,\nsaleor-dashboard and cal.com; clash-verge-rev differs only in Rust edges from the rust-analyzer index (no JS \u002F TS change, its\n",[152,9670,9671],{},"ws"," use is in an unindexed ",[152,9674,9675],{},"scripts\u002Fperf\u002F","). No edges were removed anywhere else. A random 20 of the 56 added edges and changed routes in\nthe projects above were checked by hand against the source, and all 20 were correct; three are open-webui proxy routes\nthat answer SSE only when the upstream or the ",[152,9678,9679],{},"stream"," flag asks for it. ",[152,9682,9683],{},"tests\u002Ftest_websockets.py",[152,9685,9686],{},"tests\u002Fws_fixture",": a ",[152,9689,9671],{}," server with a path, one on a port with an inline handler, a ",[152,9692,9693],{},"noServer"," server behind an\nupgrade prefix check, express-ws on a mounted router, @fastify\u002Fwebsocket and Hono WS routes, express \u002F Hono \u002F FastAPI\nSSE routes (and two that only look like it), python ",[152,9696,9660],{},", and a browser client using ",[152,9699,9508],{},[152,9701,9702],{},"ReconnectingWebSocket",[152,9704,9705],{},"EventSource",[152,9707,9708],{},"fetchEventSource",", linked with ",[152,9711,5549],{},[172,9713,9715],{"id":9714},"webhook-receivers-37-part-1","Webhook receivers (#37 part 1)",[177,9717,9718,9732],{},[180,9719,9720],{},[183,9721,9722,9724,9727,9730],{},[186,9723,188],{},[186,9725,9726],{},"Receivers",[186,9728,9729],{},"Events",[186,9731,800],{},[211,9733,9734,9797],{},[183,9735,9736,9738,9741,9744],{},[216,9737,9536],{},[216,9739,9740],{},"7 verified",[216,9742,9743],{},"24 endpoints, 42 RECEIVED_BY",[216,9745,9746,9747,9750,9751,9754,9755,9758,9759,5352,9762,9765,9766,9768,9769,9772,9773,442,9776,442,9779,9782,9783,9786,9787,9790,9791,4898,9794,237],{},"Stripe ",[152,9748,9749],{},"Webhook::constructEvent"," (its 8 event types are handled in ",[152,9752,9753],{},"StripeProcessJob",", reached through the dispatched job: heuristic, the job reads ",[152,9756,9757],{},"data_get($this->event, 'type')","); GitHub (app and manual), Gitea and Bitbucket ",[152,9760,9761],{},"hash_hmac",[152,9763,9764],{},"hash_equals","; GitLab token headers compared with ",[152,9767,9764],{}," (the app hook in ",[152,9770,9771],{},"GitlabApp","). Events from ",[152,9774,9775],{},"X-GitHub-Event",[152,9777,9778],{},"X-Gitea-Event",[152,9780,9781],{},"x-event-key.0"," header variables and GitLab ",[152,9784,9785],{},"object_kind","; 13 of the edges go to functions a thin branch calls (the dispatched jobs, ",[152,9788,9789],{},"handleWorkflowJob",", and helpers that run only for that event, such as ",[152,9792,9793],{},"webhookPushMatchesWatchPaths",[152,9795,9796],{},"push",[183,9798,9799,9802,9805,9807],{},[216,9800,9801],{},"invoiceninja f1ffa5f",[216,9803,9804],{},"2 verified",[216,9806,3923],{},[216,9808,9809,9810,5352,9812,2512,9814,9817,9818,2512,9821,9824],{},"The Mailgun hooks (",[152,9811,9761],{},[152,9813,9764],{},[152,9815,9816],{},"isAuthorizedByMailgunHash","; provider from the path). The payment-gateway webhooks go through a driver resolved at run time, so the Stripe ",[152,9819,9820],{},"constructEvent",[152,9822,9823],{},"StripePaymentDriver"," is not reached from a route",[141,9826,9827,9828,9831,9832,9835,9836,9838,9839,9842,9843,9845,9846,9849,9850,8771,9853,9856,9857,442,9859,9861,9862,9865,9866,9868],{},"No receiver in vito (its routes are spatie\u002Flaravel-route-attributes ",[152,9829,9830],{},"#[Post]"," attributes, which give no routes yet),\noutline (the GitHub hook is a plugin ",[152,9833,9834],{},"router.post(\"github.webhooks\", ..)"," RPC route, not indexed as a route), cal.com\n(no Stripe receiver in this checkout; its webhooks are outbound), firefly-iii, pixelfed, koel, open-webui, saleor\n(payment-plugin hooks are dispatched by plugin id at run time), authentik, nest, librenms, akaunting, UNIT3D, panel,\nnetbox, monica, laravel.io, solidtime or express; their graphs are unchanged. Coolify's Sentinel route reads\n",[152,9837,9775],{}," only through ",[152,9840,9841],{},"auditLogWebhookFailure",", a logger called from many functions, so it is not a receiver.\nNo edges were removed anywhere. A random 20 of the 51 new edges and route markers in coolify and invoiceninja were\nchecked by hand against the source, and all 20 were correct; one is a branch helper (",[152,9844,9793],{},"\nfor ",[152,9847,9848],{},"github:push","), which runs only for that event but is not its handler. ",[152,9851,9852],{},"tests\u002Ftest_webhooks.py",[152,9854,9855],{},"tests\u002Fwebhooks_fixture",": Express, FastAPI and Laravel receivers for Stripe, svix \u002F standardwebhooks, GitHub (HMAC\nand @octokit\u002Fwebhooks), Twilio, GitLab and a generic HMAC hook, verified and unverified, with ",[152,9858,4419],{},[152,9860,9462],{}," \u002F PHP\n",[152,9863,9864],{},"match"," event dispatch and the ",[152,9867,5698],{}," markers.",[172,9870,9872],{"id":9871},"webhook-senders-37-part-2","Webhook senders (#37 part 2)",[177,9874,9875,9886],{},[180,9876,9877],{},[183,9878,9879,9881,9884],{},[186,9880,188],{},[186,9882,9883],{},"Senders",[186,9885,800],{},[211,9887,9888,9931,9953],{},[183,9889,9890,9892,9898],{},[216,9891,1931],{},[216,9893,9894,9895],{},"3 SENDS_TO ",[152,9896,9897],{},"cal.com:{event}",[216,9899,9900,463,9903,3362,9906,9909,9910,3366,9913,442,9916,9919,9920,3362,9923,9926,9927,9930],{},[152,9901,9902],{},"_sendPayload",[152,9904,9905],{},"WebhookService.sendWebhookDirectly",[152,9907,9908],{},"fetch"," POST with ",[152,9911,9912],{},"X-Cal-Signature-256",[152,9914,9915],{},"createWebhookSignature",[152,9917,9918],{},"createHmac",") and ",[152,9921,9922],{},"handleWebhookScheduledTriggers",[152,9924,9925],{},"headers[\"X-Cal-Signature-256\"] = ..","). The event comes from the stored subscription, so it stays ",[152,9928,9929],{},"{event}"," (heuristic)",[183,9932,9933,9935,9941],{},[216,9934,334],{},[216,9936,9937,9938],{},"1 SENDS_TO ",[152,9939,9940],{},"netbox:{event}",[216,9942,9943,6012,9946,9949,9950],{},[152,9944,9945],{},"extras.webhooks.send_webhook",[152,9947,9948],{},"prepared_request.headers['X-Hook-Signature'] = generate_signature(..)",", sent with ",[152,9951,9952],{},"session.send",[183,9954,9955,9958,9963],{},[216,9956,9957],{},"firefly-iii",[216,9959,9937,9960],{},[152,9961,9962],{},"firefly-iii:{event}",[216,9964,9965,9968,9969,9045,9972,9975,9976],{},[152,9966,9967],{},"StandardWebhookSender::send",": Guzzle ",[152,9970,9971],{},"request('POST', ..)",[152,9973,9974],{},"Signature"," header from ",[152,9977,9978],{},"$signatureGenerator->generate(..)",[141,9980,9981,9982,9985,9986,9989,9990,9993,9994,9996,9997,1879,10000,10003,10004,10007,10010,10011,10013,10014,442,10016,10019],{},"No sender in the other 18 projects, and no receiver edge changed anywhere. Two false positives found on the way were\nfixed before this run: librenms' Kayako transport (a ",[152,9983,9984],{},"signature"," form field of an API call, not a header) and request\nheaders read with ",[152,9987,9988],{},"headers['X-Sig']",". Not seen: saleor (its signature header is the constant\n",[152,9991,9992],{},"SALEOR_SIGNATURE_HEADER","), invoiceninja and coolify (their outgoing webhooks are unsigned; invoiceninja adds the subscriber's own headers). All 10 new edges (the 5\nabove and the fixture's 4 sends plus the ",[152,9995,5549],{}," pairing of ",[152,9998,9999],{},"hooks-ts",[152,10001,10002],{},"order.created"," with the ",[152,10005,10006],{},"hooks-py",[152,10008,10009],{},"\u002Fhooks\u002Facme"," receiver) were checked by hand against the source, and all 10 were correct. ",[152,10012,9852],{},"\ncovers svix, spatie\u002Flaravel-webhook-server and hand-signed ",[152,10015,9908],{},[152,10017,10018],{},"requests"," senders, event names from a caller's\nargument, and the pairing.",[172,10021,10023],{"id":10022},"dart-isolates-38-part-3","Dart isolates (#38 part 3)",[177,10025,10026,10036],{},[180,10027,10028],{},[183,10029,10030,10032,10034],{},[186,10031,188],{},[186,10033,2620],{},[186,10035,800],{},[211,10037,10038,10069],{},[183,10039,10040,10043,10046],{},[216,10041,10042],{},"dart-lang\u002Fsamples (shallow clone)",[216,10044,10045],{},"4 SENDS_TO, 3 RECEIVED_BY",[216,10047,10048,6012,10051,10054,10055,10058,10059,10062,10063,7014,10066],{},[152,10049,10050],{},"isolates\u002Fbin",[152,10052,10053],{},"Isolate.run(() => _readAndParseJson(filename))",", and the long-running service ",[152,10056,10057],{},"Isolate.spawn(_readAndParseJsonService, p.sendPort)"," whose two ",[152,10060,10061],{},"p.send(..)"," replies reach ",[152,10064,10065],{},"_sendAndReceive",[152,10067,10068],{},"StreamQueue(p)",[183,10070,10071,10074,10077],{},[216,10072,10073],{},"immich (mobile)",[216,10075,10076],{},"4 SENDS_TO, 2 RECEIVED_BY",[216,10078,10079,10082,10083,10086,10087,442,10090,10093,10094,10097,10098,10101],{},[152,10080,10081],{},"IsolateWorker.initialize"," spawns the static ",[152,10084,10085],{},"_isolateEntry","; its ",[152,10088,10089],{},"sendPort.send(..)",[152,10091,10092],{},"Isolate.exit(sendPort, result)"," reach the ",[152,10095,10096],{},"RawReceivePort"," handler. A test's ",[152,10099,10100],{},"compute(_writerTask, path)"," is skipped",[141,10103,10104,10105,10108,10109,10112,10113,420],{},"Unchanged: flutter-samples, dart_style and grpc-dart. All 13 new edges were checked against the source and were\ncorrect; reviewing them found the ",[152,10106,10107],{},"StreamQueue(port)"," reader and test-only isolates, both handled before landing.\n",[152,10110,10111],{},"tests\u002Ftest_dart_isolates.py"," covers ",[152,10114,10115],{},"tests\u002Fisolate_fixture",[172,10117,10119],{"id":10118},"child-processes-worker_threads-and-android-exposure-38-part-3","Child processes, worker_threads and Android exposure (#38 part 3)",[177,10121,10122,10132],{},[180,10123,10124],{},[183,10125,10126,10128,10130],{},[186,10127,188],{},[186,10129,2620],{},[186,10131,800],{},[211,10133,10134,10163,10190,10218],{},[183,10135,10136,10139,10145],{},[216,10137,10138],{},"pip",[216,10140,10141,10142,237],{},"3 SENDS_TO, 2 RECEIVED_BY (",[152,10143,10144],{},"process",[216,10146,10147,8211,10150,10153,10154,8917,10157,8211,10160],{},[152,10148,10149],{},"tools\u002Fprotected_pip.py",[152,10151,10152],{},"python -m pip"," (to ",[152,10155,10156],{},"src\u002Fpip\u002F__main__.py",[152,10158,10159],{},"tools\u002Frelease",[152,10161,10162],{},"tools\u002Frelease\u002Fcheck_version.py",[183,10164,10165,10167,10172],{},[216,10166,1910],{},[216,10168,10169,10170,237],{},"1 SENDS_TO, 1 RECEIVED_BY (",[152,10171,10144],{},[216,10173,10174,10175,8211,10178,10181,10182,10185,10186,10189],{},"machine-learning ",[152,10176,10177],{},"prepared()",[152,10179,10180],{},"python -m immich_ml.sessions.prepare"," in a child process (its ",[152,10183,10184],{},"__main__"," block). The server's ",[152,10187,10188],{},"fork(workerFile)"," names the worker with a template and stays unlinked",[183,10191,10192,10195,10199],{},[216,10193,10194],{},"eslint",[216,10196,10169,10197,237],{},[152,10198,8247],{},[216,10200,10201,1879,10204,8376,10207,2512,10210,10213,10214,10217],{},[152,10202,10203],{},"lib\u002Feslint\u002Fworker.js",[152,10205,10206],{},"parentPort.postMessage(indexedResults)",[152,10208,10209],{},"worker.once(\"message\", ..)",[152,10211,10212],{},"runWorkers","; the worker URL is ",[152,10215,10216],{},"pathToFileURL(path.join(__dirname, \".\u002Fworker.js\"))"," held in a local",[183,10219,10220,10223,10226],{},[216,10221,10222],{},"bitwarden-android, element-x-android, nowinandroid",[216,10224,10225],{},"guards only",[216,10227,10228,10229,442,10232,10235,10236,10238,10239,463,10242,10245],{},"Manifest components get ",[152,10230,10231],{},"permission \u003Cname>",[152,10233,10234],{},"not exported"," guards; ",[152,10237,5691],{},": bitwarden ",[152,10240,10241],{},"AuthCallbackActivity",[152,10243,10244],{},"AutofillCallbackActivity",", element-x the five UnifiedPush connector actions (received from distributor apps). Launcher activities are not checked",[141,10247,10248,10249,10252,10253,10256,10257,10260,10261,10263,10264,10112,10267,10270,10271,10274,10275,442,10278,10281,10282,10284],{},"No edge was removed anywhere. Unchanged: electron-fiddle (its ",[152,10250,10251],{},"utilityProcess"," sample sits in ",[152,10254,10255],{},"static\u002F",", which is not\nindexed), socket.io (",[152,10258,10259],{},"cluster.fork()"," is not linked), pino and mocha (their forks are in tests), and supervisor,\nmini-redis, tonic, beets, httpie, python-zeroconf, libuv, redis, tokio, flask, express, nodemailer, ws, jayson,\nrequest, panel, tauri, ktor-samples and capacitor. All 9 new edges outside the fixture were checked against the source\nand were correct. Reviewing the guards found launcher activities flagged ",[152,10262,5691],{},", so they are now left unchecked.\n",[152,10265,10266],{},"tests\u002Ftest_process_ipc.py",[152,10268,10269],{},"tests\u002Fprocess_ipc_fixture"," (Python ",[152,10272,10273],{},"-m",", Node ",[152,10276,10277],{},"spawn",[152,10279,10280],{},"fork",", Electron\n",[152,10283,10251],{},", fork messages both ways, worker_threads, a spawn in a test that stays a test call).",[172,10286,10288],{"id":10287},"android-intents-and-aidl-38-part-3","Android intents and AIDL (#38 part 3)",[177,10290,10291,10301],{},[180,10292,10293],{},[183,10294,10295,10297,10299],{},[186,10296,188],{},[186,10298,2620],{},[186,10300,800],{},[211,10302,10303,10372,10430],{},[183,10304,10305,10308,10311],{},[216,10306,10307],{},"bitwarden-android (shallow clone)",[216,10309,10310],{},"23 SENDS_TO, 18 RECEIVED_BY, 12 TEST_CALLS",[216,10312,10313,10316,10317,571,10320,571,10322,10325,10326,10329,10330,10333,10334,10337,10338,10341,10342,10344,10345,10348,10349,6012,10352,10355,10356,10359,10360,10363,10364,10367,10368,10371],{},[152,10314,10315],{},"intent",": 12 explicit intents to ",[152,10318,10319],{},"MainActivity",[152,10321,10241],{},[152,10323,10324],{},"AccessibilityActivity"," and the autofill \u002F credential activities (factories such as ",[152,10327,10328],{},"createAddTotpItemFromAuthenticatorIntent",", tile services through ",[152,10331,10332],{},"PendingIntent.getActivity","). ",[152,10335,10336],{},"intent-action",": the five ",[152,10339,10340],{},"com.x8bit.bitwarden.credentials.ACTION_*"," constants sent through ",[152,10343,10332],{}," and received by ",[152,10346,10347],{},"CredentialProviderActivity.onCreate"," from its manifest intent filter (not exported). ",[152,10350,10351],{},"aidl",[152,10353,10354],{},"IAuthenticatorBridgeService"," (7 methods) implemented by the ",[152,10357,10358],{},"object : IAuthenticatorBridgeService.Stub()"," in the app and called by the ",[152,10361,10362],{},"authenticatorbridge"," library, ",[152,10365,10366],{},"IAuthenticatorBridgeServiceCallback.onAccountsSync"," called back through a ",[152,10369,10370],{},"RemoteCallbackList","; tests call both through captured mocks",[183,10373,10374,10377,10380],{},[216,10375,10376],{},"element-x-android",[216,10378,10379],{},"22 SENDS_TO, 16 RECEIVED_BY",[216,10381,10382,10384,10385,442,10388,10391,10392,463,10395,571,10398,4404,10401,571,10404,10407,10408,10411,10412,10415,10416,10419,10420,10422,10423,442,10426,10429],{},[152,10383,10315],{},": notification actions (",[152,10386,10387],{},"PendingIntentCompat.getBroadcast",[152,10389,10390],{},"PendingIntent.getBroadcast",") to ",[152,10393,10394],{},"NotificationBroadcastReceiver",[152,10396,10397],{},"DeclineCallBroadcastReceiver",[152,10399,10400],{},"startForegroundService",[152,10402,10403],{},"LiveLocationSharingService.onStartCommand",[152,10405,10406],{},"CallForegroundService"," (its ",[152,10409,10410],{},"onBind"," only returns null, so ",[152,10413,10414],{},"onCreate"," receives), ",[152,10417,10418],{},"newIntent"," factories of activities. ",[152,10421,10336],{},": the UnifiedPush ",[152,10424,10425],{},"org.unifiedpush.android.connector.*",[152,10427,10428],{},"distributor.*"," actions received by manifest receivers (exported); the senders are other apps",[183,10431,10432,10435,10437],{},[216,10433,10434],{},"nowinandroid",[216,10436,8634],{},[216,10438,10439,2512,10442,4404,10445],{},[152,10440,10441],{},"ComponentName(packageName, TARGET_ACTIVITY_NAME)",[152,10443,10444],{},"newsPendingIntent",[152,10446,10319],{},[141,10448,10449,10450,442,10453,10456,10457,10459,10460,10462,10463,10466,10467,9919,10470,10473,10474,6307,10477,10480,10481,10483,10484,10487,10488,10491,10492,10495,10496,10498,10499,10502,10503,10506,10507,10510,10511,10514,10515,10112,10518,10521,10522,10525,10526,722],{},"No edge was removed anywhere. Unchanged: KaMPKit, capacitor, ktor-samples, spring-petclinic-kotlin, grpc-kotlin and the 20\npart 2 corpora run again (supervisor, mini-redis, tonic, beets, httpie, python-zeroconf, libuv, redis, tokio, pip,\nflask, express, nodemailer, ws, jayson, request, mocha, electron-fiddle, panel, tauri). Reviewing two random samples of\n20 found these errors, all fixed before landing: mockk ",[152,10451,10452],{},"every { }",[152,10454,10455],{},"verify { }"," stubs counted as AIDL calls, a\nservice whose ",[152,10458,10410],{}," only returns null received at ",[152,10461,10410],{},", manifest receivers recorded at the Kotlin handler's line\ninstead of the ",[152,10464,10465],{},"\u003Caction>"," line, consuming calls opened on an earlier line (",[152,10468,10469],{},"PendingIntent.getActivity(\\n ctx, .., Intent(..))",[152,10471,10472],{},"PendingIntentCompat"," missing from ",[152,10475,10476],{},"via",[152,10478,10479],{},"ComponentName(pkg, name)"," values built for an\nassertion or a Robolectric package-manager shadow taken as sends. After those fixes, a third random 20 of the new edges\nwere checked: 19 were correct and one had a wrong ",[152,10482,10476],{},", read from a comment (",[152,10485,10486],{},"\u002F\u002F ... handles setResult\u002Ffinish","); consuming\ncalls now skip comments, strings and coroutine ",[152,10489,10490],{},"launch { }"," blocks, and that edge reads ",[152,10493,10494],{},"launch(mainIntent)",". The ",[152,10497,10362],{}," client's calls inside ",[152,10500,10501],{},"ServiceConnection"," callbacks come from the class\n(",[152,10504,10505],{},"heuristic","): the Kotlin extractor gives the anonymous object's ",[152,10508,10509],{},"onServiceConnected"," and the private\n",[152,10512,10513],{},"onServiceConnected(binder)"," one id. ",[152,10516,10517],{},"tests\u002Ftest_android_ipc.py",[152,10519,10520],{},"tests\u002Fandroid_ipc_fixture"," (an app module with a\nmanifest, services, receivers and an AIDL ",[152,10523,10524],{},"Stub",", and a client module binding to it by ",[152,10527,10528],{},"ComponentName(pkg, CONST)",[172,10530,10532],{"id":10531},"unix-sockets-named-pipes-fifos-and-d-bus-38-part-2","Unix sockets, named pipes \u002F FIFOs and D-Bus (#38 part 2)",[177,10534,10535,10545],{},[180,10536,10537],{},[183,10538,10539,10541,10543],{},[186,10540,188],{},[186,10542,2620],{},[186,10544,800],{},[211,10546,10547,10625,10652,10679,10696],{},[183,10548,10549,10552,10558],{},[216,10550,10551],{},"zbus (shallow clone)",[216,10553,10554,10555,237],{},"37 SENDS_TO, 22 RECEIVED_BY, 27 TEST_CALLS (",[152,10556,10557],{},"dbus",[216,10559,10560,10563,10564,571,10567,10570,10571,442,10574,442,10577,571,10580,571,10583,10586,10587,571,10590,10593,10594,571,10597,10600,10601,10604,10605,10608,10609,571,10612,4404,10615,10618,10619,463,10622,10624],{},[152,10561,10562],{},"fdo"," proxies (",[152,10565,10566],{},"org.freedesktop.DBus.*",[152,10568,10569],{},"#[zbus(name = \"GetConnectionUnixProcessID\")]"," kept as written) and interfaces (",[152,10572,10573],{},"Properties.Get",[152,10575,10576],{},"Set",[152,10578,10579],{},"GetAll",[152,10581,10582],{},"ObjectManager.GetManagedObjects",[152,10584,10585],{},"Introspectable.Introspect","); signals sent by interfaces (",[152,10588,10589],{},"InterfacesAdded",[152,10591,10592],{},"PropertiesChanged",") and received by proxies (",[152,10595,10596],{},"NameAcquired",[152,10598,10599],{},"NameOwnerChanged","); the GeoClue client \u002F service fixture crates meet on ",[152,10602,10603],{},"org.freedesktop.GeoClue2.*",". Property setters (",[152,10606,10607],{},"set_x",") map to property ",[152,10610,10611],{},"X",[152,10613,10614],{},"r#match",[152,10616,10617],{},"Match",". Interfaces inside ",[152,10620,10621],{},"mod tests",[152,10623,1373],{}," are test-only",[183,10626,10627,10630,10636],{},[216,10628,10629],{},"tokio",[216,10631,10632,10633,237],{},"3 SENDS_TO, 4 RECEIVED_BY (",[152,10634,10635],{},"pipe",[216,10637,8314,10638,10641,10642,463,10645,4898,10648,10651],{},[152,10639,10640],{},"named-pipe*"," examples: ",[152,10643,10644],{},"ServerOptions::new().create(PIPE_NAME)",[152,10646,10647],{},"ClientOptions::new().open(PIPE_NAME)",[152,10649,10650],{},"r\"\\\\.\\pipe\\named-pipe-single-client\""," constants",[183,10653,10654,10657,10663],{},[216,10655,10656],{},"tonic",[216,10658,10659,10660,237],{},"2 SENDS_TO, 1 RECEIVED_BY (",[152,10661,10662],{},"unix",[216,10664,8314,10665,10668,10669,571,10672,10675,10676],{},[152,10666,10667],{},"uds"," example: ",[152,10670,10671],{},"UnixListener::bind(\"\u002Ftmp\u002Ftonic\u002Fhelloworld\")",[152,10673,10674],{},"UnixStream::connect(path)"," in a connector closure, and ",[152,10677,10678],{},"GreeterClient::connect(\"unix:\u002F\u002F\u002Ftmp\u002Ftonic\u002Fhelloworld\")",[183,10680,10681,10683,10686],{},[216,10682,2630],{},[216,10684,10685],{},"1 RECEIVED_BY, 2 test",[216,10687,10688,10691,10692,10695],{},[152,10689,10690],{},"uv_pipe_bind(&server, PIPENAME)"," in the pipe echo server docs example (the non-Windows ",[152,10693,10694],{},"#define"," value); tests connecting to a regular file and to a FIFO",[183,10697,10698,10701,10704],{},[216,10699,10700],{},"nodemailer",[216,10702,10703],{},"1 test",[216,10705,10706,10709],{},[152,10707,10708],{},"socketPath: '\u002Fvar\u002Frun\u002Fdocker.sock'"," in a fetch test",[141,10711,10712,10713,10716,10717,10720,10721,10724,10725,10728,10729,10731,10732,10735,10736,10738,10739,10742,10743,10112,10746,10749,10750,442,10752,10755,10756,3362,10759,5352,10762,442,10765,722],{},"No edge was removed anywhere. Unchanged: supervisor, redis, ansible, pip, opentelemetry-python, authentik, immich,\nopen-webui, mini-redis, alacritty, beets, httpie, python-zeroconf, tauri, panel, coolify, express, flask, ws,\nelectron-fiddle, jayson, openai-agents-python, request and mocha. Where these projects use Unix sockets, the path is\nknown only at run time: supervisor, redis and alacritty read it from configuration or the command line, ansible\nderives it from a connection hash, and authentik's Rust server connects to gunicorn through\n",[152,10714,10715],{},"fn socket_path() -> PathBuf { temp_dir().join(\"authentik.sock\") }"," while gunicorn's bind is set in its config.\nThese calls are counted under ",[152,10718,10719],{},"unix_path_unknown"," (alacritty 4, supervisor 5, ansible 4, authentik 7). Four errors\nfound while reviewing the zbus output were fixed before landing: ",[152,10722,10723],{},"fn","s nested in an interface method were taken as\nmembers, property setters became ",[152,10726,10727],{},"SetX"," members, ",[152,10730,10614],{}," became ",[152,10733,10734],{},"R",", and interfaces inside ",[152,10737,10621],{}," counted as\napplication code. After those fixes, a random 20 of the 98 new edges then in libuv, tokio, tonic and zbus were checked by\nhand against the source, and all 20 were correct (tonic's ",[152,10740,10741],{},"GreeterClient::connect"," edge came later and was checked too). ",[152,10744,10745],{},"tests\u002Ftest_local_sockets.py",[152,10747,10748],{},"tests\u002Flocal_sockets_fixture","\n(Python socket \u002F asyncio \u002F socketserver \u002F gRPC, Node ",[152,10751,9408],{},[152,10753,10754],{},"http",", Rust std \u002F tokio \u002F tonic \u002F zbus, a FIFO and a\nnamed pipe, dbus-next) and ",[152,10757,10758],{},"tests\u002Flocal_sockets_c_fixture",[152,10760,10761],{},"sockaddr_un",[152,10763,10764],{},"bind",[152,10766,2511],{},[172,10768,10770],{"id":10769},"local-ipc-in-js-ts-38-part-1","Local IPC in JS \u002F TS (#38 part 1)",[177,10772,10773,10783],{},[180,10774,10775],{},[183,10776,10777,10779,10781],{},[186,10778,188],{},[186,10780,2620],{},[186,10782,800],{},[211,10784,10785,10852,10896,10924,10950,10972,10986,11009,11027,11041],{},[183,10786,10787,10796,10802],{},[216,10788,10789,10790,1879,10792,10795],{},"darkreader (shallow clone, ",[152,10791,1127],{},[152,10793,10794],{},"include: [src]",", see #153)",[216,10797,10798,10799,237],{},"34 SENDS_TO, 45 RECEIVED_BY, 20 MATCHES_ENDPOINT (",[152,10800,10801],{},"extension",[216,10803,10804,442,10807,1876,10810,10813,10814,442,10817,442,10820,10823,10824,10826,10827,8376,10830,571,10833,10835,10836,10839,10840,10843,10844,10847,10848,10851],{},[152,10805,10806],{},"chrome.runtime.sendMessage",[152,10808,10809],{},"tabs.sendMessage",[152,10811,10812],{},"{type: MessageTypeUItoBG.X}"," enum members (resolved to ",[152,10815,10816],{},"ui-bg-*",[152,10818,10819],{},"cs-bg-*",[152,10821,10822],{},"bg-cs-*"," names); listeners that ",[152,10825,4419],{}," on enum members, also one call down (",[152,10828,10829],{},"Messenger.messageListener",[152,10831,10832],{},"onUIMessage",[152,10834,10476],{}," the listener); ",[152,10837,10838],{},"runtime.connect({name: type})"," as ",[152,10841,10842],{},"port:*",". Catch-all listeners (",[152,10845,10846],{},"makeChromiumHappy",") receive ",[152,10849,10850],{},"*"," and match every typed sender",[183,10853,10854,10857,10860],{},[216,10855,10856],{},"open-webui",[216,10858,10859],{},"20 SENDS_TO, 13 RECEIVED_BY",[216,10861,10862,10863,10866,10867,571,10870,10873,10874,442,10877,10880,10881,10884,10885,10888,10889,10892,10893,237],{},"Kokoro and Pyodide workers (",[152,10864,10865],{},"this.worker.postMessage"," \u003C-> ",[152,10868,10869],{},"self.onmessage",[152,10871,10872],{},"self.postMessage"," back to ",[152,10875,10876],{},"worker.onmessage",[152,10878,10879],{},"addEventListener('message')","); the Pyodide sandbox iframe (",[152,10882,10883],{},"parent.postMessage(.., '*')",", a listener checking ",[152,10886,10887],{},"event.source"," per ",[152,10890,10891],{},"fs:*"," type); the OneDrive picker's window listener (",[152,10894,10895],{},"initialize",[183,10897,10898,10900,10903],{},[216,10899,834],{},[216,10901,10902],{},"12 SENDS_TO, 3 RECEIVED_BY",[216,10904,10905,10906,7014,10909,571,10912,571,10915,10873,10918,10921,10922,237],{},"Service worker: ",[152,10907,10908],{},"sw.postMessage",[152,10910,10911],{},"const getSW = () => navigator.serviceWorker?.controller",[152,10913,10914],{},"self.addEventListener('message')",[152,10916,10917],{},"client.postMessage",[152,10919,10920],{},"navigator.serviceWorker.addEventListener('message')","; the SSO popup listener (",[152,10923,10850],{},[183,10925,10926,10929,10932],{},[216,10927,10928],{},"saleor-dashboard",[216,10930,10931],{},"1 SENDS_TO, 12 RECEIVED_BY",[216,10933,10934,10935,10938,10939,10941,10942,5464,10945,3362,10947,10949],{},"App iframes: ",[152,10936,10937],{},"contentWindow.postMessage(event, appOrigin)"," (type unknown: ",[152,10940,10850],{},"); the app-actions listener receives 11 action types from ",[152,10943,10944],{},"handleAction(event.data)",[152,10946,4419],{},[152,10948,10476],{}," the listener)",[183,10951,10952,10955,10958],{},[216,10953,10954],{},"excalidraw",[216,10956,10957],{},"9 SENDS_TO, 3 RECEIVED_BY",[216,10959,10960,10961,571,10964,10967,10968,10971],{},"Embeddable iframes (",[152,10962,10963],{},"contentWindow.postMessage({type: 'command'})",[152,10965,10966],{},"event.source.postMessage","), the diagram-to-code ",[152,10969,10970],{},"srcdoc"," listener",[183,10973,10974,10977,10980],{},[216,10975,10976],{},"electron-fiddle",[216,10978,10979],{},"5 SENDS_TO, 4 RECEIVED_BY",[216,10981,10982,10983,237],{},"The isolated run-button iframe both ways, with origin and source checks; types as string constants (",[152,10984,10985],{},"RESIZE_MESSAGE",[183,10987,10988,10990,10993],{},[216,10989,1931],{},[216,10991,10992],{},"6 SENDS_TO, 2 RECEIVED_BY",[216,10994,10995,10996,10999,11000,11003,11004,571,11006,237],{},"OAuth setup popups (",[152,10997,10998],{},"window.opener.postMessage({type: 'alby:oauth:success'})","), embed preview instructions, ",[152,11001,11002],{},"CAL:${name}"," events to the opener (",[152,11005,10850],{},[152,11007,11008],{},"target_origin: \"*\"",[183,11010,11011,11014,11017],{},[216,11012,11013],{},"immich, librenms",[216,11015,11016],{},"4 + 2, 2 + 2",[216,11018,11019,11020,11023,11024,237],{},"Workers (",[152,11021,11022],{},"new URL('$lib\u002Fworkers\u002Fhash-file.ts', import.meta.url)"," by suffix; librenms through ",[152,11025,11026],{},"getWorker().postMessage",[183,11028,11029,11031,11033],{},[216,11030,2690],{},[216,11032,10076],{},[216,11034,11035,442,11038],{},[152,11036,11037],{},"BroadcastChannel('BSKY_BROADCAST_CHANNEL')",[152,11039,11040],{},"NOTIFS_BROADCAST_CHANNEL",[183,11042,11043,11046,11049],{},[216,11044,11045],{},"elk, outline, eslint",[216,11047,11048],{},"3, 1, 2 (test only)",[216,11050,11051],{},"elk's service worker files are not indexed, so only the page side shows",[141,11053,11054,11055,2893,11058,11061,11062,11064,11065,11068,11069,11071,11072,11074,11075,11078,11079,11082,11083,442,11086,442,11089,442,11092,442,11095,442,11098,11101,11102,11105,11106,11109,11110,8771,11113,11116],{},"No edge was removed anywhere. Unchanged: tauri, mattermost-mobile, socket.io, authentik, mkdocs, invoiceninja, vito,\npixelfed, panel and express. In tauri and mattermost-mobile the postMessage calls are ",[152,11056,11057],{},"window.__TAURI_INTERNALS__",[152,11059,11060],{},"window.ipc"," \u002F React Native WebView bridges (",[152,11063,3823],{},"); authentik's ",[152,11066,11067],{},"web\u002F"," is a separate project from its Python\nroot. Two errors found in the hand-check were fixed before landing: a ",[152,11070,10842],{}," connection matched a ",[152,11073,10850],{}," message\nlistener (ports now match only ",[152,11076,11077],{},"port:"," listeners), and a type guard (",[152,11080,11081],{},"isWidgetResizeAction(event.data)",") was taken as\na handler (callees named ",[152,11084,11085],{},"is*",[152,11087,11088],{},"has*",[152,11090,11091],{},"can*",[152,11093,11094],{},"should*",[152,11096,11097],{},"check*",[152,11099,11100],{},"validate*"," are skipped). Also fixed:\n",[152,11103,11104],{},"this.#onmessage = h"," fields and ",[152,11107,11108],{},"typeof data.type !== 'string'"," are not listeners or types. A random 20 of the 210 new edges\nin the batch were checked by hand against the source: 18 correct and the 2 above wrong. ",[152,11111,11112],{},"tests\u002Ftest_local_ipc.py",[152,11114,11115],{},"tests\u002Flocal_ipc_fixture",": workers both ways (and through a getter), comlink, a service worker, BroadcastChannel,\npostMessage with and without an origin check, extension messages with literal and enum types, ports and a\nnative-messaging host manifest.",[172,11118,11120],{"id":11119},"socketio-and-websocket-in-dart-kotlin-swift-rust-32-part-3","Socket.IO and WebSocket in Dart \u002F Kotlin \u002F Swift \u002F Rust (#32 part 3)",[177,11122,11123,11133],{},[180,11124,11125],{},[183,11126,11127,11129,11131],{},[186,11128,188],{},[186,11130,9478],{},[186,11132,800],{},[211,11134,11135,11160,11210,11234],{},[183,11136,11137,11139,11142],{},[216,11138,9320],{},[216,11140,11141],{},"13 RECEIVED_BY, 2 endpoints",[216,11143,11144,11145,11148,11149,11152,11153,442,11156,11159],{},"The Flutter app's ",[152,11146,11147],{},"socket.on('on_asset_update', _handleRemoteChange)"," and the other listeners in ",[152,11150,11151],{},"mobile\u002Flib\u002Fproviders\u002Fwebsocket.provider.dart"," now receive the server's Socket.IO events. ",[152,11154,11155],{},"AssetUploadReadyV1",[152,11157,11158],{},"AssetEditReadyV1"," are new endpoints: the server emits only the V2 events",[183,11161,11162,11165,11176],{},[216,11163,11164],{},"ktor-samples 1c9df7c",[216,11166,11167,11168,11171,11172,11175],{},"3 ",[152,11169,11170],{},"route:WS",", 2 ",[152,11173,11174],{},"http:WS",", 3 test clients",[216,11177,11178,11181,11182,2682,11185,11188,11189,11192,11193,11195,11196,571,11199,11202,11203,442,11206,11209],{},[152,11179,11180],{},"webSocket(\"\u002Fws\")"," in the chat sample and ",[152,11183,11184],{},"webSocket(\"\u002Fwebsocket\")",[152,11186,11187],{},"route(\"\u002Fopentelemetry\")",", each with its handler lambda; the reverse proxy's ",[152,11190,11191],{},"webSocket(path)"," takes its path as a parameter and reads as the routing prefix ",[152,11194,166],{}," (which is what its one caller passes). Clients: ",[152,11197,11198],{},"client.ws(\"\u002Fopentelemetry\u002Fwebsocket\")",[152,11200,11201],{},"webSocketSession(.., path = \"\u002Fws\")"," and the chat tests' ",[152,11204,11205],{},"client.webSocket(\"\u002Fws\")",[152,11207,11208],{},"ws(\"\u002Fws\")",". 9 calls and 2 property reads move from the routing function into the new handler lambdas",[183,11211,11212,11215,11220],{},[216,11213,11214],{},"tauri 30da1fd",[216,11216,11217],{},[152,11218,11219],{},"route:WS \u002F__tauri_cli",[216,11221,11222,11223,11226,11227,11230,11231,237],{},"The CLI dev server's axum route, whose ",[152,11224,11225],{},"ws_handler"," takes ",[152,11228,11229],{},"WebSocketUpgrade"," (was ",[152,11232,11233],{},"route:GET \u002F__tauri_cli",[183,11235,11236,11239,11241],{},[216,11237,11238],{},"swift-IceCubesApp 9efcb16",[216,11240,3923],{},[216,11242,11243,11246,11247,11250],{},[152,11244,11245],{},"urlSession.webSocketTask(with: url, ..)"," takes a URL built by ",[152,11248,11249],{},"makeURL(scheme:endpoint:)"," from an endpoint enum, so there is no path",[141,11252,11253,11254,442,11257,11260,11261,11264,11265,11268,11269,10112,11272,11275],{},"Rust routes now carry ",[152,11255,11256],{},"uri",[152,11258,11259],{},"method",": tauri's 7 and authentik's 12 axum routes, with no edge change (authentik's\n",[152,11262,11263],{},"\u002Foutpost.goauthentik.io\u002Fauth\u002Fenvoy{*rest}"," becomes ",[152,11266,11267],{},"...\u002Fenvoy{rest*}","). Unchanged (same nodes and edges):\nswift-isowords, swift-Alamofire, flutter-samples, grpc-dart, http, nowinandroid, KaMPKit, element-x-android,\ngrpc-kotlin, spring-petclinic-kotlin, element-x-ios, swift-template, bitwarden-ios, authentik, tokio, mini-redis,\njsonrpsee, tonic, parity and alacritty. No edges were removed anywhere except the 11 moved ktor-samples calls and\nreads. A random 20 of the 25 added edges in the projects above (not counting the moved ones) were checked by hand\nagainst the source, and all 20 were correct. ",[152,11270,11271],{},"tests\u002Ftest_realtime_native.py",[152,11273,11274],{},"tests\u002Fsio_native_fixture",": a\nsocketioxide server with a namespace and a room, a rust_socketio bot, Dart, Kotlin and Swift clients with acks,\nstring templates and constants, Ktor \u002F Vapor \u002F axum WebSocket routes, and Ktor, OkHttp and URLSession WebSocket\nclients.",[172,11277,11279],{"id":11278},"js-callback-variables-property-reads-and-returns-138","JS callback variables, property reads and returns (#138)",[141,11281,11282],{},"Call edges are CALLS, TEST_CALLS and RENDERS, counted by (kind, source, target, line), before -> after.",[177,11284,11285,11299],{},[180,11286,11287],{},[183,11288,11289,11291,11294,11297],{},[186,11290,188],{},[186,11292,11293],{},"Functions",[186,11295,11296],{},"Call edges",[186,11298,800],{},[211,11300,11301,11341,11365,11391,11418,11437,11456,11480,11505],{},[183,11302,11303,11305,11308,11311],{},[216,11304,9123],{},[216,11306,11307],{},"195 -> 136",[216,11309,11310],{},"1,031 -> 745 (-326, +40)",[216,11312,11313,11314,571,11317,463,11320,11323,11324,442,11327,442,11330,11333,11334,11337,11338,11340],{},"The 59 lost function nodes are ",[152,11315,11316],{},"var s = http.createServer(cb)",[152,11318,11319],{},"var r = request(url, cb)",[152,11321,11322],{},".map(cb)"," results. No calls of ",[152,11325,11326],{},"server",[152,11328,11329],{},"s",[152,11331,11332],{},"s2"," remain (163 before). The callbacks' own calls move to the enclosing test or module. ",[152,11335,11336],{},"request(..)"," calls and expando calls like ",[152,11339,9211],{}," are kept",[183,11342,11343,11346,11349,11352],{},[216,11344,11345],{},"saleor-dashboard f9093f2",[216,11347,11348],{},"9,348 -> 9,317",[216,11350,11351],{},"34,511 -> 33,819 (-701, +9)",[216,11353,11354,11355,11358,11359,571,11362,237],{},"Mostly ",[152,11356,11357],{},"Comp.displayName = \"..\""," (about 480) and zod schemas \u002F fixtures (",[152,11360,11361],{},"appManifestSchema.safeParse",[152,11363,11364],{},"attributes[0]",[183,11366,11367,11369,11372,11375],{},[216,11368,7569],{},[216,11370,11371],{},"7,131 -> 7,070",[216,11373,11374],{},"20,472 -> 20,227 (-253, +8)",[216,11376,11377,11378,8917,11381,11384,11385,571,11388],{},"zod schemas (",[152,11379,11380],{},"z.string().transform(fn)",[152,11382,11383],{},"vi.hoisted(() => ({..}))"," mocks, ",[152,11386,11387],{},"displayName",[152,11389,11390],{},"return handler",[183,11392,11393,11396,11399,11402],{},[216,11394,11395],{},"excalidraw ed10ac7",[216,11397,11398],{},"3,263 -> 3,259",[216,11400,11401],{},"26,796 -> 26,573 (-224, +1)",[216,11403,11404,571,11406,11409,11410,11413,11414,11417],{},[152,11405,11387],{},[152,11407,11408],{},"X.prototype.y = .."," in the woff2 bindings. ",[152,11411,11412],{},"Object.assign(withInternalFallback(..), {..})"," components and ",[152,11415,11416],{},"\u003CMainMenu.Item>"," tags are kept",[183,11419,11420,11422,11425,11428],{},[216,11421,10194],{},[216,11423,11424],{},"4,534 -> 4,534",[216,11426,11427],{},"16,705 -> 16,288 (-417)",[216,11429,11430,11431,571,11434,237],{},"Bundled benchmark files (",[152,11432,11433],{},"_.isFinite = function ..",[152,11435,11436],{},"Buffer.prototype.x = ..",[183,11438,11439,11441,11444,11447],{},[216,11440,8659],{},[216,11442,11443],{},"3,998 -> 3,945",[216,11445,11446],{},"24,025 -> 23,906 (-167, +48)",[216,11448,11449,11452,11453,11455],{},[152,11450,11451],{},"createLazyRegistry(() => ..)"," registries and ",[152,11454,11322],{}," results. Their callbacks' calls now come from the module",[183,11457,11458,11460,11463,11466],{},[216,11459,9320],{},[216,11461,11462],{},"3,125 -> 3,110",[216,11464,11465],{},"22,355 -> 22,194 (-165, +4)",[216,11467,11468,11469,9919,11472,11475,11476,11479],{},"Test fixtures (",[152,11470,11471],{},"Object.fromEntries(..map(cb))",[152,11473,11474],{},"mocks.x"," reads. ",[152,11477,11478],{},"vitest.fn(impl)"," mocks are kept",[183,11481,11482,11485,11488,11491],{},[216,11483,11484],{},"socket.io 1eaa582, mocha a9fc529, jayson 4c368aa",[216,11486,11487],{},"876 -> 849, 511 -> 506, 226 -> 220",[216,11489,11490],{},"-154, -114, -68",[216,11492,11493,571,11496,571,11499,463,11501,11504],{},[152,11494,11495],{},"Mocha.prototype.x = ..",[152,11497,11498],{},"return fn",[152,11500,11322],{},[152,11502,11503],{},".filter(cb)"," results",[183,11506,11507,11510,11513,11516],{},[216,11508,11509],{},"social-app, mattermost-mobile",[216,11511,11512],{},"5,701 -> 5,686, 5,756 -> 5,744",[216,11514,11515],{},"-77, -95",[216,11517,11518],{},"Same patterns",[141,11520,11521,11522,11525,11526,442,11528,11531,11532,571,11534,11537,11538,11540,11541,11544,11545,11548,11549,10112,11552,11555,11556,11558],{},"Unchanged: node-gyp, commander.js, capacitor-plugins, breeze-nuxt, examples-es and fullstack-tutorial\n(",[152,11523,11524],{},"styled('img')(fn)"," stays a component). ws, pino, amqplib, kafkajs, nodemailer, express, nest, elk, mcp-servers,\nelectron-fiddle, open-webui, excalidraw-room, create-t3-turbo, cordova-toast, statsd and capacitor lose 2 to 30 edges\neach, from the same patterns. A random 20 of the 2,380 changed call edges in ten of these projects were checked by\nhand against the source: 16 removed and 4 added. 19 were correct. They include six ",[152,11527,11387],{},[152,11529,11530],{},"PreviewProps","\nwrites, a zod schema, an array result of ",[152,11533,11322],{},[152,11535,11536],{},"s.url"," on a server, ",[152,11539,11383],{},", a\n",[152,11542,11543],{},"Mocha.prototype"," write, and callbacks' calls moved to their module. One added edge is in a minified bundle\n(",[152,11546,11547],{},"socket.io.min.js",") and could not be checked. ",[152,11550,11551],{},"tests\u002Ftest_js_refs.py",[152,11553,11554],{},"tests\u002Fjsref_fixture",": a factory\ncallback, a wrapper, expando assignments, ",[152,11557,9232],{}," and test-file reads of a server.",[172,11560,11562],{"id":11561},"xpc-and-darwin-notifications-38-part-3","XPC and Darwin notifications (#38 part 3)",[141,11564,11565,11566,571,11569,11572,11573,8917,11576,11579,11580,11583,11584,11587,11588,442,11591,11594,11595,11598,11599,442,11602,11605],{},"exelban\u002Fstats (shallow clone): 1 service (",[152,11567,11568],{},"eu.exelban.Stats.SMC.Helper",[152,11570,11571],{},"SMCHelper.helperConnection"," ->\n",[152,11574,11575],{},"Helper.listener",[152,11577,11578],{},"HelperProtocol"," with 6 methods all received by the privileged ",[152,11581,11582],{},"Helper",", and 7 proxy calls in\n",[152,11585,11586],{},"Kit\u002Fhelpers.swift","; 15 new edges, all hand-checked. Three ",[152,11589,11590],{},"self.setFanMode",[152,11592,11593],{},"self.uninstall"," calls on\n",[152,11596,11597],{},"SMCHelper","'s own wrappers were false positives before calls on ",[152,11600,11601],{},"self",[152,11603,11604],{},"super"," were skipped. No corpus here posts\nDarwin notifications; that path is covered by tests\u002Fxpc_fixture only. Swift regression set (swift-template,\nAlamofire, Kingfisher, SwiftUIX, isowords, IceCubesApp, bitwarden-ios, element-x-ios): no node or edge changes.",[172,11607,11609],{"id":11608},"prisma-datasources-as-external-systems-41","Prisma datasources as external systems (#41)",[141,11611,11612,11613,11616,11617,4105,11620,11623,11624,11627,11628,11631,11632,11635,11636,11638,11639,11641,11642,2500,11645,571,11648,571,11651,11654,11655,11658,11659,11662,11663,11666,11667,11670,11671,463,11673,11675],{},"umami-software\u002Fumami (shallow clone): the ",[152,11614,11615],{},"postgresql"," datasource's url is in ",[152,11618,11619],{},"prisma.config.ts",[152,11621,11622],{},"env('DATABASE_URL')","), so the system stays ",[152,11625,11626],{},"external:postgres:env:DATABASE_URL"," (docker-compose sets the URL\nin the service environment, not an ",[152,11629,11630],{},".env.example","). 26 new CONNECTS_TO edges, one per ",[152,11633,11634],{},"@@map"," table, all checked\nagainst the schema; ",[152,11637,4630],{}," on the system goes from 429 callers \u002F 198 entry points (the code reading\n",[152,11640,6211],{},") to 564 \u002F 203 through the tables, and 5 sampled new callers (",[152,11643,11644],{},"getTeamWebsiteCount",[152,11646,11647],{},"updateTeamUser",[152,11649,11650],{},"updateReplaySaved",[152,11652,11653],{},"canViewBatchWebsites",", the 2FA setup ",[152,11656,11657],{},"POST",") all call ",[152,11660,11661],{},"prisma.client.\u003Cmodel>","\ndirectly. The other Prisma schemas in the corpora are sqlite (nest ",[152,11664,11665],{},"22-graphql-prisma",") or outside the indexed app\n(cal.com's ",[152,11668,11669],{},"packages\u002Fprisma",", read by ",[152,11672,1351],{},[152,11674,1347],{}," through a workspace package), so they add\nnothing; no node or edge changes on the regression set.",[172,11677,11679],{"id":11678},"typeorm-drizzle-and-kysely-as-external-systems-41-step-2","TypeORM, Drizzle and Kysely as external systems (#41 step 2)",[141,11681,4006,11682,11684,11685,11688,11689,3362,11692,11695,11696,1879,11699,11702,11703,442,11706,4105,11709,10333,11712,11714,11715,11717,11718,571,11721,571,11724,571,11727,2500,11730,11733,11734,11737,11738,11741,11742,3362,11745,11748,11749,11752],{},[152,11683,11326],{},": 76 tables gain ",[152,11686,11687],{},"attrs.system"," and CONNECTS_TO\n",[152,11690,11691],{},"external:postgres:env:DB_URL",[152,11693,11694],{},"via: sole postgres system",") — 16 from ",[152,11697,11698],{},"@immich\u002Fsql-tools",[152,11700,11701],{},"@Table","\n(now recognised alongside sequelize-typescript) plus 60 from Kysely ",[152,11704,11705],{},"selectFrom",[152,11707,11708],{},"insertInto",[152,11710,11711],{},"orm: kysely",[152,11713,11701],{}," also adds CONTAINS column edges from the schema decorators. ",[152,11716,4630],{}," on the\nsystem goes from 211 callers \u002F 318 entry points to 1329 \u002F 341; 5 sampled depth-2 callers\n(",[152,11719,11720],{},"withSharedBy",[152,11722,11723],{},"withMetadata",[152,11725,11726],{},"updateThumbnailBuilder",[152,11728,11729],{},"checkSharedLinkAccess",[152,11731,11732],{},"ApiKeyRepository.update",") all query through Kysely. nestjs-boilerplate: 5 ",[152,11735,11736],{},"@Entity"," tables attach via\nthe ",[152,11739,11740],{},"new DataSource({ type: process.env.DATABASE_TYPE, url: process.env.DATABASE_URL })"," in\n",[152,11743,11744],{},"src\u002Fdatabase\u002Fdata-source.ts",[152,11746,11747],{},"via: typeorm datasource default","); Mongoose ",[152,11750,11751],{},"@Schema"," collections stay\nout. koel (Laravel tables without an ORM tag) and outline \u002F create-t3-turbo \u002F solidtime: no node or\nedge changes.",[172,11754,11756],{"id":11755},"laravel-tables-php-pdo-and-spring-datasources-41-step-3","Laravel tables, PHP PDO and Spring datasources (#41 step 3)",[141,11758,11759,11760,11763,11764,3362,11767,11770,11771,571,11774,11777,11778,11780,11781,1879,11784,11787,11788,11791,11792,11795,11796,11799,11800,420],{},"koel: 35 migration \u002F Eloquent tables CONNECTS_TO ",[152,11761,11762],{},"external:mysql:env:DB_HOST"," through\n",[152,11765,11766],{},"connection:mysql",[152,11768,11769],{},"via: laravel connection","); inferred aliases (",[152,11772,11773],{},"information_schema.*",[152,11775,11776],{},"*_new",") stay\nunattached. ",[152,11779,4630],{}," on the system reaches 396 callers \u002F 127 entry points. pixelfed: 135 tables the same\nway. spring-petclinic-kotlin: ",[152,11782,11783],{},"application-mysql.properties",[152,11785,11786],{},"jdbc:mysql:\u002F\u002Flocalhost\u002Fpetclinic"," becomes\n",[152,11789,11790],{},"external:mysql:localhost:3306"," (literal password location recorded, value not stored); 4 Spring Data\ntables (owners, pets, vets, visits) attach; the default H2 profile is skipped. outline and\nnestjs-boilerplate: no node or edge changes. shop-api fixture: ",[152,11793,11794],{},"table:orders"," -> default pgsql,\n",[152,11797,11798],{},"table:reports"," -> the model's ",[152,11801,11802],{},"$connection = reporting",[172,11804,11806],{"id":11805},"redis-key-prefixes-and-elasticsearch-indices-41-step-4","Redis key prefixes and Elasticsearch indices (#41 step 4)",[141,11808,11809,11812,11813,11816,11817,11820,11821,420],{},[152,11810,11811],{},"attrs.key_prefixes"," on redis externals and ",[152,11814,11815],{},"attrs.indices"," on elasticsearch externals, from call-site\nkeys \u002F f-string and template prefixes, Django ",[152,11818,11819],{},"KEY_PREFIX",", and ES index \u002F index-prefix defaults.\nShown by ",[152,11822,6075],{},[177,11824,11825,11838],{},[180,11826,11827],{},[183,11828,11829,11832,11834,11836],{},[186,11830,11831],{},"Corpus",[186,11833,6574],{},[186,11835,9114],{},[186,11837,800],{},[211,11839,11840,11871,11910,11933],{},[183,11841,11842,11844,11847,11865],{},[216,11843,389],{},[216,11845,11846],{},"redis without prefixes",[216,11848,11849,571,11852,571,11855,571,11858,571,11861,11864],{},[152,11850,11851],{},"login:fail:ip:",[152,11853,11854],{},"login:block:ip:",[152,11856,11857],{},"allow_storefront_traffic:",[152,11859,11860],{},"bbrs",[152,11862,11863],{},"oidc:",", …",[216,11866,11867,11868,11870],{},"Django cache + circuit-breaker ",[152,11869,11819],{},"; attr-only (no edge delta)",[183,11872,11873,11876,11878,11904],{},[216,11874,11875],{},"umami",[216,11877,11846],{},[216,11879,11880,571,11883,571,11886,571,11889,571,11892,571,11895,571,11898,571,11901],{},[152,11881,11882],{},"website:",[152,11884,11885],{},"link:",[152,11887,11888],{},"pixel:",[152,11890,11891],{},"account:",[152,11893,11894],{},"team:",[152,11896,11897],{},"session:",[152,11899,11900],{},"auth:",[152,11902,11903],{},"white-label:",[216,11905,11906,11909],{},[152,11907,11908],{},"redis.client.get\u002Fset\u002Fdel\u002Ffetch"," template keys",[183,11911,11912,11914,11917,11927],{},[216,11913,10856],{},[216,11915,11916],{},"redis \u002F ES without attrs",[216,11918,11919,11920,442,11923,11926],{},"redis prefixes + ",[152,11921,11922],{},"open_webui_collections",[152,11924,11925],{},"open_webui"," indices",[216,11928,11929,11932],{},[152,11930,11931],{},"ELASTICSEARCH_INDEX_PREFIX"," default; short unrelated index kwargs filtered",[183,11934,11935,11938,11940,11957],{},[216,11936,11937],{},"shop-py fixture",[216,11939,1236],{},[216,11941,11942,571,11945,571,11948,571,11950,11953,11954],{},[152,11943,11944],{},"cache:user:",[152,11946,11947],{},"sess:",[152,11949,11854],{},[152,11951,11952],{},"shop:"," + index ",[152,11955,11956],{},"shop_products",[216,11958,11959],{},"unit coverage",[141,11961,11962,11963,11966],{},"Edge-only ",[152,11964,11965],{},"ddiff"," is silent for this step (attrs only). Leftover FPs \u002F missed helper-only keys -> follow-up.",[172,11968,11970],{"id":11969},"pydantic-settings-broker-field-defaults-157","pydantic-settings broker field defaults (#157)",[141,11972,11973,11976,11977,442,11980,442,11983,11986,11987,463,11990,11993,11994,5146,11997,12000,12001,5352,12004,4898,12007,8215,12010,12013],{},[152,11974,11975],{},"settings-bus"," fixture: ",[152,11978,11979],{},"Settings.events_topic = \"events\"",[152,11981,11982],{},"jobs_queue = \"jobs\"",[152,11984,11985],{},"Field(default=\"audit.orders\")",".\n",[152,11988,11989],{},"producer.send_and_wait(settings.events_topic)",[152,11991,11992],{},"consumer.subscribe([settings.events_topic])"," share\n",[152,11995,11996],{},"endpoint:kafka:events",[152,11998,11999],{},"default_exchange.publish(..., routing_key=settings.jobs_queue)"," pairs with\n",[152,12002,12003],{},"declare_queue(settings.jobs_queue)",[152,12005,12006],{},"consume",[152,12008,12009],{},"endpoint:amqp:queue:jobs",[152,12011,12012],{},"self.settings.events_topic"," on a\nwrapper class resolves the same way.",[172,12015,12017],{"id":12016},"broker-helper-parameters-and-consumer-constructor-topics-137","Broker helper parameters and consumer constructor topics (#137)",[141,12019,12020,1879,12022,12025,12026,12029,12030,12033],{},[152,12021,11975],{},[152,12023,12024],{},"TaskQueue._publish(queue, ...)"," with callers passing module constants: five \u002F two AMQP queue\nsends from the helper; ",[152,12027,12028],{},"AIOKafkaConsumer(settings.events_topic, group_id=...)"," is a kafka receive (no separate\n",[152,12031,12032],{},".subscribe"," needed).",[172,12035,12037],{"id":12036},"third-party-http-hosts-as-external-nodes-42-part-1","Third-party HTTP hosts as external nodes (#42 part 1)",[141,12039,12040,12042,12043,12046,12047,442,12050,12053,12054,12056,12057,12060,12061,12063,12064,12066],{},[152,12041,10754],{}," nodes with ",[152,12044,12045],{},"origin_kind"," other become ",[152,12048,12049],{},"external:http:\u003Chost>:80",[152,12051,12052],{},"external:https:\u003Chost>:443","\n(or the explicit port) with CONNECTS_TO (",[152,12055,10476],{}," http). Loopback, templates, and test-only callers stay out.\n",[152,12058,12059],{},"https-client"," fixture: GitHub + Slack (https) and httpbin (http). outline: ",[152,12062,6227],{},".\ncal.com \u002F saleor \u002F open-webui \u002F immich server: no app-called other-origin hosts in this pass (same-origin \u002F\nunknown \u002F none). Query-time https adapter removed; ",[152,12065,5549],{}," still skips other-origin URLs.",[172,12068,12070],{"id":12069},"cloud-saas-sdks-as-external-nodes-42-part-2","Cloud \u002F SaaS SDKs as external nodes (#42 part 2)",[141,12072,12073,12074,2500,12077,571,12080,571,12083,571,12086,2500,12089,12092,12093,12096,12097,571,12100,571,12103,571,12106,571,12109,571,12112,12115,12116,12119],{},"SDK construction and operations become resource nodes (",[152,12075,12076],{},"external:s3:\u003Cbucket-or-env>",[152,12078,12079],{},"external:gcs:…",[152,12081,12082],{},"external:azure-blob:…",[152,12084,12085],{},"external:aws:\u003Cservice>[:resource]",[152,12087,12088],{},"external:saas:stripe",[152,12090,12091],{},"external:llm:\u003Cprovider>","). Fixtures: ",[152,12094,12095],{},"s3-py"," (PutObject + ambient creds, explicit keys, SQS, Secrets Manager),\n",[152,12098,12099],{},"gcs-py",[152,12101,12102],{},"azure-py",[152,12104,12105],{},"stripe-py",[152,12107,12108],{},"openai-chat",[152,12110,12111],{},"laravel-disk",[152,12113,12114],{},"django-storages",". Test-only callers and\nHTTP hosts already attached as ",[152,12117,12118],{},"external:http(s)"," are not duplicated.",[177,12121,12122,12134],{},[180,12123,12124],{},[183,12125,12126,12128,12130,12132],{},[186,12127,11831],{},[186,12129,6574],{},[186,12131,9114],{},[186,12133,800],{},[211,12135,12136],{},[183,12137,12138,12140,12143,12146],{},[216,12139,8659],{},[216,12141,12142],{},"15,551 nodes \u002F 64,832 edges, index 24.54s",[216,12144,12145],{},"15,552 \u002F 64,843 (+1 node, +11 edges), index 24.12s",[216,12147,12148,12149,3362,12152,12155,12156,3362,12159,571,12162,571,12165,571,12168,5352,12171,4898,12173,571,12176,4898,12179,463,12182,571,12185,571,12188,571,12191,12194,12195,12197],{},"one ",[152,12150,12151],{},"external:s3:env:AWS_S3_UPLOAD_BUCKET_NAME",[152,12153,12154],{},"auth=ambient",", CONFIGURED_BY that env key). 10 CONNECTS_TO from ",[152,12157,12158],{},"S3Storage",[152,12160,12161],{},"PutObject",[152,12163,12164],{},"DeleteObject",[152,12166,12167],{},"HeadObject",[152,12169,12170],{},"CopyObject",[152,12172,12164],{},[152,12174,12175],{},"moveFile",[152,12177,12178],{},"GetObject",[152,12180,12181],{},"getFileStream",[152,12183,12184],{},"getS3PresignedUrl",[152,12186,12187],{},"Upload",[152,12189,12190],{},"createPresignedPost",[152,12192,12193],{},"S3Client","). No new ",[152,12196,12118],{}," node.",[172,12199,12201],{"id":12200},"attack-surface-47","Attack surface (#47)",[141,12203,12204,12205,463,12207,12210,12211,12214,12215,12218,12219,12222],{},"Run of ",[152,12206,2740],{},[152,12208,12209],{},"cg surface --format json"," on shallow clones of the default branch (October 2026), indexed in\nfull unless noted. Clone shas: juice-shop 1618a61, DVWA 088256f, NodeGoat c5cb68a, netbox 726a2bb, saleor bb75f87,\noutline 6e6eaf6, nextcloud\u002Fserver 21bf334 (whole repo), ansible bf2610e (whole repo), plus for #42 calcom\u002Fcal.com 54343aa\n(web app only, as before), appwrite 8a47c4b, open-webui 8bd8b4f, documenso a166cab. Each finding was compared with\nthe cited source line: ",[1443,12212,12213],{},"TP"," is the finding as described, ",[1443,12216,12217],{},"FP"," is a route that is public by design or guarded in a way\nthe index does not see, or text that is not code, ",[1443,12220,12221],{},"unclear"," needs a decision from the owner (an opt-in switch, a check in\nanother file). Up to 20 findings per type per corpus were sampled (seeded random sample, all when fewer). The counts below\nare from the tree after the precision fixes of this pass; the \"before\" figure is the same corpus on 871328e.",[2876,12224,12226],{"id":12225},"recall-on-the-vulnerable-apps","Recall on the vulnerable apps",[141,12228,12229],{},"Items are the ones each project documents for the types cg covers (hardcoded credentials, plaintext, TLS off, SSRF,\nunguarded routes). Nothing is counted that the project does not document.",[177,12231,12232,12245],{},[180,12233,12234],{},[183,12235,12236,12239,12242],{},[186,12237,12238],{},"corpus",[186,12240,12241],{},"documented item (where)",[186,12243,12244],{},"result",[211,12246,12247,12275,12295,12319,12335,12356,12382,12400,12420,12442,12455],{},[183,12248,12249,12252,12262],{},[216,12250,12251],{},"juice-shop",[216,12253,12254,12255,12258,12259,237],{},"SSRF challenge (",[152,12256,12257],{},"data\u002Fstatic\u002Fchallenges.yml",", key ",[152,12260,12261],{},"ssrfChallenge",[216,12263,12264,12265,12268,12269,571,12272],{},"found: ",[152,12266,12267],{},"ssrf"," high, ",[152,12270,12271],{},"routes\u002FprofileImageUrlUpload.ts:24",[152,12273,12274],{},"body.imageUrl",[183,12276,12277,12279,12292],{},[216,12278,12251],{},[216,12280,12281,12282,3362,12285,12288,12289,237],{},"Product Tampering, guard commented out on ",[152,12283,12284],{},"PUT \u002Fapi\u002FProducts\u002F:id",[152,12286,12287],{},"server.ts:389",", marked ",[152,12290,12291],{},"vuln-line changeProductChallenge",[216,12293,12294],{},"missed: the route is generated by the REST library, not registered as a route",[183,12296,12297,12299,12312],{},[216,12298,12251],{},[216,12300,12301,12302,12305,12306,571,12309,237],{},"Confidential Document, public ",[152,12303,12304],{},"\u002Fftp"," listing (",[152,12307,12308],{},"server.ts:288",[152,12310,12311],{},"directoryListingChallenge",[216,12313,12314,12315,12318],{},"missed: ",[152,12316,12317],{},"app.use"," mounts are not routes",[183,12320,12321,12323,12332],{},[216,12322,12251],{},[216,12324,12325,12326,571,12329,237],{},"Exposed Credentials, test account in client code (",[152,12327,12328],{},"challenges.yml",[152,12330,12331],{},"exposedCredentialsChallenge",[216,12333,12334],{},"missed: not a protocol argument or a known config key",[183,12336,12337,12340,12346],{},[216,12338,12339],{},"NodeGoat",[216,12341,12342,12343,237],{},"SSRF (",[152,12344,12345],{},"app\u002Fviews\u002Ftutorial\u002Fssrf.html",[216,12347,12264,12348,12268,12350,571,12353],{},[152,12349,12267],{},[152,12351,12352],{},"app\u002Froutes\u002Fresearch.js:16",[152,12354,12355],{},"query.url",[183,12357,12358,12360,12379],{},[216,12359,12339],{},[216,12361,12362,12363,442,12366,3362,12369,12372,12373,571,12376,237],{},"hardcoded ",[152,12364,12365],{},"cookieSecret",[152,12367,12368],{},"cryptoKey",[152,12370,12371],{},"config\u002Fenv\u002Fall.js:8-9",", shown in ",[152,12374,12375],{},"a5.html",[152,12377,12378],{},"a6.html",[216,12380,12381],{},"missed: literals in a plain config object",[183,12383,12384,12386,12394],{},[216,12385,12339],{},[216,12387,12388,12389,571,12392,237],{},"plain HTTP server, \"Insecure HTTP connection\" (",[152,12390,12391],{},"server.js:144",[152,12393,12378],{},[216,12395,12314,12396,12399],{},[152,12397,12398],{},"http.createServer"," is not a plaintext finding",[183,12401,12402,12404,12413],{},[216,12403,12339],{},[216,12405,12406,12407,3362,12410,237],{},"missing function-level access control on ",[152,12408,12409],{},"\u002Fbenefits",[152,12411,12412],{},"a7.html",[216,12414,12415,12416,12419],{},"missed: the route has ",[152,12417,12418],{},"isLoggedIn","; role checks are not modelled",[183,12421,12422,12425,12435],{},[216,12423,12424],{},"DVWA",[216,12426,12427,12428,3362,12431,12434],{},"default DB password ",[152,12429,12430],{},"getenv('DB_PASSWORD') ?: 'p@ssw0rd'",[152,12432,12433],{},"config\u002Fconfig.inc.php.dist:21",", README \"Database Setup\")",[216,12436,12437,12438,12441],{},"missed: a ",[152,12439,12440],{},"getenv() ?:"," literal default outside Laravel config is not read",[183,12443,12444,12446,12452],{},[216,12445,12424],{},[216,12447,12448,12449,237],{},"Authorisation Bypass lab (",[152,12450,12451],{},"vulnerabilities\u002Fauthbypass\u002Fhelp\u002Fhelp.php",[216,12453,12454],{},"missed: a file-per-page PHP app has no modelled routes (0 inbound items)",[183,12456,12457,12459,12466],{},[216,12458,12424],{},[216,12460,12461,12462,12465],{},"remote file inclusion with ",[152,12463,12464],{},"allow_url_include"," (README \"PHP configuration\")",[216,12467,12314,12468,442,12471,12473],{},[152,12469,12470],{},"include",[152,12472,9243],{}," are not outbound sinks",[141,12475,12476,12477,722],{},"Found 2 of 11 documented items. The vulnerable apps document few items of the covered types, and most of those\ndepend on code shapes the index does not model (see ",[145,12478,58],{"href":12479},"\u002Fdocs\u002Flimitations#attack-surface",[2876,12481,12483],{"id":12482},"precision-by-finding-type","Precision by finding type",[177,12485,12486,12507],{},[180,12487,12488],{},[183,12489,12490,12492,12495,12498,12501,12503,12505],{},[186,12491,12238],{},[186,12493,12494],{},"finding",[186,12496,12497],{},"count",[186,12499,12500],{},"sampled",[186,12502,12213],{},[186,12504,12217],{},[186,12506,12221],{},[211,12508,12509,12525,12541,12557,12574,12591,12607,12624,12641,12658,12675,12691,12708,12724,12741,12758,12775,12791,12807,12824,12842,12859],{},[183,12510,12511,12513,12515,12517,12519,12521,12523],{},[216,12512,12339],{},[216,12514,12267],{},[216,12516,615],{},[216,12518,615],{},[216,12520,615],{},[216,12522,243],{},[216,12524,243],{},[183,12526,12527,12529,12531,12533,12535,12537,12539],{},[216,12528,12251],{},[216,12530,12267],{},[216,12532,615],{},[216,12534,615],{},[216,12536,615],{},[216,12538,243],{},[216,12540,243],{},[183,12542,12543,12545,12547,12549,12551,12553,12555],{},[216,12544,12251],{},[216,12546,5691],{},[216,12548,3533],{},[216,12550,3533],{},[216,12552,888],{},[216,12554,7240],{},[216,12556,615],{},[183,12558,12559,12561,12564,12566,12568,12570,12572],{},[216,12560,334],{},[216,12562,12563],{},"hardcoded",[216,12565,615],{},[216,12567,615],{},[216,12569,615],{},[216,12571,243],{},[216,12573,243],{},[183,12575,12576,12578,12580,12583,12585,12587,12589],{},[216,12577,334],{},[216,12579,5691],{},[216,12581,12582],{},"858",[216,12584,1027],{},[216,12586,243],{},[216,12588,1027],{},[216,12590,243],{},[183,12592,12593,12595,12597,12599,12601,12603,12605],{},[216,12594,389],{},[216,12596,5691],{},[216,12598,404],{},[216,12600,404],{},[216,12602,243],{},[216,12604,7240],{},[216,12606,888],{},[183,12608,12609,12612,12614,12616,12618,12620,12622],{},[216,12610,12611],{},"outline",[216,12613,12563],{},[216,12615,615],{},[216,12617,615],{},[216,12619,243],{},[216,12621,615],{},[216,12623,243],{},[183,12625,12626,12628,12631,12633,12635,12637,12639],{},[216,12627,12611],{},[216,12629,12630],{},"plaintext",[216,12632,615],{},[216,12634,615],{},[216,12636,243],{},[216,12638,243],{},[216,12640,615],{},[183,12642,12643,12645,12648,12650,12652,12654,12656],{},[216,12644,12611],{},[216,12646,12647],{},"tls-off",[216,12649,888],{},[216,12651,888],{},[216,12653,888],{},[216,12655,243],{},[216,12657,243],{},[183,12659,12660,12662,12665,12667,12669,12671,12673],{},[216,12661,12611],{},[216,12663,12664],{},"ipc-exposed",[216,12666,615],{},[216,12668,615],{},[216,12670,615],{},[216,12672,243],{},[216,12674,243],{},[183,12676,12677,12679,12681,12683,12685,12687,12689],{},[216,12678,12611],{},[216,12680,5691],{},[216,12682,3080],{},[216,12684,1027],{},[216,12686,243],{},[216,12688,9376],{},[216,12690,615],{},[183,12692,12693,12696,12698,12700,12702,12704,12706],{},[216,12694,12695],{},"cal.com web app",[216,12697,12647],{},[216,12699,615],{},[216,12701,615],{},[216,12703,615],{},[216,12705,243],{},[216,12707,243],{},[183,12709,12710,12712,12714,12716,12718,12720,12722],{},[216,12711,12695],{},[216,12713,12664],{},[216,12715,837],{},[216,12717,837],{},[216,12719,837],{},[216,12721,243],{},[216,12723,243],{},[183,12725,12726,12728,12730,12733,12735,12737,12739],{},[216,12727,12695],{},[216,12729,5691],{},[216,12731,12732],{},"99",[216,12734,1027],{},[216,12736,243],{},[216,12738,3077],{},[216,12740,664],{},[183,12742,12743,12745,12747,12750,12752,12754,12756],{},[216,12744,10856],{},[216,12746,12267],{},[216,12748,12749],{},"4 (14)",[216,12751,888],{},[216,12753,664],{},[216,12755,615],{},[216,12757,243],{},[183,12759,12760,12762,12764,12767,12769,12771,12773],{},[216,12761,10856],{},[216,12763,12647],{},[216,12765,12766],{},"2 (4)",[216,12768,837],{},[216,12770,615],{},[216,12772,243],{},[216,12774,615],{},[183,12776,12777,12779,12781,12783,12785,12787,12789],{},[216,12778,10856],{},[216,12780,12664],{},[216,12782,837],{},[216,12784,837],{},[216,12786,837],{},[216,12788,243],{},[216,12790,243],{},[183,12792,12793,12795,12797,12799,12801,12803,12805],{},[216,12794,10856],{},[216,12796,5691],{},[216,12798,3915],{},[216,12800,3915],{},[216,12802,243],{},[216,12804,612],{},[216,12806,612],{},[183,12808,12809,12812,12814,12816,12818,12820,12822],{},[216,12810,12811],{},"documenso",[216,12813,12664],{},[216,12815,3080],{},[216,12817,1027],{},[216,12819,1027],{},[216,12821,243],{},[216,12823,243],{},[183,12825,12826,12829,12831,12834,12836,12838,12840],{},[216,12827,12828],{},"ansible",[216,12830,12647],{},[216,12832,12833],{},"4 (5)",[216,12835,888],{},[216,12837,243],{},[216,12839,243],{},[216,12841,888],{},[183,12843,12844,12847,12849,12851,12853,12855,12857],{},[216,12845,12846],{},"nextcloud",[216,12848,12647],{},[216,12850,615],{},[216,12852,615],{},[216,12854,243],{},[216,12856,243],{},[216,12858,615],{},[183,12860,12861,12864,12867,12870,12873,12875,12877],{},[216,12862,12863],{},"DVWA, appwrite",[216,12865,12866],{},"all",[216,12868,12869],{},"0 (appwrite 1 ssrf)",[216,12871,12872],{},"-",[216,12874,12872],{},[216,12876,12872],{},[216,12878,12872],{},[141,12880,12881,12882,12885,12886,463,12888,12890,12891,463,12893,12895,12896,12898],{},"A number in brackets is the count before this pass. ",[152,12883,12884],{},"appwrite"," had one ",[152,12887,12267],{},[152,12889,12811],{}," one, both false positives\nthat are fixed here; ",[152,12892,12828],{},[152,12894,10856],{}," lost one or two ",[152,12897,12647],{}," that were text, not code (see below).",[141,12900,12901],{},"Notes from the sampled checks:",[425,12903,12904,12931,12939,12948,12955,13001],{},[428,12905,12906,12908,12909,12912,12913,12916,12917,12919,12920,12923,12924,463,12927,12930],{},[152,12907,5691],{}," is the noisiest type (counts above are from part 2c; part 2d below has the new ones). The false positives have four causes: routes that are public by design (health, robots,\nshare links, login, jwks, static, OAuth token endpoints); a check inside the handler (a session lookup, a cron key, a\n",[152,12910,12911],{},"getServerSession"," call, tRPC procedure middleware) that is not a guard fact; a framework-wide default set in\nsettings (a DRF ",[152,12914,12915],{},"DEFAULT_PERMISSION_CLASSES"," that applies to every route of one corpus, so all of its sampled findings are false positives, most from router registrations); and Socket.IO events whose auth is\nchecked at ",[152,12918,2511],{}," or in the first lines of the handler (7 of 13 sampled handlers in one corpus). NodeGoat's\n",[152,12921,12922],{},"session()"," middleware is read as an auth guard, so its ",[152,12925,12926],{},"\u002Flogin",[152,12928,12929],{},"\u002Fsignup"," routes show as guarded (fixed in part 2d).",[428,12932,12933,12935,12936,12938],{},[152,12934,12647],{},": 4 of 4 sampled true positives in one corpus (pattern: an opt-in branch that switches certificate verification off for a database, mail or cache client); two corpora have 5 sampled findings in total that are ",[152,12937,12221],{}," (verification is off only when the user switches validation off).",[428,12940,12941,12943,12944,12947],{},[152,12942,12664],{},": 25 of 25 sampled true positives, all one pattern class (a wildcard target origin in ",[152,12945,12946],{},"postMessage","). Whether the data sent is sensitive was not judged.",[428,12949,12950,463,12952,12954],{},[152,12951,12563],{},[152,12953,12630],{},": one corpus, 2 findings from example env files (a placeholder DSN, a compose service name); both are by design for example files.",[428,12956,12957,12958,12961,12962,12964,12965,442,12968,442,12971,442,12974,442,12977,442,12980,442,12983,442,12986,12989,12990,12993,12994,12997,12998,13000],{},"Precision fixes made in this pass (each has a regression case): ",[152,12959,12960],{},"from ssl import CERT_NONE",", docstrings and module documentation string\nblocks no longer match ",[152,12963,12647],{},"; a derived URL variable\nkeeps its part (a template that appends a path to a base URL returned by a call is a path, not a whole URL); a value wrapped in\n",[152,12966,12967],{},"realpath",[152,12969,12970],{},"basename",[152,12972,12973],{},"intval",[152,12975,12976],{},"(int)",[152,12978,12979],{},"parseInt",[152,12981,12982],{},"Number",[152,12984,12985],{},"int",[152,12987,12988],{},"float"," is no longer a URL; a template that starts with the tainted piece (",[152,12991,12992],{},"`${id}\u002Fx`",") is a whole URL; and an index run that\ncrashed on a destructured parameter (",[152,12995,12996],{},"const { url } = obj",") now completes. One ",[152,12999,12267],{}," false positive remains: taint that passes through the result of a call that gets the input only as an argument.",[428,13002,13003,13004,13007,13008,5146,13010,10839,13012,13014,13015,420],{},"Follow-ups, not fixed: guards inside handler bodies and framework defaults (above); taint through call results;\n",[152,13005,13006],{},"getenv('X') ?: 'literal'"," and config-object literals as ",[152,13009,12563],{},[152,13011,12398],{},[152,13013,12630],{},"; file-per-page PHP routes;\na role check as a guard; the exact items in the recall table. Listed in ",[145,13016,58],{"href":12479},[2876,13018,13020,13021,13023],{"id":13019},"part-2d-unguarded-precision-index-time-fingerprints","Part 2d: ",[152,13022,5691],{}," precision, index time, fingerprints",[141,13025,13026,13027,13030,13031,13034,13035,13037,13038,13041,13042,13044,13045,13047,13048,13050],{},"Same clones as above (base ",[152,13028,13029],{},"2542c89",", which equals ",[152,13032,13033],{},"origin\u002Fmain"," when this pass ran), indexed in full with ",[152,13036,2740],{}," into a fresh database for the \"before\" (2542c89, in a separate worktree) and the \"after\" (this change), and read with ",[152,13039,13040],{},"cg surface --finding unguarded --format json",". The \"sampled\" column is the full list when it has 20 or fewer entries, a seeded random sample of 20 otherwise (seed 47), so every finding below was classified. ",[1443,13043,12213],{},": no guard and no check, as described; ",[1443,13046,12217],{},": public by design or guarded in a way the index does not see; ",[1443,13049,12221],{},": depends on a setting or a check in other code.",[177,13052,13053,13079],{},[180,13054,13055],{},[183,13056,13057,13059,13062,13065,13068,13071,13073,13075,13077],{},[186,13058,12238],{},[186,13060,13061],{},"before",[186,13063,13064],{},"after",[186,13066,13067],{},"cut",[186,13069,13070],{},"after by severity (confidence)",[186,13072,12500],{},[186,13074,12213],{},[186,13076,12217],{},[186,13078,12221],{},[211,13080,13081,13103,13124,13147,13169,13191,13213,13235],{},[183,13082,13083,13085,13087,13089,13092,13095,13097,13099,13101],{},[216,13084,12251],{},[216,13086,3533],{},[216,13088,5086],{},[216,13090,13091],{},"20%",[216,13093,13094],{},"8 low (7 resolved, 1 heuristic)",[216,13096,5086],{},[216,13098,888],{},[216,13100,615],{},[216,13102,664],{},[183,13104,13105,13107,13109,13111,13113,13116,13118,13120,13122],{},[216,13106,12339],{},[216,13108,243],{},[216,13110,837],{},[216,13112,12872],{},[216,13114,13115],{},"2 low (resolved)",[216,13117,837],{},[216,13119,243],{},[216,13121,837],{},[216,13123,243],{},[183,13125,13126,13128,13131,13133,13136,13139,13141,13143,13145],{},[216,13127,334],{},[216,13129,13130],{},"199",[216,13132,7240],{},[216,13134,13135],{},"97.5%",[216,13137,13138],{},"5 low (1 resolved, 4 heuristic)",[216,13140,7240],{},[216,13142,243],{},[216,13144,837],{},[216,13146,664],{},[183,13148,13149,13151,13153,13155,13158,13161,13163,13165,13167],{},[216,13150,389],{},[216,13152,404],{},[216,13154,888],{},[216,13156,13157],{},"56%",[216,13159,13160],{},"3 medium (resolved), 1 low (heuristic)",[216,13162,888],{},[216,13164,243],{},[216,13166,243],{},[216,13168,888],{},[183,13170,13171,13173,13175,13177,13180,13183,13185,13187,13189],{},[216,13172,12611],{},[216,13174,3080],{},[216,13176,7240],{},[216,13178,13179],{},"82%",[216,13181,13182],{},"5 low (resolved)",[216,13184,7240],{},[216,13186,243],{},[216,13188,7240],{},[216,13190,243],{},[183,13192,13193,13195,13197,13200,13202,13205,13207,13209,13211],{},[216,13194,12695],{},[216,13196,12732],{},[216,13198,13199],{},"18",[216,13201,13179],{},[216,13203,13204],{},"11 low (resolved), 7 low (heuristic)",[216,13206,13199],{},[216,13208,243],{},[216,13210,3533],{},[216,13212,5086],{},[183,13214,13215,13217,13219,13221,13224,13227,13229,13231,13233],{},[216,13216,10856],{},[216,13218,3915],{},[216,13220,615],{},[216,13222,13223],{},"93%",[216,13225,13226],{},"1 low (exact)",[216,13228,615],{},[216,13230,243],{},[216,13232,615],{},[216,13234,243],{},[183,13236,13237,13239,13241,13243,13245,13247,13249,13251,13253],{},[216,13238,12811],{},[216,13240,243],{},[216,13242,243],{},[216,13244,12872],{},[216,13246,12872],{},[216,13248,12872],{},[216,13250,12872],{},[216,13252,12872],{},[216,13254,12872],{},[141,13256,13257],{},"The 2c table above reports 858 for netbox; recounting the clone used here on 2542c89 gives 199, which is the \"before\" number in this table.",[141,13259,13260,13261,13264,13265,13268],{},"Target: precision of at least 60% or a cut of at least 80% on netbox, outline and the cal.com web app. ",[1443,13262,13263],{},"Met by the cut"," on all three (97.5%, 82%, 82%). ",[1443,13266,13267],{},"Not met by precision",": no TP remains on those three, because what is left is public-by-design, checked in code the index does not read, or depends on a setting, and no sampled finding on them was a missing guard. The remaining findings are low severity except saleor's three plugin webhook dispatchers, which stay medium (no guard, no recognised check, a write is reached; each plugin verifies its own request).",[141,13270,13271,13272,13275],{},"Recall on juice-shop's four true positives (all sampled before and after, ",[152,13273,13274],{},"server.ts","):",[177,13277,13278,13291],{},[180,13279,13280],{},[183,13281,13282,13285,13287,13289],{},[186,13283,13284],{},"route",[186,13286,1801],{},[186,13288,13061],{},[186,13290,13064],{},[211,13292,13293,13309,13323,13337],{},[183,13294,13295,13300,13303,13306],{},[216,13296,13297],{},[152,13298,13299],{},"POST \u002Ffile-upload",[216,13301,13302],{},"328",[216,13304,13305],{},"medium",[216,13307,13308],{},"low, resolved",[183,13310,13311,13316,13319,13321],{},[216,13312,13313],{},[152,13314,13315],{},"POST \u002Fprofile\u002Fimage\u002Ffile",[216,13317,13318],{},"329",[216,13320,13305],{},[216,13322,13308],{},[183,13324,13325,13330,13333,13335],{},[216,13326,13327],{},[152,13328,13329],{},"POST \u002Fprofile\u002Fimage\u002Furl",[216,13331,13332],{},"330",[216,13334,13305],{},[216,13336,13308],{},[183,13338,13339,13344,13347,13349],{},[216,13340,13341],{},[152,13342,13343],{},"POST \u002Frest\u002Fmemories",[216,13345,13346],{},"331",[216,13348,13305],{},[216,13350,13351],{},"low, heuristic (an unclassified middleware precedes the handler)",[141,13353,13354,13355,13358,13359,13361,13362,13364,13365,13367,13368,420],{},"All four are still reported, so there is no recall loss; their severity falls to low because none reaches a database write the graph can see (file system writes are not writes in this model). The two ",[152,13356,13357],{},"security.txt"," routes (public by design) are no longer reported. NodeGoat's two new findings are tutorial pages: they appear because an Express ",[152,13360,12922],{}," middleware is no longer read as authentication, so routes with only ",[152,13363,12922],{}," in front of them are now ",[152,13366,5691],{}," (low) where they used to be ",[152,13369,13370],{},"guarded",[141,13372,13373,13374,13377,13378,463,13381,13384,13385,13388,13389,13392,13393,13396,13397,13400,13401,13403],{},"What caused the cuts: framework defaults (DRF ",[152,13375,13376],{},"REST_FRAMEWORK"," default permission classes, Laravel global and group middleware, Nest ",[152,13379,13380],{},"APP_GUARD",[152,13382,13383],{},"@Public()","), the public-by-design route list (",[145,13386,107],{"href":13387},"\u002Fdocs\u002Fsurface#public-by-design-routes","), checks at the top of a handler or of a Socket.IO connection, Express ",[152,13390,13391],{},"app.use(auth)"," ordering and mount path, and a DRF ",[152,13394,13395],{},"permission_classes = []"," taken as explicit public access. ",[152,13398,13399],{},"--strict"," keeps route-level guards only: on netbox it reports 200 (199 before; one route that only ",[152,13402,12922],{}," guarded) and on outline 28, unchanged.",[141,13405,13406,13407,13409,13410,13413,13414,13417,13418,13421,13422,13425,13426,13429,13430,13433,13434,13436,13437,13439],{},"Index time against 8172833 (outline and the cal.com web app, three alternating runs, each run a fresh ",[152,13408,2740],{}," from a separate worktree outside the repository; \"before\" is 8172833, \"after\" is this change). The profile on cal.com web app before the change put ",[152,13411,13412],{},"ssrf_input.apply"," at 5.7 s and ",[152,13415,13416],{},"insecure_transport.apply"," at 1.3 s of a 17.2 s profiled run. Fixes (output unchanged): ",[152,13419,13420],{},"ssrf_input"," skips files and functions that contain no sink text, ",[152,13423,13424],{},"insecure_transport"," checks one lowercase substring list per file before running its 35 regexes and finds the client library only when a rule matches, and the SDK file prefilter in ",[152,13427,13428],{},"sdk_systems"," lowercases the text once instead of two ",[152,13431,13432],{},"re.I"," scans. After the change on cal.com web app: ",[152,13435,13412],{}," 0.6 s, ",[152,13438,13416],{}," 0.6 s.",[177,13441,13442,13455],{},[180,13443,13444],{},[183,13445,13446,13449,13452],{},[186,13447,13448],{},"run",[186,13450,13451],{},"outline s (before \u002F after)",[186,13453,13454],{},"cal.com web app s (before \u002F after)",[211,13456,13457,13467,13477,13487],{},[183,13458,13459,13461,13464],{},[216,13460,615],{},[216,13462,13463],{},"33.47 \u002F 33.18",[216,13465,13466],{},"13.42 \u002F 12.43",[183,13468,13469,13471,13474],{},[216,13470,837],{},[216,13472,13473],{},"30.17 \u002F 31.49",[216,13475,13476],{},"11.48 \u002F 11.19",[183,13478,13479,13481,13484],{},[216,13480,664],{},[216,13482,13483],{},"27.78 \u002F 28.04",[216,13485,13486],{},"9.68 \u002F 11.20",[183,13488,13489,13492,13495],{},[216,13490,13491],{},"mean",[216,13493,13494],{},"30.47 \u002F 30.90 (+1.4%)",[216,13496,13497],{},"11.53 \u002F 11.61 (+0.7%)",[141,13499,13500],{},"The box is shared and its speed drifted between sessions. Earlier complete sets, taken on slower periods, are in the same range but noisier (outline before \u002F after: 41.15 \u002F 43.04 s with the first two fixes only, 30.09 \u002F 35.46 s and 38.29 \u002F 40.90 s with all of them; cal.com web app: 14.23 \u002F 17.49, 12.70 \u002F 14.02 and 16.44 \u002F 16.09 s). The target is at most +10% against 8172833; the last alternating set meets it, and the noisy sets show the error of one run is larger than the margin.",[141,13502,13503,13504,13506,13507,571,13509,463,13511,13513,13514,571,13516,13519,13520,13523,13524,13527,13528,13531],{},"Output check, ",[152,13505,12209],{}," on outline, cal.com web app, open-webui and documenso, with the guard change held fixed (commit before the speed-up vs after): ",[152,13508,12267],{},[152,13510,12647],{},[152,13512,12664],{}," findings are identical in all three types on all four corpora (outline 0 \u002F 4 \u002F 1, cal.com web app 0 \u002F 1 \u002F 2, open-webui 4 \u002F 2 \u002F 2, documenso 0 \u002F 0 \u002F 28), as are the node and edge counts and every attr that holds an ",[152,13515,13424],{},[152,13517,13518],{},"url_from_input"," or ",[152,13521,13522],{},"tls_verify"," fact. The only graph change comes from the SES v2 work: documenso gains ",[152,13525,13526],{},"external:aws:ses"," and 4 ",[152,13529,13530],{},"CONNECTS_TO"," edges (below).",[141,13533,13534,13535,571,13538,571,13541,3366,13544,13547,13548,13550],{},"Mail (#42), documenso re-run: the SES v2 identity commands (",[152,13536,13537],{},"CreateEmailIdentityCommand",[152,13539,13540],{},"GetEmailIdentityCommand",[152,13542,13543],{},"DeleteEmailIdentityCommand",[152,13545,13546],{},"@aws-sdk\u002Fclient-sesv2",") are now recognised: 1 new external node and 4 ",[152,13549,13530],{}," edges, one from each of the 4 functions that call them (checked against the source). The nodemailer SES and Resend transports are recognised too, but documenso uses neither with a transport the extractor can resolve, so they add nothing there.",[141,13552,13553,13554,13557,13558,13561,13562,13565,13566,13569],{},"Fingerprints: a marker is ",[152,13555,13556],{},"redacted:hmac:\u003C8 hex>",", keyed by a per-graph salt in meta ",[152,13559,13560],{},"redact_salt",", so a common password no longer gives a known value (the unsalted marker of ",[152,13563,13564],{},"password"," was ",[152,13567,13568],{},"5e884898",") and the same value in two different graphs gives different markers.",[2876,13571,13573],{"id":13572},"redaction-check","Redaction check",[141,13575,13576,13577,13580,13581,13584],{},"Values counted are strings containing ",[152,13578,13579],{},"redacted:sha256:"," in any node or edge attr, and in ",[152,13582,13583],{},"doc"," after the fix below.",[177,13586,13587,13599],{},[180,13588,13589],{},[183,13590,13591,13593,13596],{},[186,13592,12238],{},[186,13594,13595],{},"redacted values",[186,13597,13598],{},"what they are",[211,13600,13601,13610,13624,13634,13643],{},[183,13602,13603,13606,13608],{},[216,13604,13605],{},"DVWA, NodeGoat, juice-shop, netbox, cal.com, appwrite, open-webui, documenso",[216,13607,243],{},[216,13609,12872],{},[183,13611,13612,13614,13617],{},[216,13613,389],{},[216,13615,13616],{},"9 in 3 test functions and their cases",[216,13618,13619,13620,13623],{},"passwords of ",[152,13621,13622],{},"scheme:\u002F\u002Fuser:pw@host"," URLs in test parameters; credentials in test data",[183,13625,13626,13628,13631],{},[216,13627,12828],{},[216,13629,13630],{},"20 in 3 test functions and their cases",[216,13632,13633],{},"passwords of fake URLs in test functions; credentials in test data",[183,13635,13636,13638,13640],{},[216,13637,12846],{},[216,13639,837],{},[216,13641,13642],{},"password entries of a test array",[183,13644,13645,13647,13650],{},[216,13646,12611],{},[216,13648,13649],{},"1 before the fix, 0 attrs after",[216,13651,13652],{},"a re-export whose name contains a credential word: the name of an exported class, not a credential (wrong redaction, fixed)",[141,13654,13655,13656,442,13659,13662,13663,442,13665,13667,13668,13671,13672,13675,13676,13678,13679,13681,13682,13684,13685,13688,13689,13691],{},"All values of saleor, ansible and nextcloud were checked and are credentials in test data, so no wrong redaction there.\nNo ",[152,13657,13658],{},"*_PASSWORD",[152,13660,13661],{},"*_SECRET"," default or DSN password from a sampled source file is stored verbatim (a test-settings password in one corpus, the NodeGoat ",[152,13664,12365],{},[152,13666,12368],{},", and DVWA's ",[152,13669,13670],{},"p@ssw0rd"," do not appear in the database; a scan of every\nstring attr of every corpus for ",[152,13673,13674],{},"scheme:\u002F\u002Fuser:pw@"," and for literals under a credential-named attr found none).\nFound and fixed: an example DSN with a placeholder password in a doc comment (one corpus) was kept in the ",[152,13677,13583],{}," column, which the sweep did not cover; the sweep now\nreplaces URL passwords there too. Fixed in part 2d: the marker was an unsalted 8-hex SHA-256 of the value, so a common password\n(",[152,13680,13564],{}," gave ",[152,13683,13568],{},") could be recognised from it; it is now a keyed HMAC with a per-graph salt (",[152,13686,13687],{},"redacted:hmac:","). The counts above were taken with the old ",[152,13690,13579],{}," marker.",[172,13693,13695],{"id":13694},"mail-sms-push-infra-sdks-42-parts-3a-and-3b","Mail \u002F SMS \u002F push \u002F infra SDKs (#42 parts 3a and 3b)",[141,13697,13698,13699,13701],{},"Δ of external nodes and ",[152,13700,13530],{}," edges for mail, SMS, push, Firebase, Kubernetes, Docker and key-management\nsystems, on 8172833 (before 3a) and 871328e (after 3b, same code as the attack-surface runs above). Both indexed from a\nseparate worktree.",[177,13703,13704,13719],{},[180,13705,13706],{},[183,13707,13708,13710,13713,13716],{},[186,13709,12238],{},[186,13711,13712],{},"external nodes before \u002F after",[186,13714,13715],{},"CONNECTS_TO before \u002F after",[186,13717,13718],{},"index s before \u002F after",[211,13720,13721,13735,13750,13763,13775,13787],{},[183,13722,13723,13726,13729,13732],{},[216,13724,13725],{},"outline (6e6eaf6)",[216,13727,13728],{},"8 \u002F 8",[216,13730,13731],{},"31 \u002F 31",[216,13733,13734],{},"25.06 \u002F 31.76",[183,13736,13737,13742,13745,13747],{},[216,13738,1648,13739,13741],{},[152,13740,1351],{}," (54343aa)",[216,13743,13744],{},"0 \u002F 0",[216,13746,13744],{},[216,13748,13749],{},"9.50 \u002F 12.86",[183,13751,13752,13755,13758,13760],{},[216,13753,13754],{},"saleor (bb75f87)",[216,13756,13757],{},"3 \u002F 3",[216,13759,1230],{},[216,13761,13762],{},"84.71 \u002F 101.54",[183,13764,13765,13768,13770,13772],{},[216,13766,13767],{},"appwrite (8a47c4b)",[216,13769,840],{},[216,13771,13744],{},[216,13773,13774],{},"39.61 \u002F 52.24",[183,13776,13777,13780,13782,13784],{},[216,13778,13779],{},"open-webui (8bd8b4f)",[216,13781,13728],{},[216,13783,891],{},[216,13785,13786],{},"26.34 \u002F 32.07",[183,13788,13789,13792,13794,13796],{},[216,13790,13791],{},"documenso (a166cab)",[216,13793,1203],{},[216,13795,2967],{},[216,13797,13798],{},"25.56 \u002F 20.11",[141,13800,13801,13802,13804,13805,13808],{},"No corpus gains an external node or a ",[152,13803,13530],{}," edge from 3a or 3b, so the requested hand check of at least 10\nnew edges could not be made. The same harness does detect them: ",[152,13806,13807],{},"tests\u002Fexternal_fixture\u002Fmail-sms-py"," has 0 external nodes\non 8172833 and 5 on 871328e. Reasons found by reading each corpus:",[425,13810,13811,13825,13828,13835],{},[428,13812,13813,13814,571,13817,13820,13821,13824],{},"outline and saleor send mail through plain SMTP (",[152,13815,13816],{},"external:smtp:env:SMTP_HOST",[152,13818,13819],{},"external:smtp:env:EMAIL_URL",", present before), which 3a leaves out on purpose (",[152,13822,13823],{},"smtp"," is an ignored mailer).",[428,13826,13827],{},"documenso uses nodemailer transports, a Resend transport package and AWS SES v2 identity commands. Before part 2d none was recognised; the SES v2 commands now are (see Part 2d above); its nodemailer and Resend transports are still not resolved.",[428,13829,13830,13831,13834],{},"appwrite reaches Twilio, Resend and others through its own ",[152,13832,13833],{},"Utopia\\Messaging\\Adapter"," classes, which are not an SDK from the extractor's list (follow-up).",[428,13836,1648,13837,13839],{},[152,13838,1351],{}," and open-webui have no mail, SMS, push, Firebase, Kubernetes, Docker or key-management SDK calls in the indexed tree.",[141,13841,13842,13843,13845,13846,13848,13849,13851,13852,13854,13855,13858],{},"Index time: the 871328e runs are 12% to 54% slower than 8172833 on 9 of 12 corpora, within 5% on DVWA and NodeGoat, and 21% faster on documenso (single runs on a shared box, so noisy at about 20%). Three alternating runs: cal.com ",[152,13844,1351],{}," 10.06 s before and\n13.21 s after (+31%), outline 25.93 s and 32.72 s (+26%). The rise is above 5% and is explained by the 2a and 2b\nindex passes, not by 3a or 3b: a profile of ",[152,13847,1351],{}," (profiling inflates it) puts ",[152,13850,13412],{}," at about 28% and ",[152,13853,13416],{}," at about 7% of the index\ntime, and the 3a \u002F 3b changes add no external nodes on these corpora. The node and edge counts are identical before and after for every corpus\nexcept ansible (+3 ",[152,13856,13857],{},"file:config:"," nodes for shell scripts and YAML).",[141,13860,13861,13862,13864,13865,13869,13870,463,13872,13874],{},"Part 2d recovered this cost: against 8172833, the mean of three alternating runs is +1.4% on outline and +0.7% on cal.com ",[152,13863,1351],{}," (all runs in ",[145,13866,13868],{"href":13867},"#part-2d-unguarded-precision-index-time-fingerprints","Part 2d","). The ",[152,13871,12267],{},[152,13873,13424],{}," passes skip files and functions that cannot contain a sink or a rule hit, and the SDK file prefilter lowercases once.",[172,13876,115],{"id":13877},"typescript-javascript-frameworks",[141,13879,13880,13881,13884,13885,13887],{},"Moved from the TS frameworks page. Shallow clones, ",[152,13882,13883],{},"CODEGRAPH_NO_CACHE=1",", 8-core box. Index time is wall time for ",[152,13886,2740],{},". Spot-checks were compared by hand with decorators, router files and file-system routes. \"Found\" counts come from the graph.",[177,13889,13890,13921],{},[180,13891,13892],{},[183,13893,13894,13897,13900,13903,13906,13909,13912,13915,13918],{},[186,13895,13896],{},"project (revision)",[186,13898,13899],{},"files",[186,13901,13902],{},"index time",[186,13904,13905],{},"nodes \u002F edges",[186,13907,13908],{},"found",[186,13910,13911],{},"spot-check",[186,13913,13914],{},"resolution \u002F links",[186,13916,13917],{},"parse failures",[186,13919,13920],{},"gaps",[211,13922,13923,13979,14013,14060,14103,14139],{},[183,13924,13925,13930,13933,13936,13939,13953,13963,13970,13972],{},[216,13926,1615,13927,13929],{},[152,13928,1339],{}," (a81ddfa), NestJS + Kysely",[216,13931,13932],{},"458 TS",[216,13934,13935],{},"7.4 s",[216,13937,13938],{},"4,759 \u002F 19,780",[216,13940,13941,13942,571,13945,13948,13949,13952],{},"295 HTTP routes (= the 295 route decorators in 47 controllers, global prefix ",[152,13943,13944],{},"api",[152,13946,13947],{},"RouteKey"," enum paths), 13 nest-commander commands, 86 ",[152,13950,13951],{},"@OnEvent"," listeners, 60 tables",[216,13954,13955,13956,13959,13960],{},"47 album \u002F asset \u002F auth routes: all correct; ",[152,13957,13958],{},"GET \u002Fapi\u002Falbums\u002F{id}"," → controller → service → repository → ",[152,13961,13962],{},"table:album",[216,13964,13965,13966,13969],{},"DI: 200 of 201 project tokens resolved (99.5%), 49 library tokens; the miss is a ",[152,13967,13968],{},"string[]"," param",[216,13971,243],{},[216,13973,13974,13975,13978],{},"immich's own ",[152,13976,13977],{},"@OnJob"," job decorators are not entry points",[183,13980,13981,13986,13989,13992,13995,14002,14005,14008,14010],{},[216,13982,8066,13983,13985],{},[152,13984,8069],{}," 01–37 (7fb52e7), federation sub-apps indexed one by one",[216,13987,13988],{},"41 apps",[216,13990,13991],{},"66 s total (1.4–2.6 s each)",[216,13993,13994],{},"1,043 \u002F 1,708",[216,13996,13997,13998,14001],{},"62 HTTP routes (incl. ",[152,13999,14000],{},"@Sse","), 31 GraphQL operations, 5 message handlers, 1 queue job, 3 schedules, 1 listener",[216,14003,14004],{},"route count equals the route-decorator count in all 27 samples with routes",[216,14006,14007],{},"DI: 44 resolved + 13 library, 0 unresolved",[216,14009,243],{},[216,14011,14012],{},"the 31\u002F32 roots hold several apps and are not a project themselves",[183,14014,14015,14022,14025,14028,14031,14034,14048,14051,14053],{},[216,14016,14017,14018,14021],{},"Ghost ",[152,14019,14020],{},"ghost\u002Fcore"," (412652f), Express, CommonJS + TS",[216,14023,14024],{},"1,740 JS\u002FTS",[216,14026,14027],{},"12.4 s",[216,14029,14030],{},"9,429 \u002F 19,391",[216,14032,14033],{},"335 routes: 242 Admin API, 20 Content API, 39 Members API, plus frontend and service routers",[216,14035,14036,14037,690,14040,14043,14044,14047],{},"20 random routes: 20\u002F20 paths correct, 19\u002F20 handlers resolved (",[152,14038,14039],{},"http(api.posts.browse)",[152,14041,14042],{},"controller.browse.query"," through the lazy ",[152,14045,14046],{},"require()"," registry)",[216,14049,14050],{},"11 routes without a project handler (library middleware factories), 5 routers never mounted from an app",[216,14052,243],{},[216,14054,14055,14056,14059],{},"middleware attribution on ",[152,14057,14058],{},"lazyUse"," apps is coarse",[183,14061,14062,14068,14071,14074,14077,14080,14087,14090,14092],{},[216,14063,14064,14065,14067],{},"dub ",[152,14066,1351],{}," (7e01013), Next.js app router + Prisma",[216,14069,14070],{},"3,428 TS",[216,14072,14073],{},"24.8 s",[216,14075,14076],{},"15,726 \u002F 50,246",[216,14078,14079],{},"198 pages, 57 layouts, 653 route handlers, 134 server actions, 86 Prisma models",[216,14081,14082,14083,14086],{},"20 random route handlers and pages: all correct (route groups, ",[152,14084,14085],{},"[...slug]",", re-exported handlers)",[216,14088,14089],{},"in-repo client → handler links: 299 of 363 endpoints (the rest are external URLs or dynamic)",[216,14091,243],{},[216,14093,14094,14095,14098,14099,14102],{},"7 handlers built by libraries (",[152,14096,14097],{},"NextAuth(...)",", workflow ",[152,14100,14101],{},"serve(...)",") have no project function",[183,14104,14105,14111,14114,14117,14120,14127,14130,14133,14136],{},[216,14106,14107,14108,14110],{},"vercel\u002Fnext.js ",[152,14109,2104],{}," (fbd032ff)",[216,14112,14113],{},"224 apps",[216,14115,14116],{},"384 s total (≤ 2.3 s each)",[216,14118,14119],{},"6,186 \u002F 10,537",[216,14121,14122,14123,14126],{},"221 detected as Next: 413 pages, 236 layouts, 22 route handlers, 125 ",[152,14124,14125],{},"pages\u002Fapi"," routes, 19 server actions",[216,14128,14129],{},"22 random pages \u002F routes: all correct",[216,14131,14132],{},"in-repo links: 47 of 69 endpoints",[216,14134,14135],{},"1 file (with-custom-babel-config: non-standard syntax)",[216,14137,14138],{},"5 apps with MD\u002FMDX-only pages or Electron renderers have no pages; 3 monorepo roots (with-zones, with-yarn-workspaces, with-stencil) must be indexed per app",[183,14140,14141,14144,14147,14150,14153,14162,14165,14174,14176],{},[216,14142,14143],{},"realworld express + Prisma (30b68e1) → realworld vue3 client (741c215)",[216,14145,14146],{},"25 + 43",[216,14148,14149],{},"2.3 s + 1.9 s, link 0.05 s",[216,14151,14152],{},"142 \u002F 277 + 196 \u002F 530",[216,14154,14155,14156,3362,14158,14161],{},"20 routes under ",[152,14157,1951],{},[152,14159,14160],{},"Router().use(..)"," chains)",[216,14163,14164],{},"20\u002F20 correct",[216,14166,14167,14170,14171,14173],{},[152,14168,14169],{},"link",": 19 of 20 client endpoints matched (generated client, origin unknown → ",[152,14172,10505],{},"); the miss is a dynamic URL",[216,14175,243],{},[216,14177,14178],{},"—",[141,14180,14181,14182,14185],{},"Spot-checks were done by hand against the source (decorators, router files, file-system routes). The \"found\" counts\ncome from the graph (",[152,14183,14184],{},"SELECT count(*) FROM nodes WHERE kind='route'"," etc.).",[141,14187,14188,14189,14192,14193,14196],{},"React Router \u002F Remix (shallow clones, ",[152,14190,14191],{},"CG_NO_CACHE=1","). Counts are pages, layouts, ",[152,14194,14195],{},"route:"," nodes and\nNAVIGATES_TO edges.",[177,14198,14199,14219],{},[180,14200,14201],{},[183,14202,14203,14205,14208,14211,14214,14216],{},[186,14204,13896],{},[186,14206,14207],{},"pages",[186,14209,14210],{},"layouts",[186,14212,14213],{},"routes",[186,14215,2865],{},[186,14217,14218],{},"notes",[211,14220,14221,14258],{},[183,14222,14223,14230,14232,14234,14236,14238],{},[216,14224,14225,14226,14229],{},"remix-run\u002Freact-router-templates ",[152,14227,14228],{},"default\u002F"," (067adb3)",[216,14231,615],{},[216,14233,615],{},[216,14235,243],{},[216,14237,243],{},[216,14239,14240,8443,14243,14246,14247,14250,14251,14253,14254,14257],{},[152,14241,14242],{},"app\u002Froutes.ts",[152,14244,14245],{},"index(\"routes\u002Fhome.tsx\")"," inside a ",[152,14248,14249],{},"root.tsx"," layout. Home has no loader, so no ",[152,14252,14195],{}," node. ",[152,14255,14256],{},"welcome.tsx"," is a component, not a route",[183,14259,14260,14263,14265,14267,14269,14271],{},[216,14261,14262],{},"remix-run\u002Findie-stack (56abb93, archived Remix v2)",[216,14264,5086],{},[216,14266,837],{},[216,14268,9328],{},[216,14270,3052],{},[216,14272,14273,14276,14277,571,14280,571,14283,14286,14287,14290],{},[152,14274,14275],{},"flatRoutes"," file conventions: ",[152,14278,14279],{},"_index",[152,14281,14282],{},"notes.$noteId",[152,14284,14285],{},"notes._index"," (so ",[152,14288,14289],{},"notes.tsx"," is a layout). 2 navigation sites stay unresolved. 5 form \u002F fetcher calls match an in-repo loader or action",[14292,14293,14294],"style",{},"html pre.shiki code .s4LKg, html code.shiki .s4LKg{--shiki-light:#4D7C0F;--shiki-default:#4D7C0F;--shiki-dark:#84CC16}html pre.shiki code .sZ_TN, html code.shiki .sZ_TN{--shiki-light:#71717A;--shiki-default:#71717A;--shiki-dark:#A1A1AA}html pre.shiki code .sha9Y, html code.shiki .sha9Y{--shiki-light:#9F8CFF;--shiki-default:#9F8CFF;--shiki-dark:#C4B5FD}html pre.shiki code .seS0s, html code.shiki .seS0s{--shiki-light:#71717A;--shiki-light-font-style:italic;--shiki-default:#71717A;--shiki-default-font-style:italic;--shiki-dark:#A1A1AA;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1795,"searchDepth":1847,"depth":1812,"links":14296},[14297,14298,14299,14300,14301,14302,14303,14304,14305,14308,14311,14312,14313,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14363,14364],{"id":174,"depth":1812,"text":175},{"id":506,"depth":1812,"text":507},{"id":757,"depth":1812,"text":758},{"id":1030,"depth":1812,"text":1031},{"id":1117,"depth":1812,"text":1118},{"id":1868,"depth":1812,"text":1869},{"id":1982,"depth":1812,"text":1983},{"id":2228,"depth":1812,"text":87},{"id":2734,"depth":1812,"text":54,"children":14306},[14307],{"id":2878,"depth":1839,"text":2879},{"id":3209,"depth":1812,"text":111,"children":14309},[14310],{"id":3404,"depth":1839,"text":3405},{"id":3814,"depth":1812,"text":18},{"id":4486,"depth":1812,"text":4487},{"id":4723,"depth":1812,"text":14314},"Overrides in tests \u002F reaches, inherited specs, TypeScript class hierarchy",{"id":4881,"depth":1812,"text":4882},{"id":4979,"depth":1812,"text":4980},{"id":5245,"depth":1812,"text":5246},{"id":5539,"depth":1812,"text":5540},{"id":5864,"depth":1812,"text":5865},{"id":6067,"depth":1812,"text":6068},{"id":6323,"depth":1812,"text":6324},{"id":6548,"depth":1812,"text":6549},{"id":6760,"depth":1812,"text":6761},{"id":6817,"depth":1812,"text":6818},{"id":6960,"depth":1812,"text":6961},{"id":7169,"depth":1812,"text":14327,"children":14328},"gRPC services from .proto contracts (#33)",[14329],{"id":7458,"depth":1839,"text":7459},{"id":7660,"depth":1812,"text":7661},{"id":7875,"depth":1812,"text":7876},{"id":8103,"depth":1812,"text":8104},{"id":8500,"depth":1812,"text":8501},{"id":8837,"depth":1812,"text":8838},{"id":9100,"depth":1812,"text":9101},{"id":9262,"depth":1812,"text":9263},{"id":9466,"depth":1812,"text":9467},{"id":9714,"depth":1812,"text":9715},{"id":9871,"depth":1812,"text":9872},{"id":10022,"depth":1812,"text":10023},{"id":10118,"depth":1812,"text":10119},{"id":10287,"depth":1812,"text":10288},{"id":10531,"depth":1812,"text":10532},{"id":10769,"depth":1812,"text":10770},{"id":11119,"depth":1812,"text":11120},{"id":11278,"depth":1812,"text":11279},{"id":11561,"depth":1812,"text":11562},{"id":11608,"depth":1812,"text":11609},{"id":11678,"depth":1812,"text":11679},{"id":11755,"depth":1812,"text":11756},{"id":11805,"depth":1812,"text":11806},{"id":11969,"depth":1812,"text":11970},{"id":12016,"depth":1812,"text":12017},{"id":12036,"depth":1812,"text":12037},{"id":12069,"depth":1812,"text":12070},{"id":12200,"depth":1812,"text":12201,"children":14357},[14358,14359,14360,14362],{"id":12225,"depth":1839,"text":12226},{"id":12482,"depth":1839,"text":12483},{"id":13019,"depth":1839,"text":14361},"Part 2d: unguarded precision, index time, fingerprints",{"id":13572,"depth":1839,"text":13573},{"id":13694,"depth":1812,"text":13695},{"id":13877,"depth":1812,"text":115},"Per-corpus tables behind How we validate. Shallow clones, default branch, October 2026. \"Unchanged corpora\" notes stay here.","md",{},true,{"title":123,"description":14365},"VfzyMX1iHkRIYIQLq4dN9WLB6lOinQbphxO2eCkv0_0",[14372,14374],{"title":119,"path":120,"stem":121,"description":14373,"children":-1},"Public-project checks, not a tutorial. Each area was indexed from a shallow clone (default\nbranch, October 2026) with python -m cg_code_graph.cli index \u003Crepo> on one 8-core Linux box. Wall\ntime includes a cold extractor cache, not a one-off dart compile exe.",{"title":127,"path":128,"stem":129,"description":14375,"children":-1},"Facts about values, from the PHP and TypeScript ASTs (cg_code_graph\u002Fplugins\u002Flaravel\u002Fvalues.py and\nthe TS extractor).",1792170237758]