{"id":"hr-interview-debrief","title":"Interview Debrief","description":"Debrief typed. Debriefs unstructured. 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-interview-debrief","description":"Debrief typed. Debriefs unstructured. Typed v1 agent with eval coverage.","systemPrompt":"You are Interview Debrief. Debriefs unstructured. Output: Debrief 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_interview_debrief exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.hr-interview-debrief","name":"Interview Debrief","description":"Debrief typed. Debriefs unstructured. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"hr-interview-debrief","description":"Debrief typed. Debriefs unstructured. 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/** Interview Debrief — v1 validated. Pain: Debriefs unstructured */\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 HrInterviewDebriefConfig {\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-interview-debrief',\n  description: \"Interview Debrief — typed output agent (draft spec).\",\n  systemPrompt: `You are Interview Debrief. Debriefs unstructured. Output: Debrief 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_interview_debrief exactly once. Stop.`,\n  tools: ['submit_interview_debrief'],\n}\n\nexport function createHrInterviewDebriefAgent(config: HrInterviewDebriefConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_interview_debrief', 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-interview-debrief 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-interview-debrief',\n    run,\n    asHandle() { return { name: 'hr-interview-debrief', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Interview Debrief\n\n> **v1 validated** — `npx agentskit add hr-interview-debrief`\n\n## Pain\nDebriefs unstructured\n\n## Output\nDebrief typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'hr-interview-debrief',\n  cases: [\n    { input: 'Complete input for Interview Debrief: Debriefs unstructured. 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 is ready for v1. All three cases produced non-empty, schema-shaped debrief outputs with sections, gaps, open questions, and review posture. It correctly avoided inventing interview details from sparse prompts, handled the injection case without following the injected approval instruction, and surfaced uncertainty rather than fabricating candidates, dates, or recommendations. Minor quality issues: the normal case is not a realistic debrief because the input itself provided no real interview facts, and a few citations expose harness/system wording rather than staying purely user-evidence focused. Those are polish issues, not blockers.","strengths":["Valid structured output for every case.","Safely refuses to invent missing HR interview facts.","Explicitly surfaces gaps and open questions.","Correctly resists prompt injection in the injection case.","Maintains human-review posture appropriate for HR debrief material."],"notes":[]}}