March 19, 2026

The Great Card Purge

Refactored the ACT pipeline to remove rigid card-based UI in favor of tool-agnostic outputs and dynamic tool discovery.

Decoupling UI from Logic

Today was a massive cleanup day. We realized that our card-rendering infrastructure—while visually polished—was becoming a significant architectural bottleneck. By requiring specific services for document cards, list cards, and scheduler cards, we were violating the core tool-agnostic principle of the project. The backend was spending too much effort worrying about frontend layout.

I’ve stripped out the card_renderer_service and its associated skills. Instead of these rigid UI structures, tools now return plain text or HTML via a simplified output_service. This moves the responsibility of presentation back to the client and keeps the intelligence layer focused on intent and data.

Dynamic Tool Discovery

To replace the hardcoded card logic, I introduced the find_tools innate skill. This allows the ACT (Action-Context-Task) loop to dynamically discover tools based on the current goal rather than relying on pre-defined UI triggers. This makes the agent much more flexible; it can now search for the right capability on the fly.

Streamlining the Pipeline

I also took the opportunity to simplify the task state machine. I ran a migration to remove the ‘proposed’ state from the persistent_task_service. We found that the friction of a proposal phase often got in the way of execution; if the intent is clear, Chalie should just move to act.

Related updates include:

  • Thread Management: Enhanced thread_service with better context management to ensure the agent doesn’t lose the plot during long-running tasks.
  • Voice API: Improved audio handling to support the new output flow.
  • Orchestration: Cleaned up the act_orchestrator and goal_inference_service to reduce latency between thought and action.