[{"data":1,"prerenderedAt":802},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fplans":135,"\u002Fdocs\u002Fplans-surround":798},[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":83,"body":137,"description":205,"extension":793,"meta":794,"navigation":795,"path":84,"seo":796,"stem":85,"__hash__":797},"docs\u002Fdocs\u002Fplans.md",{"type":138,"value":139,"toc":786},"minimark",[140,145,167,171,199,603,616,620,664,703,706,755,759,782],[141,142,144],"h2",{"id":143},"what-a-plan-is","What a plan is",[146,147,148,149,153,154,158,159,162,163,166],"p",{},"A ",[150,151,152],"strong",{},"plan"," is an agreed scope in ",[155,156,157],"code",{},"\u003Cplans-dir>\u002F\u003Cname>.yaml",". Loading or checking it never writes the graph DB. The same plan and the same code always produce the same report. Example: ",[155,160,161],{},"examples\u002Fplans\u002Fpreorders.yaml"," (incomplete on purpose, so ",[155,164,165],{},"plan check"," has something to find).",[141,168,170],{"id":169},"file","File",[146,172,173,176,177,180,181,184,185,188,189,188,192,195,196,198],{},[155,174,175],{},"cg plan validate"," reports unknown keys and wrong shapes. ",[155,178,179],{},"plan_version"," is ",[155,182,183],{},"1",". Specs match the rest of cg (exact id, ",[155,186,187],{},"Class::method",", ",[155,190,191],{},"table:\u003Ct>",[155,193,194],{},"route:\u003CMETHOD> \u003Curi>",", …). In a plan, a class spec is the class node, and ",[155,197,187],{}," must resolve to one method.",[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"language-yaml shiki shiki-themes cg-light cg-light cg-dark","plan_version: 1\nname: preorders\ntitle: \"...\"\nstatus: draft    # draft | agreed | in_progress | implemented | abandoned\nissues: [\"#7\"]\ncontext: {findings: findings.yaml, clients: clients.yaml}\nadd_nodes: [{id: column:books.preorder_until, attrs: {nullable: true}}]\nmodify: [{target: StockService::reserve, intent: \"...\", role: guard, issues: [\"#7\"]}]\nadd_edges: [{from: StockService::reserve, kind: READS_COLUMN, to: column:books.preorder_until}]\nforbid: [{id: no-warehouse, type: path, from: StockService::reserve, to: table:warehouse_stock}]\nrequire: [{route: \"route:POST \u002Fv1\u002Fstock\u002Freserve\", middleware: [\"auth:api\"]}]\ncovers: [{spec: ..., note: ...}]\nout_of_scope: [{spec: ..., reason: ...}]\n","yaml","",[155,207,208,224,236,253,268,290,323,362,421,460,507,547,576],{"__ignoreMap":205},[209,210,213,216,220],"span",{"class":211,"line":212},"line",1,[209,214,179],{"class":215},"s4LKg",[209,217,219],{"class":218},"sZ_TN",":",[209,221,223],{"class":222},"sZWGQ"," 1\n",[209,225,227,230,232],{"class":211,"line":226},2,[209,228,229],{"class":215},"name",[209,231,219],{"class":218},[209,233,235],{"class":234},"sha9Y"," preorders\n",[209,237,239,242,244,247,250],{"class":211,"line":238},3,[209,240,241],{"class":215},"title",[209,243,219],{"class":218},[209,245,246],{"class":218}," \"",[209,248,249],{"class":234},"...",[209,251,252],{"class":218},"\"\n",[209,254,256,259,261,264],{"class":211,"line":255},4,[209,257,258],{"class":215},"status",[209,260,219],{"class":218},[209,262,263],{"class":234}," draft",[209,265,267],{"class":266},"seS0s","    # draft | agreed | in_progress | implemented | abandoned\n",[209,269,271,274,276,279,282,285,287],{"class":211,"line":270},5,[209,272,273],{"class":215},"issues",[209,275,219],{"class":218},[209,277,278],{"class":218}," [",[209,280,281],{"class":218},"\"",[209,283,284],{"class":234},"#7",[209,286,281],{"class":218},[209,288,289],{"class":218},"]\n",[209,291,293,296,298,301,304,306,309,312,315,317,320],{"class":211,"line":292},6,[209,294,295],{"class":215},"context",[209,297,219],{"class":218},[209,299,300],{"class":218}," {",[209,302,303],{"class":215},"findings",[209,305,219],{"class":218},[209,307,308],{"class":234}," findings.yaml",[209,310,311],{"class":218},",",[209,313,314],{"class":215}," clients",[209,316,219],{"class":218},[209,318,319],{"class":234}," clients.yaml",[209,321,322],{"class":218},"}\n",[209,324,326,329,331,334,337,339,342,344,347,349,351,354,356,359],{"class":211,"line":325},7,[209,327,328],{"class":215},"add_nodes",[209,330,219],{"class":218},[209,332,333],{"class":218}," [{",[209,335,336],{"class":215},"id",[209,338,219],{"class":218},[209,340,341],{"class":234}," column:books.preorder_until",[209,343,311],{"class":218},[209,345,346],{"class":215}," attrs",[209,348,219],{"class":218},[209,350,300],{"class":218},[209,352,353],{"class":215},"nullable",[209,355,219],{"class":218},[209,357,358],{"class":222}," true",[209,360,361],{"class":218},"}}]\n",[209,363,365,368,370,372,375,377,380,382,385,387,389,391,393,395,398,400,403,405,408,410,412,414,416,418],{"class":211,"line":364},8,[209,366,367],{"class":215},"modify",[209,369,219],{"class":218},[209,371,333],{"class":218},[209,373,374],{"class":215},"target",[209,376,219],{"class":218},[209,378,379],{"class":234}," StockService::reserve",[209,381,311],{"class":218},[209,383,384],{"class":215}," intent",[209,386,219],{"class":218},[209,388,246],{"class":218},[209,390,249],{"class":234},[209,392,281],{"class":218},[209,394,311],{"class":218},[209,396,397],{"class":215}," role",[209,399,219],{"class":218},[209,401,402],{"class":234}," guard",[209,404,311],{"class":218},[209,406,407],{"class":215}," issues",[209,409,219],{"class":218},[209,411,278],{"class":218},[209,413,281],{"class":218},[209,415,284],{"class":234},[209,417,281],{"class":218},[209,419,420],{"class":218},"]}]\n",[209,422,424,427,429,431,434,436,438,440,443,445,448,450,453,455,457],{"class":211,"line":423},9,[209,425,426],{"class":215},"add_edges",[209,428,219],{"class":218},[209,430,333],{"class":218},[209,432,433],{"class":215},"from",[209,435,219],{"class":218},[209,437,379],{"class":234},[209,439,311],{"class":218},[209,441,442],{"class":215}," kind",[209,444,219],{"class":218},[209,446,447],{"class":234}," READS_COLUMN",[209,449,311],{"class":218},[209,451,452],{"class":215}," to",[209,454,219],{"class":218},[209,456,341],{"class":234},[209,458,459],{"class":218},"}]\n",[209,461,463,466,468,470,472,474,477,479,482,484,487,489,492,494,496,498,500,502,505],{"class":211,"line":462},10,[209,464,465],{"class":215},"forbid",[209,467,219],{"class":218},[209,469,333],{"class":218},[209,471,336],{"class":215},[209,473,219],{"class":218},[209,475,476],{"class":234}," no-warehouse",[209,478,311],{"class":218},[209,480,481],{"class":215}," type",[209,483,219],{"class":218},[209,485,486],{"class":234}," path",[209,488,311],{"class":218},[209,490,491],{"class":215}," from",[209,493,219],{"class":218},[209,495,379],{"class":234},[209,497,311],{"class":218},[209,499,452],{"class":215},[209,501,219],{"class":218},[209,503,504],{"class":234}," table:warehouse_stock",[209,506,459],{"class":218},[209,508,510,513,515,517,520,522,524,527,529,531,534,536,538,540,543,545],{"class":211,"line":509},11,[209,511,512],{"class":215},"require",[209,514,219],{"class":218},[209,516,333],{"class":218},[209,518,519],{"class":215},"route",[209,521,219],{"class":218},[209,523,246],{"class":218},[209,525,526],{"class":234},"route:POST \u002Fv1\u002Fstock\u002Freserve",[209,528,281],{"class":218},[209,530,311],{"class":218},[209,532,533],{"class":215}," middleware",[209,535,219],{"class":218},[209,537,278],{"class":218},[209,539,281],{"class":218},[209,541,542],{"class":234},"auth:api",[209,544,281],{"class":218},[209,546,420],{"class":218},[209,548,550,553,555,557,560,562,565,567,570,572,574],{"class":211,"line":549},12,[209,551,552],{"class":215},"covers",[209,554,219],{"class":218},[209,556,333],{"class":218},[209,558,559],{"class":215},"spec",[209,561,219],{"class":218},[209,563,564],{"class":222}," ...",[209,566,311],{"class":218},[209,568,569],{"class":215}," note",[209,571,219],{"class":218},[209,573,564],{"class":222},[209,575,459],{"class":218},[209,577,579,582,584,586,588,590,592,594,597,599,601],{"class":211,"line":578},13,[209,580,581],{"class":215},"out_of_scope",[209,583,219],{"class":218},[209,585,333],{"class":218},[209,587,559],{"class":215},[209,589,219],{"class":218},[209,591,564],{"class":222},[209,593,311],{"class":218},[209,595,596],{"class":215}," reason",[209,598,219],{"class":218},[209,600,564],{"class":222},[209,602,459],{"class":218},[146,604,605,606,188,609,188,612,615],{},"Also used: ",[155,607,608],{},"rationale",[155,610,611],{},"assumptions",[155,613,614],{},"precedents",". The full sample is the example file above.",[141,617,619],{"id":618},"check","Check",[200,621,625],{"className":622,"code":623,"language":624,"meta":205,"style":205},"language-bash shiki shiki-themes cg-light cg-light cg-dark","cg plan check \u003Cname> --plans-dir examples\u002Fplans --db out\u002Fgraph.db\n","bash",[155,626,627],{"__ignoreMap":205},[209,628,629,633,636,639,642,645,649,652,655,658,661],{"class":211,"line":212},[209,630,632],{"class":631},"sZJo5","cg",[209,634,635],{"class":234}," plan",[209,637,638],{"class":234}," check",[209,640,641],{"class":218}," \u003C",[209,643,644],{"class":234},"nam",[209,646,648],{"class":647},"snmWg","e",[209,650,651],{"class":218},">",[209,653,654],{"class":234}," --plans-dir",[209,656,657],{"class":234}," examples\u002Fplans",[209,659,660],{"class":234}," --db",[209,662,663],{"class":234}," out\u002Fgraph.db\n",[146,665,666,667,670,671,674,675,678,679,682,683,686,687,690,691,694,695,698,699,702],{},"MCP: ",[155,668,669],{},"plan_check",". The report has four parts: ",[150,672,673],{},"Resolve"," (every reference resolves; planned nodes must not exist yet), ",[150,676,677],{},"Missing from plan"," (writers, readers, callers, pages and other gaps, each with file:line), ",[150,680,681],{},"Conflicts"," (forbidden paths or edges that still exist), and with ",[155,684,685],{},"--verify"," a ",[150,688,689],{},"verify"," section. One line per item. ",[155,692,693],{},"--json"," is the full report; ",[155,696,697],{},"-o"," writes it to a file. Flags: ",[155,700,701],{},"cg plan check -h",".",[141,704,705],{"id":689},"Verify",[707,708,709,713,732,742,745],"ol",{},[710,711,712],"li",{},"Write the plan.",[710,714,715,717,718,721,722,724,725,188,727,729,730,702],{},[155,716,175],{},", then ",[155,719,720],{},"cg plan check",". Put each gap in ",[155,723,367],{}," \u002F ",[155,726,426],{},[155,728,552],{}," or ",[155,731,581],{},[710,733,734,737,738,741],{},[155,735,736],{},"cg plan baseline"," writes ",[155,739,740],{},"\u003Cplans-dir>\u002F\u003Cname>.baseline.json"," (sha1 of each modified target's source).",[710,743,744],{},"Implement, then re-index.",[710,746,747,750,751,754],{},[155,748,749],{},"cg plan check \u003Cname> --verify",". ",[155,752,753],{},"verify_ok"," is true only when planned nodes, edges, forbids and requirements all pass.",[141,756,758],{"id":757},"overlay","Overlay",[146,760,761,762,765,766,769,770,773,774,777,778,781],{},"In ",[155,763,764],{},"cg serve",", mode ",[150,767,768],{},"plan overlay"," (or ",[155,771,772],{},"#mode=plan&spec=\u003Cname>",", optional ",[155,775,776],{},"&verify=1","). Or ",[155,779,780],{},"cg viz-plan \u003Cname> --db … -o file.html"," for one HTML file. The panel opens on the check report.",[783,784,785],"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 .sZWGQ, html code.shiki .sZWGQ{--shiki-light:#8B5CF6;--shiki-default:#8B5CF6;--shiki-dark:#C4B5FD}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);}html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .snmWg, html code.shiki .snmWg{--shiki-light:#27272A;--shiki-default:#27272A;--shiki-dark:#E4E4E7}",{"title":205,"searchDepth":255,"depth":226,"links":787},[788,789,790,791,792],{"id":143,"depth":226,"text":144},{"id":169,"depth":226,"text":170},{"id":618,"depth":226,"text":619},{"id":689,"depth":226,"text":705},{"id":757,"depth":226,"text":758},"md",{},true,{"title":83,"description":205},"XHWeCxRvyyCo5sx5TLacFz73dYpPQIjCpMnWWHUEj80",[799,800],{"title":79,"path":80,"stem":81,"description":205,"children":-1},{"title":87,"path":88,"stem":89,"description":801,"children":-1},"Per-platform code is tagged with the targets it is built for. --platform ios drops what that\ntarget does not build. cg platforms divergence lists variants that leave a declared target\nuncovered, and calls that are live where the callee is absent.",1792170234805]