Evidence Before Interpretation
Start by deciding what can be known without opening a transcript—and write every unknown down.
- Separate discovery, structure, meaning, and action.
- Classify known knowns, known unknowns, unknown knowns, and unknown unknowns.
- Choose the smallest claim that can be proven at the next boundary.
Core model
A request to ‘analyze every session’ mixes at least four jobs: discover files, describe structure, interpret meaning, and act on conclusions. Evidence-first work separates those jobs. U1 answers only the first question with metadata. That narrow answer is useful because it is measurable, rerunnable, and incapable of leaking a message.
Mental model: The prompt is a map; the archive is the territory. An inventory counts roads and measures distances before anyone claims to know what happened on those roads.
The first port intentionally exposes only `lstat(path)` and `readDir(path)`. There is no `readFile`, stream, parser, model, or network method. Privacy is therefore structural, not a promise made by a caller.
Boundary table
| Question | Observed boundary | Owner | Verdict |
|---|---|---|---|
| File existence | Metadata | U1 | Knowable |
| Record structure | Local byte stream | U2 | Deferred |
| What the user meant | Semantic interpretation | Later unit | Unknown |
Primary local source
packages/sessions/src/claude-inventory.tsinterface ClaudeInventoryFs {
lstat(path): Promise<Metadata>;
readDir(path): Promise<readonly string[]>;
}
// No content-read method exists.Synthetic lab
Choose a question. Which unit may answer it honestly?
Retrieval and feedback
Which first result remains useful even if the semantic goal changes later?
Retrieval cards
Check your model
Why is U1 metadata-only by construction?
Evidence ledger
Authority: docs/fable-session-mining/LOOP-LOG.md. Tests never upgrade a missing live receipt.