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 SkillManagerAbility bypasses 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