PR-A1: Route schema + literal extractor (B2a)#5
Conversation
Co-authored-by: Cursor <[email protected]>
✅ Approved — ready to mergeReviewed against Scope discipline (all clean)
Schema
Helpers (reusable contract for B2b/B6)
TestsAll 11 plan-numbered cases present in The 21 errors + 1 fail you may see in a fresh sandbox come from Manual evidence — reproduced
All numbers match the PR description. Bonus catch worth calling out
Plan deltas — both acceptable
Nothing to fix before mergingThe LGTM. 🟢 |
Scope
Implements PR-A1 from
plans/PLAN-TIER1-COMPLETION.md/plans/CURSOR-PROMPTS-TIER1.md:Routenodes,EXPOSESedges ((Symbol)-[:EXPOSES]->(Route)), literal-only annotation extraction,pass4_routesafterpass3_calls,ONTOLOGY_VERSION4 → 5.Behaviour
${…}inside strings and non-string path args incrementroutes_skipped_unresolvedand emit no route for that value._normalize_path/_route_idinbuild_ast_graph.py(deterministic, shared contract for later B2b/B6).graph_meta:routes_total,exposes_total,routes_by_framework(JSON string column — Kuzu Python MAP binding limitation),routes_resolved_pct.graph_metaextended with the same route fields.pass1_parsenow computesrelbeforeparse_java(..., filename=rel)(was referencing undefinedrel).Evidence (bank-chat-system)
Tests
pytest tests: 170 passed, 3 skipped (default; no heavy gate).ruff checkclean on touched paths.Not in this PR
SpEL/constant-ref routes as nodes (PR-A2), brownfield (PR-A3), MCP route listing tools (PR-A2),
HTTP_CALLS/ASYNC_CALLS(B2b).Ambiguities / plan deltas to confirm
routes_by_framework: The plan showedMAP(STRING, INT64). Kuzu’s Python binder rejected a Pythondictfor that parameter (STRUCT()vsMAP). The implementation uses a STRING JSON blob instead (documented next to the schema inbuild_ast_graph.py). Consumers (meta(), MCPgraph_meta) decode it to a dict.@Bean Functionroutes: Emitted asstream_binding/streamwith emptytopicwhen no@Input/@Outputmetadata is parsed — enough for PR-A1 smoke; refine if richer binding metadata is needed later.Made with Cursor