You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
JDK / Spring / Lombok callees are represented as **phantom** method symbols at index time. Caller/callee traversals default to `exclude_external=true` so those edges are filtered by FQN prefix without dropping them from the graph.
392
392
@@ -426,7 +426,7 @@ Resolution order for `microservice`:
426
426
427
427
Current ontology version is **14**. Any index built before this version must be rebuilt via `cocoindex update ... --full-reprocess -f` or a full `java-codebase-rag reprocess` (no selective flags) so vectors and graph stay aligned. Until re-indexed, the server defensively JSON-decodes string-form list columns so nothing explodes, but filters like `array_contains` will not work.
428
428
429
-
Ontology **14** introduces `EDGE_SCHEMA` in `java_ontology.py` as the canonical edge navigation schema (see `docs/EDGE-NAVIGATION.md`). **`HTTP_CALLS` is `Client → Route`** (SCHEMA-V2 PR-B). **`ASYNC_CALLS` remains `Symbol → Route` until PR-C**, which adds the `Producer` node, `DECLARES_PRODUCER`, and flips `ASYNC_CALLS` to `Producer → Route`. Run one full reprocess after upgrading through the SCHEMA-V2 sequence (or when you need the v14 ontology gate).
429
+
Ontology **14** introduces `EDGE_SCHEMA` in `java_ontology.py` as the canonical edge navigation schema (see `docs/EDGE-NAVIGATION.md`). **`HTTP_CALLS` is `Client → Route`** (SCHEMA-V2 PR-B). **`ASYNC_CALLS` is `Producer → Route`** with `DECLARES_PRODUCER` (SCHEMA-V2 PR-C). Run one full reprocess after upgrading through the SCHEMA-V2 sequence (or when you need the v14 ontology gate).
430
430
431
431
Ontology **13** materializes stored `OVERRIDES` edges between method Symbols (subtype override → supertype declaration, matching `signature` on a direct `IMPLEMENTS` / `EXTENDS` hop). `neighbors(edge_types=["OVERRIDES"])` traverses this relationship; `OVERRIDDEN_BY*` keys in `edge_summary` remain describe-time rollups only.
Symmetric: cross-service and intra-service questions use the **same**`neighbors` call with different `edge_types`.
102
102
@@ -191,6 +191,7 @@ Exact allowed values for roles, capabilities, client kinds, etc. live in `java_o
191
191
| List interfaces in service S |`find(kind="symbol", filter={"microservice":S,"symbol_kind":"interface"})`|`neighbors` / `describe`|
192
192
| List HTTP or Kafka entry points |`find(kind="route", filter={...})`|`describe`|
193
193
| List Feign / HTTP clients |`find(kind="client", filter={...})`|`neighbors(..., out, ["HTTP_CALLS"])` if needed |
194
+
| List async producers |`find(kind="producer", filter={...})`|`neighbors(..., out, ["ASYNC_CALLS"])` if needed |
194
195
| Who calls method M? | Stable symbol id via `resolve`, `find`, or `search`|`neighbors(ids=sym_id, direction="in", edge_types=["CALLS"])`|
195
196
| What does M call? | Same |`neighbors(..., direction="out", edge_types=["CALLS"])`|
196
197
| Who hits this route? |`find(kind="route", ...)` or route id from logs |`neighbors(ids=route_id, direction="in", edge_types=["HTTP_CALLS","ASYNC_CALLS","EXPOSES"])`|
@@ -263,7 +264,7 @@ Virtual keys (`OVERRIDDEN_BY`, …) and composed dot-keys are **not** valid `Edg
263
264
264
265
### Ontology glossary (version 14)
265
266
266
-
Source of truth: `java_ontology.py` (`EDGE_SCHEMA`, valid sets). Strings are case-sensitive. Edge navigation: [`docs/EDGE-NAVIGATION.md`](./EDGE-NAVIGATION.md) — for `HTTP_CALLS`, traverse via `DECLARES_CLIENT` from a method Symbol or `neighbors` outbound from a Client id; `ASYNC_CALLS` still uses `*_current` member traversals until SCHEMA-V2 PR-C.
267
+
Source of truth: `java_ontology.py` (`EDGE_SCHEMA`, valid sets). Strings are case-sensitive. Edge navigation: [`docs/EDGE-NAVIGATION.md`](./EDGE-NAVIGATION.md) — for `HTTP_CALLS`, traverse via `DECLARES_CLIENT` from a method Symbol or `neighbors` outbound from a Client id; for `ASYNC_CALLS`, traverse via `DECLARES_PRODUCER` or outbound from a Producer id.
-`alien_subject`: DECLARES_PRODUCER connects method Symbol → Producer
206
+
186
207
## HTTP_CALLS
187
208
188
209
**Endpoints**: `Client → Route`
@@ -209,12 +230,12 @@
209
230
210
231
## ASYNC_CALLS
211
232
212
-
**Endpoints**: `Symbol → Route`
233
+
**Endpoints**: `Producer → Route`
213
234
**Cardinality**: `many_to_many`
214
235
**Brownfield-resolver-sourced**: yes
215
236
**Member-only** (hints): no
216
237
217
-
**Purpose**: resolved async call from declaring method to topic route (pre-flip: Symbol→Route; PR-C: Producer→Route)
238
+
**Purpose**: resolved async call from a declared Producer to a topic route
218
239
219
240
**Attributes**:
220
241
@@ -226,8 +247,7 @@
226
247
227
248
**Typical traversals**:
228
249
229
-
-`type_subject_current`: neighbors(['{id}'],'out',['DECLARES']) then neighbors(member_ids,'out',['ASYNC_CALLS'])
230
250
-`type_subject`: neighbors(['{id}'],'out',['DECLARES']) then neighbors(member_ids,'out',['DECLARES_PRODUCER']) then neighbors(producer_ids,'out',['ASYNC_CALLS'])
-`member_subject`: neighbors(['{id}'],'out',['DECLARES_PRODUCER']) then neighbors(producer_ids,'out',['ASYNC_CALLS'])
233
-
-`alien_subject`: ASYNC_CALLS is Symbol→Route until PR-C; use member_subject_current. After PR-C (Producer→Route), use member_subject via DECLARES_PRODUCER
252
+
-`route_subject`: neighbors(['{id}'],'in',['ASYNC_CALLS']) then neighbors(producer_ids,'in',['DECLARES_PRODUCER']) for declaring method
253
+
-`alien_subject`: ASYNC_CALLS connects Producer→Route; use DECLARES_PRODUCER from a method Symbol, or neighbors(producer_id,'out',['ASYNC_CALLS']) from a Producer id
Copy file name to clipboardExpand all lines: docs/skills/java-codebase-explore.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -98,8 +98,8 @@ You cannot reason reliably about cross-service behaviour until these surfaces ex
98
98
**Sequence:**
99
99
100
100
1. Cluster routes by path prefix; **`describe`** on representative `route:` ids.
101
-
2. For each major route, **`neighbors(direction="in", edge_types=["EXPOSES"])`** to land on handler symbols; for inbound **`HTTP_CALLS`**, expect **Client** callers (then **`DECLARES_CLIENT` inbound** to the declaring method); **`ASYNC_CALLS`** inbound still lands on Symbol callers until PR-C.
102
-
3. Use **`find(kind="client", …)`** with the same microservice filter to list outbound integration points; follow outbound **`HTTP_CALLS`** from each Client (or**`ASYNC_CALLS`** from methods until Producer lands).
101
+
2. For each major route, **`neighbors(direction="in", edge_types=["EXPOSES"])`** to land on handler symbols; for inbound **`HTTP_CALLS`**, expect **Client** callers (then **`DECLARES_CLIENT` inbound** to the declaring method); for inbound **`ASYNC_CALLS`**, expect **Producer** callers (then **`DECLARES_PRODUCER` inbound** to the declaring method).
102
+
3. Use **`find(kind="client", …)`**and **`find(kind="producer", …)`**with the same microservice filter to list outbound integration points; follow outbound **`HTTP_CALLS`** from each Client and**`ASYNC_CALLS`** from each Producer.
103
103
104
104
**Stopping rule:** You can summarize how traffic enters the service, what modules/controllers own key paths, and what external systems it calls—**without** claiming tests, runtime config, or unindexed siblings exist in MCP.
105
105
@@ -116,7 +116,7 @@ You cannot reason reliably about cross-service behaviour until these surfaces ex
116
116
**Sequence:**
117
117
118
118
1.**`neighbors(direction="in", edge_types=["EXPOSES"])`** onto the handling symbol; walk **`CALLS`** outbound method-by-method.
119
-
2. When a method makes outbound HTTP, **`neighbors(..., out, ["DECLARES_CLIENT"])`** then outbound **`HTTP_CALLS`** from each Client id; for async (pre-PR-C), **`ASYNC_CALLS`**may still be direct from the method Symbol.
119
+
2. When a method makes outbound HTTP, **`neighbors(..., out, ["DECLARES_CLIENT"])`** then outbound **`HTTP_CALLS`** from each Client id; for async, **`neighbors(..., out, ["DECLARES_PRODUCER"])`** then outbound **`ASYNC_CALLS`** from each Producer id.
120
120
3. Stop at leaves, framework boundaries, or unresolved edges; read **`edge.attrs`** (`attrs.confidence`, `attrs.strategy`, `attrs.match`) and report low-confidence segments as resolver gaps, not as facts.
121
121
122
122
**Stopping rule:** You reach a stable leaf (external IO, message publish, clear terminal layer) **or** you document every unresolved hop with a concrete next non-MCP check.
@@ -239,11 +239,11 @@ Ten edge types:
239
239
| Group | Edges |
240
240
| ----- | ----- |
241
241
| Type wiring |`EXTENDS`, `IMPLEMENTS`, `INJECTS`|
0 commit comments