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.
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.
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.
len(matches) == 2, never the confirmable 1. The loop is deterministic: same inputs, same tie, same reply, three times or three hundred.commit_assertion takes speakable held-numbers ("commit held 3", CR-2026-127, number-words included); the forget flow's disambiguation PROMPT prints display numbers (#6, #7) that its own answer path cannot consume.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.
"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.
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.