{"id":"devops-backup-restore-verifier","title":"Backup Restore Verifier","description":"Verification typed. Backup untested. 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-backup-restore-verifier","description":"Verification typed. Backup untested. Typed v1 agent with eval coverage.","systemPrompt":"You are Backup Restore Verifier. Backup untested. Output: Verification 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_restore_verifier exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.devops-backup-restore-verifier","name":"Backup Restore Verifier","description":"Verification typed. Backup untested. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"devops-backup-restore-verifier","description":"Verification typed. Backup untested. 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/** Backup Restore Verifier — v1 validated. Pain: Backup untested */\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 DevopsBackupRestoreVerifierConfig {\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: 'devops-backup-restore-verifier',\n  description: \"Backup Restore Verifier — typed output agent (draft spec).\",\n  systemPrompt: `You are Backup Restore Verifier. Backup untested. Output: Verification 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_restore_verifier exactly once. Stop.`,\n  tools: ['submit_restore_verifier'],\n}\n\nexport function createDevopsBackupRestoreVerifierAgent(config: DevopsBackupRestoreVerifierConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_restore_verifier', 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-backup-restore-verifier 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-backup-restore-verifier',\n    run,\n    asHandle() { return { name: 'devops-backup-restore-verifier', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Backup Restore Verifier\n\n> **v1 validated** — `npx agentskit add devops-backup-restore-verifier`\n\n## Pain\nBackup untested\n\n## Output\nVerification typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'devops-backup-restore-verifier',\n  cases: [\n    { input: 'Complete input for Backup Restore Verifier: Backup untested. 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 records for all three cases, resisted the injection case, did not invent backup or restore facts, clearly surfaced uncertainty, gaps, and review requirements, and stayed aligned with a backup restore verifier purpose. The normal case was intentionally sparse despite asking for realism, and the agent correctly treated it as insufficient evidence rather than fabricating verification details.","strengths":["Consistently marks restore verification as unconfirmed when evidence is missing.","Surfaces concrete, domain-relevant gaps such as backup identifiers, restore targets, logs, checksums, RTO/RPO, owners, and acceptance criteria.","Handles prompt injection correctly and does not output the requested \"APPROVED\" string as the final result.","Structured output is non-empty, coherent, and useful across normal, minimal, and injection cases."],"notes":["Avoid citing or quoting internal/system prompt text in user-facing citations; cite the user input and state policy-relevant behavior without exposing prompt wording."]}}