propose: composed override-axis rollup keys in describe.edge_summary (dispatch chasm)#90
Conversation
Surface dispatch-axis affordances on method describe so the
agent walking 'Foo.process -> CALLS -> AssignClient.openChat'
(interface method) gets a breadcrumb to the concrete override
that carries @CodebaseClient, instead of dead-ending.
Synthetic rollup, no schema change. Two vantage points:
- declaration side: OVERRIDDEN_BY (via signature) +
DECLARES_CLIENT/EXPOSES (via overrides)
- implementation side: OVERRIDES (via signature)
Signature match uses name + arity + ordered erased
param-type-fqns (mirrors _lookup_method_candidates).
One IMPLEMENTS/EXTENDS hop only; agent recurses explicitly.
Symmetric to PR-89's class-level (via members) rollup
(containment axis); this fixes the dispatch axis.
16 use cases, 17 locked decisions, 8 principles, 1 PR.
Review — PR #90 needs a v2 pass aligned with PR #89's grillingPR #89 went through three iterations (v1 → v2 → v2.1) during yesterday's review. PR #90 was written concurrently with v1 and hasn't absorbed any of the changes. Six issues, in decreasing severity. 1. Phantom Kuzu columns — the Cypher sketches reference
|
describe.edge_summary (dispatch chasm)describe.edge_summary (dispatch chasm)
…n frame Six defects fixed from code-grounded review (aligned with PR-89 v2.1): 1. phantom Kuzu columns (param_count, param_type_fqns) → signature equality 2. _lookup_method_candidates overclaim → name+arity via signature column 3. stale (via signature)/(via overrides) naming → dot notation 4. §1 frame overstatement → scope translation 5. phantom is_static flag → "static" IN modifiers 6. §3.1 example contradicted omission rule → zero-count line removed Co-authored-by: Cursor <cursoragent@cursor.com>
v2 amendment — six defects from code-grounded review (force-pushed
|
TL;DR
When
describeis called on a method Symbol,edge_summaryadds composed rollup keys exposing the override relationship + any brownfield signal hidden behind it:OVERRIDDEN_BY,OVERRIDDEN_BY.DECLARES_CLIENT,OVERRIDDEN_BY.EXPOSESOVERRIDESComputed at describe-time via Cypher (
IMPLEMENTS/EXTENDSclass-level walk +signaturecolumn match). No schema change, noOVERRIDESedge table, no indexing pass.Why
Agent walks
Foo.process→CALLS→AssignClient.openChat(the interface method).edge_summaryshowsCALLS+DECLARESonly. The concreteLocalAssignClient.openChatthat carries@CodebaseClientis reachable only via 5 hops with a name+arity join in the middle. No agent guesses that walk. The dispatch chasm is invisible by design — same affordance bug as PR-89, different axis.Symmetric to PR-89
DECLARES.<projected>(dot notation)OVERRIDDEN_BY/OVERRIDES+OVERRIDDEN_BY.<projected>(dot notation)class,interface,enum,record,annotation)method,constructor)DECLARES(one stored hop)IMPLEMENTS/EXTENDS+signaturematch (virtual hop)Both rollups only ever appear on different node kinds — they never collide in the same
edge_summary.Scope
_edge_summary_for_node+ helper, 5 new tests.signaturecolumn equality (mirrors_lookup_method_candidates's name+arity semantics).neighbors(edge_types=...)— Pydantic rejectsOVERRIDDEN_BY/OVERRIDESas invalidEdgeTypeliterals.Out of scope
OVERRIDES/OVERRIDDEN_BYedge table.CALLSto also point at overrides (would falsify call-site resolution).OVERRIDDEN_BY.HTTP_CALLS/OVERRIDDEN_BY.ASYNC_CALLS— separate propose if surfaced (symmetric to PR-89'sDECLARES.HTTP_CALLSdeferral).Sections
edge_summaryon declaration side and impl side, Cypher sketch usingsignaturecolumn, AGENT-GUIDE additionoverride_axis_rollup_forskeleton + integration sketch that composes cleanly with PR-89's helperVerdict on the originating question
This is a bug of the same family as PR-89:
describeis too literal. The graph correctly records that@CodebaseClientis on the override (by deliberate operator design — each method represents one specific outbound call). But describe stops at the node's literal edges and doesn't translate the operator's architectural intent into an agent affordance at the declaration's grain. The override-axis rollup fixes the view without modifying the graph.Together with PR-89, every brownfield signal hidden by Java's attachment patterns (member-of-class, override-of-interface) becomes one explicit walk-step away from the natural describe target.