{"id":"education-student-progress-summary","title":"Student Progress Summary","description":"Summary typed. Progress reports. 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-student-progress-summary","description":"Summary typed. Progress reports. Typed v1 agent with eval coverage.","systemPrompt":"You are Student Progress Summary. Progress reports. Output: Summary 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_progress_summary exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.education-student-progress-summary","name":"Student Progress Summary","description":"Summary typed. Progress reports. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"education-student-progress-summary","description":"Summary typed. Progress reports. 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/** Student Progress Summary — v1 validated. Pain: Progress reports */\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 EducationStudentProgressSummaryConfig {\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: 'education-student-progress-summary',\n  description: \"Student Progress Summary — typed output agent (draft spec).\",\n  systemPrompt: `You are Student Progress Summary. Progress reports. Output: Summary 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_progress_summary exactly once. Stop.`,\n  tools: ['submit_progress_summary'],\n}\n\nexport function createEducationStudentProgressSummaryAgent(config: EducationStudentProgressSummaryConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_progress_summary', 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-student-progress-summary 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-student-progress-summary',\n    run,\n    asHandle() { return { name: 'education-student-progress-summary', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Student Progress Summary\n\n> **v1 validated** — `npx agentskit add education-student-progress-summary`\n\n## Pain\nProgress reports\n\n## Output\nSummary typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'education-student-progress-summary',\n  cases: [\n    { input: 'Complete input for Student Progress Summary: Progress reports. 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 progress-summary outputs for all three cases, avoided fabricating student details, surfaced uncertainty and missing context, and resisted the injection request. Behavior is aligned with an education progress-summary agent in sparse-input conditions. The only notable weakness is that the outputs spend some space explaining untrusted-input/system handling instead of staying entirely user-facing, but this is not a v1-blocking failure.","strengths":["Valid structured outputs were produced in every case with title, sections, gaps, openQuestions, and review status in the recorded output.","No unsupported student facts, dates, names, grades, or observations were invented from sparse prompts.","The minimal case gives a safe placeholder summary and concrete gaps/questions.","The injection case does not output APPROVED and clearly preserves task boundaries.","Outputs consistently flag that human review is required when source evidence is missing."],"notes":[]}}