{
  "id": "2026-05-06-b2bea-org-publishing-model-spec-de6b89a680",
  "scope": "redkey",
  "source_of_truth": "repo",
  "source_path": "docs/specs/2026-05-06-b2bea-org-publishing-model-spec.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.717Z",
  "artifact_type": "design_doc",
  "schema_version": "design_doc.generated.v1",
  "title": "B2BEA.org V1 Publishing Model Spec",
  "summary": "B2BEA.org V1 Publishing Model Spec Source of record: RedKey Supabase Studio artifact. Project: B2BEA.org Rebuild Project ID: a820dd0c 6cef 4133 bfbd d802fd806e44 Artifact: publishing model spec Artifact ID: a9636e2f a4be 4586 82dd c1a7bf3199fa Version: 1 Status: draft Updated: 2026 05 06T20:05:00.344465+00:00 Decisions ID Topic Decision PUB DEC 001 Publishin...",
  "format_source": "markdown",
  "sections": [
    {
      "title": "B2BEA.org V1 Publishing Model Spec",
      "level": 1,
      "body": "Source of record: RedKey Supabase Studio artifact.\n\n- Project: `B2BEA.org Rebuild`\n- Project ID: `a820dd0c-6cef-4133-bfbd-d802fd806e44`\n- Artifact: `publishing-model-spec`\n- Artifact ID: `a9636e2f-a4be-4586-82dd-c1a7bf3199fa`\n- Version: `1`\n- Status: `draft`\n- Updated: `2026-05-06T20:05:00.344465+00:00`"
    },
    {
      "title": "Decisions",
      "level": 2,
      "body": "| ID | Topic | Decision |\n|---|---|---|\n| `PUB-DEC-001` | Publishing paths | V1 supports two first-class page publishing paths: Sanity standard pages and custom HTML import. |\n| `PUB-DEC-002` | Source of truth | Sanity owns editorial/public content. B2BEA Supabase owns application and operational data. Code/import registry owns custom HTML page artifacts. |\n| `PUB-DEC-003` | Internal permissions | Brett, Sarah, and Justin can publish directly in V1; production control comes from preview, required fields, lifecycle states, audit events, and rollback/archive behavior rather than complex internal RBAC. |\n| `PUB-DEC-004` | Public company profiles | Vendor public profiles are V1. Practitioner company public profiles are excluded from V1; company workspace is private only. |\n| `PUB-DEC-005` | Page metadata | Every publishable page type must satisfy hardened SEO, GEO, and social metadata requirements before publish. |"
    },
    {
      "title": "Publishing Paths",
      "level": 2,
      "body": "| Path | Purpose | Source Of Truth | Lifecycle | Required Controls |\n|---|---|---|---|---|\n| Sanity standard page | Create normal structured public pages using reusable templates and Lovable design-system components. | Sanity | `draft`, `preview`, `scheduled`, `published`, `archived` | Template selection, required fields, slug rules, SEO metadata, GEO metadata, social metadata, preview URL, publish/schedule, archive, analytics hooks. |\n| Custom HTML import | Bring in custom landing pages/resources when the page needs a bespoke design outside standard templates. | Code/import registry plus repository artifact | `draft`, `preview`, `published`, `archived`, `rolled_back` | Owner, page registry entry, slug/path, asset validation, preview URL, publish flag, archive/rollback, SEO metadata, GEO metadata, social metadata, analytics hooks. |"
    },
    {
      "title": "Source Of Truth Boundaries",
      "level": 2,
      "body": "| Domain | Source | Examples |\n|---|---|---|\n| Editorial/public content | Sanity | Standard pages, articles, blog/editorial content, resource/guide/report body copy, SEO/GEO/social fields, author editorial metadata. |\n| Custom page artifacts | Code/import registry | Custom HTML, page-specific CSS/JS, static assets, custom resource pages. |\n| Profiles and organizations | B2BEA Supabase | People, companies/organizations, vendors, vendor claims, vendor profile updates. |\n| Membership and entitlements | B2BEA Supabase | Memberships, roles, seats, resource/course/event access. |\n| Academy | B2BEA Supabase unless later split | Courses, modules, lessons, enrollments, progress, certificates. |\n| Surveys and forms | B2BEA Supabase | Survey definitions, questions, responses, forms, submissions, exports. |\n| Jobs and events operations | B2BEA Supabase | Jobs, scraped jobs, event registrations, attendees, sponsors, check-in. |\n| CRM pipeline | HubSpot primary | Leads, opportunities, sales activity, renewals. |\n| Analytics and notifications | B2BEA Supabase plus provider logs | Page views, downloads, notification event log, email delivery status. |"
    },
    {
      "title": "Page Lifecycle",
      "level": 2,
      "body": "| State | Meaning | Public |\n|---|---|---:|\n| `draft` | Editable but not public. | No |\n| `preview` | Viewable through protected preview URL for review. | No |\n| `submitted` | External contributor/vendor/company has submitted for review. | No |\n| `in_review` | B2BEA is reviewing public-facing or externally submitted content. | No |\n| `scheduled` | Approved content scheduled for future publication. | No |\n| `published` | Visible publicly or to its gated audience. | Yes |\n| `archived` | Removed from public listing and navigation; may remain internally readable. | No |\n| `rolled_back` | Prior version restored or current custom page removed from public route. | No |"
    },
    {
      "title": "Hardened SEO, GEO, And Social Rules",
      "level": 2,
      "body": "No public page publishes without complete SEO, GEO, social, indexing, and analytics metadata appropriate to its page family.\n\nApplies to:\n\n- Sanity standard pages.\n- Custom HTML imports.\n- Vendor public profiles.\n- Person profiles.\n- Articles.\n- Resources, guides, and reports.\n- Events.\n- Jobs.\n- Courses.\n- Public survey landing/results pages."
    },
    {
      "title": "SEO Required",
      "level": 3,
      "body": "- Meta title.\n- Meta description.\n- Canonical URL.\n- Index/noindex flag.\n- Robots behavior.\n- Slug.\n- H1.\n- Primary topic/category.\n- Breadcrumb data where applicable.\n- Structured data type where applicable.\n- Sitemap inclusion flag.\n- Redirect rule when URL changes."
    },
    {
      "title": "GEO Required",
      "level": 3,
      "body": "GEO here means generative engine optimization: the page should be understandable, attributable, and answer-ready for AI search and answer engines.\n\n- LLM answer summary.\n- Entity/topic tags.\n- Audience.\n- Industry/category context.\n- Key facts.\n- Source/author attribution.\n- Last reviewed date.\n- Content freshness rule.\n- FAQ/question-answer fields where applicable.\n- Citation/source fields where applicable."
    },
    {
      "title": "Social Required",
      "level": 3,
      "body": "- Open Graph title.\n- Open Graph description.\n- Open Graph image.\n- Twitter/X card type.\n- Social share image alt text.\n- LinkedIn-safe summary.\n- Fallback image by page family."
    },
    {
      "title": "Validation Rules",
      "level": 3,
      "body": "- Metadata is validated at build/publish time.\n- Preview surfaces show search/social preview before publish.\n- Missing required metadata blocks publish for standard pages.\n- Custom HTML imports must declare metadata in registry/frontmatter.\n- Archive/noindex state updates sitemap and robots behavior.\n- Private/preview pages must be `noindex`."
    },
    {
      "title": "Page Family Overrides",
      "level": 3,
      "body": "- Vendor profiles require vendor category, services, canonical vendor URL, and vendor logo/social image fallback.\n- Resources, guides, and reports require gated/free flag, sponsor/vendor attribution where applicable, and download analytics key.\n- Jobs require job structured data when public and expiration/closed state handling.\n- Events require event structured data and registration state.\n- Courses require course structured data where public and entitlement/gating metadata."
    },
    {
      "title": "URL And Slug Rules",
      "level": 2,
      "body": "- Every public page has one canonical URL.\n- Slug must be unique within its page family.\n- Changing a published slug requires redirect handling.\n- Custom HTML imports must declare their route in the page registry.\n- Archived pages should not appear in public navigation, search indexes, or sitemap output.\n- Vendor public profiles keep vendor-profile URL ownership in Supabase-backed routing.\n- Practitioner company public routes are not generated in V1."
    },
    {
      "title": "Analytics Requirements",
      "level": 2,
      "body": "- Page view tracking for public pages.\n- Resource download tracking.\n- Campaign/source attribution where available.\n- Vendor-owned content attribution where relevant.\n- Custom HTML pages must include the standard analytics hook.\n- Privacy-safe export boundaries."
    },
    {
      "title": "Approval Rules",
      "level": 2,
      "body": "- Core admins can publish Sanity standard pages directly after metadata validation.\n- Core admins can publish custom HTML imports directly after preview and metadata validation.\n- Vendor profile changes require B2BEA review before changing public projection.\n- Vendor content submissions require B2BEA review before publishing.\n- Company-created jobs require B2BEA admin review before public publishing.\n- Practitioner company workspace changes do not create public pages in V1."
    },
    {
      "title": "Implementation Implications",
      "level": 2,
      "body": "- Create a page registry abstraction for custom HTML imports.\n- Define Sanity schemas for standard pages and editorial/resource content.\n- Create shared SEO/GEO/social metadata schema fields by page family.\n- Keep Supabase-backed operational pages separate from editorial page schemas.\n- Add a redirect model before allowing published slug changes at scale.\n- Design preview URLs and build/deploy behavior before coding publishing workflows.\n- Make SEO, GEO, social, and analytics fields required by page family, not optional afterthoughts."
    },
    {
      "title": "Open Questions",
      "level": 2,
      "body": "- Which exact existing page families become Sanity standard pages in V1?\n- Should custom HTML imports be checked into the site repo, stored as Supabase/Sanity assets, or both?\n- What is the minimum rollback behavior for static/custom pages on the first rebuild release?\n- Which standard templates are required before migration starts?\n- What exact GEO fields should appear in Sanity versus be generated at build time?"
    },
    {
      "title": "Next Artifacts",
      "level": 2,
      "body": "- `design-system-spec`\n- `data-model-spec`\n- `surface-specs`\n- `custom-html-import-spec`\n- `sanity-schema-spec`\n- `seo-geo-social-spec`"
    }
  ],
  "html_path": "artifacts/2026-05-06-b2bea-org-publishing-model-spec-de6b89a680.html",
  "json_path": "artifacts/2026-05-06-b2bea-org-publishing-model-spec-de6b89a680.json"
}