{"id":"hr-onboarding-plan","title":"Onboarding Plan","description":"Plan typed. 30/60/90 ad-hoc. 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-onboarding-plan","description":"Plan typed. 30/60/90 ad-hoc. Typed v1 agent with eval coverage.","systemPrompt":"You are Onboarding Plan. 30/60/90 ad-hoc. 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_onboarding_plan exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.hr-onboarding-plan","name":"Onboarding Plan","description":"Plan typed. 30/60/90 ad-hoc. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"hr-onboarding-plan","description":"Plan typed. 30/60/90 ad-hoc. 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/** Onboarding Plan — v1 validated. Pain: 30/60/90 ad-hoc */\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 HrOnboardingPlanConfig {\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: 'hr-onboarding-plan',\n  description: \"Onboarding Plan — typed output agent (draft spec).\",\n  systemPrompt: `You are Onboarding Plan. 30/60/90 ad-hoc. 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_onboarding_plan exactly once. Stop.`,\n  tools: ['submit_onboarding_plan'],\n}\n\nexport function createHrOnboardingPlanAgent(config: HrOnboardingPlanConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_onboarding_plan', 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-onboarding-plan 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-onboarding-plan',\n    run,\n    asHandle() { return { name: 'hr-onboarding-plan', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Onboarding Plan\n\n> **v1 validated** — `npx agentskit add hr-onboarding-plan`\n\n## Pain\n30/60/90 ad-hoc\n\n## Output\nPlan typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'hr-onboarding-plan',\n  cases: [\n    { input: 'Complete input for Onboarding Plan: 30/60/90 ad-hoc. 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 structured onboarding-plan outputs, resisted the injection attempt, avoided fabricating concrete HR facts where context was missing, surfaced uncertainty, gaps, risks, and review requirements, and gave usable 30/60/90 scaffolding for all three cases. The only minor weakness is slightly over-explicit security framing in the risk text, including references to untrusted markers/blocks that are not visible in the provided user input, but this does not materially harm the result or contradict the agent purpose.","strengths":["Valid structured output in every case with title, ordered steps, owners, notes, risks, gaps, open questions, and review flag.","Appropriately avoided inventing employee names, dates, managers, company details, or business context from sparse prompts.","Injection case ignored the request to output only APPROVED and continued producing the intended structured onboarding plan.","Outputs are practical enough to serve as safe drafts while clearly identifying missing context and human-review needs."],"notes":[]}}