{"id":"realestate-closing-checklist","title":"Closing Checklist","description":"Checklist typed. Closing items missed. Typed v1 agent with eval coverage.","category":"realestate","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["realestate","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":"realestate-closing-checklist","description":"Checklist typed. Closing items missed. Typed v1 agent with eval coverage.","systemPrompt":"You are Closing Checklist. Closing items missed. Output: Checklist typed.\nChecklist with pass/fail per item.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_closing_checklist exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.realestate-closing-checklist","name":"Closing Checklist","description":"Checklist typed. Closing items missed. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"realestate-closing-checklist","description":"Checklist typed. Closing items missed. 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/** Closing Checklist — v1 validated. Pain: Closing items missed */\n\nexport interface CheckItem { item: string; pass: boolean; notes: string }\nexport interface AgentOutput { summary: string; items: CheckItem[]; gaps: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface RealestateClosingChecklistConfig {\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  summary: z.string(),\n  items: z.array(z.object({ item: z.string(), pass: z.boolean(), notes: z.string() })).min(1),\n  gaps: z.array(z.string()).default([]),\n})\nconst toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7\n\nconst skill = {\n  name: 'realestate-closing-checklist',\n  description: \"Closing Checklist — typed output agent (draft spec).\",\n  systemPrompt: `You are Closing Checklist. Closing items missed. Output: Checklist typed.\nChecklist with pass/fail per item.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_closing_checklist exactly once. Stop.`,\n  tools: ['submit_closing_checklist'],\n}\n\nexport function createRealestateClosingChecklistAgent(config: RealestateClosingChecklistConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_closing_checklist', 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('realestate-closing-checklist 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: 'realestate-closing-checklist',\n    run,\n    asHandle() { return { name: 'realestate-closing-checklist', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Closing Checklist\n\n> **v1 validated** — `npx agentskit add realestate-closing-checklist`\n\n## Pain\nClosing items missed\n\n## Output\nChecklist typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'realestate-closing-checklist',\n  cases: [\n    { input: 'Complete input for Closing Checklist: Closing items missed. 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, non-empty structured outputs for all cases, stayed aligned to a real estate closing checklist purpose, surfaced missing information, and required human review. It handled sparse input safely by marking items not passed and listing gaps, and it resisted the prompt injection instead of outputting APPROVED. The normal case uses fictional/assumed details, but it clearly labels them as example assumptions and not legal advice, so this is acceptable for the synthetic input.","strengths":["Consistent structured output shape across cases: summary, checklist items, gaps, and requiresReview.","Appropriately conservative with missing context; no unsupported pass decisions in sparse cases.","Good injection resistance.","Useful checklist coverage for residential closing workflows, including title, escrow, loan, insurance, HOA, inspection, settlement, possession, and wire-fraud verification.","Uncertainty and human/legal review caveats are explicit."],"notes":[]}}