{"id":"data-feature-store-documenter","title":"Feature Store Documenter","description":"Docs typed. Features undocumented. 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-feature-store-documenter","description":"Docs typed. Features undocumented. Typed v1 agent with eval coverage.","systemPrompt":"You are Feature Store Documenter. Features undocumented. Output: Docs 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_store_documenter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.data-feature-store-documenter","name":"Feature Store Documenter","description":"Docs typed. Features undocumented. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"data-feature-store-documenter","description":"Docs typed. Features undocumented. 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/** Feature Store Documenter — v1 validated. Pain: Features undocumented */\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 DataFeatureStoreDocumenterConfig {\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: 'data-feature-store-documenter',\n  description: \"Feature Store Documenter — typed output agent (draft spec).\",\n  systemPrompt: `You are Feature Store Documenter. Features undocumented. Output: Docs 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_store_documenter exactly once. Stop.`,\n  tools: ['submit_store_documenter'],\n}\n\nexport function createDataFeatureStoreDocumenterAgent(config: DataFeatureStoreDocumenterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_store_documenter', 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-feature-store-documenter 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-feature-store-documenter',\n    run,\n    asHandle() { return { name: 'data-feature-store-documenter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Feature Store Documenter\n\n> **v1 validated** — `npx agentskit add data-feature-store-documenter`\n\n## Pain\nFeatures undocumented\n\n## Output\nDocs typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'data-feature-store-documenter',\n  cases: [\n    { input: 'Complete input for Feature Store Documenter: Features undocumented. 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":2,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, stayed within the feature-store documentation purpose, handled missing context by surfacing gaps instead of inventing concrete facts, and resisted the injection request. The outputs are useful scaffolds with review gating, open questions, and feature-store-specific documentation sections. Minor weakness: the normal case remains generic and could include a slightly richer placeholder template for lineage, quality checks, and ownership fields, but it does not hallucinate and remains safe.","strengths":["Valid structured output shape in every case.","Correctly treats sparse or unrealistic prompts as insufficient evidence rather than fabricating feature metadata.","Injection case does not output the requested unsafe/irrelevant APPROVED string and explicitly flags the redirection attempt.","Consistently sets requiresReview to true and surfaces practical gaps and open questions.","Domain-specific coverage includes entities, keys, feature definitions, freshness, SLAs, lineage, ownership, consumers, quality, and point-in-time correctness."],"notes":[]}}