Repository navigation
fix(voice): misfire-guard description for get_current_time - #2033
Conversation
… 3 sibling)
3-day trace audit across live voice sessions: 12 of 14 get_current_time
fires were spurious — triggered by 'Shh.', 'Mm-hm.', 'Open a tab', and
'what is the paper about?' (Chi's demo, announced the date instead of
answering). The bare one-line description ('Get the current date and
time. Instant.') gave the model nothing about when NOT to fire; it had
become the confusion fallback. The description now scopes the tool to
explicit time/date asks and instructs firing nothing when unsure.
Sibling of sonichi/sutando-meeting#125 (same audit, voice-server-side
tools). Behavior unchanged; description only.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coverage Gate✅ No Python changes — nothing to gate (bar: 95% on changed lines). |
Owner-ordered follow-up ('search sqlite for any other tools called
without explicitly requesting'). Audit of every tool call paired with
its preceding utterance found these firing unprompted:
- press_key: fired twice on 'Hey Google' (user addressing their Google
speaker; the bot pressed keys on the host) — now excludes speech
addressed to other assistants
- summon: 4/4 spurious ('you're not showing the slide though') — now
routes display complaints to display tools, not Zoom
- switch_voice_config: fired on a sentence about search engines — now
marked HIGH-IMPACT, explicit-switch-only
- add_to_vault: 2/3 spurious ('summarize all the bugs you found' got
vaulted instead of summarized) — capture-intent only
- get_core_status: 3/4 spurious ('Hello') — explicit status asks only
- describe_screen / show_view / slide_control: fired on 'Um' and
'what what what I' — explicit requests only
All description-only; shared clause: when unsure, fire nothing.
Sibling: sonichi/sutando-meeting#125 round 2 (dismiss, open_github_url).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The change itself looks good — the expanded misfire guard directly targets the audited spurious fires, and it's prompt-description-only (no behavior change). The one red check ( The test file documents the intended flow for deliberate prompt changes (line 102 + 22): That regenerates the fixture; commit the updated Nit (non-blocking): 'explicitly asks for the time, date, or day' may also suppress indirect asks like 'how long until noon?' — acceptable tradeoff given the 12/14 false-fire rate; erring toward not-firing is the right call here. |
liususan091219
left a comment
There was a problem hiding this comment.
Per Susan: misfire counts from the conversation.sqlite audit (7 days to 2026-07-08), one inline comment per guarded description.
| '"press tab", "send the message" (Enter), "close the dialog" (Escape), "select all" (Cmd+A), ' + | ||
| '"clear the input" (Cmd+A then Delete). Instant — do NOT use work for simple keystrokes.', | ||
| '"clear the input" (Cmd+A then Delete). Instant — do NOT use work for simple keystrokes. ' + | ||
| 'Call this ONLY on an explicit key/shortcut request. NEVER when the user is addressing another ' + |
There was a problem hiding this comment.
Audit: 2/2 fires spurious. Both on "Hey Google" (07-03 21:03 ×2) — the user was addressing their Google speaker and the bot pressed keys on the host.
| description: 'Get the current date and time. Instant.', | ||
| description: | ||
| 'Get the current date and time. Instant. Call this ONLY when the user explicitly asks for ' + | ||
| 'the time, date, or day. NEVER call it for any other question, on filler ("hm", "okay"), or ' + |
There was a problem hiding this comment.
Audit: 12 of 14 fires spurious (3-day sample; 28 calls over 7 days). Triggers included "Shh.", "Mm-hm.", "Open a tab", "Hm.", and "what is the paper about?" (07-08 05:35 — Chi's demo, announced the date instead of the paper; #118 item 3).
| '"what are you working on", "what are you up to", "are you busy", "anything running", ' + | ||
| 'or similar questions about background work. Instant file read.', | ||
| 'or similar questions about background work. Instant file read. Call it ONLY for those ' + | ||
| 'explicit status questions — NEVER on greetings ("hello"), filler, garbled speech, or as ' + |
There was a problem hiding this comment.
Audit: 3/4 fires spurious. "Hello" (07-03 19:37), "Just completely made up…" (07-04 09:29), "security magnetism of Sutandol" (07-06 18:49).
| '"no-search" = gemini-3.1-flash-live-preview + googleSearch:false (newer model, no Web grounding). ' + | ||
| 'Restart takes ~2-3 seconds during which voice will be silent; the web client auto-reconnects.', | ||
| 'Restart takes ~2-3 seconds during which voice will be silent; the web client auto-reconnects. ' + | ||
| 'HIGH-IMPACT: this restarts the whole voice session. Call it ONLY on one of those explicit switch ' + |
There was a problem hiding this comment.
Audit: 2/2 fires spurious. "Nobody uses the search engine now and why do they care…" (07-05 23:27) and garbled "who has switch to the um" (07-08 12:26) — each restarted the live voice session.
| 'kind="thought" appends a timestamped block to today\'s thoughts file (Sutando/Thoughts/YYYY-MM-DD.md) — use when the user wants to record an idea or reflection rather than a deliverable. ' + | ||
| 'If the user does not specify, prefer "thought" for stream-of-consciousness, "task" if action-shaped (verb-leading or contains "I need to" / "remind me to"), "note" for everything else.', | ||
| 'If the user does not specify, prefer "thought" for stream-of-consciousness, "task" if action-shaped (verb-leading or contains "I need to" / "remind me to"), "note" for everything else. ' + | ||
| 'Call this ONLY on an explicit capture request. A request to summarize, explain, or answer something is NOT a capture — do that instead. NEVER call it on filler, garbled speech, or as a guess when unsure; fire nothing instead.', |
There was a problem hiding this comment.
Audit: 2/3 fires spurious. "summarize all the bugs you found" (07-03 12:05 — vaulted instead of summarizing) and "Okay, I don't know what you're doing right now…" (07-03 21:07).
| 'Use when user says "summon", "share my screen", "start zoom", "let me see your screen". ' + | ||
| 'Instant — do NOT use work for this.' + | ||
| 'Instant — do NOT use work for this. ' + | ||
| 'Call this ONLY on one of those explicit requests. A complaint that something is not visible ' + |
There was a problem hiding this comment.
Audit: 4/4 fires spurious. "you're not showing the slide though" (07-04 16:47), "I don't see the slides…" (07-04 20:26), "No no no, the slides are already generated…" (07-04 20:27) — each opened Zoom instead of fixing the display.
…ner scope) Per Susan: only tools EASILY called by mistake keep the guard clause. Removed the guards from describe_screen (1/1 fire), show_view (1/1), and slide_control (2/5 — majority-legit usage). Kept: get_current_time (12/14 spurious), press_key (2/2, both 'Hey Google'), summon (4/4), switch_voice_config (2/2), add_to_vault (2/3), get_core_status (3/4). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…hanges ANCHOR_UPDATE=1 per the test's documented flow — the misfire-guard description edits (get_current_time, press_key, summon, switch_voice_config, add_to_vault, get_core_status) are deliberate prompt changes; the fixture now anchors the new wording. Addresses Rui's review (CI 'tool-table anchor' failure). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@john-the-dev Addressed in |
john-the-dev
left a comment
There was a problem hiding this comment.
Fixture regen looks correct — every modified description in the source is reflected exactly in voice-behavior-anchors.json. The misfire guards read clearly and the "when unsure, fire nothing" pattern is consistent across all 6 tools. LGTM.
|
@cla-assistant check |
Sibling of sonichi/sutando-meeting#125 (issue sutando-meeting#118 item 3), owner-ordered 2026-07-08.
3-day trace audit across live voice sessions: 12 of 14
get_current_timefires were spurious — triggered by "Shh.", "Mm-hm.", "Open a tab", and "what is the paper about?" (Chi's guest demo — the bot announced the date instead of answering the paper question, #118's item 3).The bare one-line description ("Get the current date and time. Instant.") gave the model nothing about when NOT to fire, so it became the confusion fallback. The description now scopes the tool to explicit time/date asks and instructs firing nothing when unsure. Description-only; no behavior change.
🤖 Generated with Claude Code