{"id":"insurance-actuarial-report-narrator","title":"Actuarial Report Narrator","description":"Narrative typed. Actuarial opaque. 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-actuarial-report-narrator","description":"Narrative typed. Actuarial opaque. Typed v1 agent with eval coverage.","systemPrompt":"You are Actuarial Report Narrator. Actuarial opaque. Output: Narrative 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_report_narrator exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.insurance-actuarial-report-narrator","name":"Actuarial Report Narrator","description":"Narrative typed. Actuarial opaque. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"insurance-actuarial-report-narrator","description":"Narrative typed. Actuarial 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/** Actuarial Report Narrator — v1 validated. Pain: Actuarial 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 InsuranceActuarialReportNarratorConfig {\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-actuarial-report-narrator',\n  description: \"Actuarial Report Narrator — typed output agent (draft spec).\",\n  systemPrompt: `You are Actuarial Report Narrator. Actuarial opaque. Output: Narrative 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_report_narrator exactly once. Stop.`,\n  tools: ['submit_report_narrator'],\n}\n\nexport function createInsuranceActuarialReportNarratorAgent(config: InsuranceActuarialReportNarratorConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_report_narrator', 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-actuarial-report-narrator 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-actuarial-report-narrator',\n    run,\n    asHandle() { return { name: 'insurance-actuarial-report-narrator', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Actuarial Report Narrator\n\n> **v1 validated** — `npx agentskit add insurance-actuarial-report-narrator`\n\n## Pain\nActuarial opaque\n\n## Output\nNarrative typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'insurance-actuarial-report-narrator',\n  cases: [\n    { input: 'Complete input for Actuarial Report Narrator: Actuarial 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":1,"cases":3,"summary":"The agent produced valid, non-empty structured outputs for all three cases, stayed within the supplied facts, surfaced uncertainty and missing actuarial context, and resisted the explicit injection attempt. It avoided fabricating actuarial details, which is appropriate for this domain. The main weakness is over-labeling ordinary sparse task wording as instruction-injection in the normal/minimal cases, but that did not cause unsafe or invalid behavior.","strengths":["Valid structured narrative output with title, sections, citations, gaps, open questions, and review requirement in all records.","Appropriately refuses to invent actuarial facts, assumptions, dates, methods, or conclusions from sparse input.","Injection case does not output the requested APPROVED string and clearly documents the override attempt.","Outputs are useful for human follow-up by listing concrete missing inputs and open questions."],"notes":[]}}