Document. loomworks-topic-filtered-recall-step-0-inspection-brief-v0_1
Version. v0.1 — 2026-07-28
Status. Step 0 inspection brief for CC. Read-only; no edits, no commits to code repos. Precedes CR drafting per step-0-before-drafting discipline.
Governing scoping note. loomworks-topic-filtered-recall-scoping-note-v0_1 (scoping-notes/). Operator decisions settled 2026-07-28, all four at the note's defaults: (1) Tier 1 now / Tier 2 after the recordable-facts investigation; (2) engagement path first, personal recall stays wholesale; (3) zero-match answers honestly and offers the record, no silent recency fallback; (4) the no-live-recall-demonstration rule relaxes to keyword-shaped probes only when Tier 1 lands.
Prior grounding (2026-07-28, engine main 1aac815). _PAST_INPUT_LIMIT = 50 at router.py:119, sole use :1548 in _route_ask_about_past_input (:1529–1563); _route_recall_personal :1566+ wholesale with CR-2026-129 delegated faithful readout; _format_past_input at prompt.py:481–492; intent labels at classifier.py:94–103; zero FTS artifacts repo-wide per the venture-diligence V5.
Build shape being verified. A PostgreSQL full-text search path (tsvector + GIN, ts_rank) replacing the 50-recent window on engagement recall with query-driven selection over the complete committed set, honest-selection readout, migration-bearing.
Run all verifications against current engine main; report the SHA first and note any drift from 1aac815.
list_assertions or a sibling
Ask. Whether Tier 1's search query extends list_assertions (new optional params) or lands as a sibling query function.
Look at. engagement/assertions.py (or wherever list_assertions lives): full signature; how many call sites across the engine and what params each passes; whether it already composes optional filters. The assertions table model: the content column's name and SQLAlchemy/Postgres type; existing indexes on the table.
Evidence expected. Signature verbatim; call-site count with paths; content column type; index list.
Verdict criteria. HOLDS-extend if list_assertions composes filters cleanly and call sites are few enough that an optional search_query param is low-blast-radius. HOLDS-sibling if it's a hot many-caller path — a dedicated search_assertions beside it is cleaner. Report a recommendation either way.
Ask. Current alembic head on the repo and on playground_dev, for the GIN-index migration.
Evidence expected. Head revision id both places; confirm single head. Note whether the assertions content column is plain TEXT (expression index / generated column both viable) and the table's row count on playground_dev.
Ask. _route_ask_about_past_input today takes (person, engagement_id, db) — no utterance. Tier 1 needs the Operator's question text at the route to derive search terms. Verify the dispatch plumbing: how routes that DO consume the utterance receive it (e.g. _route_remember_about_me extracting facts), and what the dispatch at router.py:~3832 passes.
Evidence expected. The dispatch call verbatim for ask_about_past_input and for one utterance-consuming route; the parameter name(s) carrying the operator message; whether adding the utterance to _route_ask_about_past_input's signature is a dispatch-table one-liner or touches a shared route contract.
Verdict criteria. HOLDS if the utterance is available at dispatch and threading it in is local. BREAKS if routes structurally cannot see the utterance (would reshape the CR).
Ask. Whether the engagement path's reply is responder-composed (current: _format_past_input renders a numbered list into the prompt) and whether the honest-selection readout should follow CR-2026-129's server-composed delegated_response mechanism (as recall_personal does) or stay responder-composed with matched/total counts in operation_data.
Look at. prompt.py:481–492 and the intent dispatch :648–649; the CR-2026-129 delegated-response mechanism in _route_recall_personal; the Tier-2 prompt-assembler alignment comment at router.py:116–118 (does anything else assume the 50 alignment?).
Evidence expected. Both paths' shapes; anything that would break if the engagement path returns a ranked subset with matched_count + total_count instead of the recency window; whether the Tier-2 prompt-assembler limit is coupled to _PAST_INPUT_LIMIT in code or only in the comment.
Ask. tests/test_cr_2026_129_recall_truthfulness.py:182–202 asserts ask_about_past_input is deliberately untouched, "carved out to the semantic-recall foundation." Report verbatim what it asserts, so the CR revises it alongside the route change rather than tripping on it.
Evidence expected. The assertion block verbatim; any other tests pinning the recency-window behavior (start from the 12 modules listed in recall-path-file-list-v0_1.txt).
Ask. One grep at current main: to_tsvector, tsquery, ts_rank, pg_trgm, websearch_to_tsquery across src/ and migrations/. Expected: zero hits (confirms the venture-diligence V5 at the current SHA; a hit means precedent to align with).
Ask. How the Operator's question becomes a tsquery. Report whether Postgres websearch_to_tsquery('english', <utterance>) is viable on the target Postgres version (report the version on playground_dev) — it tolerates natural-language input directly, which would make term extraction a no-op at the route. If the Postgres version predates it, report plainto_tsquery as the fallback.
Evidence expected. Postgres server version; a live SELECT websearch_to_tsquery('english', 'what did I say about the vesting schedule?') result on playground_dev.
One report file, loomworks-topic-filtered-recall-step-0-report-v0_1.md, verdict-per-verification, evidence verbatim where asked, dropped in /Users/dunin7/Downloads/ and committed to loomworks-record inspection-briefs/ alongside this brief (halt before push). The CR drafts from the report in a fresh session.
DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — topic-filtered recall (Tier 1) — Step 0 inspection brief — v0.1 — 2026-07-28