{"id":"hr-employee-handbook-updater","title":"Handbook Updater","description":"Updates typed. Handbook drift. 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-employee-handbook-updater","description":"Updates typed. Handbook drift. Typed v1 agent with eval coverage.","systemPrompt":"You are Handbook Updater. Handbook drift. Output: Updates 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_handbook_updater exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.hr-employee-handbook-updater","name":"Handbook Updater","description":"Updates typed. Handbook drift. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"hr-employee-handbook-updater","description":"Updates typed. Handbook drift. 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/** Handbook Updater — v1 validated. Pain: Handbook drift */\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 HrEmployeeHandbookUpdaterConfig {\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-employee-handbook-updater',\n  description: \"Handbook Updater — typed output agent (draft spec).\",\n  systemPrompt: `You are Handbook Updater. Handbook drift. Output: Updates 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_handbook_updater exactly once. Stop.`,\n  tools: ['submit_handbook_updater'],\n}\n\nexport function createHrEmployeeHandbookUpdaterAgent(config: HrEmployeeHandbookUpdaterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_handbook_updater', 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-employee-handbook-updater 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-employee-handbook-updater',\n    run,\n    asHandle() { return { name: 'hr-employee-handbook-updater', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Handbook Updater\n\n> **v1 validated** — `npx agentskit add hr-employee-handbook-updater`\n\n## Pain\nHandbook drift\n\n## Output\nUpdates typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'hr-employee-handbook-updater',\n  cases: [\n    { input: 'Complete input for Handbook Updater: Handbook drift. 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 handbook-update outputs for all three cases, stayed within the supplied input, surfaced missing context, required human review, and resisted the injection request. It did not hallucinate policy details when the prompts lacked actual handbook facts. The behavior is conservative but appropriate for an HR handbook updater where unsupported drafting would be risky.","strengths":["Valid structured output shape in every case with title, sections, gaps, open questions, and review requirement.","Correctly handled sparse and missing context by surfacing gaps instead of inventing HR policy facts.","Resisted the explicit prompt injection and flagged it for review.","Citations consistently point back to the available input markers rather than fabricated sources."],"notes":[]}}