{
  "id": "2026-04-27-dreamborn-marketing-agents-50838d1823",
  "scope": "redkey",
  "source_of_truth": "repo",
  "source_path": "docs/specs/2026-04-27-dreamborn-marketing-agents.md",
  "source_kind": "markdown",
  "visibility": "internal",
  "renderer_id": "design_doc.dreamborn-forge.generated.v1",
  "design_system": "dreamborn-design-system:forge",
  "generated_at": "2026-05-09T13:00:55.681Z",
  "artifact_type": "design_doc",
  "schema_version": "design_doc.generated.v1",
  "title": "DreamBorn Marketing Agent Team — Design Spec",
  "summary": "DreamBorn Marketing Agent Team — Design Spec Date: 2026 04 27 Branch: feature/marketing agents Status: Design in progress — decisions being finalised in session 2026 04 27 Overview A five agent marketing team that runs on the Bezel platform and produces DreamBorn's public content. The team demonstrates the platform's core value prop — parallel orchestration,...",
  "format_source": "markdown",
  "sections": [
    {
      "title": "DreamBorn Marketing Agent Team — Design Spec",
      "level": 1,
      "body": "**Date:** 2026-04-27  \n**Branch:** feature/marketing-agents  \n**Status:** Design in progress — decisions being finalised in session 2026-04-27\n\n---"
    },
    {
      "title": "Overview",
      "level": 2,
      "body": "A five-agent marketing team that runs on the Bezel platform and produces DreamBorn's public content. The team demonstrates the platform's core value prop — parallel orchestration, human exec gates, agent-authored output — while doing real business work.\n\nThe agents are not ghostwriters. They are credited authors. \"Written by Harper, DreamBorn Content Agent\" is the product demo.\n\n**Content territory:** Orchestration at scale, AI agents, distributed ledgers, consensus — the problems DreamBorn solves. Show don't tell. DreamBorn.ai is what an AI-native company looks like, not a description of one.\n\n**Primary audience:** Business builders, founders, and operators who want to understand what AI-native means in practice. Not analysts. People building things.\n\n---"
    },
    {
      "title": "Content Model",
      "level": 2,
      "body": "**Weekly output:** 14 pieces tied to a single theme Nova sets from BezelBrain.\n\n| Channel | Volume | Audience | Voice | Account |\n|---------|--------|----------|-------|---------|\n| Blog (dreamborn.ai) | 1/week | Corporate, AI-native companies | Founder narrative, principled | DreamBorn |\n| Substack | 3/week | Agent builders, Bezel audience | Technical, educational, honest | TBD (DreamBorn or Agentrophy) |\n| LinkedIn | 5/week | Manufacturers, distributors | Professional, use-case driven | Justin personal |\n| X/Twitter | 5/week (1 thread + 4 standalones) | Founders, builders | Raw, first-person, observational | Justin personal |\n\n**Weekly theme:** Nova proposes from BezelBrain. Justin can override at exec gate. Everything in the week connects back to it.\n\n**Publishing cadence:** Always one week ahead. Nova plans on Monday for the *following* week. Execution happens this week; content publishes next week. Nothing rushes to publish.\n\n**Batch / inventory mode:** Nova accepts a `weeks_ahead` param (default 1). In a power session, set to 4 — Nova plans 4 themes + 56 pieces, Engine dispatches all tasks simultaneously, agents run in parallel. The platform handles the volume natively. Nova checks inventory depth first — if a channel already has 2 weeks banked, she skips it and fills gaps only.\n\n**Editorial calendar (cockpit):** A daily calendar view in the cockpit Marketing tab (V1). Rows = channels, columns = days (current week + 3 weeks ahead). Cell states: green (approved/ready), yellow (draft in progress), empty (gap). One glance shows where content is thin.\n\n**What good looks like per channel:**\n- **Blog:** 800–1200 words. Opens with a real incident. Builds to a principle. Ends with what it means for companies. Justin's voice, Harper's structure.\n- **Substack:** 600–900 words each. Technical but readable. For people who have Claude Code open and want to understand the architecture. Concrete — real config, real outputs.\n- **LinkedIn:** 150–250 words. One-liner hook. Manufacturer/distributor frame. Ends with a question or sharp observation. Sounds like a person.\n- **X:** Short. Raw. What you'd say to another founder over coffee. Not a polished take — the thing you just figured out.\n\n**What bad looks like (agents must avoid):**\n- Generic AI takes (\"AI is transforming industries…\")\n- Explaining what agents are instead of showing what they do\n- LinkedIn posts that are just blog excerpts with line breaks\n- Substack articles that are 50% disclaimers and hedging\n\n---"
    },
    {
      "title": "AI-First Design Principle",
      "level": 2,
      "body": "Agents are the primary actors in this system. They index, retrieve, generate, evaluate, and route. Humans set direction and approve outcomes. No step in the pipeline requires a human to do mechanical work — only judgment calls belong at the exec gate.\n\nApplied here:\n- Nova evaluates topic freshness and content gaps before proposing — she doesn't just pick topics\n- Harper builds on previous posts, creates callbacks, develops series over time\n- Rosa chooses the right template for the content and generates variants before routing\n- Ivy runs a semantic quality check before surfacing to Justin — the gate is for real decisions, not proofreading\n- The asset index is agent-readable first — structured for query, not folder browsing\n\n---"
    },
    {
      "title": "Agent Roster",
      "level": 2,
      "body": "All agents: `department: marketing`, `model: claude-sonnet-4-6`"
    },
    {
      "title": "Nova — Content Strategist",
      "level": 3,
      "body": "- **Slug:** `nova`\n- **Role topic:** `roles.marketing-strategy`\n- **Schedule:** Weekly (Monday morning systemd timer)\n- **Skills:** None (strategy only — no content-writing skills)\n- **Plugins:** BezelBrain MCP, Google Drive (dreamborn), Supabase read\n- **What she does:**\n  1. Checks `weeks_ahead` param (default 1, up to N for batch/inventory mode)\n  2. Queries `content_assets` by `scheduled_date` range — finds gaps per channel per day\n  3. Queries `content_assets` for all `backlog` items — surfaces waiting ideas\n  4. Queries BezelBrain for fresh DreamBorn-relevant thinking\n  5. Sets theme(s) — one per week being planned\n  6. Assigns specific `scheduled_date` to each piece (e.g. LinkedIn Mon–Fri, Substack Mon/Wed/Fri, blog Wed, X spread across week)\n  7. Shapes pieces for gap days only — skips days/channels already covered by approved inventory\n  8. Writes ALL candidates to `content_assets` — selected as `draft` with `scheduled_date`, unselected as `backlog`\n  9. Saves `weekly_plan.md` (one per week) to Google Drive `/Marketing/Plans/`\n  10. Posts to `roles.exec` for approval — one gate per week being planned\n- **Exec gate:** Justin approves each week's plan or returns with edits. Can cut individual items before Engine dispatches.\n- **V1 source:** BezelBrain exclusively — 12+ weeks of material available.\n- **V2 enhancement:** Reads engagement data to inform angle selection. Firecrawl research added when BezelBrain coverage thins."
    },
    {
      "title": "Harper — DreamBorn Writer",
      "level": 3,
      "body": "- **Slug:** `harper`\n- **Role topic:** `roles.content-writer`\n- **Skills:** `content-writing`, `content-writing-styles`\n- **Plugins:** Google Drive (dreamborn), Supabase read/write\n- **What she does:** Long-form writing — blog (1/week) and Substack (3/week). Produces 3 full versions per piece. Standalone pieces that feel like a series — each works on its own but creates callbacks to prior work.\n- **Brief contains:** approved outline, multiple title/hook options, weekly theme, channel, scheduled_date, last 4 published pieces on that channel (for callbacks)\n- **Output per version:** Markdown with frontmatter (title, excerpt, tags, channel, scheduled_date, byline)\n- **Byline:** \"Written by Harper, DreamBorn Content Agent\"\n- **Stores to:** Google Drive `/Marketing/Content/Blog/` and `/Marketing/Content/Substack/`\n- **Writes to content_assets:** one row per version, grouped by `piece_id`, `version` 1/2/3"
    },
    {
      "title": "Jade — Social Adapter",
      "level": 3,
      "body": "- **Slug:** `jade`\n- **Role topic:** `roles.social`\n- **Skills:** `content-writing`, `content-writing-styles`\n- **Plugins:** Google Drive (dreamborn), Supabase read/write\n- **What she does:** LinkedIn (5/week) and X/Twitter (5/week: 1 thread + 4 standalones). 3 full versions per post. Writes channel-native — not repurposed Harper copy. LinkedIn = professional depth, manufacturer/distributor frame. X = raw, first-person, founder voice.\n- **Brief contains:** approved hook, angle, weekly theme, channel, scheduled_date, voice guidelines\n- **Output per version:** formatted post, character-count validated\n- **Stores to:** Google Drive `/Marketing/Content/Social/LinkedIn/` and `/Marketing/Content/Social/X/`\n- **Writes to content_assets:** one row per version, grouped by `piece_id`, `version` 1/2/3"
    },
    {
      "title": "Rosa — Visual Production",
      "level": 3,
      "body": "- **Slug:** `rosa`\n- **Role topic:** `roles.graphic`\n- **Plugins:** Puppeteer MCP, Google Drive (dreamborn), Supabase read/write\n- **What she does:** 6 graphics per Harper/Jade piece. Picks the right HTML template, fills with content, screenshots via Puppeteer. Justin selects one set at exec gate 2.\n- **Templates (ported from CCOS2, rebranded for DreamBorn brand tokens):**\n  - `infographic.html` — data-rich explainers\n  - `carousel.html` — LinkedIn multi-slide\n  - `stat_card.html` — single striking stat\n  - `quote_card.html` — pull quote / agent-authored insight\n  - `blog_hero.html` — header image for blog posts\n- **Stores to:** Google Drive `/Marketing/Graphics/<piece_id>/`\n- **V2:** Publishes to Cloudflare R2 for CDN delivery"
    },
    {
      "title": "Ivy — Publisher",
      "level": 3,
      "body": "- **Slug:** `ivy`\n- **Role topic:** `roles.publisher`\n- **Plugins:** Google Drive (dreamborn), Supabase read/write\n- **V1 behaviour:** Quality check on selected version → copy to `/Marketing/Published/` → update `content_assets` status to `staged`. On manual publish confirmation: status → `published`, `published_at` + `publish_url` recorded.\n- **V2 behaviour:** Publishes directly after staging. LinkedIn → Unipile API (`UNIPILE_API_TOKEN`). X → Twitter API v2. Substack → email API. Blog → DreamBorn.ai deploy pipeline.\n- **Design rationale:** Ivy is defined now so the slot exists. V2 activation is a config change, not a rebuild.\n\n---"
    },
    {
      "title": "Workflow Template: `weekly-content`",
      "level": 2,
      "body": "```\nStep 1 — Strategy + Outlines (Nova)\n  Trigger: Monday morning systemd timer (or manual with weeks_ahead param)\n  Actions:\n    1. Check content_assets for inventory depth per channel per day (gap analysis)\n    2. Query content_assets — backlog items + last 4 weeks published (avoid repeats)\n    3. Query BezelBrain — find unused DreamBorn-relevant thinking\n    4. Set weekly theme\n    5. For each gap day: assign channel, scheduled_date, topic\n    6. For blog + Substack pieces: produce multiple title options + multiple hook options + outline\n    7. For LinkedIn + X pieces: produce multiple title options + multiple hook options\n    8. Write ALL candidates to content_assets (selected=draft, unselected=backlog)\n    9. Save weekly_plan.md to Google Drive /Marketing/Plans/\n    10. Post to roles.exec\n\nStep 2 — Exec Gate 1 (Justin)\n  Justin makes full editorial edits — rewrites titles, sharpens hooks, cuts pieces, adds pieces.\n  Edits made directly in weekly_plan.md in Google Drive.\n  Approve → Engine advances to Step 3\n  Return with notes → Nova revises and re-posts\n\nStep 3 — Parallel: Write + Design concepts\n  All fire simultaneously. depends_on: Step 2 approval.\n\n  Harper tasks (dispatched to roles.content-writer):\n    - 3 full versions per blog piece\n    - 3 full versions per Substack article\n    Brief includes: approved outline, hooks, titles, weekly theme, last 4 published pieces on channel\n\n  Jade tasks (dispatched to roles.social):\n    - 3 full versions per LinkedIn post\n    - 3 full versions per X post (thread or standalone)\n    Brief includes: approved hook, angle, weekly theme, channel voice guidelines\n\n  Rosa tasks (dispatched to roles.graphic):\n    - 6 graphics per Harper/Jade piece (all channels)\n    Brief includes: piece topic, hook, stat, approved graphic type\n\nStep 4 — Exec Gate 2 (Justin — per piece)\n  Justin reviews all versions of each piece + all graphics.\n  Selects one version (sets is_selected=true) + one graphic set.\n  Selection sets scheduled_date → status moves to 'scheduled'.\n  Can return any piece for a rewrite with notes.\n\nStep 5 — Ivy (staging → publish)\n  V1: Quality check → copy selected version to /Marketing/Published/ →\n      update content_assets status to 'staged' → ready for manual posting\n      On publish: status → 'published', published_at + publish_url recorded\n  V2: Publishes directly after staging.\n      LinkedIn → Unipile API. X → Twitter API v2.\n      Substack → email API. Blog → DreamBorn.ai deploy pipeline.\n```\n\n---"
    },
    {
      "title": "V1 — Google Drive",
      "level": 3,
      "body": "**DreamBorn Shared Drive** (`0AHJ3Wr5leTnTUk9PVA`) — one folder per week, everything in it:\n\n```\nMarketing/\n  2026-05-04/                 ← week folder (Monday date)\n    weekly_plan.md            ← Nova's strategy + outlines\n    blog-v1.md                ← Harper (3 versions per piece)\n    blog-v2.md\n    blog-v3.md\n    substack-1-v1.md          ← Harper\n    substack-1-v2.md\n    substack-1-v3.md\n    substack-2-v1.md ... -v3.md\n    substack-3-v1.md ... -v3.md\n    linkedin-1-v1.md          ← Jade (3 versions × 5 posts)\n    linkedin-1-v2.md\n    linkedin-1-v3.md\n    ... (linkedin-2 through linkedin-5)\n    x-1-v1.md                 ← Jade (3 versions × 5 posts)\n    ... (x-2 through x-5)\n    graphics/\n      blog-1/                 ← Rosa (6 graphics per piece)\n      substack-1/\n      linkedin-1/\n      ...\n    published/                ← Ivy moves selected versions here\n  2026-05-11/                 ← next week\n    ...\n```\n\n**Naming convention:** `<channel>-<n>-v<version>.md` — e.g. `substack-2-v3.md`\n\n**Week folder ID** stored on the Stage record — all agents resolve their write path from it."
    },
    {
      "title": "V2 — Cloudflare R2 + Google Drive",
      "level": 3,
      "body": "When Cloudflare R2 is wired for DreamBorn:\n- Rosa writes final images to R2 → gets public CDN URL\n- `r2_url` populated in `content_assets`\n- Blog embeds and social posts use R2 URL\n- Google Drive becomes human review/organization layer only"
    },
    {
      "title": "Supabase: `content_assets` table",
      "level": 3,
      "body": "Every produced asset gets a row. Nova queries this before planning. Ivy updates on approval.\n\n```sql\nid             uuid primary key\npiece_id       uuid          -- groups versions of the same piece (all 3 Harper versions share a piece_id)\nversion        int           -- 1 | 2 | 3 (null for Nova's outline rows)\nis_selected    boolean       -- Justin chose this version at exec gate 2\nclient_id      text          -- 'dreamborn'\nscheduled_date date          -- specific publish day (null = vault/unscheduled)\nchannel        text          -- blog | substack | linkedin | x | graphic\ntopic          text\nangle          text\nhook           text          -- stat, claim, or question from BezelBrain\ntheme          text          -- Nova's weekly theme this piece belongs to\nstatus         text          -- backlog | draft | in_progress | staging | scheduled | staged | published\ndrive_file_id  text\ndrive_url      text\nr2_url         text          -- null until V2\npublished_at   timestamptz   -- set by Ivy on publish\npublish_url    text          -- live URL after publishing\ntags           text[]\ncreated_by     text          -- agent slug (nova, harper, jade, rosa, ivy)\ncreated_at     timestamptz\n```\n\n**Status lifecycle:**\n`backlog` → `draft` (Nova outlined, exec gate 1 pending) → `in_progress` (Harper/Jade/Rosa writing) → `staging` (versions ready, awaiting Justin's selection at exec gate 2) → `scheduled` (version chosen, scheduled_date set) → `staged` (Ivy quality-checked, in /Marketing/Published/) → `published` (live, published_at + publish_url set) (went out)\n\n---"
    },
    {
      "title": "HCS Topic Structure",
      "level": 2,
      "body": "Five new role topics required on testnet:\n\n| Topic | Purpose |\n|-------|---------|\n| `roles.marketing-strategy` | Nova claims weekly strategy tasks |\n| `roles.content-writer` | Harper claims blog and newsletter tasks |\n| `roles.social` | Jade claims LinkedIn and X tasks |\n| `roles.graphic` | Rosa claims graphic production tasks |\n| `roles.publisher` | Ivy claims publishing/staging tasks |\n\nOne new workflow template: `weekly-content`\n\n---"
    },
    {
      "title": "Rosa — Brand Tokens (DreamBorn)",
      "level": 2,
      "body": "Rosa's HTML templates need DreamBorn brand variables, separate from the B2BEA set in CCOS2. Brand tokens should be pulled from the DreamBorn website design spec (Zara's UX spec, task `0.0.8788451`) before Rosa's templates are built. At minimum:\n\n- Primary color (header bands, badges)\n- Accent color (borders, stat suffixes, tags)\n- Font pair (heading + body)\n- Footer format (brand name + domain)\n\n---"
    },
    {
      "title": "V2 — Content Studio",
      "level": 2,
      "body": "V1 ships a working content team. V2 turns it into a full AI-native content studio.\n\n**Content Atoms**\nNova produces atoms — the smallest unit of DreamBorn thinking: one core idea, one supporting stat, one angle, one quote. Harper, Jade, and Rosa all pull from the same atom pool independently. Coherence comes from shared source, not repurposing. Atoms are stored in Supabase and become the DAM retrieval unit — the Recall Studio model applied to DreamBorn's content.\n\n**Performance Feedback Loop**\nIvy reads engagement data from published posts (LinkedIn API, X API, Substack metrics) after each week. Nova receives a performance report alongside her BezelBrain query — she knows which topics, angles, and graphic types drove engagement. The plan improves every cycle.\n\n**Cloudflare R2**\nRosa publishes to R2. CDN URLs replace Drive share links in all published content.\n\n**Live Publishers**\nIvy activates fully. Justin approves; Ivy posts. The manual step disappears.\n\n**Studio Cockpit Tab**\nThe cockpit gains a Marketing tab — live view of the weekly pipeline: Nova's plan status, which agents are writing, pieces in approval queue, what published this week, performance from last week. The content team is visible, not a black box.\n\n---"
    },
    {
      "title": "Scope Boundary",
      "level": 2,
      "body": "**V1 includes:**\n- Five agent definitions (Nova, Harper, Jade, Rosa, Ivy)\n- `weekly-content` workflow template\n- `content_assets` Supabase migration (with `scheduled_date`, `backlog` status, `theme`, `hook` fields)\n- Rosa HTML templates rebranded for DreamBorn\n- Google Drive folder structure (Marketing subfolder + Calendar subfolder)\n- Five new HCS role topics\n- Nova's BezelBrain query integration + inventory-aware gap filling + `weeks_ahead` batch mode\n- Cockpit Marketing tab — daily editorial calendar (rows=channels, cols=days, 4-week view, gap highlighting)\n\n**V1 excludes (V2):**\n- Content atoms model\n- Cloudflare R2 integration\n- Live publishing APIs (LinkedIn, X, Substack, blog deploy pipeline)\n- Performance feedback loop\n- Bezel/Agentrophy second brand track"
    }
  ],
  "html_path": "artifacts/2026-04-27-dreamborn-marketing-agents-50838d1823.html",
  "json_path": "artifacts/2026-04-27-dreamborn-marketing-agents-50838d1823.json"
}