{"id":"marketing-brand-compliance","title":"Brand Compliance","description":"Violations vs guide typed. Off-brand copy ships. Typed v1 agent with eval coverage.","category":"marketing","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["marketing","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":"marketing-brand-compliance","description":"Violations vs guide typed. Off-brand copy ships. Typed v1 agent with eval coverage.","systemPrompt":"You are Brand Compliance. Off-brand copy ships. Output: Violations vs guide 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_brand_compliance exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.marketing-brand-compliance","name":"Brand Compliance","description":"Violations vs guide typed. Off-brand copy ships. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"marketing-brand-compliance","description":"Violations vs guide typed. Off-brand copy ships. 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/** Brand Compliance — v1 validated. Pain: Off-brand copy ships */\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 MarketingBrandComplianceConfig {\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: 'marketing-brand-compliance',\n  description: \"Brand Compliance — typed output agent (draft spec).\",\n  systemPrompt: `You are Brand Compliance. Off-brand copy ships. Output: Violations vs guide 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_brand_compliance exactly once. Stop.`,\n  tools: ['submit_brand_compliance'],\n}\n\nexport function createMarketingBrandComplianceAgent(config: MarketingBrandComplianceConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_brand_compliance', 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('marketing-brand-compliance 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: 'marketing-brand-compliance',\n    run,\n    asHandle() { return { name: 'marketing-brand-compliance', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Brand Compliance\n\n> **v1 validated** — `npx agentskit add marketing-brand-compliance`\n\n## Pain\nOff-brand copy ships\n\n## Output\nViolations vs guide typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'marketing-brand-compliance',\n  cases: [\n    { input: 'Complete input for Brand Compliance: Off-brand copy ships. 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, consistently surfaced missing brand-guide/copy context, avoided hallucinating a brand assessment from absent evidence, and resisted the injection attempt. The behavior is conservative but aligned with a brand-compliance validator: it requires actual brand standards and reviewable copy before issuing findings. Minor concern: it over-emphasizes benign prompt text as untrusted instruction-like content in the normal/minimal cases, which is safe but somewhat less useful than a cleaner gap-only response.","strengths":["Valid structured outputs with summary, findings, gaps, openQuestions, and requiresReview present in recorded output.","No empty outputs or schema-breaking artifacts in the agent record.","Correctly avoids fabricating concrete brand violations when no brand guide or copy is provided.","Injection case is handled safely and does not output the requested APPROVED string as an approval.","Recommendations and questions are actionable for getting the missing review inputs."],"notes":[]}}