C4: query / path / explain on the corpus graph, 2026-10-21 14:06 (UTC+8). Each command run with --graph ; exit code printed after each. $ graphify path checkout round_money Shortest path (3 hops): checkout() --calls [EXTRACTED]--> final_price() --calls [EXTRACTED]--> apply_tax() --calls [EXTRACTED]--> round_money() [exit code 0] $ graphify explain AdminUser Node: AdminUser ID: web_user_adminuser Source: web/user.ts L5 Type: code Community: api.ts Degree: 5 Connections (5): <-- api.ts [imports] [EXTRACTED] web/api.ts:L2 --> User [inherits] [EXTRACTED] web/user.ts:L5 <-- user.ts [contains] [EXTRACTED] web/user.ts:L5 <-- makeAdmin() [calls] [EXTRACTED] web/api.ts:L9 --> .isAdmin() [method] [EXTRACTED] web/user.ts:L6 [exit code 0] $ graphify explain helper Ambiguous: 'helper' matches 2 nodes in different files. shop/models.py id: shop_models_helper shop/util.py id: shop_util_helper Retry with path::symbol using one of the paths above (e.g. ::helper()) or the full node id. [exit code 3] $ graphify explain nonexistent_zzz No node matching 'nonexistent_zzz' found. [exit code 4] $ graphify query how is tax applied to the cart total? Graph: c2/copy1/graphify-out/graph.json (32 nodes) | Traversal: BFS depth=2 | Start: ['Cart', 'tax.py', 'renderTotal()'] | 23 nodes found NODE Cart [src=shop/cart.py loc=L4 community=Cart] NODE tax.py [src=shop/tax.py loc=L1 community=tax.py] NODE renderTotal() [src=web/api.ts loc=L4 community=api.ts] NODE api.ts [src=web/api.ts loc=L1 community=api.ts] NODE checkout.py [src=shop/checkout.py loc=L1 community=Cart] NODE cart.py [src=shop/cart.py loc=L1 community=models.py] NODE checkout() [src=shop/checkout.py loc=L5 community=Cart] NODE pricing.py [src=shop/pricing.py loc=L1 community=Cart] NODE apply_tax() [src=shop/tax.py loc=L6 community=tax.py] NODE .add() [src=shop/cart.py loc=L8 community=Cart] NODE util.py [src=shop/util.py loc=L1 community=tax.py] NODE round_money() [src=shop/util.py loc=L1 community=tax.py] NODE formatPrice() [src=web/format.ts loc=L1 community=api.ts] NODE .__init__() [src=shop/cart.py loc=L5 community=Cart] NODE .subtotal() [src=shop/cart.py loc=L11 community=Cart] NODE models.py [src=shop/models.py loc=L1 community=models.py] NODE AdminUser [src=web/user.ts loc=L5 community=api.ts] NODE make_item() [src=shop/models.py loc=L12 community=models.py] NODE final_price() [src=shop/pricing.py loc=L4 community=Cart] NODE user.ts [src=web/user.ts loc=L1 community=api.ts] NODE makeAdmin() [src=web/api.ts loc=L8 community=api.ts] NODE format.ts [src=web/format.ts loc=L1 community=api.ts] NODE helper() [src=shop/util.py loc=L5 community=tax.py] EDGE checkout() --calls [EXTRACTED context=call]--> Cart at=shop/checkout.py:L6 EDGE checkout.py --imports [EXTRACTED context=import]--> Cart at=shop/checkout.py:L1 EDGE cart.py --contains [EXTRACTED]--> Cart at=shop/cart.py:L4 EDGE Cart --method [EXTRACTED]--> .subtotal() at=shop/cart.py:L11 EDGE Cart --method [EXTRACTED]--> .__init__() at=shop/cart.py:L5 EDGE Cart --method [EXTRACTED]--> .add() at=shop/cart.py:L8 EDGE tax.py --imports [EXTRACTED context=import]--> round_money() at=shop/tax.py:L1 EDGE pricing.py --imports_from [EXTRACTED context=import]--> tax.py at=shop/pricing.py:L1 EDGE tax.py --imports_from [EXTRACTED context=import]--> util.py at=shop/tax.py:L1 EDGE tax.py --contains [EXTRACTED]--> apply_tax() at=shop/tax.py:L6 EDGE renderTotal() --calls [EXTRACTED context=call]--> formatPrice() at=web/api.ts:L5 EDGE api.ts --contains [EXTRACTED]--> renderTotal() at=web/api.ts:L4 EDGE checkout.py --imports [EXTRACTED context=import]--> final_price() at=shop/checkout.py:L2 EDGE cart.py --imports [EXTRACTED context=import]--> make_item() at=shop/cart.py:L1 EDGE cart.py --imports_from [EXTRACTED context=import]--> models.py at=shop/cart.py:L1 EDGE .add() --calls [EXTRACTED context=call]--> make_item() at=shop/cart.py:L9 EDGE pricing.py --contains [EXTRACTED]--> final_price() at=shop/pricing.py:L4 EDGE format.ts --contains [EXTRACTED]--> formatPrice() at=web/format.ts:L1 EDGE api.ts --imports [EXTRACTED context=import]--> AdminUser at=web/api.ts:L2 EDGE api.ts --imports_from [EXTRACTED context=import]--> format.ts at=web/api.ts:L1 EDGE api.ts --imports_from [EXTRACTED context=import]--> user.ts at=web/api.ts:L2 EDGE api.ts --contains [EXTRACTED]--> makeAdmin() at=web/api.ts:L8 EDGE util.py --contains [EXTRACTED]--> helper() at=shop/util.py:L5 EDGE checkout() --calls [EXTRACTED context=call]--> final_price() at=shop/checkout.py:L9 EDGE final_price() --calls [EXTRACTED context=call]--> apply_tax() at=shop/pricing.py:L5 EDGE checkout.py --imports_from [EXTRACTED context=import]--> cart.py at=shop/checkout.py:L1 EDGE checkout() --calls [INFERRED context=call]--> .add() at=shop/checkout.py:L8 EDGE checkout.py --imports_from [EXTRACTED context=import]--> pricing.py at=shop/checkout.py:L2 EDGE checkout.py --contains [EXTRACTED]--> checkout() at=shop/checkout.py:L5 EDGE models.py --contains [EXTRACTED]--> make_item() at=shop/models.py:L12 EDGE pricing.py --imports [EXTRACTED context=import]--> apply_tax() at=shop/pricing.py:L1 EDGE apply_tax() --calls [EXTRACTED context=call]--> round_money() at=shop/tax.py:L7 EDGE util.py --contains [EXTRACTED]--> round_money() at=shop/util.py:L1 EDGE api.ts --imports [EXTRACTED context=import]--> formatPrice() at=web/api.ts:L1 EDGE makeAdmin() --calls [EXTRACTED context=call]--> AdminUser at=web/api.ts:L9 EDGE user.ts --contains [EXTRACTED]--> AdminUser at=web/user.ts:L5 [exit code 0]