APPROVED 2026-04-13 • FEATURE FREEZE • BUILD STARTED 2026-04-14

CampaignForge + ContentForge

Complete Spec Bundle — 5 Documents, 3 Repos, Building

5
Spec Documents
17
Decisions
3
Repos Live
340
Files Shipped
32/40
Tasks Done
Spec Documents
Click any card to drill into the full visual breakdown.
Platform Spec (Ops App)
ContentForge (Content Sites)
Trust Framework (Accounts)
Execution Plan (Timeline)
Operator Runbook (Daily Ops)
Build Progress
Repos scaffolded 2026-04-14. Feature freeze in effect — building from locked specs.

campaignforge-app

PIPELINE UI DONE

SvelteKit 2 + Svelte 5 + Tailwind 4 + Drizzle ORM + shadcn-svelte

✓ App shell + auth + dark mode
✓ shadcn-svelte (9 components)
✓ PostgreSQL + Drizzle + migrations
✓ Agent Executor + SSE streaming
✓ Cost tracker (per-model pricing)
✓ Session manager (state machine)
✓ Pipeline orchestrator (stage sequencing)
✓ Brief editor (7-step form → YAML)
✓ Pipeline execution UI (SSE + timeline)
✓ Approval panels (angles + copy)
✓ 3 pipeline API routes wired
◆ Validation results display
◆ Deploy to Coolify
◆ GATE: Pipeline runnable from UI

contentforge

QUALITY GATES DONE

Astro 5 + Svelte islands + MDX + Tailwind 4 • 42 pages, 10 tools, Lighthouse 95+

✓ 20 articles + 10 tools + 4 E-E-A-T
✓ 8 shared + 10 tool Svelte islands
✓ JSON-LD schema (all page types)
✓ XML sitemaps (priority + lastmod)
✓ Zaraz events (5 × 10 tools)
✓ Playwright E2E (22 tests)
✓ a11y audit (zero critical/serious)
✓ Lighthouse CI (all pages 95+)
✓ Skip-to-content + ARIA roles
✓ Color contrast WCAG AA
◆ URL redirect plan + A/B test
◆ CF Pages production cutover
◆ GATE: ContentForge live on Astro

Lessons Learned

Session 8 — Parallel Agent Scaling (2026-04-15)

Sweet spot is 3-4 parallel agents: Beyond 4, prompt quality drops and merge review gets sloppy. The real constraint is file isolation, not compute. With 3 repos, the ceiling is ~5 agents if file boundaries are clean.

Feature branches prevent same-repo conflicts: Agents C and D in campaignforge-app worked on separate branches (feat/cost-session-manager, feat/pipeline-orchestrator), then merged sequentially. Zero conflicts.

Independent agents can converge on identical fixes: Both the a11y and Lighthouse agents independently identified and fixed the same CSS cascade issue (@layer base wrapping, :where() scoping) with byte-identical diffs. Merge was clean because Git detected identical changes.

CAPI Worker type errors are IDE-only: Cloudflare Workers have their own tsconfig with @cloudflare/workers-types. The IDE picks up the root tsconfig which doesn't know about Request/Response/fetch globals. Not real errors.

Session 3 — Content Migration + Tool Islands (2026-04-14)

MDX body_html requires JSX-safe formatting: Raw HTML from JSON has nested block elements on same lines, bare <br> tags, and ~ chars parsed as strikethrough. Conversion script needed multi-pass formatting: self-close void tags, escape tildes to &#126;, and split every block element onto its own line.

Astro dynamic components need static imports: client:visible hydration fails with dynamic component references (NoMatchingImport). Must use conditional static rendering: {tc === 'EFCCalculator' && <EFCCalculator client:visible />}.

Parallel agents for tool implementations: 4 agents dispatched simultaneously, each handling 2-3 tools. All completed in ~17 minutes. Logic/data separation (*.logic.ts, *.data.ts) enabled clean parallelization with zero merge conflicts.

Session 2 — W1 Build (2026-04-14)

Astro 5 Content Layer API: entry.render() is gone. Use import { render } from 'astro:content' then render(entry). Content collections need glob() loader from astro/loaders.

shadcn-svelte + Tailwind v4: @apply border-border fails — Tailwind v4 doesn't know custom vars via @apply. Use @theme inline to declare all HSL color vars, then use raw CSS instead of @apply for base styles.

shadcn-svelte components need WithElementRef: The cn utility must also export WithElementRef and WithoutChildrenOrChild types for sidebar/rail components.

MDX in Content Collections: HTML (tables, callouts, step-lists) works inline in MDX. No need to convert to custom components yet — the prose CSS styles handle it.

Session 1 — Scaffold (2026-04-14)

Astro 5 Content Collections: Uses src/content.config.ts (not src/content/config.ts). The z import from astro:content shows deprecation warnings.

Tailwind v4: No tailwind.config.ts needed. Uses @tailwindcss/vite plugin. The @astrojs/tailwind integration conflicts — use the Vite plugin directly.

Remote agents failed: Overnight scaffold agents couldn't auth with GitHub. Local execution worked first try.

Session Log

2026-04-15 #8
Parallel Builds #3-5: 10 Tasks, 3 Batches, 12 Agents — Batch 3 (3 agents): XML sitemaps, cost tracker + session manager, pipeline orchestrator. Batch 4 (3 agents): brief editor (7-step form), Zaraz event taxonomy (5 events × 10 tools), Playwright E2E tests (22 tests). Batch 5 (4 agents): pipeline execution UI (SSE streaming + timeline + approvals), a11y audit (zero critical/serious), Lighthouse CI (all pages 95+), CAPI Worker (Zaraz → Meta CAPI). Both contentforge a11y and Lighthouse agents independently arrived at identical CSS cascade + favicon fixes — zero merge conflicts. +48 files, ~6,000 lines across 3 repos. 10 tasks completed.
2026-04-15 #5
Parallel Build #2: Schema Markup + Agent Executor — Agent team. Agent 1: JSON-LD structured data on all 42 contentforge pages (BreadcrumbList, Article, WebApplication, Organization via @graph arrays). Agent 2: full Agent Executor in campaignforge-app — Anthropic SDK streaming, cost tracker with per-model pricing, session manager, POST /api/pipeline/execute with auth guard and SSE response. +8 files, 1,623 insertions across 2 repos. 1 Plane task Done.
2026-04-15 #4
Parallel Build: E-E-A-T + PostgreSQL — Agent team session. Agent 1: built 4 substantive E-E-A-T pages in contentforge (about, editorial-policy, methodology, contact) with real data sources (Federal Methodology, BLS, IPEDS, College Scorecard), tool-by-tool methodology, affiliate disclosure, AI disclosure. Agent 2: set up PostgreSQL + Drizzle in campaignforge-app — docker-compose.yml (PG 16, port 5433), drizzle.config.ts, 6 db npm scripts, .env.example, Coolify production setup docs. +8 files across 2 repos. 2 Plane tasks marked Done.
2026-04-14 #3
BUILD-C Content + Tools Complete — Bulk converted 28 article/tool JSONs to MDX (wrote Python converter with MDX-safe HTML formatting). Built 4 category index pages (/category/financial-aid/ etc.). Polished 8 shared Svelte components (StepWizard, ButtonGroup, ResultCard, InputField, ProgressBar, MethodologyDisclosure, SourceCitation, CTAButton). Implemented all 10 interactive Svelte tool islands (EFC Calculator, Financial Aid Quiz, Scholarship Finder, ROI Calculator, Loan Repayment, Career Salary Explorer, Employer Tuition Checker, Time-to-Degree, GI Bill Calculator, Aid Letter Decoder). Wired tool components with client:visible hydration. 41 pages build in 4s. +31 files, 10,452 insertions in tool commit alone. 12 Plane tasks marked Done.
2026-04-14 #2
BUILD-C W1 + BUILD-P W1 — Design tokens migrated, full header/footer/layouts built, homepage + tools index polished, FAFSA article + EFC calculator converted to MDX, Content Layer routing working (9 pages). shadcn-svelte initialized, app shell with sidebar nav + dark mode + auth. CF Pages deployed. +86 files across 2 repos.
2026-04-14 #1
Scaffolds — Both repos created, pushed to GitHub. contentforge: Astro 5 + Svelte + Tailwind 4 (60 files). campaignforge-app: SvelteKit 2 + Drizzle (99 files). 30 Plane tasks created.
1 3-Repo Architecture
Each concern lives in its own repository. Shared config, independent deploys.
Repository Purpose Stack Deploys To Status
campaignforge-app CampaignForge ops platform (workflow UI, pipeline execution, dashboards) SvelteKit 2, Svelte 5, shadcn-svelte, Drizzle + Kysely, Postgres DigitalOcean via Coolify W1 Done
contentforge Content sites (degreesources.com + future verticals) Astro 5, Svelte 5 islands, MDX, Tailwind 4 Cloudflare Pages W1 Done • Deployed
campaign-forge Pipeline brain: skills, config, specs, vertical data, research Python scripts, YAML/JSON config, Claude skills Local / CLI Active
2 Revenue Flow
Ad spend → Content site → Tool engagement → Offer conversion → Revenue
1

Ad Click

Meta / Google / TikTok ad → user clicks → lands on content site tool page

2

Tool Engagement

User uses EFC Calculator / Quiz / Finder → genuine value delivered

3

CTA Click

User clicks "Explore Programs" → routed via offer URL with tracking params

4

Lead Submit

User fills form on partner portal → lead captured → Everflow attributes

5

Revenue

$35 CPL per qualified lead → Winners Vault updated → next campaign informed

3 Execution Phases
BUILD (Claude builds) + OPERATE (Operator executes) run simultaneously across 5 phases.

Phase 0

This Week

Spec review, social profiles, Meta Verified, entity resolution, pre-warming

22 tasks

Phase 1

Weeks 1-3

Tracking live, platform MVP, ad accounts, organic posting, campaign structures

35 tasks

Phase 2

Weeks 4-6

Full workflow UI, account warm-up, first live campaign, Winners Vault seeded

26 tasks

Phase 3

Weeks 7-9

Lead intelligence, email capture, social automation, competitive intel, platform health

28 tasks

Phase 4-5

Weeks 10+

Ad platform APIs, CAPI firing, retro automated, ping/post routing, multi-vertical

15+ tasks