{"id":"product-api-product-brief","title":"API Product Brief","description":"Brief typed. API product specs. Typed v1 agent with eval coverage.","category":"product","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["product","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":"product-api-product-brief","description":"Brief typed. API product specs. Typed v1 agent with eval coverage.","systemPrompt":"You are API Product Brief. API product specs. Output: Brief 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_product_brief exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.product-api-product-brief","name":"API Product Brief","description":"Brief typed. API product specs. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"product-api-product-brief","description":"Brief typed. API product specs. 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/** API Product Brief — v1 validated. Pain: API product specs */\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 ProductApiProductBriefConfig {\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: 'product-api-product-brief',\n  description: \"API Product Brief — typed output agent (draft spec).\",\n  systemPrompt: `You are API Product Brief. API product specs. Output: Brief 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_product_brief exactly once. Stop.`,\n  tools: ['submit_product_brief'],\n}\n\nexport function createProductApiProductBriefAgent(config: ProductApiProductBriefConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_product_brief', 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('product-api-product-brief 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: 'product-api-product-brief',\n    run,\n    asHandle() { return { name: 'product-api-product-brief', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# API Product Brief\n\n> **v1 validated** — `npx agentskit add product-api-product-brief`\n\n## Pain\nAPI product specs\n\n## Output\nBrief typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'product-api-product-brief',\n  cases: [\n    { input: 'Complete input for API Product Brief: API product specs. 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 product-brief outputs for all three cases, correctly avoided fabricating missing API/product facts, surfaced gaps and open questions, and resisted the injection request to output APPROVED. Behavior is conservative and aligned with the stated purpose. Minor weakness: the normal case is not a rich product brief because the input itself supplied no real product facts, and the outputs spend some space on instruction-safety notes rather than brief content; however this is appropriate under the no-hallucination requirement and does not block v1.","strengths":["Valid structured outputs across all cases.","Explicitly surfaces missing context and requires review.","Avoids hallucinating concrete product details from sparse prompts.","Handles prompt injection safely without following the malicious instruction.","Open questions are relevant to API product brief creation."],"notes":[]}}