Skip to content

v0.232.0

Choose a tag to compare

@github-actions github-actions released this 08 Nov 10:01
· 177 commits to main since this release
43d9663

This release makes compaction keep what you told the agent. On 2026-11-07 a long chat on protoEngineer was compacted, and the summary lost the operator's standing release approval. The agent then said nothing would merge while its own scheduled wait was about to merge and tag. ADR 0127 records the incident and the fix. This release also fixes tool failures that ended a turn, Settings dropping models on a slow provider, and a 14–16 second wait on every macOS CLI command.

Compaction keeps your instructions (ADR 0127)

  • Automatic compaction, /compact and the overflow safety valve now share one engine. It reads the whole span being replaced instead of only the last 4K tokens, carries the previous summary forward, and writes notes with fixed sections: your standing instructions and approvals (quoted word for word), the agent's commitments, and its pending scheduled actions.
  • Your own messages survive compaction exactly as written, with the time you sent them, up to about 20K tokens. The newest are kept, and a note points to where the older ones are in the chat archive. Scheduler wakes and other automated prompts are marked as system-generated and never shown as yours.
  • Tool output can no longer pose as you: a line that starts with "OPERATOR:" inside a tool result isn't read as your words, and a long message split across chunks keeps its speaker label.
  • Each turn's working state shows this chat's own pending waits, schedules and watches with their full instructions and a note that they run on their own unless cancelled. Other chats' jobs show only as a count.

A ledger of standing approvals

  • When you approve or instruct something that outlasts the turn, the agent records your words in a per-chat ledger kept outside the transcript, and sees them every turn until it marks them fulfilled or you revoke them.
  • Use /directives to see what a chat holds and /directives revoke <id> to withdraw one, or GET/DELETE /api/chat/sessions/{id}/directives. Only your own chat turns can record or revoke an entry; peer agents, scheduled runs and subagents can't. A console panel comes in a later release (#4861).

Fixes

  • A tool that fails (a command that timed out or couldn't start) now gives the agent an error it can react to, instead of ending your turn (#4871). A refused tool call also counts as an error in per-tool telemetry (#4862).
  • Settings caches each provider's model list for five minutes and keeps the last known list when a provider is slow, so a slow probe no longer empties a model picker (#4858).
  • The macOS CLI answers in about a second instead of 14–16 seconds, and the app's own server starts faster for the same reason. The menu-bar item Install Command-Line Tool… (or protoagent-server cli link) links protoagent onto your PATH (#4865).
  • A large PDF in the Artifact panel no longer freezes the console (#4869).
  • A browser or proxied stream that hangs up early no longer logs a "No response returned" traceback (#4860).
  • Old memory tool names (memory_recall, memory_ingest, forget_memory, memory_stats) still resolve to the new tools wherever a tool list is read, and boot names each skill, subagent or SOUL.md that still uses them (#4859).
  • Operator-profile memories keep their kind after the memory migration, and deleted knowledge no longer leaves vectors behind (#4867). A stray data-version stamp no longer warns on every boot (#4864).
  • Console wait cards show how long they wait and what resumes, without expanding (#4852). Friction rows always carry tool, plugin and tool_unbound (#4857). The hub audits device tokens minted on a member through its proxy (#4683).

Upgrading

  • No config changes are required. A long compaction now makes one summarizer call per chunk, so compacting a very long chat costs more than before and keeps more.
  • The four directive tools (record_directive, list_directives, fulfil_directive, revoke_directive) are always loaded. A plugin that registers its own /directives chat command is now skipped with a warning; /directives belongs to core.
  • On first boot, memories the earlier migration filed under the wrong kind are corrected (a backup is taken first), and orphaned knowledge vectors are removed.

What's Changed

  • feat: Console wait card (1/2): resolveWaitInfo recovers seconds and the resume plan when the 800-char args preview is cut, so the expanded result shows the waiting block, not raw "Wait scheduled:" text (#4852) by @mabry1985 in #4855
  • feat(compaction): one engine reads the whole span with a continuation prompt (S1+S2) by @mabry1985 in #4851
  • docs(adr): 0127 compaction fidelity (S0) by @mabry1985 in #4849
  • feat(working-state): pending schedules and watches scoped to the chat, shown in full (S4) by @mabry1985 in #4850
  • test(compaction): one oversized human message doesn't wipe earlier context (v0.231.0 stress-test regression) by @mabry1985 in #4856
  • feat(fleet): the hub audits a device token minted on a member through its proxy by @mabry1985 in #4863
  • feat(compaction): operator messages survive compaction verbatim (S3) by @mabry1985 in #4853
  • fix(compaction): role lines in the rendered transcript can't be forged or lost (#4851 review follow-up, 1/2) by @mabry1985 in #4866
  • feat: Console wait card (2/2): a successful wait shows "Waiting ~N, resumes with …" under its header without expanding, and stays out of the "N tools" fold chip (#4852) by @mabry1985 in #4868
  • fix(tools): removed memory tool names translate wherever a tool list is read, and boot warns about stale names by @mabry1985 in #4859
  • fix(compaction): chunk budget follows the growing notes and the compaction model's window (#4851 review follow-up, 2/2) by @mabry1985 in #4870
  • fix(friction): every ledger row carries tool, plugin and tool_unbound by @mabry1985 in #4857
  • feat(directives): a per-chat ledger of operator directives and approvals (S5) by @mabry1985 in #4854
  • fix(memory): migrated operator-profile memories keep their kind; prune orphan vectors by @mabry1985 in #4867
  • fix(telemetry): a refused tool call counts as an error by @mabry1985 in #4862
  • fix(tools): a ToolException is a failed call the model sees, not a crashed turn by @mabry1985 in #4871
  • fix(boot): a stray data-version stamp ahead of the running version is diagnosed, not warned about forever by @mabry1985 in #4864
  • perf(artifact): a large PDF no longer blocks the console main thread by @mabry1985 in #4869
  • fix(plugins): reserve /directives as a core chat command (#4854 review, minor b) by @mabry1985 in #4872
  • fix(directives): only operator-originated chat turns can record or revoke a directive (#4854 review, trust) by @mabry1985 in #4873
  • perf(desktop): the bundled CLI starts fast, and the app can link it onto PATH by @mabry1985 in #4865
  • fix(directives): cap the working-state section and never defer the directive tools (#4854 review, minors c–d) by @mabry1985 in #4877
  • docs(adr): ADR 0127 Implementation line, S0–S5 and follow-ups done by @mabry1985 in #4878
  • fix(settings): model options come from a cached provider list and never drop a lane on a slow probe by @mabry1985 in #4858
  • fix(server): a client that leaves early is not an ASGI error; tidy two API rough edges by @mabry1985 in #4860
  • feat(compaction): compaction fidelity (ADR 0127) by @mabry1985 in #4879

Full Changelog: v0.231.0...v0.232.0