DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-218-forget-ordinal-answer-v0_1.md

CR-2026-218 — The forget disambiguation hears its own numbers (B-102) — v0.1

Version. 0.1 Date. 2026-08-15 Author. Claude.ai, drafted against the B-102 build-list entry (v0.87+, filed from inspection-briefs/loomworks-personal-memory-probe-duplicate-shane-v0_1). Repository. loomworks-engine. Build-list item. B-102 (full close).


Plain-language summary

When the Operator asks the Companion to forget something and more than one memory matches, the Companion lists the candidates with display numbers ("#6", "#7") and asks which one. But the answer path cannot hear those numbers — it matches the reply against memory content only, so answering "#7" or "Number 7" fails, and byte-identical duplicates tie every content signal forever. Observed live: three attempts, three identical replies, deterministic dead end. The fix is an import, not an invention: CR-2026-127 already shipped a speakable-number parser (number-words included) for the commit flow. This change request wires that same parser into the forget disambiguation's answer turn. Content matching stays for everything else. No decision needed from the Operator.


0. Established facts (from the filing; verify current at Step 0)

1. Scope

In scope. The ordinal answer path in the forget disambiguation: when the reply parses as a speakable number via CR-127's parser and that number is among the listed candidates, it resolves the match. Content matching remains the fallback for non-numeric replies. Tests per §3.

Out of scope. B-103 (duplicate-accepting capture — design-adjacent, not to be decided as a side effect of this matcher fix, per its own filing). B-104 (separate CR). Any change to the disambiguation prompt's wording or to CR-127's parser itself — if the parser needs generalizing to be shared, the sharing is a mechanical extraction, not a behavior change, and any behavior change HALTS for a ruling.

2. Steps

Step 0 — branch and verify. Branch cr-2026-218-forget-ordinal-answer. Verify CR-2026-218 unclaimed in loomworks-record; HALT if claimed. Locate the current _match_assertions_for_forget and CR-127's speakable-number parser; confirm the filing's shape holds (content-only matching, confirm branch needs exactly one match, parser accepts digits and number-words). Report locations. HALT if either shape has changed.

Step 1 — the wiring. In the disambiguation answer turn: parse the reply with CR-127's parser first; if it yields a number that maps to a listed candidate's display number, that candidate is the match. Otherwise fall through to the existing content matching unchanged. The mapping must use the same display numbers the prompt printed — the prompt and the answer path must share one numbering source, not compute numbers independently.

Step 2 — tests.

Step 3 — quality gates. ruff zero-tolerance; mypy message-level non-regression.

Checkpoint A — after the green run, before tag and push. Gate string: GATE A APPROVED — PROCEED for CR-2026-218. Live verification uses a synthetic engagement and the Marvin-Test2 persona per the instrument notes — never shared test engagements, never the personal engagement. The report includes the live walk: create the duplicate pair, trigger the disambiguation, answer by number, observe the resolution.

3. Acceptance

  1. The Shane-probe dead end is closed: byte-identical duplicates are distinguishable by the numbers the prompt itself prints.
  2. Non-numeric replies behave byte-identically to pre-fix.
  3. Suite green at the zero-failures baseline; ruff clean; mypy at baseline.
  4. Build list v0.92+ closes B-102 (new file alongside the current version — verify the highest version at write time, do not assume).

4. Discipline

Stage by explicit path, never git add -A. Re-verify HEAD before each write. Halt before every push. One session, one repository. An early gate string is asked back, not banked.


DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-218 — forget ordinal answer — v0.1 — 2026-08-15