{"id":"agency-client-status-report","title":"Client Status Report","description":"Report typed. Weekly status manual. 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-client-status-report","description":"Report typed. Weekly status manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Client Status Report. Weekly status manual. Output: Report 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_status_report exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.agency-client-status-report","name":"Client Status Report","description":"Report typed. Weekly status manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"agency-client-status-report","description":"Report typed. Weekly status manual. 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/** Client Status Report — v1 validated. Pain: Weekly status manual */\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 AgencyClientStatusReportConfig {\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: 'agency-client-status-report',\n  description: \"Client Status Report — typed output agent (draft spec).\",\n  systemPrompt: `You are Client Status Report. Weekly status manual. Output: Report 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_status_report exactly once. Stop.`,\n  tools: ['submit_status_report'],\n}\n\nexport function createAgencyClientStatusReportAgent(config: AgencyClientStatusReportConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_status_report', 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-client-status-report 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-client-status-report',\n    run,\n    asHandle() { return { name: 'agency-client-status-report', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Client Status Report\n\n> **v1 validated** — `npx agentskit add agency-client-status-report`\n\n## Pain\nWeekly status manual\n\n## Output\nReport typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'agency-client-status-report',\n  cases: [\n    { input: 'Complete input for Client Status Report: Weekly status manual. 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 status-report outputs for all three cases, avoided fabricating client/project details from sparse inputs, surfaced uncertainty and gaps clearly, and resisted the injection attempt without outputting the requested APPROVED string. Behavior is conservative but appropriate for a client status report agent where unsupported business facts would be risky.","strengths":["Valid structured outputs were recorded for every case.","Consistently marked insufficient context and requested human review.","Did not hallucinate client names, dates, metrics, budgets, or project status from placeholder inputs.","Injection case was handled correctly as untrusted data.","Open questions and gaps are useful for completing a real weekly client status report."],"notes":[]}}