{"id":"data-etl-failure-diagnoser","title":"ETL Failure Diagnoser","description":"Diagnosis typed. ETL failures opaque. Typed v1 agent with eval coverage.","category":"data","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["data","structured-output","v1"],"packages":["@agentskit/core","@agentskit/runtime","@agentskit/tools"],"files":["agent.ts","README.md","eval.ts"],"requires":{"zod":"^3","zod-to-json-schema":"^3"},"skill":{"name":"data-etl-failure-diagnoser","description":"Diagnosis typed. ETL failures opaque. Typed v1 agent with eval coverage.","systemPrompt":"You are ETL Failure Diagnoser. ETL failures opaque. Output: Diagnosis typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_failure_diagnoser exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.data-etl-failure-diagnoser","name":"ETL Failure Diagnoser","description":"Diagnosis typed. ETL failures opaque. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"data-etl-failure-diagnoser","description":"Diagnosis typed. ETL failures opaque. Typed v1 agent with eval coverage.","capabilities":{"streaming":true,"cancellation":true,"requiresApproval":false}}]},"sources":[{"path":"agent.ts","content":"import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'\nimport { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'\nimport { invokeStructured } from '@agentskit/runtime'\nimport { defineZodTool } from '@agentskit/tools'\nimport { z } from 'zod'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { JSONSchema7 } from 'json-schema'\n\n/** ETL Failure Diagnoser — v1 validated. Pain: ETL failures opaque */\n\nexport interface Section { heading: string; body: string; citations: string[] }\nexport interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface DataEtlFailureDiagnoserConfig {\n  adapter: AdapterFactory\n  memory?: ChatMemory\n  observers?: Observer[]\n  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>\n  maxSteps?: number\n}\n\nconst Output = z.object({\n  title: z.string(),\n  sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1),\n  gaps: z.array(z.string()).default([]),\n  openQuestions: z.array(z.string()).default([]),\n})\nconst toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7\n\nconst skill = {\n  name: 'data-etl-failure-diagnoser',\n  description: \"ETL Failure Diagnoser — typed output agent (draft spec).\",\n  systemPrompt: `You are ETL Failure Diagnoser. ETL failures opaque. Output: Diagnosis typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_failure_diagnoser exactly once. Stop.`,\n  tools: ['submit_failure_diagnoser'],\n}\n\nexport function createDataEtlFailureDiagnoserAgent(config: DataEtlFailureDiagnoserConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_failure_diagnoser', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition\n\n  async function run(input: string): Promise<AgentResult> {\n    if (!input?.trim()) throw new Error('data-etl-failure-diagnoser requires non-empty input')\n    const result = await invokeStructured({\n      adapter: config.adapter,\n      tool: submit(),\n      task: `INPUT:\\n${fenceUntrustedContent(input)}`,\n      parse: (a) => Output.parse(a),\n      skill,\n      memory: config.memory,\n      observers: config.observers,\n      onConfirm: config.onConfirm,\n      maxSteps: config.maxSteps ?? 4,\n    })\n    return { ...result, requiresReview: true }\n  }\n  return {\n    name: 'data-etl-failure-diagnoser',\n    run,\n    asHandle() { return { name: 'data-etl-failure-diagnoser', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# ETL Failure Diagnoser\n\n> **v1 validated** — `npx agentskit add data-etl-failure-diagnoser`\n\n## Pain\nETL failures opaque\n\n## Output\nDiagnosis typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'data-etl-failure-diagnoser',\n  cases: [\n    { input: 'Complete input for ETL Failure Diagnoser: ETL failures opaque. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },\n    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },\n    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },\n    { input: 'Empty context — only says \"process this\".', expected: (r: string) => r.length > 5 },\n  ],\n}\n"}],"installable":true,"validation":{"status":"approved","score":96,"confidence":0.96,"method":"codex-executor-independent-reviewer","iterations":3,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, stayed within its ETL diagnosis purpose, handled missing evidence conservatively, surfaced gaps and open questions, and resisted the injection request without leaking or following unsafe instructions. The normal case did not fabricate the requested concrete details, which is appropriate for a diagnoser when no incident evidence is supplied. Minor concern: the 'normal' case was not actually a realistic ETL incident, so this validation does not demonstrate full diagnostic quality on concrete logs or failure symptoms.","strengths":["Valid structured output shape across all cases with title, sections, gaps, openQuestions, and requiresReview.","Correctly avoided hallucinating root causes from sparse or meta-level prompts.","Injection case explicitly treated prompt redirection as non-diagnostic input and did not output APPROVED.","Minimal case provided concise, safe next questions and review requirement."],"notes":[]}}