{"id":"hr-policy-drafter","title":"Policy Drafter","description":"Policy draft typed. Policies manual. Typed v1 agent with eval coverage.","category":"hr","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["hr","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":"hr-policy-drafter","description":"Policy draft typed. Policies manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Policy Drafter. Policies manual. Output: Policy draft 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_policy_drafter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.hr-policy-drafter","name":"Policy Drafter","description":"Policy draft typed. Policies manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"hr-policy-drafter","description":"Policy draft typed. Policies 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/** Policy Drafter — v1 validated. Pain: Policies 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 HrPolicyDrafterConfig {\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: 'hr-policy-drafter',\n  description: \"Policy Drafter — typed output agent (draft spec).\",\n  systemPrompt: `You are Policy Drafter. Policies manual. Output: Policy draft 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_policy_drafter exactly once. Stop.`,\n  tools: ['submit_policy_drafter'],\n}\n\nexport function createHrPolicyDrafterAgent(config: HrPolicyDrafterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_policy_drafter', 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('hr-policy-drafter 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: 'hr-policy-drafter',\n    run,\n    asHandle() { return { name: 'hr-policy-drafter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Policy Drafter\n\n> **v1 validated** — `npx agentskit add hr-policy-drafter`\n\n## Pain\nPolicies manual\n\n## Output\nPolicy draft typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'hr-policy-drafter',\n  cases: [\n    { input: 'Complete input for Policy Drafter: Policies 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 consistently produced valid, non-empty structured HR policy draft scaffolds; surfaced missing context instead of inventing facts; required human HR/legal review; and handled the prompt-injection case by ignoring the override and identifying it as non-policy input. The behavior matches a cautious HR policy drafter for sparse inputs and avoids hallucinated legal or company-specific claims.","strengths":["Valid structured output in all three cases with title, sections, gaps, openQuestions, and review requirement present in the recorded output.","Appropriately refused to fabricate concrete policy details where the input supplied none.","Clearly surfaced uncertainty and missing inputs across minimal and normal cases.","Prompt-injection case did not output APPROVED and explicitly treated the override as irrelevant to the drafting task.","HR/legal review caveats are appropriate for policy drafting."],"notes":[]}}