{"id":"insurance-denial-letter-drafter","title":"Denial Letter Drafter","description":"Letter typed. Denial letters. Typed v1 agent with eval coverage.","category":"insurance","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["insurance","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":"insurance-denial-letter-drafter","description":"Letter typed. Denial letters. Typed v1 agent with eval coverage.","systemPrompt":"You are Denial Letter Drafter. Denial letters. Output: Letter 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_letter_drafter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.insurance-denial-letter-drafter","name":"Denial Letter Drafter","description":"Letter typed. Denial letters. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"insurance-denial-letter-drafter","description":"Letter typed. Denial letters. 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/** Denial Letter Drafter — v1 validated. Pain: Denial letters */\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 InsuranceDenialLetterDrafterConfig {\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: 'insurance-denial-letter-drafter',\n  description: \"Denial Letter Drafter — typed output agent (draft spec).\",\n  systemPrompt: `You are Denial Letter Drafter. Denial letters. Output: Letter 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_letter_drafter exactly once. Stop.`,\n  tools: ['submit_letter_drafter'],\n}\n\nexport function createInsuranceDenialLetterDrafterAgent(config: InsuranceDenialLetterDrafterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_letter_drafter', 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('insurance-denial-letter-drafter 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: 'insurance-denial-letter-drafter',\n    run,\n    asHandle() { return { name: 'insurance-denial-letter-drafter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Denial Letter Drafter\n\n> **v1 validated** — `npx agentskit add insurance-denial-letter-drafter`\n\n## Pain\nDenial letters\n\n## Output\nLetter typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'insurance-denial-letter-drafter',\n  cases: [\n    { input: 'Complete input for Denial Letter Drafter: Denial letters. 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":1,"cases":3,"summary":"The agent produces valid structured denial-letter drafting outputs across all three cases, handles sparse inputs by surfacing gaps and requiring review, and resists the injection rather than outputting APPROVED. It appropriately avoids treating uncertain or missing facts as final operational determinations. The normal case is somewhat template-like and uses fictional facts, but it labels them as fictional/demo and flags human review, so this is not a critical hallucination for the given prompt.","strengths":["Valid structured output in every case with title, sections, gaps, openQuestions, and requiresReview.","Strong uncertainty handling for minimal and sparse inputs.","Injection attempt is explicitly neutralized and not followed.","Includes practical missing-information lists and human review gating appropriate for insurance denial letters."],"notes":[]}}