Back to DevLog

Room-Relative Noise Floor and One-Turn Antecedents in Foreman

3 min read

I replaced the fixed absolute energy threshold with a floor measured at startup and kept current by the passive loop's rolling window. The gate had been measuring the room against a number taken from a different room. Measured at three Windows input volumes, there is no setting where speech clears a fixed gate and the idle floor stays under it.

Greeting and Brief

I added a spoken greeting at wake-mode start, before the reminder brief, once per session. Three configurable states under a new greeting key in assistant_settings.json: computed time-of-day default, verbatim custom string, and explicitly silent. Off is an empty custom message, not an absent key, because absent already means default and one field cannot mean two things.

The greeting printed but never spoke. I called say(text, barge_in=False). barge_in is a listener object and "off" is None, so False is not None and it reached the listener branch, calling .watch() on a bool. I fixed the call site and made the swallowing except in tools/speak.say print exception type and message.

The reminder brief stopped reading every item aloud and became a count-plus-status summary. Measured: 9.13 s of synthesis across five utterances became 4.12 s in one, 55% shorter. Overdue compares calendar dates with the clock discarded. due.date() < now.date() is overdue, == is due today whatever the hour. A 9 AM reminder at 10 AM is due today.

Antecedent

"And what are they?" after the brief was refused, correctly, since the router gets one turn and no history. I gave the pronoun a referent for exactly one turn via router.LastSaid, riding the same path the clock and preferences already take. It holds one token from a closed dict and never text. It is spent when a real utterance arrives, not at the routing call, so a registry refusal spends it too.

Commit b9cfae1 added pronoun phrasings to the tool description. A live check showed "Read them out." routing to reminders with nothing said before it. A tool description cannot know what was said before an utterance, so any pronoun it captures it captures always. Deleting the phrase list was not enough. Opening with "Read the reminder list ALOUD" still matched on the verb. I reworded to "List".

Files Changed

  • tools/greeting.py, tools/reminder_brief.py — new
  • tools/memory_store.py — greeting key, plus the third _write_settings preservation clause
  • tools/speak.py — the except now prints exception type and message
  • tools/router.py — LastSaid, the antecedent token table and prompt rider, last_said on route/build_system_prompt
  • tools/ui_server.py — /api/settings/greeting and the settings payload
  • ui/index.html — the Wake greeting card
  • foreman.py — greeting call site, the new brief, antecedent arming and spending
  • scripts/greeting_test.py, scripts/reminder_brief_test.py, scripts/antecedent_test.py — new suites

Barge-in live test passed. The work built in the previous session survived contact with a real room and a real microphone.

Share this post