- A collection built for another corpus set is refused with a stale-index
error on every read (listing included), not answered with an empty page.
- --after/--before ages parse on char boundaries and overflow is an error.
- Tests for inclusive span bounds, scroll order/filter, nearest filter and
the corpus and ts_end_ms indexes; all ten surviving mutants now caught.
- index/tests.rs keeps the base file's CRLF endings (diff is content only).
- Drop the exclusion claim from the CLI help; document the listing limit.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
`huginn chat search [TEXT]... [--room R]... [--after T] [--before T] [--top-k N] [--json]`;
T is an RFC 3339 instant or an age (6h, 2d), one parser. The render prints the
organ's header line per hit and each message verbatim with its event id, and a
truncated listing ends with the --after that continues it. chrono moves from
dev-dependency to dependency of eureka-state (already in the lock graph).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Probe: the deployed Qdrant answers 1.17.1 at 127.0.0.1:6333 (>= 1.8: integer
range payload indexes and scroll order_by exist).
Wire: SearchChat / Chat, ChatQuery (door-checked by field), ChatHit with no
optional room_id, event ids or timestamps, published schemas regenerated.
Index: corpus payload on every point (forge searches must corpus=forge), chat
payload codec derived from the messages, keyword and integer indexes, upsert_chat
/ chat_nearest / chat_scroll on Qdrant and the fakes. CORPUS becomes
forge:GameCult+chat:rooms, so the existing meta mismatch rebuilds the forge index
once at deploy. sources::search_chat shares the identity check and fuse with
the forge search; chat rides the same queue (SourceAsk) and Found::Chat.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>