Repository navigation
Description
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
- Configure T3 Code with the ACP Registry
opencode-v2provider enabled. - Keep a T3 client connected so background provider-status work is allowed. Defaults:
providerHealthRefreshInterval= 5 min; a successful probe is cached for 15 min (PROBE_SUCCESS_TTL_MS). - Let T3 run for 15-30 minutes (or overnight).
- Inspect the OpenCode session list (
opencodeTUI,GET /api/session, or the SQLite DB).
Expected behavior
A provider health probe should be invisible to the user's OpenCode session history. If the probe must create a test session to validate the agent, it should delete that session before finishing — e.g. a best-effort runtime.deleteSession(sessionId) (or reuse of deleteAcpRegistrySession) guarded by sessionCapabilities.delete, with cleanup failures ignored. Sending session/close alone would not delete on 2.1.4; it only becomes useful once anomalyco/opencode#56088 ships.
Actual behavior
Every probe leaves a durable empty session in OpenCode:
titleempty/NULLagentempty,modelempty- 0 message rows
version = "2.1.4"(T3's managedopencode-v2binary)- cwd = the T3 server's cwd
At least 33 untitled, 0-message rows accumulated. They appear every ~15 minutes while T3 is in use (~4/hour) and persist until manually deleted. This is continuous, not occasional: every T3 session produces more rows, and real sessions get buried in the list.
The probe path is AcpRegistryDriver.checkProviderStatus → AcpRegistryProbe.probeConfiguration. packages/provider-acp-registry/src/server/probe.ts calls runtime.start() (ACP session/new in AcpSessionRuntime) with clientInfo.name = "t3-code-provider-test". When the probe's effect scope closes, AcpSessionRuntime terminates the ACP child process; the probe never sends session/close or session/delete. OpenCode persists the session eagerly on session/new (anomalyco/opencode#55293, anomalyco/opencode#38064), so the row survives. deleteAcpRegistrySession already exists in the same file (~line 646 on main), but it is wired only to user-initiated session management (driver.ts → AcpSessionManagementSection), not the probe path.
Impact
Major degradation or frequent failure
Version or commit
0.1.3-nightly.20261025.3692
Environment
Linux, T3 Code nightly desktop 0.1.3-nightly.20261025.3692, managed opencode-v2 2.1.4 (ACP), default "balanced" background activity profile; ACP Registry provider with agentId opencode-v2, distribution auto.
Logs or stack traces
# ~/.t3/userdata/logs/server.trace.ndjson
# 16 AcpRegistryProbe.probeConfiguration spans; 03:04–06:19 exactly 900.0 s apart
02:59:02.825 probeConfiguration 687 ms
03:04:02.827 probeConfiguration 2459 ms
03:19:02.838 probeConfiguration 8059 ms
...
06:19:02.988 probeConfiguration 2875 ms
06:39:02.994 probeConfiguration 2959 ms
# ~/.local/share/opencode/log/opencode.log at the 05:19 tick
05:19:03.137Z cli starting version=2.1.4 args="[\"acp\"]"
05:19:03.178Z spawning process command=~/.t3/tools/opencode-v2/2.1.4/linux-x86_64/opencode args="[\"serve\",\"--stdio\",\"--port\",\"0\"]"
# session_v2 row created at 05:19:04 (empty)
title="" agent="" model="" version="2.1.4" msgs=0
# SQL verification against a pre-cleanup copy of ~/.local/share/opencode/opencode.db
sqlite3 ~/.local/share/opencode/opencode.db <<'SQL'
SELECT datetime(time_created / 1000, 'unixepoch', 'localtime') AS created,
version, title, agent, model
FROM session_v2 s
WHERE (title IS NULL OR title = '')
AND version = '2.1.4'
AND NOT EXISTS (SELECT 1 FROM session_message m WHERE m.session_id = s.id)
ORDER BY time_created;
SQL
2026-10-26 03:04:04|2.1.4|||
2026-10-26 03:19:04|2.1.4|||
2026-10-26 03:34:04|2.1.4|||
...
2026-10-26 06:19:04|2.1.4|||
2026-10-26 06:39:05|2.1.4|||Screenshots, recordings, or supporting files
No response
Workaround
Settings → Background Activity → Provider health interval = 0 seconds stops the periodic probes (T3 still probes once at startup).
Activity
garysassano commentedon Oct 29, 2026
The same probe leak also affects Kiro CLI, set up as a local ACP command (
kiro-cli acp --agent-engine=v3, Kiro CLI 2.35.1).session/new, Kiro persists the session straight away. The wire log shows_kiro/sessions/changedwith the new session inupsertedbefore any prompt, and asess_<id>directory under Kiro's own sessions folder.runtime.start()that is then closed withoutsession/closeorsession/deleteleaves that session in Kiro's session list. I confirmed this with T3's ownAcpSessionRuntime; the leftover directories only disappeared after I deleted them manually.One caution about the fix proposed here (
runtime.deleteSessionguarded bysessionCapabilities.delete): for agents that answerinitializein the v1 shape, such as Kiro,deleteSessioncurrently fails locally and sends nothing, so it would not clean up either. That is tracked in #26927.