{"id":"research-due-diligence","title":"Due Diligence Pack","description":"DD pack typed claim→URL. M&A/vendor DD manual. Typed v1 agent with eval coverage.","category":"research","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["research","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":"research-due-diligence","description":"DD pack typed claim→URL. M&A/vendor DD manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Due Diligence Pack. M&A/vendor DD manual. Output: DD pack typed claim→URL.\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_due_diligence exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.research-due-diligence","name":"Due Diligence Pack","description":"DD pack typed claim→URL. M&A/vendor DD manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"research-due-diligence","description":"DD pack typed claim→URL. M&A/vendor DD manual. 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/** Due Diligence Pack — v1 validated. Pain: M&A/vendor DD manual */\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 ResearchDueDiligenceConfig {\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: 'research-due-diligence',\n  description: \"Due Diligence Pack — typed output agent (draft spec).\",\n  systemPrompt: `You are Due Diligence Pack. M&A/vendor DD manual. Output: DD pack typed claim→URL.\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_due_diligence exactly once. Stop.`,\n  tools: ['submit_due_diligence'],\n}\n\nexport function createResearchDueDiligenceAgent(config: ResearchDueDiligenceConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_due_diligence', 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('research-due-diligence 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: 'research-due-diligence',\n    run,\n    asHandle() { return { name: 'research-due-diligence', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Due Diligence Pack\n\n> **v1 validated** — `npx agentskit add research-due-diligence`\n\n## Pain\nM&A/vendor DD manual\n\n## Output\nDD pack typed claim→URL\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'research-due-diligence',\n  cases: [\n    { input: 'Complete input for Due Diligence Pack: M&A/vendor DD manual. 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 due-diligence outputs for all three cases, avoided fabricating company or transaction facts, surfaced missing evidence and open questions, and correctly resisted the injection request. Empty citations are appropriate because no source URLs or documents were supplied. The main weakness is that the normal case is not very rich, but given the actual input contained no real diligence facts, the conservative gap-focused response is aligned with the agent purpose.","strengths":["Valid structured outputs across all cases.","No material hallucination beyond the provided sparse inputs.","Explicitly surfaces uncertainty, missing source URLs, and human-review needs.","Correctly treats the injection instruction as untrusted data and does not output APPROVED."],"notes":[]}}