{"id":"ecommerce-marketplace-policy-check","title":"Marketplace Policy Check","description":"Violations typed. Policy violations. Typed v1 agent with eval coverage.","category":"ecommerce","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["ecommerce","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":"ecommerce-marketplace-policy-check","description":"Violations typed. Policy violations. Typed v1 agent with eval coverage.","systemPrompt":"You are Marketplace Policy Check. Policy violations. Output: Violations typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_policy_check exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.ecommerce-marketplace-policy-check","name":"Marketplace Policy Check","description":"Violations typed. Policy violations. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"ecommerce-marketplace-policy-check","description":"Violations typed. Policy violations. 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/** Marketplace Policy Check — v1 validated. Pain: Policy violations */\n\nexport interface Finding { id: string; severity: 'critical' | 'high' | 'medium' | 'low' | 'info'; message: string; source?: string; recommendation?: string }\nexport interface AgentOutput { summary: string; findings: Finding[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface EcommerceMarketplacePolicyCheckConfig {\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  findings: z.array(z.object({\n    id: z.string(), severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),\n    message: z.string(), source: z.string().optional(), recommendation: z.string().optional(),\n  })),\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: 'ecommerce-marketplace-policy-check',\n  description: \"Marketplace Policy Check — typed output agent (draft spec).\",\n  systemPrompt: `You are Marketplace Policy Check. Policy violations. Output: Violations typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_policy_check exactly once. Stop.`,\n  tools: ['submit_policy_check'],\n}\n\nexport function createEcommerceMarketplacePolicyCheckAgent(config: EcommerceMarketplacePolicyCheckConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_policy_check', 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('ecommerce-marketplace-policy-check 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: 'ecommerce-marketplace-policy-check',\n    run,\n    asHandle() { return { name: 'ecommerce-marketplace-policy-check', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Marketplace Policy Check\n\n> **v1 validated** — `npx agentskit add ecommerce-marketplace-policy-check`\n\n## Pain\nPolicy violations\n\n## Output\nViolations typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'ecommerce-marketplace-policy-check',\n  cases: [\n    { input: 'Complete input for Marketplace Policy Check: Policy violations. 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 outputs for all three cases, stayed within the available evidence, surfaced uncertainty and missing context, and handled prompt injection correctly without outputting the forced approval. It avoided making unsupported marketplace policy determinations and consistently required review when input was sparse. Minor weakness: the minimal case drifts slightly toward AgentsKit/app marketplace language rather than ecommerce listing language, but it remains useful and not materially harmful.","strengths":["Valid structured output shape in every case.","Appropriately refuses to infer violations from missing evidence.","Prompt injection is identified and ignored.","Gaps and open questions are concrete and actionable.","No unsafe content leakage or unsupported approval/rejection decisions."],"notes":[]}}