May 27, 2026
Skill Curation Goes Fully Subconscious
Skill suggestion now runs entirely in the background, plus cancel-race fixes and a token-usage overhaul in the brain.
Today’s target was getting skill suggestion out of the user’s way entirely. Chalie has been able to learn new skills from conversation for a while, but the suggestion flow still leaned on the same channel and policy path as normal chat — which meant it could surface summaries, respect cooldowns meant for user-facing actions, and generally behave like something the user needed to babysit. It shouldn’t be. Learning a new skill is housekeeping, not a conversation.
The fix was to give skill curation its own lane. A new SkillManagerAbility extends the existing skill builder but runs as a system-level ability — it bypasses normal policy enforcement because nothing except the background processor is allowed to touch it. The SkillSuggestionMessageProcessor moved onto a dedicated channel, drops the post-turn summary and WebSocket broadcast it used to send, and now treats every run as independent rather than carrying prior context forward. The result: Chalie can propose and refine skills continuously without ever interrupting a session or asking for attention it doesn’t need. It’s a small architectural move with an outsized effect on how invisible the system feels day to day — the best infrastructure is the kind you never notice. Seven new curated bash skills went in alongside it — health checks, media conversion, archive management, process inspection, network diagnostics, disk cleanup, certificate checks — bringing the curated catalog to 73 skills, all framed for personal-assistant use rather than raw sysadmin scripting.
The rest of the day was cleanup with real user impact. The cancel button had a set of race conditions that could leave a turn half-finished or let an old turn’s cleanup clobber a fresh one — fixed by checking for cancellation right after the model responds and between tool calls, rather than waiting for the next loop iteration. Stop got a companion fix: hitting it now visibly undoes the turn — the pending response bubble disappears and your original text reappears in the input box, instead of leaving a dangling half-finished exchange on screen. Mid-conversation message concatenation (typing a follow-up while Chalie is still replying) moved from a frontend patch to the backend, so the turn is cancelled and restarted cleanly with the combined text rather than juggled client-side.
The brain’s token-usage view also got the coverage it was missing. The chart used to only render time slots where data existed, which meant sparse days looked broken. Now every window — day, week, month, lifetime — renders full coverage with zeros filling the gaps, and a table underneath breaks down input/output tokens per slot. A companion fix stopped yesterday’s UTC hours from leaking into today’s table. And every model’s context window is now hard-capped at 200k tokens regardless of what the provider reports, closing a class of payload-size surprises before they happen.
None of this is flashy, but it’s the kind of day that compounds: a background system that gets quieter, a cancel button that finally does what it visually promises, and a usage view you can actually trust. Next up is watching how the subconscious skill loop behaves once it’s had a few days to run unattended.
- Skill suggestion moved to a dedicated background channel — no summaries, no broadcasts, no shared cooldowns with chat
- New system-only
SkillManagerAbilitybypasses policy enforcement so only the background processor can curate skills - 7 curated bash skills added (health check, media conversion, archive management, process inspection, network diagnostics, disk cleanup, certificate checks) — catalog now at 73 skills
- Cancel/stop race conditions fixed: cancellation checked immediately after each model call, stop button visibly undoes the pending turn
- Mid-turn message concatenation moved to the backend for a cleaner cancel-and-restart
- Token-usage table now shows full time-slot coverage with zero-filled gaps; model context window hard-capped at 200k tokens