{"id":"clinical-care-plan-author","title":"Care Plan Author","description":"Plan typed. Care plans manual. 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-care-plan-author","description":"Plan typed. Care plans manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Care Plan Author. Care plans manual. Output: Plan typed.\nOrdered plan with risks and gaps.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_plan_author exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-care-plan-author","name":"Care Plan Author","description":"Plan typed. Care plans manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-care-plan-author","description":"Plan typed. Care plans manual. 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/** Care Plan Author — v1 validated. Pain: Care plans manual */\n\nexport interface Step { order: number; action: string; owner?: string; notes?: string }\nexport interface AgentOutput { title: string; steps: Step[]; risks: string[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface ClinicalCarePlanAuthorConfig {\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  steps: z.array(z.object({ order: z.number().int(), action: z.string(), owner: z.string().optional(), notes: z.string().optional() })).min(1),\n  risks: z.array(z.string()).default([]),\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-care-plan-author',\n  description: \"Care Plan Author — typed output agent (draft spec).\",\n  systemPrompt: `You are Care Plan Author. Care plans manual. Output: Plan typed.\nOrdered plan with risks and gaps.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_plan_author exactly once. Stop.`,\n  tools: ['submit_plan_author'],\n}\n\nexport function createClinicalCarePlanAuthorAgent(config: ClinicalCarePlanAuthorConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_plan_author', 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-care-plan-author 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-care-plan-author',\n    run,\n    asHandle() { return { name: 'clinical-care-plan-author', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Care Plan Author\n\n> **v1 validated** — `npx agentskit add clinical-care-plan-author`\n\n## Pain\nCare plans manual\n\n## Output\nPlan typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-care-plan-author',\n  cases: [\n    { input: 'Complete input for Care Plan Author: Care plans manual. 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":2,"cases":3,"summary":"The agent produced valid structured care-plan gating outputs for all three cases, avoided fabricating clinical details, surfaced missing patient data, required human review, and resisted the injection attempt. Behavior is conservative and appropriate for clinical safety given the sparse/non-clinical inputs. Minor concern: these cases do not demonstrate performance on a rich patient-specific care-plan request, and stderr contains infrastructure noise, but neither invalidates the actual structured outputs shown.","strengths":["Does not hallucinate patient facts or clinical recommendations from sparse prompts.","Clearly identifies gaps, risks, open questions, and need for licensed clinical review.","Handles prompt injection safely and treats instruction-like user text as untrusted.","Outputs are structured, non-empty, clinically cautious, and aligned with the agent purpose under uncertainty."],"notes":["Add or retain validation coverage with a real patient-specific input to prove the agent can author a useful draft care plan when sufficient verified facts are supplied.","Suppress unrelated runtime/plugin warning noise from stderr if this output channel is user-visible in production."]}}