Skip to content

fix(executor): un error interno de una herramienta dice qué tipo de falla fue y si conviene reintentar - #39

Merged
fforres merged 2 commits into
skywardfrom
fforres/actionable-internal-tool-error
Oct 30, 2026
Merged

fforres merged 2 commits into
skywardfrom
fforres/actionable-internal-tool-error

Conversation

@fforres

@fforres fforres commented Oct 30, 2026 •

Copy link
Copy Markdown

Qué cambia

Cuando una llamada a invoke o execute falla por un defecto interno, el mensaje ya no es solo Internal tool error [id]. Ahora indica el tipo de falla y si conviene reintentar, por ejemplo:

Internal tool error [de660f2d]: upstream timeout calling slack_com_openapi.org.main.conversationsHistory. Retry may succeed.

  • Categorías: timeout o abort, falla de red, respuesta HTTP del upstream (con el código), autenticación e interna. Solo se leen etiquetas de error, nombres y códigos numéricos; nunca mensajes, URLs, headers, tokens ni stacks.
  • Las categorías reintentables (timeout, red, 429 y 5xx) llegan también como errorCategory y retryable en el contenido estructurado. Las fallas internas conservan el mensaje opaco de antes.
  • El log del servidor ([executor:mcp] execute defect) ahora incluye categoría, herramienta y la causa completa. Antes no registraba la causa.
  • No se agregó reintento automático: solo se señala retryable, porque invoke puede escribir en sistemas externos.

Causa de de660f2d

Confirmada: una caída de D1 (D1_ERROR: internal error; reference = ...) de unos 15 s el 2026-10-28 a las 14:50Z, más larga que el reintento de D1. No fue un timeout upstream (la hipótesis de los 19 s era incorrecta; search ni siquiera llama a un upstream). La corrección de la causa está en #41. Este PR solo mejora el diagnóstico: el log ahora trae la causa completa. Un error de D1 sigue clasificado como interno, porque la categoría solo lee etiquetas de error, no mensajes.

Cómo se probó

  • Pruebas nuevas en failure-category.test.ts y una de integración en tool-server.test.ts (un timeout con URL y token en el mensaje no filtra nada).
  • vitest run en packages/hosts/mcp: 275 pruebas pasan. oxlint sin errores en los archivos tocados.

@fforres

fforres commented Oct 30, 2026

Copy link
Copy Markdown
Author

El CI de Blacksmith no corre en este repositorio (todas sus ejecuciones quedan en cola o canceladas), así que se verificó en local sobre el head adcbf6f (rama con skyward ya integrado, incluye #40 y #41):

  • bunx oxfmt --check sobre los archivos tocados: OK
  • bunx oxlint -c .oxlintrc.jsonc --deny-warnings packages/hosts/mcp/src: 0 advertencias, 0 errores
  • bunx vitest run en packages/hosts/mcp: 12 archivos, 276 pruebas, todas OK
  • bun run typecheck en packages/hosts/mcp (tsgo): código de salida 0 (solo sugerencias de estilo de Effect, no errores)

@fforres
fforres merged commit 63c7a6e into skyward Oct 30, 2026
3 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant