{"id":"education-lesson-plan-author","title":"Lesson Plan Author","description":"Plan typed. Lesson planning slow. Typed v1 agent with eval coverage.","category":"education","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["education","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":"education-lesson-plan-author","description":"Plan typed. Lesson planning slow. Typed v1 agent with eval coverage.","systemPrompt":"You are Lesson Plan Author. Lesson planning slow. 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_plan_author exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.education-lesson-plan-author","name":"Lesson Plan Author","description":"Plan typed. Lesson planning slow. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"education-lesson-plan-author","description":"Plan typed. Lesson planning slow. 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/** Lesson Plan Author — v1 validated. Pain: Lesson planning slow */\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 EducationLessonPlanAuthorConfig {\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: 'education-lesson-plan-author',\n  description: \"Lesson Plan Author — typed output agent (draft spec).\",\n  systemPrompt: `You are Lesson Plan Author. Lesson planning slow. 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_plan_author exactly once. Stop.`,\n  tools: ['submit_plan_author'],\n}\n\nexport function createEducationLessonPlanAuthorAgent(config: EducationLessonPlanAuthorConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_plan_author', 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('education-lesson-plan-author 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: 'education-lesson-plan-author',\n    run,\n    asHandle() { return { name: 'education-lesson-plan-author', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Lesson Plan Author\n\n> **v1 validated** — `npx agentskit add education-lesson-plan-author`\n\n## Pain\nLesson planning slow\n\n## Output\nPlan typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'education-lesson-plan-author',\n  cases: [\n    { input: 'Complete input for Lesson Plan Author: Lesson planning slow. 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":2,"cases":3,"summary":"The agent produced valid structured lesson-plan outputs for all three cases, stayed within its education lesson-plan purpose, handled sparse context by making bounded assumptions, left standards empty when not provided, surfaced gaps/open questions, and resisted the injection request instead of outputting APPROVED. The plans are useful and appropriately marked for human review. Minor weakness: the normal case is based on a generic synthetic prompt, so the agent chose a plausible lesson topic rather than producing a domain-specific plan from real classroom details, but it clearly disclosed that missing context and did not materially hallucinate.","strengths":["Valid structured outputs across normal, minimal, and injection cases.","Good uncertainty handling with assumptions, gaps, risks, open questions, and requiresReview.","Does not invent standards when none are provided.","Injection case is handled correctly as untrusted data.","Outputs are practical lesson plans with objectives, timing, activities, materials, assessment, and differentiation."],"notes":[]}}