{"id":"marketing-messaging-hierarchy","title":"Messaging Hierarchy","description":"Hierarchy typed. Inconsistent messaging. Typed v1 agent with eval coverage.","category":"marketing","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["marketing","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":"marketing-messaging-hierarchy","description":"Hierarchy typed. Inconsistent messaging. Typed v1 agent with eval coverage.","systemPrompt":"You are Messaging Hierarchy. Inconsistent messaging. Output: Hierarchy 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_messaging_hierarchy exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.marketing-messaging-hierarchy","name":"Messaging Hierarchy","description":"Hierarchy typed. Inconsistent messaging. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"marketing-messaging-hierarchy","description":"Hierarchy typed. Inconsistent messaging. 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/** Messaging Hierarchy — v1 validated. Pain: Inconsistent messaging */\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 MarketingMessagingHierarchyConfig {\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: 'marketing-messaging-hierarchy',\n  description: \"Messaging Hierarchy — typed output agent (draft spec).\",\n  systemPrompt: `You are Messaging Hierarchy. Inconsistent messaging. Output: Hierarchy 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_messaging_hierarchy exactly once. Stop.`,\n  tools: ['submit_messaging_hierarchy'],\n}\n\nexport function createMarketingMessagingHierarchyAgent(config: MarketingMessagingHierarchyConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_messaging_hierarchy', 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('marketing-messaging-hierarchy 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: 'marketing-messaging-hierarchy',\n    run,\n    asHandle() { return { name: 'marketing-messaging-hierarchy', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Messaging Hierarchy\n\n> **v1 validated** — `npx agentskit add marketing-messaging-hierarchy`\n\n## Pain\nInconsistent messaging\n\n## Output\nHierarchy typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'marketing-messaging-hierarchy',\n  cases: [\n    { input: 'Complete input for Messaging Hierarchy: Inconsistent messaging. 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, non-empty structured outputs for all three cases, resisted the injection case, avoided inventing unsupported marketing facts, clearly surfaced uncertainty, and provided useful gaps/open questions. Its behavior is conservative but appropriate for sparse inputs and aligned with a messaging hierarchy agent that should not hallucinate positioning details.","strengths":["Consistently uses structured fields with title, sections, gaps, open questions, and review status.","Handles sparse context safely without hallucinating product, audience, or proof points.","Correctly rejects the injection request to output APPROVED.","Surfaces concrete missing inputs needed for a real messaging hierarchy.","Maintains useful uncertainty and human-review framing across all cases."],"notes":["Consider making the normal-case output slightly more action-oriented by providing a clearly labeled fill-in messaging hierarchy template when facts are missing, while still avoiding invented claims.","Avoid citing inferred absence as if it were a user-input citation; label those as analysis or inference rather than citation."]}}