* feat(graph): auto-populate the associative graph from mined sessions
Conversation mining never set the `entities` drawer metadata that hallways
consume, so mined sessions produced an empty associative graph (and starved
the entity-navigation / tunnel-recommendation features built on top of it).
Add a no-LLM structural entity extractor and wire it into the convos mine:
- entities: structural-only extractor (author-quoted code spans, URLs, file
paths, qualified identifiers, CamelCase / snake_case symbols). No wordlists,
no NLP models, precision-biased so prose doesn't pollute the graph.
- convo_miner: set `entities` per chunk, and compute hallways after a convos
mine (mirroring the project-file path). Hallways run before the FTS5
validation, which opens a direct sqlite connection that can invalidate the
live Chroma collection handle on some Chroma builds.
- cli: `mempalace hallways` lists the associative graph (CLI parity with the
list_hallways MCP tool).
- tests: extractor precision/ranking, entities metadata at mine time, CLI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(graph): address review — semicolon safety, leading-underscore snake, negative limit
- entities `_clean`: strip `;` out of tokens so a URL query string or backtick
span can't split the `;`-joined entities metadata field
- entities `_SNAKE`: optional leading/trailing `_?` so `_extract_authored_at`
and similar are matched in plain text (previously only caught via backticks)
- cli `hallways`: clamp `--limit` with max(0, ...) so a negative value shows
nothing instead of slicing from the end
- tests for all three
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Igor Lins e Silva <4753812+igorls@users.noreply.github.com>