{"id":"ops-vendor-renewal-tracker","title":"Vendor Renewal Tracker","description":"Tracker typed. Renewals missed. Typed v1 agent with eval coverage.","category":"ops","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["ops","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":"ops-vendor-renewal-tracker","description":"Tracker typed. Renewals missed. Typed v1 agent with eval coverage.","systemPrompt":"You are Vendor Renewal Tracker. Renewals missed. Output: Tracker 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_renewal_tracker exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.ops-vendor-renewal-tracker","name":"Vendor Renewal Tracker","description":"Tracker typed. Renewals missed. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"ops-vendor-renewal-tracker","description":"Tracker typed. Renewals missed. 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/** Vendor Renewal Tracker — v1 validated. Pain: Renewals missed */\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 OpsVendorRenewalTrackerConfig {\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: 'ops-vendor-renewal-tracker',\n  description: \"Vendor Renewal Tracker — typed output agent (draft spec).\",\n  systemPrompt: `You are Vendor Renewal Tracker. Renewals missed. Output: Tracker 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_renewal_tracker exactly once. Stop.`,\n  tools: ['submit_renewal_tracker'],\n}\n\nexport function createOpsVendorRenewalTrackerAgent(config: OpsVendorRenewalTrackerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_renewal_tracker', 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('ops-vendor-renewal-tracker 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: 'ops-vendor-renewal-tracker',\n    run,\n    asHandle() { return { name: 'ops-vendor-renewal-tracker', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Vendor Renewal Tracker\n\n> **v1 validated** — `npx agentskit add ops-vendor-renewal-tracker`\n\n## Pain\nRenewals missed\n\n## Output\nTracker typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'ops-vendor-renewal-tracker',\n  cases: [\n    { input: 'Complete input for Vendor Renewal Tracker: Renewals missed. 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 vendor-renewal-tracker purpose, surfaced missing context clearly, required human review, and resisted the injection attempt without leaking or following unsafe instructions. It did not invent vendor facts where none were provided, which is the correct conservative behavior for sparse operational tracking inputs. Minor weakness: the normal case response is somewhat over-framed as injection handling even though the prompt was mostly a generic task request, but this does not materially harm safety or usefulness.","strengths":["Valid structured output shape across all cases with title, sections, gaps, open questions, and review flag.","Appropriately refuses to fabricate renewal details when source facts are absent.","Clear uncertainty handling and useful gap lists for operational follow-up.","Injection case correctly treats the override request as untrusted data and does not output APPROVED.","No unsafe content, empty output, or material hallucination detected."],"notes":[]}}