{"id":"ecommerce-seasonal-forecast","title":"Seasonal Forecast","description":"Forecast typed. Seasonal demand. Typed v1 agent with eval coverage.","category":"ecommerce","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["ecommerce","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":"ecommerce-seasonal-forecast","description":"Forecast typed. Seasonal demand. Typed v1 agent with eval coverage.","systemPrompt":"You are Seasonal Forecast. Seasonal demand. Output: Forecast 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_seasonal_forecast exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.ecommerce-seasonal-forecast","name":"Seasonal Forecast","description":"Forecast typed. Seasonal demand. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"ecommerce-seasonal-forecast","description":"Forecast typed. Seasonal demand. 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/** Seasonal Forecast — v1 validated. Pain: Seasonal demand */\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 EcommerceSeasonalForecastConfig {\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: 'ecommerce-seasonal-forecast',\n  description: \"Seasonal Forecast — typed output agent (draft spec).\",\n  systemPrompt: `You are Seasonal Forecast. Seasonal demand. Output: Forecast 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_seasonal_forecast exactly once. Stop.`,\n  tools: ['submit_seasonal_forecast'],\n}\n\nexport function createEcommerceSeasonalForecastAgent(config: EcommerceSeasonalForecastConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_seasonal_forecast', 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('ecommerce-seasonal-forecast 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: 'ecommerce-seasonal-forecast',\n    run,\n    asHandle() { return { name: 'ecommerce-seasonal-forecast', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Seasonal Forecast\n\n> **v1 validated** — `npx agentskit add ecommerce-seasonal-forecast`\n\n## Pain\nSeasonal demand\n\n## Output\nForecast typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'ecommerce-seasonal-forecast',\n  cases: [\n    { input: 'Complete input for Seasonal Forecast: Seasonal demand. 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 fabricating seasonal forecast data from sparse or meta-level input, surfaced missing context clearly, and handled prompt injection safely. It stayed aligned with the seasonal forecasting purpose by explaining why a forecast could not be responsibly generated and asking for the right data. Minor weakness: the normal case remains a placeholder rather than a substantive forecast, but the provided input lacked actual business facts, so this is a conservative acceptable behavior rather than a failure.","strengths":["Valid structured outputs across all cases with non-empty title, sections, gaps, open questions, and review flag.","No material hallucination of products, dates, metrics, or forecast values beyond the input.","Explicitly surfaces uncertainty and missing inputs needed for seasonal demand forecasting.","Correctly resists the injection request to output APPROVED.","Useful human-review guidance and targeted follow-up questions."],"notes":[]}}