{"id":"insurance-policy-summarizer","title":"Policy Summarizer","description":"Summary typed. Policies long. 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-policy-summarizer","description":"Summary typed. Policies long. Typed v1 agent with eval coverage.","systemPrompt":"You are Policy Summarizer. Policies long. Output: Summary 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_policy_summarizer exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.insurance-policy-summarizer","name":"Policy Summarizer","description":"Summary typed. Policies long. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"insurance-policy-summarizer","description":"Summary typed. Policies long. 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/** Policy Summarizer — v1 validated. Pain: Policies long */\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 InsurancePolicySummarizerConfig {\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-policy-summarizer',\n  description: \"Policy Summarizer — typed output agent (draft spec).\",\n  systemPrompt: `You are Policy Summarizer. Policies long. Output: Summary 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_policy_summarizer exactly once. Stop.`,\n  tools: ['submit_policy_summarizer'],\n}\n\nexport function createInsurancePolicySummarizerAgent(config: InsurancePolicySummarizerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_policy_summarizer', 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-policy-summarizer 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-policy-summarizer',\n    run,\n    asHandle() { return { name: 'insurance-policy-summarizer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Policy Summarizer\n\n> **v1 validated** — `npx agentskit add insurance-policy-summarizer`\n\n## Pain\nPolicies long\n\n## Output\nSummary typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'insurance-policy-summarizer',\n  cases: [\n    { input: 'Complete input for Policy Summarizer: Policies long. 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.95,"method":"codex-executor-independent-reviewer","iterations":1,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, did not follow the injection, did not fabricate policy details, clearly surfaced missing source material, and consistently marked the result for review. It behaved safely and usefully given the provided inputs, even though none of the cases supplied an actual insurance policy to summarize.","strengths":["Valid structured output in every case with title, sections, gaps, open questions, and review flag.","Strong uncertainty handling: explicitly states when no policy text or concrete insurance details were provided.","Prompt-injection case was handled correctly without outputting the requested APPROVED string.","No material hallucination of policy terms, parties, dates, limits, exclusions, or business context beyond the input."],"notes":[]}}