This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+1 more
Summary
AI summaryUpdates Bug Fixes, Refactoring, and Performance across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
Error event payloads now use canonical {message, raw} shape and are classified via classifyAdapterError. Error event payloads now use canonical {message, raw} shape and are classified via classifyAdapterError. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
Canonical AgentEvent.data contract documented per-type data shapes for output, tool_call, command, file_change, error, and done events. Canonical AgentEvent.data contract documented per-type data shapes for output, tool_call, command, file_change, error, and done events. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Performance | Medium |
`firstLineTrunc` fast path short-circuits for single-line input, skipping unnecessary splits and allocations. `firstLineTrunc` fast path short-circuits for single-line input, skipping unnecessary splits and allocations. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Performance | Medium |
`summarizeToolResult` now reuses a single split of content instead of performing two separate splits. `summarizeToolResult` now reuses a single split of content instead of performing two separate splits. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Bugfix | Medium |
Pi adapter aggregates per-character text_delta updates into a single canonical output event on text_end. Pi adapter aggregates per-character text_delta updates into a single canonical output event on text_end. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Pi adapter drops unknown RPC event types at the adapter boundary instead of rendering them as placeholders. Pi adapter drops unknown RPC event types at the adapter boundary instead of rendering them as placeholders. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Pi adapter now drops intermediate tool_execution_update events to maintain uniform canonical contract. Pi adapter now drops intermediate tool_execution_update events to maintain uniform canonical contract. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Pi adapter resets finalText buffer after text_end to prevent unbounded growth across turns. Pi adapter resets finalText buffer after text_end to prevent unbounded growth across turns. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Refactor | Medium |
`extractToolResultText` delegates to `extractTextFromContent`, consolidating duplicated walk-and-join logic for pi tool results and messages. `extractToolResultText` delegates to `extractTextFromContent`, consolidating duplicated walk-and-join logic for pi tool results and messages. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Refactor | Medium |
`firstLineTrunc` helper extracted into App.tsx, replacing multiple scattered implementations across canonical shape branches. `firstLineTrunc` helper extracted into App.tsx, replacing multiple scattered implementations across canonical shape branches. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Refactor | Medium |
Summary icons aligned with MSG_ICONS for consistency; error glyph changed from ✗ to ✕ and path glyph uses MSG_ICONS.file. Summary icons aligned with MSG_ICONS for consistency; error glyph changed from ✗ to ✕ and path glyph uses MSG_ICONS.file. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Other | Medium |
Pi adapter contract tests updated to assert aggregation of text_delta updates into one output event on text_end. Pi adapter contract tests updated to assert aggregation of text_delta updates into one output event on text_end. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Other | Medium |
New test drops tool_execution_update progress events (noise) locks in noise-drop behavior. New test drops tool_execution_update progress events (noise) locks in noise-drop behavior. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Other | Medium |
`pi-adapter.e2e.test.ts` exercises aggregation of text_delta updates through the Orchestrator end-to-end. `pi-adapter.e2e.test.ts` exercises aggregation of text_delta updates through the Orchestrator end-to-end. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
Full changelog
New Features
- Canonical
AgentEvent.datacontract — documented per-type data shapes insrc/infrastructure/adapters/interface.ts. Each adapter now has a single target shape foroutput({text}),tool_call({name,input}),command({command,result}),file_change({paths}),error({message}) anddone({result}). Downstream consumers (TUI,orch logs,servedaemon) can render events without knowing adapter internals. Legacy adapters (claude/cursor/codex) still emit their native shapes during the migration window — the TUI renderer is defensive.
Bug Fixes
- Pi adapter: per-character text_delta flood — pi RPC emits one
text_deltaper LLM stream chunk (often per-character). The adapter was forwarding each as its ownoutputevent, drowning the activity feed with character-level fragments. Now deltas aggregate into adapter-local state and the assembled text is flushed once ontext_endas a single canonicaloutputevent. - Pi adapter:
[agent_start]/[turn_start]placeholders in logs — unknown pi RPC event types fell through adefaultcase that emitted them as rawoutputevents. The TUI renderer then displayed them as[type_name]placeholders. Unknown types are now dropped at the adapter boundary; adding a new known type is the right way to surface a new event. - Pi adapter:
tool_execution_updatenoise — pi emits one of these per chunk of streaming tool output (e.g. live bash stdout). No other adapter surfaces intermediate tool progress in its event stream. These are now dropped to keep the canonical contract uniform. - Pi adapter:
finalTextbuffer never reset aftertext_end—state.finalTextwas set to the assembled text aftertext_endbut never cleared. A follow-up assistant turn in the same pi session would build on top of the previous message, double-emitting text and growing the buffer unboundedly across turns. Buffer now resets to''after eachtext_end. - Pi adapter: API error inside
agent_end.messages[]ignored (partial) — error event payloads now use canonical{message, raw}shape and are classified viaclassifyAdapterError. (Surfacing pi'serrorMessagefield nested inside the assistant message remains a follow-up.)
Performance
firstLineTruncfast path — single-line input (the common case for agent events) short-circuits to a singleslice(0, n), skippingsplit('\n')+find+ closure allocation. The slow path uses/\S/.test(l)instead ofl.trim().length > 0to avoid allocating a trimmed copy just to test non-empty.summarizeToolResultsingle split — was splittingcontenttwice (once forlines.length, once forfind); now reuses one array.
Refactoring
extractToolResultTextdelegates toextractTextFromContent— pi tool results ({content: [{type:'text', text}, …]}) and pi message content ({content: [{text}, …]}) differ only by the outercontentwrap. Collapsed 16 lines of duplicated walk-and-join logic to a single line that unwraps and delegates.firstLineTrunchelper extracted inApp.tsx— replaces five copies ofs.split('\n')[0]?.slice(0, N) ?? s.slice(0, N)(including a dead??fallback and incorrect handling of leading blank lines) across the new canonical-shape branches informatAgentOutput.- Summary icons aligned with
MSG_ICONS— error glyph in canonical branch corrected from✗(U+2717) toMSG_ICONS.error(✕, U+2715); path glyph usesMSG_ICONS.filefor consistency.
Tests
- Pi adapter contract tests updated —
aggregates text_delta updates and emits one canonical output on text_endreplaces the old per-delta assertion. New testdrops tool_execution_update progress events (noise)locks in the noise-drop behavior. pi-adapter.e2e.test.ts— feedstext_delta+text_delta+text_endsequence to exercise the aggregation path end-to-end through the Orchestrator.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About ORCH
CLI orchestrator that manages Claude Code, Codex, and Cursor as a typed task queue with state machine (todo→in_progress→review→done), auto-retry, inter-agent messaging, and TUI dashboard.
Related context
Related tools
Beta — feedback welcome: [email protected]