June 11, 2026
Every tool learns to fail out loud
A full sweep forces nine tools onto one honest error contract while episodic memory gets a bi-temporal schema, absolute decay math, and full-KNN retrieval.
Today was about trust — specifically, whether the model can trust what its own tools tell it. For a while, a failed tool call could come back dressed as a success: a bad permission string, an invalid graph key, a validation miss, all wrapped in ok(...) because nobody had gone through and made the failure paths honest. That’s a quiet tax on every reasoning loop built on top of it — the model retries the wrong thing, or believes a write happened when it didn’t. I spent the day closing that gap across nine tools, then shipped the first real slice of a bigger memory rebuild.
The pattern repeats deliberately: file permissions, MCP manager, skill search, save-to-graph, pattern saving, weather, vision, code execution, and the review/transcript pair all move onto the same ToolResult contract. Kebab-case error codes replace the placeholder code="error", an ACTION_REQUIRED pre-gate rejects missing parameters before run() even starts, and success bodies count what actually happened instead of returning a bare {"ok": true}. Save-to-graph now distinguishes {"saved":1} from {"saved":0,"deduped":1} — writing something new versus recognizing it already exists, a difference that used to be invisible. File permissions got real chmod grammar to match examples that had been promising it for months: octal, symbolic clauses like u+rwx,go-w, and plain-English intent keywords like executable or owner-only.
Weather and vision were the trickiest fixes, because they were mostly honest already — which made the remaining lies more dangerous. Weather with no device location and no named city used to exhaust its entire fallback chain, reach no provider, and still report provider-unreachable: Unknown error. It now short-circuits to missing-location before touching the cache, and a stale-but-real cached reading returned when every live source is down now carries stale=true so the model can tell degraded data from fresh. Vision’s OCR fallback gets the same treatment — degraded=true when there’s no vision provider configured and it’s silently reading text instead of seeing the image. Code execution went further still: anything that actually ran now returns CPython-faithful results (stdout, stderr, exit_code, duration_ms), with real error codes reserved for runtime failures like timeouts or a crashed sandbox. The two review tools, which had quietly duplicated their entire anchor-parsing and windowing logic, merged onto one shared base class and stopped guessing success from string prefixes.
The other major move: episodic memory’s redesign landed in three tranches. The schema foundation adds hierarchy levels, a relevance clock, and bi-temporal valid_from/valid_to fields so facts can be properly superseded instead of silently overwritten — backfilled deterministically on boot, so no manual migration is ever required. Decay becomes an absolute exponential law anchored on last-relevant-time with per-level half-lives, replacing a compounding multiply-down that had flattened nearly the entire corpus to a floor value. And retrieval drops its adaptive-radius pipeline entirely in favor of full-KNN vector search with normalized, per-lane scoring and a relative floor that cuts weak results instead of padding results to a fixed count. Alongside it, the subconscious worker’s idle-gate clock — which used to live only in memory and reset to zero on every restart, quietly starving background maintenance — now persists durably and rehydrates on boot.
None of this changes what Chalie can do today. It changes whether Chalie can trust its own hands while doing it, and whether its memory ages the way memory should — which is the precondition for everything more ambitious coming next.
-
Nine tools (file permissions, MCP manager, skill search, save-graph, save-pattern, weather, vision, code execution, review/transcript) migrated to the ToolResult contract — kebab error codes, pre-gated missing params, honest success bodies
-
File permissions tool gained three permission grammars — octal, chmod-style symbolic, and intent keywords — closing the gap between its documentation and its validator
-
Weather and vision stopped masquerading degraded results as clean ones, surfacing
missing-location,stale=true, anddegraded=truedirectly to the model -
Episodic memory redesign shipped in three tranches: bi-temporal schema foundation, absolute exponential decay with per-level half-lives, and full-KNN retrieval with normalized scoring
-
Worker maintenance clocks now persist durably across restarts instead of resetting on every deploy
-
The two review tools merged onto one shared base, and 35 related test suites consolidated onto a shared base with zero behavior change