[Bug]: t3_thread_read drops the typed failure (usage_limit class and resetAt) on error items
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 75/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- backend-api-design
Direzione di ricerca
Inizia dai contratti MCP in packages/contracts/src/orchestratorMcp.ts e da timelineItem() e dal generatore dei dettagli del thread in apps/server/src/mcp/OrchestratorMcpService.ts. Segui come l’elemento di errore e i campi dello shell del thread vengono mappati nella risposta, poi controlla i test esistenti dei contratti e del servizio MCP. Il lavoro è completato quando t3_thread_read espone la classe di errore tipizzata e l’ora di ripristino per gli elementi di errore e i dettagli del thread.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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)
- Lingua principale
- TypeScript
- Stelle
- 24.8k
- Fork
- 6.4k
- Merge medio
- 4h 16m
- PR unite (30g)
- 352
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pingdotgg/t3code
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di pingdotgg/t3code
Issue simili
-
Add "append" and "prepend" slots for vue-vuetify extended renderersForse già presa @simeyc l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
eclipsesource/jsonforms#2668 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
cobot/zapier#520 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
README の通知条件を実際の判定処理に合わせるForse già presa @unhappychoice l’ha presa oggi. Apertafactory:in-progress priority:medium
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
unhappychoice/oss-issue-opener#395 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug Website
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
OWASP/OWASP-Hunting#88 ·
I maintainer di solito rispondono entro 1 giorno