Summary
The deterministic quick-router extracts the reminder task label only when it comes after the duration ("remind me in 5 minutes to check the oven"). The equally common reversed order, "remind me to check the oven in 5 minutes", loses the task entirely and falls back to the generic label:"reminder".
Steps to reproduce
- Route the utterance
remind me to check the oven in 5 minutes through genie_core::tools::quick::route (the same path genie-ctl chat / the BFCL quick-router harness use).
- Inspect the emitted
set_timer tool call.
Expected behavior
{"name":"set_timer","arguments":{"seconds":300,"label":"check the oven"}}
Same label as the already-supported reversed order remind me in 5 minutes to check the oven, which correctly yields label:"check the oven".
Actual behavior
{"name":"set_timer","arguments":{"seconds":300,"label":"reminder"}}
The task ("check the oven") is silently dropped. reminder_label() in crates/genie-core/src/tools/quick.rs only scans the tokens after the parsed duration unit for a to <label> clause, so when the to <label> clause precedes the duration it is never seen and the generic fallback label is used.
This is a whole class, not a single phrasing — every "remind me/us to in|after " utterance is affected (e.g. remind me to stretch after 90 seconds, remind us to water the plants in 2 hours).
Hardware
Non-Jetson (x86_64 dev / cross-build host)
GenieClaw version / commit
81ea986 (main)
Additional context
This is a tool-dispatch argument-correctness bug: the label argument is wrong, which is exactly what the BFCL local-LLM tool-call scoring measures. The duration (seconds) is already correct; only the label is dropped. Fix should be scoped so the reversed order and the named-timer paths (cookie timer for 12 minutes) stay unchanged, and a bare to <n> <unit> (no task clause) keeps the generic fallback.
Summary
The deterministic quick-router extracts the reminder task label only when it comes after the duration ("remind me in 5 minutes to check the oven"). The equally common reversed order, "remind me to check the oven in 5 minutes", loses the task entirely and falls back to the generic
label:"reminder".Steps to reproduce
remind me to check the oven in 5 minutesthroughgenie_core::tools::quick::route(the same pathgenie-ctl chat/ the BFCL quick-router harness use).set_timertool call.Expected behavior
{"name":"set_timer","arguments":{"seconds":300,"label":"check the oven"}}Same label as the already-supported reversed order
remind me in 5 minutes to check the oven, which correctly yieldslabel:"check the oven".Actual behavior
{"name":"set_timer","arguments":{"seconds":300,"label":"reminder"}}The task ("check the oven") is silently dropped.
reminder_label()incrates/genie-core/src/tools/quick.rsonly scans the tokens after the parsed duration unit for ato <label>clause, so when theto <label>clause precedes the duration it is never seen and the generic fallback label is used.This is a whole class, not a single phrasing — every "remind me/us to in|after " utterance is affected (e.g.
remind me to stretch after 90 seconds,remind us to water the plants in 2 hours).Hardware
Non-Jetson (x86_64 dev / cross-build host)
GenieClaw version / commit
81ea986 (main)
Additional context
This is a tool-dispatch argument-correctness bug: the
labelargument is wrong, which is exactly what the BFCL local-LLM tool-call scoring measures. The duration (seconds) is already correct; only the label is dropped. Fix should be scoped so the reversed order and the named-timer paths (cookie timer for 12 minutes) stay unchanged, and a bareto <n> <unit>(no task clause) keeps the generic fallback.