Normalizacion de outputs heterogeneos via hook PostToolUse y updatedMCPToolOutput antes de entrar al historial del modelo.
Kata 03 del toolkit. Un hook PostToolUse intercepta el tool_response heterogéneo de tools legacy (XML envuelto, códigos de estado arcanos como 0xA1) y lo reescribe a JSON canónico mediante updatedMCPToolOutput antes de que el output entre al historial del modelo. El modelo nunca ve el XML crudo: ve solo el JSON limpio que el runtime garantiza.
Escenarios canónicos: Customer Support y Legacy ERP Integration.
PostToolUse es runtime garantizado, no convención del autor de la tool: matchea por patrón y se aplica a TODAS las tools que matcheen.updatedMCPToolOutput reemplaza el output crudo; el modelo nunca ve el XML.STATUS_MAP) y esquemas viven en código recargable, en un solo lugar.additionalContext anexa metadatos auditables (origen legacy, timestamp de normalización) sin contaminar el payload limpio que consume el modelo.import xml.etree.ElementTree as ET
import json
STATUS_MAP = {"0xA1": "paid", "0xB2": "pending", "0xC3": "overdue"}
async def normalize_legacy(input, tool_use_id, ctx):
raw = input["tool_response"]
# Parsear de verdad: str.find() devuelve un índice, no el valor → usar ElementTree.
try:
root = ET.fromstring(raw)
clean = {
"order_id": root.findtext("OrderId", "unknown"),
"status": STATUS_MAP.get(root.findtext("StatusCode", ""), "unknown"),
"amount": float(root.findtext("Total") or 0),
}
except ET.ParseError:
clean = {"error": "parse_failed", "raw_length": len(raw)}
return {
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"updatedMCPToolOutput": {"type": "text", "text": json.dumps(clean)},
"additionalContext": "source=legacy_erp_xml; normalized=true",
}
}# Cada tool decide por su cuenta si normaliza, via decorators @tool.
@tool
def get_order(id):
raw = legacy_erp.fetch(id)
return normalize(raw) # frágil: depende de que TODO autor lo recuerde
@tool
def get_invoice(id):
return legacy_erp.fetch(id) # un handler nuevo OLVIDÓ normalizar -> envenena contextoLa normalización de outputs heterogéneos es responsabilidad del runtime vía PostToolUse, no convención de cada tool. Defiende: el hook matchea por patrón y garantiza la transformación para todas las tools; updatedMCPToolOutput impide que el XML crudo entre al historial; additionalContext sirve para metadatos auditables que el modelo no necesita ver. Quiz de referencia: C·B·B.
PostToolUse, updatedMCPToolOutput, normalización de output o payloads legacy.katas-tool-result-defensive-extractionkatas-hook-driven-controlkatas-headless-code-reviewSTATUS_MAP y la firma de updatedMCPToolOutput usados.--force solo tras revisar diffs.Capas del packet, cargables bajo demanda (disciplina ICM: una capa por vez, nunca todas juntas): knowledge/ cuerpo de conocimiento · prompts/ prompts listos · examples/ salida de ejemplo · agents/ subagentes del packet · templates/ plantilla de output.
e8f986b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.