[Bug]: t3_thread_read drops the typed failure (usage_limit class and resetAt) on error items
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 75/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- typescript
- Bereich
- backend-api-design
Rechercherichtung
Beginne mit den MCP-Verträgen in packages/contracts/src/orchestratorMcp.ts sowie mit timelineItem() und dem Thread-Detail-Builder in apps/server/src/mcp/OrchestratorMcpService.ts. Verfolge, wie das Fehler-Element und die Felder des Thread-Shells in die Antwort übernommen werden, und prüfe anschließend die vorhandenen MCP-Vertrags- und Service-Tests. Die Aufgabe ist abgeschlossen, wenn t3_thread_read bei Fehler-Elementen und Thread-Details die typisierte Fehlerklasse und den Zeitpunkt des Zurücksetzens ausgibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Before submitting
- I searched existing issues and did not find a duplicate. (#31057 is about limited children resuming on the wrong account; it is not this.)
- I included enough detail to reproduce or investigate the problem.
Area
apps/server: the orchestrator MCP read (t3_thread_read)
Steps to reproduce
- Start a thread on a provider that is out of usage. Seen with Codex, which fails the turn with
usageLimitExceeded. - The turn fails. T3's own store holds the typed failure on the error item: in
orchestration_v2_projection_turn_items,failure = { class: "usage_limit", code: "usageLimitExceeded", resetAt: "<ISO>" }. The thread shell'slastErrorClassandusageLimitResetAtare set from it (threadErrorSummary). - Read the thread through MCP:
t3_thread_readwithview: "activity", and the default view.
Expected behavior
An MCP client can tell a usage-limit failure, and its reset time, from any other failure using typed fields, without reading the human-readable message. One of these:
OrchestratorMcpThreadTimelineItemfortype: "error"carriesfailure: { class, code, resetAt }, or at leastfailureClassandresetAt;- the thread object returned by
t3_thread_readcarrieslastErrorClassandusageLimitResetAt, as the shell projection already does.
Actual behavior
The error item comes back with type, status, title, text and ids only. failure reaches the client only as text, because turnItemText returns item.failure.message for case "error" (apps/server/src/mcp/OrchestratorMcpService.ts, timelineItem(), at ac781dcb). The thread object has no lastErrorClass or usageLimitResetAt.
Claude limits are visible, because they also produce a system_notice whose item id ends usage-limit:…:<window>:<reset epoch seconds>. Codex limits produce only the error item, so through MCP a Codex usage limit looks like any other failed turn.
Impact
An MCP client that orchestrates agents cannot treat a usage limit as a wait without parsing English error text. It sees a plain failure, and may fail or relaunch work that T3's own UsageLimitRecoveryWorker would resume at resetAt. The fix is small: add the typed fields to the MCP timeline item and thread contracts in packages/contracts/src/orchestratorMcp.ts, then fill them in timelineItem() and the thread detail builder.
Version or commit
main at 59118847; OrchestratorMcpService.ts last changed in ac781dcb.
Environment
T3 server on Linux, threads started over MCP.
Logs or stack traces
The error item's text on the Codex thread: "You've hit your usage limit. Visit https://chatgpt.com/settings/usage to purchase more credits or try again at Nov 17th, 2026 7:32 PM."
— Model: claude-opus-5-5 · Harness: Claude Code (T3 Code)
- Vorherrschende Sprache
- TypeScript
- Sterne
- 24.8k
- Forks
- 6.4k
- Ø Merge
- 4 Std. 16 Min.
- Gemergte PRs (30 T.)
- 352
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus pingdotgg/t3code
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in pingdotgg/t3code
Ähnliche Issues
-
idea-scout idea:453
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
jeanibarz/agent-notebook#453 ·
Maintainer antworten meist innerhalb von 1 Tag
-
level/task
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 95/100
wazuh/wazuh-dashboard-plugins#9642 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 91/100
unicef/adt-studio#1112 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
feature request good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
TabularisDB/tabularis#1513 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 75/100