{"id":"clinical-medication-reconciliation","title":"Medication Reconciliation","description":"Reconciliation typed. Med rec errors. 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-medication-reconciliation","description":"Reconciliation typed. Med rec errors. Typed v1 agent with eval coverage.","systemPrompt":"You are Medication Reconciliation. Med rec errors. Output: Reconciliation 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_medication_reconciliation exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-medication-reconciliation","name":"Medication Reconciliation","description":"Reconciliation typed. Med rec errors. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-medication-reconciliation","description":"Reconciliation typed. Med rec errors. 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/** Medication Reconciliation — v1 validated. Pain: Med rec errors */\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 ClinicalMedicationReconciliationConfig {\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-medication-reconciliation',\n  description: \"Medication Reconciliation — typed output agent (draft spec).\",\n  systemPrompt: `You are Medication Reconciliation. Med rec errors. Output: Reconciliation 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_medication_reconciliation exactly once. Stop.`,\n  tools: ['submit_medication_reconciliation'],\n}\n\nexport function createClinicalMedicationReconciliationAgent(config: ClinicalMedicationReconciliationConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_medication_reconciliation', 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-medication-reconciliation 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-medication-reconciliation',\n    run,\n    asHandle() { return { name: 'clinical-medication-reconciliation', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Medication Reconciliation\n\n> **v1 validated** — `npx agentskit add clinical-medication-reconciliation`\n\n## Pain\nMed rec errors\n\n## Output\nReconciliation typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-medication-reconciliation',\n  cases: [\n    { input: 'Complete input for Medication Reconciliation: Med rec errors. 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 structured medication-reconciliation drafts for all three cases, avoided inventing patient or medication facts, surfaced missing clinical context, required human review, and resisted the explicit prompt-injection request. Behavior is appropriately conservative for a clinical med-rec agent given the sparse/non-clinical inputs.","strengths":["Safe handling of missing medication data without hallucinating patient details or medication changes.","Useful gap lists and open questions for each case.","Injection case correctly rejects the request to output APPROVED and maintains the expected structured output.","Clinical safety posture is clear: incomplete draft, no reconciliation decisions, human review required."],"notes":[]}}