跪拜 Guibai
← All articles
Android

Andee's Silent Turns: Android Agent Runs Unattended with a Two-Tool Whitelist and an Empty-Result Contract

By booboosui ·
Read original on juejin.cn ↗ Google Translate ↗ Alt translation

The design choices here, whitelist over blacklist, empty output as success, and separating attempt from success timestamps, prevent the invisible retry loops and permission drift that break unattended agent runs in production, a failure mode Western devs building background agents will recognize.

Summary

Andee, an Android agent with its brain on the device, now runs unattended turns triggered by silence. After a configurable quiet period (default 20 minutes) it reviews the recent conversation and writes notes to a local notebook, without any user present. The design is built around four invariants: re-arm after each turn, re-check quietness at fire time, cap daily runs at 12, and recover from process death using a catch-up sweep that distinguishes last attempt from last success.

The permission surface is deliberately narrow. Silent turns may call only tools under the note.* prefix plus a whitelist of two gear methods, and the gate lives in the dispatcher, not the schema, because the schema can't tell who is calling. Empty output is defined as a valid completion, so there is no retry branch for zero results; this matters because a failed harvest previously caused 218 retries about 5 seconds apart until reinstall. The daily budget counts only the optional sweep turns, not the forced harvest, to keep the quota interpretable.

Takeaways
— Andee's silent turns trigger when the conversation has been quiet for a configurable 20 minutes (range 5–240), re-armed after every turn.
— A daily cap limits silent runs to 12 per day by default (0–100, 0 disables).
— Silent turns may only call tools under the note.* prefix plus gear.note and gear.list.
— The permission gate lives in the dispatcher, not the schema, because the schema doesn't know which kind of turn is calling.
— Empty review output is defined as a valid completion; there is no retry branch for zero output.
— A retry loop bug logged 218 attempts about 5 seconds apart until the app was reinstalled.
— Only SWEEP turns count against the user's daily budget; forced HARVEST turns don't, because they're not optional.
— Startup catch-up uses a 'last success' timestamp to distinguish already-reviewed segments from those that died mid-review.
— Limitations: only the local brain supports this, it requires at least 6 messages, folds at most 3 topics, costs money even when empty, isn't an exact alarm, and reads the in-memory conversation.
Conclusions

A blacklist is doomed when tool surfaces evolve; a whitelist forces review for any addition, which keeps the contract auditable rather than merely safe.

Treating empty output as success is the only way to avoid invisible retry loops; the 218-attempt incident is a concrete price of treating emptiness as failure.

Budgeting only optional actions keeps the quota interpretable, even though it makes the bill incomplete. The trade-off is honest: the user controls only what they can control.

Concepts & terms
Unattended turn (silent turn)
A turn an agent runs without any user input, triggered by an internal condition such as a quiet period, as opposed to a turn started by the user speaking or by an alarm.
Sweep vs harvest
Two kinds of unattended turns in Andee: sweep is scheduled by silence, harvest is forced when the context buffer is nearly full; only sweep counts against the user's daily budget.
Source: juejin.cn ↗ Google Translate ↗ Backup ↗