March 30, 2026

Chalie Dev Log: Goals, Traits, and FTS Fixes

The Goals skill now supports explicit goal creation, accepting a description and timescale

The Goals skill now supports explicit goal creation, accepting a description and timescale. Tests related to a removed proactive hook infrastructure were cleaned up in this update.

A new feature synthesizes a one-sentence summary of user traits using an LLM after trait extraction. This summary is stored as a fact and is used by prompt_assembly for trait inclusion.

Trait extraction now dictates whether a trait is permanent or transient using a permanent: true/false field in the prompt. Decay rates for traits have also been adjusted, with standard, slow, and fast rates modified.

Full-text search capabilities were restored by ensuring inserts into the FTS5 virtual table (document_chunks_fts) during chunk storage, complementing vector similarity search.

Programmatic scheduler items are now hidden in the caldav handler and filtered by the scheduler service. The trait extraction prompt was hardened to enforce atomic values.

The web_search tool was deleted, and its logic was inlined into search/fetcher.py. A bug fix ensures trait extraction runs correctly even after unified path refactoring.

Several bugs were addressed, including a digest worker crash resolved by changing a connection keyword argument, and corrections to how empty search results are recorded as success.

The trait extraction prompt was simplified by reducing the number of examples and explicitly mandating the use of the ‘occupation’ key.

  • Goals skill supports explicit goal creation with description + timescale.

  • LLM synthesizes user summary from extracted traits, stored as a system fact.

  • Trait extraction now includes LLM-determined permanence status and adjusted decay rates.

  • FTS5 virtual table now receives inserts, enabling full-text search for document chunks.

  • The web_search tool was deleted and its functionality inlined into search/fetcher.py.

  • Trait extraction prompt was simplified and constrained to use the ‘occupation’ key.