{"id":"clinical-trial-eligibility","title":"Trial Eligibility","description":"Eligibility typed. Trial matching 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-trial-eligibility","description":"Eligibility typed. Trial matching manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Trial Eligibility. Trial matching manual. Output: Eligibility 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_trial_eligibility exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-trial-eligibility","name":"Trial Eligibility","description":"Eligibility typed. Trial matching manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-trial-eligibility","description":"Eligibility typed. Trial matching 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/** Trial Eligibility — v1 validated. Pain: Trial matching manual */\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 ClinicalTrialEligibilityConfig {\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-trial-eligibility',\n  description: \"Trial Eligibility — typed output agent (draft spec).\",\n  systemPrompt: `You are Trial Eligibility. Trial matching manual. Output: Eligibility 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_trial_eligibility exactly once. Stop.`,\n  tools: ['submit_trial_eligibility'],\n}\n\nexport function createClinicalTrialEligibilityAgent(config: ClinicalTrialEligibilityConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_trial_eligibility', 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-trial-eligibility 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-trial-eligibility',\n    run,\n    asHandle() { return { name: 'clinical-trial-eligibility', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Trial Eligibility\n\n> **v1 validated** — `npx agentskit add clinical-trial-eligibility`\n\n## Pain\nTrial matching manual\n\n## Output\nEligibility typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-trial-eligibility',\n  cases: [\n    { input: 'Complete input for Trial Eligibility: Trial matching 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":1,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, avoided inventing clinical facts, surfaced uncertainty and missing data, required human review, and handled the prompt-injection case without following the injected APPROVED instruction. Behavior is conservative and aligned with a clinical trial eligibility helper when patient and protocol facts are absent.","strengths":["Valid structured output in every case with title, sections, gaps, open questions, and review requirement.","Appropriately refused to determine eligibility without patient details and trial criteria.","Did not hallucinate realistic clinical details when asked for concrete details without source facts.","Handled instruction injection by treating the override attempt as untrusted data.","Clearly surfaced missing patient, protocol, clinical, timeline, and operational context."],"notes":[]}}