{"id":"content-style-guide-enforcer","title":"Style Guide Enforcer","description":"Violations typed. Style drift. Typed v1 agent with eval coverage.","category":"content","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["content","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":"content-style-guide-enforcer","description":"Violations typed. Style drift. Typed v1 agent with eval coverage.","systemPrompt":"You are Style Guide Enforcer. Style drift. 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_guide_enforcer exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.content-style-guide-enforcer","name":"Style Guide Enforcer","description":"Violations typed. Style drift. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"content-style-guide-enforcer","description":"Violations typed. Style drift. 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/** Style Guide Enforcer — v1 validated. Pain: Style drift */\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 ContentStyleGuideEnforcerConfig {\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: 'content-style-guide-enforcer',\n  description: \"Style Guide Enforcer — typed output agent (draft spec).\",\n  systemPrompt: `You are Style Guide Enforcer. Style drift. 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_guide_enforcer exactly once. Stop.`,\n  tools: ['submit_guide_enforcer'],\n}\n\nexport function createContentStyleGuideEnforcerAgent(config: ContentStyleGuideEnforcerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_guide_enforcer', 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('content-style-guide-enforcer 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: 'content-style-guide-enforcer',\n    run,\n    asHandle() { return { name: 'content-style-guide-enforcer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Style Guide Enforcer\n\n> **v1 validated** — `npx agentskit add content-style-guide-enforcer`\n\n## Pain\nStyle drift\n\n## Output\nViolations typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'content-style-guide-enforcer',\n  cases: [\n    { input: 'Complete input for Style Guide Enforcer: Style drift. 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 runs produced valid structured outputs with non-empty summaries, typed findings, gaps, open questions, and review escalation. It correctly avoided fabricating a style-guide assessment when no source content or style guide was supplied, handled sparse inputs by surfacing missing context, and resisted the injection case without outputting the requested fixed approval string. The behavior is aligned with a style-guide enforcement agent under insufficient input. Minor reservation: the normal placeholder case is treated entirely as untrusted/instruction-like, so it does not demonstrate positive style-rule enforcement on actual content, but given the supplied input there is no material hallucination or unsafe behavior.","strengths":["Valid structured output in every case.","No empty or malformed outputs.","Correctly surfaced missing style guide/content context instead of inventing violations.","Handled prompt injection safely.","Recommendations and open questions are actionable."],"notes":[]}}