# Reading an answer

> Every answer says what is certain, what is within a known list, and what is open. Here is a real one, line by line.

The agent asked `who_calls Store.save` on a small example project of five files.

```text
llmgraph · who_calls Store.save (app/store.py:2): 1 certain, 1 in a set, 1 open   <- 1
  ✓ certain app/admin.py:3 reset w3   <- 2
  ◇ within_these, one of 3 app/service.py:4 persist -> {Store.save, PgStore.save, MemStore.save} (closed: repo only) [a] w4   <- 3
  ⚠ maybe_more app/service.py:8 persist_any (open: type unknown) w5   <- 4
  ⚠ plus dynamic calls elsewhere that could reach anything w6   <- 5
  – ruled out: 2 same-name calls (proven: other target) [a] w7   <- 6
  assumes [a]: all subclasses are in this repo (project setting)   <- 7
```

1. **The headline.** The function asked about, where it is, and how many callers of each kind.
2. **✓ certain.** Proven to be exactly this function. `w3` is a handle: pass it to [explain](https://beta.llmgraph.in/docs/questions/explain.md) to see the evidence.
3. **◇ within_these, one of 3.** One of a known list. "One of" means exactly one of these runs. The reason in brackets says why the list is closed, and `[a]` points to the assumption it rests on.
4. **⚠ maybe_more.** There is a candidate, but the door is open: the type of `s` is unknown.
5. **⚠ dynamic calls.** Calls decided while the program runs are counted, not hidden.
6. **– ruled out.** Calls that only share the name, set aside with the proof that they reach another function.
7. **assumes [a].** An answer that relies on an assumption says so.

## You may also see

- `+K more`. The answer shows the first items and says how many more there are. The full list is in `.llmgraph/<id>.md` inside the repository. It is plain text; you may want to git-ignore it.
- `already shown: K items (w3 w4)`. Items your agent already saw earlier in the session are collapsed into one line that names the handles that already list them. Ask for one of those handles to see the items again.
- `unchanged since your last answer about X. Groups: w3 w4`. The same question again, with nothing new. The line names the handles of the first answer and repeats nothing, not even its counts.
- `file:line:column`. When two calls sit on one line, each line of the list carries the column, so they do not look like one call printed twice.
- `⚠ type checker starting`. In the first moments, answers use LLMGRAPH's own reading of the code and say so, with an assumption `[c]` "our own reading, not confirmed by the checker". This settles on its own.
- `[delta]`. Files changed since your last call; the answer uses the new state.
- `⚠ cannot_see: N files in languages LLMGRAPH does not read`. LLMGRAPH reads Python, TypeScript and JavaScript. Files in other languages (Go, Rust, Java and so on) are counted as blind spots, never read, and a project with none of the three gets one fixed message instead of empty answers.
- **Handles.** `w3`, `w4` and so on are valid in this session only. They reset when the server restarts.

> A label is never rounded up, and nothing is ranked by chance. What can't be proven is said out loud.
