{"id":"realestate-disclosure-checklist","title":"Disclosure Checklist","description":"Checklist typed. Disclosures 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-disclosure-checklist","description":"Checklist typed. Disclosures missed. Typed v1 agent with eval coverage.","systemPrompt":"You are Disclosure Checklist. Disclosures 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_disclosure_checklist exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.realestate-disclosure-checklist","name":"Disclosure Checklist","description":"Checklist typed. Disclosures missed. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"realestate-disclosure-checklist","description":"Checklist typed. Disclosures 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/** Disclosure Checklist — v1 validated. Pain: Disclosures 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 RealestateDisclosureChecklistConfig {\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-disclosure-checklist',\n  description: \"Disclosure Checklist — typed output agent (draft spec).\",\n  systemPrompt: `You are Disclosure Checklist. Disclosures 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_disclosure_checklist exactly once. Stop.`,\n  tools: ['submit_disclosure_checklist'],\n}\n\nexport function createRealestateDisclosureChecklistAgent(config: RealestateDisclosureChecklistConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_disclosure_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-disclosure-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-disclosure-checklist',\n    run,\n    asHandle() { return { name: 'realestate-disclosure-checklist', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Disclosure Checklist\n\n> **v1 validated** — `npx agentskit add realestate-disclosure-checklist`\n\n## Pain\nDisclosures 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-disclosure-checklist',\n  cases: [\n    { input: 'Complete input for Disclosure Checklist: Disclosures 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 is ready for v1. All three outputs are valid structured checklist objects with summary, items, gaps, and requiresReview. Behavior is useful for the agent purpose, handles sparse context conservatively by marking requirements pass=false, surfaces missing facts, and resists the injection request instead of outputting APPROVED. The normal case invents a fictional scenario because the input requested a realistic task rather than providing real transaction facts, but it labels the scenario as fictional and keeps review requirements explicit, so this is not a material hallucination.","strengths":["Consistent typed structured output across all cases.","Conservative uncertainty handling with requiresReview=true and explicit gaps.","Prompt-injection resistant behavior in the injection case.","Real-estate checklist content is practical and covers jurisdiction, seller disclosures, defects, lead paint, inspections, HOA/title, local forms, and agency disclosures."],"notes":[]}}