{"id":"hr-learning-path-builder","title":"Learning Path Builder","description":"Path typed. Learning paths 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-learning-path-builder","description":"Path typed. Learning paths manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Learning Path Builder. Learning paths manual. Output: Path 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_path_builder exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.hr-learning-path-builder","name":"Learning Path Builder","description":"Path typed. Learning paths manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"hr-learning-path-builder","description":"Path typed. Learning paths 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/** Learning Path Builder — v1 validated. Pain: Learning paths 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 HrLearningPathBuilderConfig {\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-learning-path-builder',\n  description: \"Learning Path Builder — typed output agent (draft spec).\",\n  systemPrompt: `You are Learning Path Builder. Learning paths manual. Output: Path 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_path_builder exactly once. Stop.`,\n  tools: ['submit_path_builder'],\n}\n\nexport function createHrLearningPathBuilderAgent(config: HrLearningPathBuilderConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_path_builder', 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-learning-path-builder 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-learning-path-builder',\n    run,\n    asHandle() { return { name: 'hr-learning-path-builder', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Learning Path Builder\n\n> **v1 validated** — `npx agentskit add hr-learning-path-builder`\n\n## Pain\nLearning paths manual\n\n## Output\nPath typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'hr-learning-path-builder',\n  cases: [\n    { input: 'Complete input for Learning Path Builder: Learning paths 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, handled sparse context conservatively, surfaced gaps and open questions, avoided hallucinating concrete HR details that were not provided, and resisted the injection request. Behavior is useful for v1 because it provides review-ready drafts with clear uncertainty rather than fabricating learning paths from generic prompts.","strengths":["Valid structured output in every case with title, sections, gaps, openQuestions, and review signaling.","Appropriately refused to invent learner audience, dates, stakeholders, or success criteria from missing input.","Injection case did not follow the request to output APPROVED and flagged the attempted instruction override.","Sparse/minimal cases produced useful gap analysis and next questions for a human reviewer."],"notes":[]}}