DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path phases/open-engagement-intent/loomworks-open-engagement-intent-completion-record-v0_1.html

DUNIN7 · Loomworks · Completion Record

Spoken open/close intents

Record version. v0.1
Date. 2026-06-26
Change Request. CR-2026-124 — Spoken "open X" and "close" intents — v0.2
Status. Executed on branch cr-2026-124-open-engagement-intent through Step 3; suite green at every step; 8-step spoken-loop database-truth walk passed; anti-theft exercised with a live key. NOT pushed — halt before push, awaiting Operator authorization.
Executing agent. Claude Code on DUNIN7-M4.
Operator. Marvin Percival.
Grounded by. CR-2026-124 v0.2 (Step 0 §2); the merged CR-2026-123 spine (engine 6f785f9, alembic 0095) supplying resolve_engagement_handle + set_current_engagement.

Plain-language summary

This is the spoken half of the current-engagement spine. CR-2026-123 made the engine able to resolve an engagement handle and set it as your current focus, but only through a direct endpoint call. This CR teaches the Companion the spoken triggers: say "open Goosey" (or "open 7", or "open E0007") and it takes you into that project; say "close" and it clears where you are. With both CRs merged, the full loop works — "open Goosey," then "commit held 14" lands in Goosey without re-naming, then "close" and the next unqualified instruction makes the Companion ask which project.

v0.2 folded a spoken "close" in alongside "open X," so this CR adds two intents. The risk in touching the live classifier is intent theft — a new intent capturing utterances that should mean something else, especially the common "close" family. That was checked empirically with a live key: the two new intents classify correctly and eight existing intents still classify as themselves. No tuning was needed.

What shipped (per-step commits; suite green at each)

Branch cr-2026-124-open-engagement-intent off the CR-2026-123 merge 6f785f9. Not pushed. No schema change (classifier-only).

CommitStepChange
4a1a1290Archive CR v0.2 as branch base (baseline 6f785f9, suite 2966/46, alembic 0095).
5e5d89a1open_engagement + close_engagement in IntentLabel (23 → 25); two classifier blocks + the open_engagement PARAMETER EXTRACTION line (the close block carries a disambiguation note vs orient and vs a confirmation turn); two instruction .md; both enumeration guards 23 → 25.
d104c882_route_open_engagement (resolve → set focus → confirm; ambiguous-before-miss catch order) + _route_close_engagement (clear focus) + dispatch branches; helpers _engagement_display_name / _ambiguous_open_message. All replies server-composed.

Suite: baseline 2966 → Step 1 2966/63 → Step 2 2973 passed, 0 failed, 63 skipped. The skipped count is 46 baseline + 17 new LLM-classification tests (@skip_no_llm_key) that skip in the keyless gate. No migration.

Anti-theft — exercised with a live key (the Step 1 care-point)

The classification + anti-theft tests (tests/test_cr_2026_124_open_close_intents.py) are LLM-dependent (the test_classifier.py pattern: @skip_no_llm_key). They skip in the keyless suite, so they were run directly against a live Anthropic key (from the repo .env) to exercise the anti-theft loop the CR anticipated:

17/17 passed with the key. No tuning halt was needed (the expected "close"-collision halt did not fire).

Report (CR §5)

8-step spoken-loop database-truth walk (CR §3 Step 3) — playground_dev, rolled back

  1. "open GooseyW" → focus set → an unqualified note (converse-default → focus) lands in Goosey — PASS (spine + voice end to end).
  2. "open 7" → sequence-7 engagement — PASS
  3. "open E996042" → focus (delegated) — PASS
  4. "open 0" → Personal — PASS
  5. "open Notes" (two) → candidates ("your number 3 or your number 4"), focus unchanged; follow-up "open 3" sets the sequence-3 one — PASS
  6. "open Nonexistent" → plain not-found, focus unchanged — PASS
  7. "close" → focus cleared → the next unqualified note → router no_project (asks), nothing in Personal — PASS
  8. Classifier anti-theft — verified in Step 1 with the live key (17/17) — PASS

Open after this record

Halt before push — Operator authorization required

The branch (3 commits, 4a1a129..d104c88) is not pushed. On your review and explicit authorization, push CR-2026-124 (merge --no-ff to engine main). With both CRs pushed, the full spoken open/close loop is live.

State at completion