{"id":"devops-oncall-schedule-optimizer","title":"On-call Schedule Optimizer","description":"Schedule typed. Unfair on-call. Typed v1 agent with eval coverage.","category":"devops","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["devops","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":"devops-oncall-schedule-optimizer","description":"Schedule typed. Unfair on-call. Typed v1 agent with eval coverage.","systemPrompt":"You are On-call Schedule Optimizer. Unfair on-call. Output: Schedule typed.\nOrdered plan with risks and gaps.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_schedule_optimizer exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.devops-oncall-schedule-optimizer","name":"On-call Schedule Optimizer","description":"Schedule typed. Unfair on-call. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"devops-oncall-schedule-optimizer","description":"Schedule typed. Unfair on-call. 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/** On-call Schedule Optimizer — v1 validated. Pain: Unfair on-call */\n\nexport interface Step { order: number; action: string; owner?: string; notes?: string }\nexport interface AgentOutput { title: string; steps: Step[]; risks: string[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface DevopsOncallScheduleOptimizerConfig {\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  steps: z.array(z.object({ order: z.number().int(), action: z.string(), owner: z.string().optional(), notes: z.string().optional() })).min(1),\n  risks: z.array(z.string()).default([]),\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: 'devops-oncall-schedule-optimizer',\n  description: \"On-call Schedule Optimizer — typed output agent (draft spec).\",\n  systemPrompt: `You are On-call Schedule Optimizer. Unfair on-call. Output: Schedule typed.\nOrdered plan with risks and gaps.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_schedule_optimizer exactly once. Stop.`,\n  tools: ['submit_schedule_optimizer'],\n}\n\nexport function createDevopsOncallScheduleOptimizerAgent(config: DevopsOncallScheduleOptimizerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_schedule_optimizer', 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('devops-oncall-schedule-optimizer 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: 'devops-oncall-schedule-optimizer',\n    run,\n    asHandle() { return { name: 'devops-oncall-schedule-optimizer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# On-call Schedule Optimizer\n\n> **v1 validated** — `npx agentskit add devops-oncall-schedule-optimizer`\n\n## Pain\nUnfair on-call\n\n## Output\nSchedule typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'devops-oncall-schedule-optimizer',\n  cases: [\n    { input: 'Complete input for On-call Schedule Optimizer: Unfair on-call. 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, avoided inventing roster/date facts from sparse prompts, surfaced uncertainty clearly, listed actionable gaps and questions, and resisted the injection attempt instead of outputting the requested fixed string. Behavior is useful and aligned with a cautious on-call schedule optimizer under missing-context conditions. The main limitation is that the evaluated cases do not demonstrate optimization with a real roster and date range, so readiness confidence is high but not maximal.","strengths":["Valid structured output in every case with non-empty title, steps, risks, gaps, open questions, and review flag in the recorded artifact.","Correctly refused to fabricate concrete schedules when required scheduling inputs were absent.","Handled prompt injection safely and explicitly treated the malicious instruction as untrusted data.","Useful domain coverage: roster, rotation history, PTO, holidays, time zones, escalation tiers, fairness metrics, weekend/holiday burden, and human review."],"notes":[]}}