DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path scoping-notes/loomworks-personal-recall-scoping-note-v0_1.md

Loomworks — first-class personal-recall — scoping note — v0.1

Version. 0.1 Date. 2026-06-10 Status. Scoping note — grounds the CR for a first-class personal-recall capability (Fix B). Drafted from the Step 0 inspection (read-only, against engine main a41ebf5). Awaiting Operator review before the CR is drafted. Technical-consumer document — Markdown primary. Author. Claude.ai (scoping) on direction from Marvin Percival (DUNIN7 Operator). Relates to. The personal-memory reach divergence diagnosis (E0005 vs E0060, this session); the orient capability (CR-2026-099) whose responder-bypass exposed the fragility; the memory=recall reframe (seed-level candidate — explicitly NOT triggered by this work; see §7).


Plain-language summary

The Companion is supposed to recall the Operator's personal facts — birthdays, preferences, who's who — from any engagement, because personal memory is committed as cross-engagement. A browser session showed it failing: asked "birthdays" in one engagement it returned the list (from personal memory); asked the same word in another engagement it returned a menu and no birthdays. Same word, same person, same personal-memory store — different result.

The diagnosis: personal-memory storage is correct and cross-engagement, but personal recall has no first-class capability of its own. It's emergent — it works only when a turn happens to reach the responder, which then reads a personal-memory block dumped into its prompt. When the same query misroutes into a responder-bypassing intent (orientation), recall silently fails. And even when it works, the block is loaded only for engagement-scoped turns and is budget-clipped, so old facts can drop silently.

This work makes personal recall first-class and reliable: a routed, retrieval-backed recall_about_me intent that mirrors the existing engagement-recall intent (ask_about_past_input), pointed at the personal store. It reads the personal engagement directly (works regardless of scope), retrieves the committed personal facts authoritatively (no silent clip), and the Companion composes the answer from them. Plus the classifier guidance that makes the intent fire reliably for the queries it should, and a complementary tightening so bare topic words stop being stolen into orientation.

Recall is retrieved wholesale — the complete set of the Operator's personal facts. Any future topic-filtering is a subset of that complete set; the foundation is the whole, retrieved authoritatively.

This is the engineering fix that honors the cross-engagement commitment. It is not the memory=recall seed reframe (§7) — it makes recall reliable and complete, without making the seed-level claim that recall is the product. That reframe stays separate, Operator-commissioned future work.


1. The problem (grounded)

Personal memory is committed as cross-engagement: person-scoped facts that travel across all the Operator's engagements (classifier: remember_about_me — "Person-scoped: the fact travels across all the Operator's projects"; functional spec §4.1: personal Memory loads alongside every engagement turn by default). The storage honors this — personal facts are committed assertions on the person's invisible personal engagement (Phase 41), the same assertion model as engagement Memory, keyed to the person, not to any engagement. The same store loads identically from every engagement.

But recall diverged: "birthdays" surfaced personal facts in engagement E0005 and not in E0060. The cause is classification/routing, not storage:

Two further fragilities make even the responder path unreliable (Step 0 flags): the personal-memory block loads only when project_id is not None (project-less converse surfaces none), and it is budget-clipped newest-first (~500 tokens) so old facts drop silently.

Verdict: a real bug against the committed cross-engagement recall, whose locus is that personal recall has no first-class, reliable capability of its own.

2. The design — mirror ask_about_past_input at the personal store

The fix is not a new pattern. ask_about_past_input is already a retrieval-backed, responder-composed recall intent for engagement memory: it classifies → dispatches to a handler → the handler runs list_assertions(engagement_id, committed) → packs results into operation_data → the responder composes from that. A personal-recall intent is the same shape with three swaps:

This is the house-standard recall shape, pointed at the personal store. It makes personal-recall and engagement-recall siblings — architecturally consistent, not bespoke. It reads the personal engagement directly (works regardless of scope, removing the project_id gate) and puts the recalled facts authoritatively into operation_data (removing the budget-clip fragility — the responder composes from the retrieved facts, not from a clipped prompt block).

Wholesale retrieval (v1, confirmed). Recall retrieves the complete set of committed personal assertions — the whole. The responder composes the answer from the complete set (picking out "Lisa's birthday" for a Lisa query, or listing all for "what do you know about me"). Any topic-filtering is a subset of this complete set — a future optimization for scale, never a capability the wholesale path lacks. The complete set is the correct foundation; subsetting narrows it, never extends it. (The deterministic matcher _match_assertions_for_forget exists and could back a future topic-filter, but v1 does not use it — wholesale is complete and correct.)

3. The load-bearing part — classifier guidance

Step 0's emphatic finding: the whole bug is a classification miss; the handler is mechanical. The routing/handler changes make the correct classification reliable once it lands — but the classifier reliably picking recall_about_me for the queries it should is the substance. The classifier work:

4. Complementary fix — tighten orient (independent, defense-in-depth)

Independently of the recall intent, tighten orient's classification so bare topic words do not get stolen into the responder-bypassing orient path. This is classifier-guidance-only (the orient section + the no-match default, which already says bare/ambiguous input should fall to general_conversation, not orient). The two changes compose:

Defense-in-depth: even if classification of the new recall intent is imperfect at the edges, a bare personal noun that misses recall_about_me should fall to general_conversation (which reaches the responder and the block), never to orient. The orient bypass should never be the landing for a recall query.

5. Scope

In scope:

Out of scope (deferred, named):

6. Build shape (for the CR)

The orientation rhythm: Step 0 (done — this inspection) → CR → build with checkpoints.

7. Not the seed reframe (explicit)

This work makes personal recall first-class by mirroring an existing recall intent (ask_about_past_input) — a consistency fix, not a new commitment. It does not make the seed-level claim that recall is the product (the memory=recall reframe). That reframe — and the relevance/topic-filtering vision it carries — stays separate, Operator-commissioned future work. This CR advances the reframe (recall becomes first-class and reliable) without requiring the seed to change. Decoupled by Operator direction.

8. Open calls for Operator review

  1. Intent name: recall_about_me (mirrors remember_about_me / forget_about_me). Alternative: recall_personal. Lean: recall_about_me (the about_me family is established).
  2. Wholesale confirmed (§2) — recall the complete personal set; topic-filtering deferred as a subset optimization. (Operator-confirmed.)
  3. Decoupled from the seed reframe (§7) — scoped as the engineering consistency fix. (Operator-confirmed.)

DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — first-class personal-recall — scoping note — v0_1 — 2026-06-10