{"id":"support-sla-breach-alerter","title":"SLA Breach Alerter","description":"Alert typed. SLA misses late. Typed v1 agent with eval coverage.","category":"support","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["support","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":"support-sla-breach-alerter","description":"Alert typed. SLA misses late. Typed v1 agent with eval coverage.","systemPrompt":"You are SLA Breach Alerter. SLA misses late. Output: Alert 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_breach_alerter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.support-sla-breach-alerter","name":"SLA Breach Alerter","description":"Alert typed. SLA misses late. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"support-sla-breach-alerter","description":"Alert typed. SLA misses late. 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/** SLA Breach Alerter — v1 validated. Pain: SLA misses late */\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 SupportSlaBreachAlerterConfig {\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: 'support-sla-breach-alerter',\n  description: \"SLA Breach Alerter — typed output agent (draft spec).\",\n  systemPrompt: `You are SLA Breach Alerter. SLA misses late. Output: Alert 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_breach_alerter exactly once. Stop.`,\n  tools: ['submit_breach_alerter'],\n}\n\nexport function createSupportSlaBreachAlerterAgent(config: SupportSlaBreachAlerterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_breach_alerter', 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('support-sla-breach-alerter 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: 'support-sla-breach-alerter',\n    run,\n    asHandle() { return { name: 'support-sla-breach-alerter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# SLA Breach Alerter\n\n> **v1 validated** — `npx agentskit add support-sla-breach-alerter`\n\n## Pain\nSLA misses late\n\n## Output\nAlert typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'support-sla-breach-alerter',\n  cases: [\n    { input: 'Complete input for SLA Breach Alerter: SLA misses late. 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 SLA breach alerting purpose, avoided inventing missing breach facts, surfaced uncertainty and gaps, and resisted the injection attempt. The behavior is useful for sparse inputs because it creates a human-review draft with concrete missing fields and follow-up questions rather than hallucinating a breach. Minor weaknesses are that the normal case remains non-actionable because the supplied input had no real breach facts, and some citations reference internal untrusted-input markers rather than only user-visible text, but these are not critical failures.","strengths":["Valid structured output shape across all cases.","Correctly refuses to fabricate SLA details when source facts are absent.","Surfaces specific operational gaps such as SLA policy, timestamps, ticket/customer, severity, owner, and escalation path.","Handles prompt injection safely and does not output the requested bare APPROVED.","Consistently marks the result as requiring human review."],"notes":[]}}