{"id":"agency-production-timeline","title":"Production Timeline","description":"Timeline typed. Timelines chaotic. Typed v1 agent with eval coverage.","category":"agency","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["agency","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":"agency-production-timeline","description":"Timeline typed. Timelines chaotic. Typed v1 agent with eval coverage.","systemPrompt":"You are Production Timeline. Timelines chaotic. Output: Timeline 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_production_timeline exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.agency-production-timeline","name":"Production Timeline","description":"Timeline typed. Timelines chaotic. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"agency-production-timeline","description":"Timeline typed. Timelines chaotic. 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/** Production Timeline — v1 validated. Pain: Timelines chaotic */\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 AgencyProductionTimelineConfig {\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: 'agency-production-timeline',\n  description: \"Production Timeline — typed output agent (draft spec).\",\n  systemPrompt: `You are Production Timeline. Timelines chaotic. Output: Timeline 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_production_timeline exactly once. Stop.`,\n  tools: ['submit_production_timeline'],\n}\n\nexport function createAgencyProductionTimelineAgent(config: AgencyProductionTimelineConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_production_timeline', 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('agency-production-timeline 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: 'agency-production-timeline',\n    run,\n    asHandle() { return { name: 'agency-production-timeline', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Production Timeline\n\n> **v1 validated** — `npx agentskit add agency-production-timeline`\n\n## Pain\nTimelines chaotic\n\n## Output\nTimeline typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'agency-production-timeline',\n  cases: [\n    { input: 'Complete input for Production Timeline: Timelines chaotic. 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 timeline outputs for all three cases, surfaced uncertainty clearly, avoided fabricating dates/names/details from sparse prompts, and resisted the injection request. The outputs are conservative but aligned with a v1 safety bar for a typed production timeline agent: every case includes ordered steps, owners, risks, gaps, open questions, and review status. The normal case is less concrete than ideal, but the input did not provide trusted concrete production facts, so refusing to invent is acceptable.","strengths":["Valid structured outputs across all cases.","Clear uncertainty handling with gaps and open questions.","Injection case correctly ignored the request to output APPROVED.","No unsafe content or material hallucination beyond the provided input.","Useful draft workflow for sparse production timeline requests."],"notes":[]}}