DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path inspection-briefs/loomworks-personal-memory-probe-duplicate-shane-v0_1.md

Personal-memory probe — the duplicate that cannot be removed — v0.1

Date. 2026-08-15 · Mode. READ-ONLY — report, not fix. Engine at 1adcd17 (deployed), production data. From. The Operator's probe on E0128: "List birthdays" → 8 personal facts correctly recalled (personal memory works); Shane listed twice, identically, #6 and #7; three removal attempts, three identical disambiguation replies, no progress.


1. Two distinct assertions — a duplicate write, not a rendering bug, and not corrections-preserved

The personal space (E0030) holds two independent assertion objects with byte-identical content "Shane's birthday is October 30.": b9fcdc74 (held 2026-05-12, committed 2026-05-16 11:26) and a8dd46ea (held AND committed 2026-05-16 07:52–07:53). The Operator told it twice, four days apart; both captures were accepted and both were committed. Corrections-preserved is not implicated: neither assertion supersedes the other — there is no correction link, just two identical committed facts. The supersession-offer behavior the Aug 14 walk observed ("Held 2 might supersede Held 1 — update?") did not fire in May; whether it postdates these captures or checks only within a conversation, the record shows no offer was made. A duplicate write, accepted by the machinery of the time.

2. The disambiguation cannot be answered — BOTH hypotheses are true at once

The removal matcher (_match_assertions_for_forget, router.py:3645) resolves the Operator's words against candidate CONTENT only, in two passes: substring match, then token-overlap scoring (digits kept). The confirmation branch requires is_confirmation_turn AND len(matches) == 1, and each turn re-derives matches fresh from the new utterance.

The shape, named: the only assertions that strictly need a removal path are identical duplicates — and identical duplicates are precisely what a content-only matcher cannot distinguish. The prompt asks a question with no answerable answer: it offers ordinals as the disambiguator and then scores the reply against content where ordinals mean nothing. The Operator's class name fits: a question whose every answer regenerates the question.

3. The count — honest today, structurally a slice

"The 8 things I have recorded about you" counts len(memories) from a list_assertions page with _PERSONAL_RECALL_LIMIT = 500 — and the personal space's true committed count is exactly 8, so today the sentence is true and complete. Structurally it is a slice count: the handler receives total from the same call and ignores it; at 501 committed facts the sentence would silently claim completeness over a truncated set. Latent, not live — the composition itself (CR-2026-129's recall-truthfulness discipline: the message derives from the real set, cannot name a memory not in it or misstate the count) holds for what it loads; the claim-of-completeness-over-a-limit is the unguarded edge. One comparison (total > len → "the N most recent") closes it whenever it ranks.

Candidate items, for the Operator's ruling — none filed (report-don't-fix)

  1. The unremovable duplicate (the probe's blocker): wire the ordinal into the forget flow's disambiguation answer — the CR-127 speakable-number vocabulary, imported to the one prompt that prints numbers it cannot read. Small; the matcher keeps content matching for everything else.
  2. The duplicate write (the origin): whether committed-vs-new duplicate detection should exist at capture (the walk's supersede-offer, extended to committed facts) — design-adjacent, B-98-face-2's neighborhood.
  3. The slice-count edge (latent): the one-comparison honesty guard on the recall count.

DUNIN7 — Done In Seven LLC — Miami, Florida — personal-memory probe — v0.1 — 2026-08-15 Two identical facts, one question no answer can answer: the prompt offers numbers its own matcher cannot hear.