[Bug]: Redundant prompts/instructions#24185

opened6d agobyYYlandolsi

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

have a typical chat with the agent and same instructions gets appended in each turn with copilot acp

Image

Expected behavior

no redunandancy

Actual behavior

redunandcy :

Image

Impact

Blocks work completely

Version or commit

latest nightly on windows

Environment

provider copilot on windows

Logs or stack traces

shell
1

Screenshots, recordings, or supporting files

No response

Workaround

No response

Synced from GitHub

Confirming the same behavior on an ACP Registry provider other than Copilot (agy-acp, provider: acpRegistry, T3 desktop on macOS).

Every ordinary user message — including short follow-ups in one uninterrupted session with no config change — gets the same two blocks appended: <runtime_info> and the full <pull_request_linking> policy. Measured in T3's own message store: each message is stored twice, a raw copy (creationSource: "web", just the user text) and a provider-side copy (creationSource: "provider", user text + ~1.5KB of appended context). The thread view renders the provider-side copy, so the appended blocks are visible as pasted text on every message.

No settings toggle exists to disable the append (checked settings.json, client-settings.json, desktop-settings.json). The blocks are harmless context for the model, but the per-turn re-injection duplicates ~1.5KB of text into the durable conversation and clutters the visible history on every turn.

#24466 (closed as a duplicate of this issue) has the precise code diagnosis (resolvePromptParts unconditionally appends buildRuntimeInstructions(...) with no change-tracking, unlike the larger instruction block).

Synced from GitHub

Root cause and a working fix, confirmed with Copilot ACP.

Cause: in packages/provider-acp/src/server/adapter.ts (resolvePromptParts), the orchestration instructions (t3AcpPromptWithInstructions) are only resent when the mode or tools change. But the separate buildRuntimeInstructions block (<runtime_info> + <pull_request_linking>) is pushed onto every non-slash prompt without any check. Since ACP sessions keep their own history, that block piles up in the native conversation on every turn.

Fix: remember, per ACP session, the runtime block last sent, and send it again only when its text changes (e.g. a model switch), after compaction, or for a new session. It's recorded only after a successful session/prompt, next to the existing instruction state, and cleared on runtime replacement. It applies to all ACP agents.

Branch (one commit on top of v0.1.3, with an extended AcpAdapterV2.test.ts case that fails before the fix): https://github.com/mmazur/t3code/tree/fix/acp-repeated-instructions Commit: https://github.com/mmazur/t3code/commit/ec5d536ba813949e5c41c9efe91a3695fae0ba92

I'm using this branch as my daily T3 build with Copilot, and it seems to work thus far: follow-up messages no longer include the runtime/PR instructions.