openclaw/config
Ayaan Zaidi 6349e43d84
fix(agents): deliver one answer per steered user input (#149925)
Most changed lines move recovery helpers and tests out of oversized files; answer boundaries still have one owner.

## What Problem This Solves

With default `steer` queueing, channels received only the last answer when more messages arrived during a run. Earlier answers remained in the transcript.

## Why This Change Was Made

This state has one writer: the subscriber seals an answer segment at the next user message. Final selection and deferred delivery use those boundaries, replacing the tool-result proxy. Telegram and Discord recovery keep earlier answers intact.

Growth accepted under the owner's standing acceptance (2026-09-15): 49 net production lines record boundaries and carry answer identity.

## User Impact

Completed answers arrive in order. Final answers still replace progress within one input; silent answers do not leak progress.

## Evidence

- Gateway `chat.send` plus a queued steer delivered only the second answer on baseline; the same dispatcher probe delivered both on candidate. Steering tests passed 8/8.
- Two live Telegram Test Server runs used controlled model responses and real transport. Both answers arrived separately, including an ellipsis excerpt followed by its expansion.
- The split passed 318 affected tests and exact-once test selection. A fresh merge passed 212 focused tests, build, package creation, and file limits.
- Strict external compilation passed against published 2026.9.4 and candidate packages, including legacy calls and optional payload. Type-aware lint and production/test types passed.

## Compatibility

No config, schema, or protocol changes. The public helper keeps its call shape; `payload` is optional. App-server steering is unchanged.

## Consumers

Final selection, deferred replies, normalization, and Telegram/Discord recovery consume the same answer identity.

## Invalidation

Segments clear with assistant text on compaction retry.

## Tests

Covers skipped tools, direct/deferred delivery, silent middle answers, empty boundaries, legacy SDK calls, and media-preview metadata. Moved tests retain all assertions.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-09-16 21:42:43 +05:30
..
oxlint feat(lint): enforce no-chained-type-assertions (#124119) 2026-08-15 02:13:37 -07:00
tsconfig ci: keep plugin lint in its nearest TypeScript project (#134216) 2026-08-31 09:34:21 -07:00
assertion-safety-baseline.txt refactor(projects): move project listing to shared state worker (#148637) 2026-09-16 07:08:38 -07:00
ci-test-timings.json ci: repair long-tail test jobs and refresh timing weights (#149665) 2026-09-15 21:47:06 -07:00
control-ui-startup-budget-baseline.json chore(ui): restore core lint and startup budget checks (#148010) 2026-09-14 14:08:59 +05:30
env-var-count-budget.txt refactor(prompt): remove unreachable runtime-only system prompt path (#143314) 2026-09-11 16:04:49 +05:30
knip.all-exports.config.ts improve: speed up legacy updater compatibility tests (#149008) 2026-09-15 08:06:38 -07:00
knip.config.ts feat(apps): preview pending requests in native sidebars (#149811) 2026-09-16 01:59:27 -07:00
knip.scripts-exports.config.ts improve(workers): reduce cloud runtime preparation overhead (#141141) 2026-09-07 06:32:30 -07:00
markdownlint-cli2.jsonc
markdownlint-templates.jsonc fix(tooling): run markdownlint on workspace templates (#91160) (#117166) 2026-08-28 12:21:13 -07:00
max-lines-baseline.txt fix(agents): deliver one answer per steered user input (#149925) 2026-09-16 21:42:43 +05:30
shellcheckrc
stylelint.config.mjs perf(control-ui): load built-in theme palettes on demand (#130473) 2026-08-26 18:56:14 -07:00
swiftformat chore(deps): refresh macOS and iOS app dependencies (#135592) 2026-09-01 16:31:14 -07:00
swiftlint.yml feat(macos): open links as native Mac tabs in the Browser panel (#140988) 2026-09-07 13:12:46 -07:00