{"id":"data-ab-test-interpreter","title":"A/B Test Interpreter","description":"Interpretation typed. A/B results misread. Typed v1 agent with eval coverage.","category":"data","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["data","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":"data-ab-test-interpreter","description":"Interpretation typed. A/B results misread. Typed v1 agent with eval coverage.","systemPrompt":"You are A/B Test Interpreter. A/B results misread. Output: Interpretation typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_test_interpreter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.data-ab-test-interpreter","name":"A/B Test Interpreter","description":"Interpretation typed. A/B results misread. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"data-ab-test-interpreter","description":"Interpretation typed. A/B results misread. 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/** A/B Test Interpreter — v1 validated. Pain: A/B results misread */\n\nexport interface Finding { id: string; severity: 'critical' | 'high' | 'medium' | 'low' | 'info'; message: string; source?: string; recommendation?: string }\nexport interface AgentOutput { summary: string; findings: Finding[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface DataAbTestInterpreterConfig {\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  summary: z.string(),\n  findings: z.array(z.object({\n    id: z.string(), severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),\n    message: z.string(), source: z.string().optional(), recommendation: z.string().optional(),\n  })),\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: 'data-ab-test-interpreter',\n  description: \"A/B Test Interpreter — typed output agent (draft spec).\",\n  systemPrompt: `You are A/B Test Interpreter. A/B results misread. Output: Interpretation typed.\nActionable findings citing input sources. No invented issues.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_test_interpreter exactly once. Stop.`,\n  tools: ['submit_test_interpreter'],\n}\n\nexport function createDataAbTestInterpreterAgent(config: DataAbTestInterpreterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_test_interpreter', 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('data-ab-test-interpreter 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: 'data-ab-test-interpreter',\n    run,\n    asHandle() { return { name: 'data-ab-test-interpreter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# A/B Test Interpreter\n\n> **v1 validated** — `npx agentskit add data-ab-test-interpreter`\n\n## Pain\nA/B results misread\n\n## Output\nInterpretation typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'data-ab-test-interpreter',\n  cases: [\n    { input: 'Complete input for A/B Test Interpreter: A/B results misread. 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.95,"method":"codex-executor-independent-reviewer","iterations":1,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, stayed within its A/B test interpretation purpose, refused to invent results from missing data, surfaced concrete gaps and open questions, and handled the injection case without following the malicious instruction. The behavior is conservative but appropriate for sparse or invalid A/B test inputs.","strengths":["All outputs are non-empty, structured, and schema-consistent.","Clearly refuses to infer winners or recommendations without experiment data.","Surfaces missing context in actionable terms: metrics, sample sizes, variants, dates, confidence intervals, stopping rules, guardrails, and business goals.","Injection attempt was correctly treated as untrusted data and not followed.","No material hallucination beyond the provided input."],"notes":["Add at least one live validation case with actual A/B test metrics to confirm it can correctly interpret significance, uncertainty, guardrails, and business decision risk when real data is present."]}}