March 30, 2026
Refining Identity and Search Reliability
Implemented natural language user summaries, improved trait permanence, and enabled full-text search for document chunks.
Synthesizing Who You Are
Today’s focus was on maturing how Chalie understands and remembers the user. We moved away from a fragmented list of traits toward a synthesized identity. After extracting traits from conversation, the system now triggers a secondary LLM call to produce a single, natural-language sentence summarizing the user’s profile. This summary prioritizes high-confidence and permanent traits—like your name or allergies—over transient interests. To support this, we updated the trait extraction prompt to let the LLM declare whether a fact is permanent (identity) or transient (habits). We also slowed down the decay rates for this knowledge; standard traits now stick around for about a week, while slower-decaying facts last closer to three weeks.
Search and Skill Expansion
We finally enabled full-text search (FTS5) for document chunks. Previously, document retrieval relied entirely on vector similarity. While vector search is great for semantic matching, it often misses specific keywords or technical terms that a traditional index catches easily. By populating the document_chunks_fts table during storage, we now have a hybrid search foundation.
On the intent side, the goals skill was expanded to support an explicit create action. You can now tell Chalie directly to “set a goal to run a marathon,” and it will be tracked with a specific timescale. We also deprecated the standalone web_search tool, inlining its logic into the core search utility to simplify the tool library.
System Hardening and Cleanup
A significant portion of today was dedicated to “spring cleaning” and stability. We fixed a critical crash in the digest worker caused by an invalid Redis connection parameter and resolved an issue where empty search results were being incorrectly flagged as successful tool executions.
The codebase is also much leaner. We cleared out over twenty unused variables and several dead imports across the backend, aided by Ruff and automated refactoring. We also hardened the provider cache to prevent sensitive null values from being persisted when the vault is locked, and ensured that capability tools are properly re-registered during the boot sequence.