Skip to content

fix(voice): misfire-guard description for get_current_time - #2033

Merged
liususan091219 merged 5 commits into
mainfrom
fix/get-current-time-misfire-guard
Jul 8, 2026
Merged

liususan091219 merged 5 commits into
mainfrom
fix/get-current-time-misfire-guard

Conversation

@liususan091219

Copy link
Copy Markdown
Collaborator

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_time fires 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

… 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>
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

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>
@john-the-dev

Copy link
Copy Markdown
Collaborator

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 (tsc + tests) is from this change though: not ok 113 — tool-table anchor matches the committed fixture in tests/voice-behavior-anchors.test.ts. That test hashes/snapshots every inline tool's description into tests/fixtures/voice-behavior-anchors.json, so editing get_current_time's description makes the live tool table diverge from the committed fixture.

The test file documents the intended flow for deliberate prompt changes (line 102 + 22):

ANCHOR_UPDATE=1 npx tsx tests/voice-behavior-anchors.test.ts

That regenerates the fixture; commit the updated voice-behavior-anchors.json and call out the one-line description diff in the PR body (as the note asks). CI should go green after that.

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 liususan091219 left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per Susan: misfire counts from the conversation.sqlite audit (7 days to 2026-07-08), one inline comment per guarded description.

Comment thread src/inline-tools.ts
'"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 ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/inline-tools.ts
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 ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Comment thread src/inline-tools.ts
'"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 ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.',

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Comment thread skills/zoom/tools.ts
'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 ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

liususan091219 and others added 2 commits July 8, 2026 15:46
…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>
@liususan091219

Copy link
Copy Markdown
Collaborator Author

@john-the-dev Addressed in 2088968 — fixture regenerated via the documented ANCHOR_UPDATE=1 flow; the anchor now matches the six deliberate description changes (get_current_time, press_key, summon, switch_voice_config, add_to_vault, get_core_status — each carries its audit evidence as an inline review comment on the diff). On the nit: agreed, indirect time asks may under-fire now, and with a 12/14 spurious rate erring toward silence is the intended tradeoff.

@john-the-dev john-the-dev left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

@cla-assistant check

@liususan091219
liususan091219 merged commit 56820d0 into main Jul 8, 2026
7 checks passed
@liususan091219
liususan091219 deleted the fix/get-current-time-misfire-guard branch July 8, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants