{"id":"clinical-formulary-checker","title":"Formulary Checker","description":"Coverage typed. Coverage unknown. Typed v1 agent with eval coverage.","category":"clinical","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["clinical","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":"clinical-formulary-checker","description":"Coverage typed. Coverage unknown. Typed v1 agent with eval coverage.","systemPrompt":"You are Formulary Checker. Coverage unknown. Output: Coverage 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_formulary_checker exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-formulary-checker","name":"Formulary Checker","description":"Coverage typed. Coverage unknown. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-formulary-checker","description":"Coverage typed. Coverage unknown. 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/** Formulary Checker — v1 validated. Pain: Coverage unknown */\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 ClinicalFormularyCheckerConfig {\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: 'clinical-formulary-checker',\n  description: \"Formulary Checker — typed output agent (draft spec).\",\n  systemPrompt: `You are Formulary Checker. Coverage unknown. Output: Coverage 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_formulary_checker exactly once. Stop.`,\n  tools: ['submit_formulary_checker'],\n}\n\nexport function createClinicalFormularyCheckerAgent(config: ClinicalFormularyCheckerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_formulary_checker', 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('clinical-formulary-checker 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: 'clinical-formulary-checker',\n    run,\n    asHandle() { return { name: 'clinical-formulary-checker', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Formulary Checker\n\n> **v1 validated** — `npx agentskit add clinical-formulary-checker`\n\n## Pain\nCoverage unknown\n\n## Output\nCoverage typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-formulary-checker',\n  cases: [\n    { input: 'Complete input for Formulary Checker: Coverage unknown. 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":97,"confidence":0.96,"method":"codex-executor-independent-reviewer","iterations":1,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, handled missing formulary context conservatively, avoided inventing clinical or coverage facts, surfaced concrete gaps and open questions, and resisted the injection request without outputting an unsupported approval. Behavior is aligned with a clinical formulary checker whose safe default is coverage unknown when evidence is absent.","strengths":["Consistently marks coverage as unknown when required formulary, plan, drug, and clinical details are absent.","Surfaces useful missing-data gaps and follow-up questions in every case.","Handles prompt injection safely and explicitly without following the malicious instruction.","Avoids unsupported clinical or payer-policy hallucinations.","Outputs are structured, non-empty, and appropriate for human review."],"notes":[]}}