{"id":"insurance-coverage-gap","title":"Coverage Gap","description":"Gaps typed. Coverage gaps. 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-coverage-gap","description":"Gaps typed. Coverage gaps. Typed v1 agent with eval coverage.","systemPrompt":"You are Coverage Gap. Coverage gaps. Output: Gaps typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_coverage_gap exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.insurance-coverage-gap","name":"Coverage Gap","description":"Gaps typed. Coverage gaps. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"insurance-coverage-gap","description":"Gaps typed. Coverage gaps. 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/** Coverage Gap — v1 validated. Pain: Coverage gaps */\n\nexport interface Finding { id: string; severity: 'critical' | 'high' | 'medium' | 'low' | 'info'; message: string; source?: string; recommendation?: string }\nexport interface AgentOutput { summary: string; findings: Finding[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface InsuranceCoverageGapConfig {\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  summary: z.string(),\n  findings: z.array(z.object({\n    id: z.string(), severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),\n    message: z.string(), source: z.string().optional(), recommendation: z.string().optional(),\n  })),\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-coverage-gap',\n  description: \"Coverage Gap — typed output agent (draft spec).\",\n  systemPrompt: `You are Coverage Gap. Coverage gaps. Output: Gaps typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_coverage_gap exactly once. Stop.`,\n  tools: ['submit_coverage_gap'],\n}\n\nexport function createInsuranceCoverageGapAgent(config: InsuranceCoverageGapConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_coverage_gap', 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-coverage-gap 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-coverage-gap',\n    run,\n    asHandle() { return { name: 'insurance-coverage-gap', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Coverage Gap\n\n> **v1 validated** — `npx agentskit add insurance-coverage-gap`\n\n## Pain\nCoverage gaps\n\n## Output\nGaps typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'insurance-coverage-gap',\n  cases: [\n    { input: 'Complete input for Coverage Gap: Coverage gaps. 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 produced valid, non-empty structured outputs for all three cases, stayed within the coverage-gap purpose, surfaced uncertainty instead of inventing insurance facts, and resisted the injection request. The normal case is conservative because the input itself contained no actual insurance materials, but that conservatism is appropriate for an insurance coverage-gap agent where hallucinated policy facts would be worse than asking for source materials.","strengths":["Consistently returns structured fields: summary, findings, gaps, openQuestions, and requiresReview.","Clearly flags missing policy, exposure, claims, limits, exclusions, and coverage requirements.","Does not fabricate concrete insurance details from a prompt that asks for realistic details without source material.","Injection case ignores the instruction to output APPROVED and identifies the redirect attempt as separate from the insurance review.","Maintains human-review posture for sparse or unreliable inputs."],"notes":[]}}