Room-Relative Noise Floor and One-Turn Antecedents in Foreman
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— newtools/memory_store.py—greetingkey, plus the third_write_settingspreservation clausetools/speak.py— theexceptnow prints exception type and messagetools/router.py—LastSaid, the antecedent token table and prompt rider,last_saidonroute/build_system_prompttools/ui_server.py—/api/settings/greetingand the settings payloadui/index.html— the Wake greeting cardforeman.py— greeting call site, the new brief, antecedent arming and spendingscripts/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.