diff --git a/gemini-extension.json b/gemini-extension.json
index 6327e15c..9b59561d 100644
--- a/gemini-extension.json
+++ b/gemini-extension.json
@@ -1,6 +1,6 @@
{
"name": "axiomcode",
- "version": "0.1.7",
+ "version": "0.1.8",
"description": "Ask your repository how its code connects: who calls this, what breaks if I change it, which tests an edit reaches, how A reaches B. Answers come from a resolved call graph and are verified against it; nothing is guessed.",
"contextFileName": "plugins/axiomcode/AGENTS.md",
"mcpServers": {
diff --git a/graph/bundle/SCHEMA.md b/graph/bundle/SCHEMA.md
index 7bd4051a..625aac8d 100644
--- a/graph/bundle/SCHEMA.md
+++ b/graph/bundle/SCHEMA.md
@@ -483,6 +483,7 @@ THE GRAPH. One row per (site, resolved target). A site with N possible targets h
| `ctor_delegate` | java | `this(…)` / `super(…)` inside a constructor. |
| `anon_new` | java | `new X() { … }` — an anonymous class creation. |
| `event` | java | Synthesised: the publishEvent call site to a listener it runs (tier event_dispatch). Not a written call to that method. |
+| `entity_callback` | java | Synthesised: a call that writes an entity (`repository.save(e)`, `em.persist(e)`, `delete(e)`) to a JPA lifecycle callback it runs (tier event_dispatch). Not a written call to that method. |
| `record_accessor` | java | Synthesised: a record pattern `case Pair(var l, var r)` calls each accessor. Not a written call; the site is the pattern expression. |
| `resource_close` | java | Synthesised: a try-with-resources resource `try (var w = open())` is closed when the block exits, so its close() is called. Not a written call; the site is the resource local. |
| `FUNCTION_CALL` | typescript | `f(…)` — a bare callee. |
@@ -511,6 +512,7 @@ THE GRAPH. One row per (site, resolved target). A site with N possible targets h
| `DYNAMIC_CODE_CALL` | javascript | `eval(…)` / `new Function(…)` — unknowable by construction. |
| `DYNAMIC_IMPORT_CALL` | javascript | `import(…)` — a module load that is also a site. |
| `JSX_ELEMENT` | javascript | `