feat: B2b HTTP_CALLS + ASYNC_CALLS extractor (PR-D1)#12
Conversation
Implement PR-D1 core by adding outgoing-call extraction, pass5 edge emission, and graph metadata counters so caller-side HTTP/async edges are materialized with unresolved match semantics. Co-authored-by: Cursor <cursoragent@cursor.com>
Review: PR-D1 — B2b HTTP_CALLS + ASYNC_CALLS extractorVerdict: Approved ✅ PR-D1 ships exactly what Scope discipline (out-of-scope checks)
Plan compliance
TestsMaster baseline: 214 collected. PR-D1 branch: 233 collected → +19 tests, exactly per the plan. All 19 test names in Manual evidence reproduced$ rm -rf /tmp/check_d1 && python build_ast_graph.py --source-root tests/bank-chat-system \
--kuzu-path /tmp/check_d1 --verbose 2>&1 | grep -E "^\[pass[45]\]"
[pass4] Route extraction: emitted=11, exposes=11, skipped_unresolved=0, routes_resolved_pct=81.8, routes_from_brownfield_pct=0.0, by_framework={'spring_mvc': 9, 'kafka': 2}
[pass5] HTTP_CALLS: 2 edges, ASYNC_CALLS: 5 edgesontology_version = 7
http_calls_total = 2
async_calls_total = 5
http_calls_by_strategy = {'rest_template': 2}
async_calls_by_strategy= {'kafka_template': 5}
http_calls_resolved_pct= 1.0
async_calls_resolved_pct= 1.0✅ Identical to the PR description. Sampling actual edges: Confidence Notes that earned my trust
Observations (non-blocking)
Plan deltas neededNone. Plan §3.6, §4, §5 all hold as written. Ready to merge. Next: PR-D2 (B2b brownfield: caller-side overrides + |
Report per-client-kind and per-strategy counts in pass5 verbose output, and document that call-edge resolved percentages are strategy-based in PR-D1. Co-authored-by: Cursor <cursoragent@cursor.com>
…-E2 plan (#16) Catches from PR-D1, PR-D2, PR-D3 reviews that were intentionally deferred until Tier 1B landed are gathered into one document to prevent them from getting lost across review threads. PR-E1 (small, 1-day): risk_score [0,1] re-normalisation, VALID_HTTP_CALL_MATCHES rename, two inline comments, two doc fixes. PR-E2 (refactor): consolidate the second three-strategy ladder in graph_enrich.py:720-724 onto the canonical resolver. Refs: - PR-D1 #12 obs 2 (strategy-ladder duplicate) - PR-D2 #13 post-D3 follow-ups (anchor-fills-from-builtin doc, channel field) - PR-D3 #15 obs 1-3, 5 (risk-score contract, VALID_HTTP_CALL_MATCHES rename, two reader comments)
Scope statement
Implements PR-D1 from
plans/PLAN-TIER1B-COMPLETION.mdonly: B2b core HTTP/async caller extraction,pass5_imperative_edges, new edge tables/writers,_string_value_atomsrename, ontology bump to 7, graph meta call-edge counters, and PR-D1 test/fixture additions.Summary
_route_value_atomsto_string_value_atoms, addedOutgoingCallDecl, and populatedMethodDecl.outgoing_callsvia new_collect_outgoing_callsfor Feign-method, RestTemplate, KafkaTemplate, WebClient(unresolved), and StreamBridge(unresolved).HTTP_CALLS/ASYNC_CALLSschema,HttpCallRow/AsyncCallRow/CallEdgeStats, andpass5_imperative_edgeswired immediately afterpass4_routesto emit caller edges withmatch='unresolved'and phantomRoutetargets where needed.graph_metawith HTTP/async call totals, strategy JSON blobs, and resolved percentages; added Kuzu meta decoding for new JSON fields; updated README route/edge section and added PR-D1 fixture/tests (cases 1-19).Test count
python3 -m pytest tests -q->229 passed, 4 skippedManual evidence
Made with Cursor