{
  "id": "2026-05-07-b2bea-org-page-template-spec-fcb91f9d23",
  "scope": "redkey",
  "source_of_truth": "repo",
  "source_path": "docs/specs/2026-05-07-b2bea-org-page-template-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.724Z",
  "artifact_type": "design_doc",
  "schema_version": "design_doc.generated.v1",
  "title": "B2BEA.org V1 Page Template Spec",
  "summary": "B2BEA.org V1 Page Template Spec Source of record: RedKey Supabase Studio artifact. Project: B2BEA.org Rebuild Project ID: a820dd0c 6cef 4133 bfbd d802fd806e44 Artifact: page template spec Artifact ID: 427c04a9 40b7 4e55 a642 65b2aee20b2b Version: 1 Status: draft Updated: 2026 05 07T14:36:17.821277+00:00 Purpose Convert approved surface decisions and route fa...",
  "format_source": "markdown",
  "sections": [
    {
      "title": "B2BEA.org V1 Page Template 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: `page-template-spec`\n- Artifact ID: `427c04a9-40b7-4e55-a642-65b2aee20b2b`\n- Version: `1`\n- Status: `draft`\n- Updated: `2026-05-07T14:36:17.821277+00:00`"
    },
    {
      "title": "Purpose",
      "level": 2,
      "body": "Convert approved surface decisions and route-family inventory into implementation-ready reusable page family contracts before any rebuild coding or PLAN/build approval."
    },
    {
      "title": "Status",
      "level": 2,
      "body": "draft"
    },
    {
      "title": "Page Families",
      "level": 2,
      "body": "| id | name | routes | states | purpose | surfaces | qa_checks | disposition |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| admin_module | Admin Module | /admin, /admin/academy, /admin/academy/course, /admin/academy/lesson, /admin/categories, /admin/companies, /admin/jobs, /admin/users, /admin/vendors | loading, empty, error, unauthorized, draft, submitted, changes_requested, approved, published/active, archived/removed | Single /admin shell operational modules. | b2bea_admin | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| admin_publishing_module | Admin Publishing Module | /studio, /studio/media | draft, preview, scheduled, published, archived, rolled_back, validation_failed | Publishing/studio module inside /admin. | b2bea_admin | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | redirect |\n| audience_landing_page | Audience Landing Page | /for/agencies, /for/consultants, /for/distributors, /for/manufacturers, /for/software-providers, /for/vendors | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Audience-specific /for/* and similar landing pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| auth_or_account_utility | Auth Or Account Utility | /checkout, /checkout-success, /confirm-email, /login, /membership-terms, /signup, /terms, /upgrade | default, submitting, success, error, expired token, already authenticated, unauthorized | Login/signup/confirmation/checkout/legal utility routes. | auth_account | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| course_catalog | Course Catalog | /courses | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Public/member course catalog listing. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| course_detail | Course Detail | /courses/:slug | anonymous preview, authenticated no access, entitled/enrolled, completed, purchase required | Course detail/enrollment page. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| course_learning_surface | Course Learning Surface | /courses/lessons/:slug, /courses/modules/challenge, /courses/modules/challenge-feedback, /courses/modules/test | loading content, in progress, submitted, passed, needs retry, access denied, save failed | Lesson, module, test, challenge, and learning interaction pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| directory_index | Directory Index | /agencies, /consultants, /distributors, /exchange, /exchange/vendor-claim, /leaders, /manufacturers, /people, /software-providers, /vendors/orocommerce | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | People, vendor, exchange, audience/category, and partner directory indexes. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| editorial_detail | Editorial Detail | /authors/:slug, /blog/:slug, /podcast/:slug | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Article, author, and podcast detail pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| editorial_index | Editorial Index | /blog, /blog/b2b-ecommerce-is-not-a-technology-problem, /insights, /podcast | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Blog, insights, podcast, authors, and other editorial list surfaces. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| event_detail | Event Detail | /events/:slug | upcoming, registration_open, sold_out_or_closed, past, archived | Public event detail page. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| event_index | Event Index | /events | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Public event listing page. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| job_board | Job Board | /careers | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Public job listing/search page. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| job_detail | Job Detail | /careers/:slug | published, expired, archived, apply unavailable | Public job detail page. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| marketing_home_or_landing | Marketing Home Or Landing | / | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Homepage and major landing surfaces that may carry custom brand/storytelling treatment. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| maturity_assessment_special_flow | Maturity Assessment Special Flow | /assessments, /assessments/maturity, /assessments/maturity/results, /assessments/maturity/take | landing, in progress, validation error, submitted, results available, results unavailable/error, returning user if persisted | Current maturity assessment and future domain-specific maturity assessments. | public_site | question flow works keyboard/mobile, progress cannot overlap content, results render deterministically, validation errors are clear, submitted data respects privacy and entitlement rules | v1_keep |\n| member_dashboard_or_account | Member Dashboard Or Account | /account, /dashboard, /dashboard/onboarding, /dashboard/profile, /dashboard/profile/edit, /dashboard/profile/knowledge, /dashboard/welcome | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Private member dashboard, profile, onboarding, account, and settings pages. | member_portal | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| people_profile_detail | People Profile Detail | /people/:slug | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Public person/member/leader profile detail pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| resource_detail_or_download | Resource Detail Or Download | /case-studies/:slug, /guides/:slug, /reports/:slug, /resources/2026-b2b-ecommerce-trends, /resources/career-acceleration-kit | public preview, anonymous gated, authenticated no entitlement, entitled downloadable, download success, download error, archived | Report, guide, case study, resource landing, and download pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| resource_index | Resource Index | /case-studies, /guides, /reports, /resources, /resources/2026-b2b-ecommerce-trends/download, /resources/:category, /resources/career-acceleration-kit/download | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Resources, guides, reports, case studies, and similar resource listing pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| standard_marketing_page | Standard Marketing Page | /about, /contact, /how-we-use-ai, /join, /services, /vendor-application, /vendor-membership | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | About, contact, join, services, vendor application, vendor membership, and similar structured public pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| system_generated | System Generated | /sitemap | generated, generation_error | Sitemap and other generated/system utility routes. | public_site | valid generated output, contains expected public canonical routes, excludes draft/archived/protected routes | v1_keep |\n| topic_index | Topic Index | /concepts, /topics | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Topic/concept index pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| topic_or_concept_detail | Topic Or Concept Detail | /concepts/:slug, /concepts/ai-product-recommendations-b2b, /topics/ai, /topics/b2b-fundamentals, /topics/customer-adoption, /topics/digital-transformation, /topics/executive-alignment, /topics/technology | default, loading where data-backed, empty where list-backed, error where API-backed, unauthorized where protected, archived/draft hidden from public where publishable | Topic/concept detail and pillar pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |\n| vendor_dashboard | Vendor Dashboard | /vendor-portal | loading, empty, unauthorized, active, pending_review, changes_requested, approved, archived, billing_attention | Private /vendor workspace. | vendor_portal | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | redirect |\n| vendor_profile_detail | Vendor Profile Detail | /exchange/:slug | published public profile, claimed private draft not public, submitted changes pending review, archived/unpublished | Public vendor profile/detail pages. | public_site | desktop and mobile screenshot pass, no horizontal overflow, text does not overlap controls/content, keyboard/focus states for interactive controls, metadata present for public pages, route returns expected status/redirect | v1_keep |"
    },
    {
      "title": "Global Template Rules",
      "level": 2,
      "body": "- Default implementation path is reusable B2BEA design-system components and page families.\n- Custom pages are allowed only for home, major campaign/resource landing pages, approved custom HTML imports, and explicitly marked signature editorial features.\n- Custom pages still require accessibility, responsive, metadata, analytics, and QA compliance.\n- All public publishable pages require canonical URL plus SEO/GEO/social metadata.\n- All protected reads/actions require server-side guards; client state cannot grant authorization.\n- Admin is a single /admin shell. Publishing/studio is an admin module, not a separate top-level shell.\n- Private vendor prefix is /vendor. Private practitioner company prefix is /company. Public practitioner company profiles/directories are not V1.\n- Route redirects must preserve SEO/user expectations where public and preserve auth intent where private."
    },
    {
      "title": "Acceptance Criteria",
      "level": 2,
      "body": "- Every route in route-family-inventory v3 maps to exactly one page family in this spec.\n- Each page family defines routes, surface, layout pattern, required components, states, data sources, custom exception rule, QA checks, and acceptance criteria.\n- page-template-spec can feed implementation planning without deciding build tasks yet.\n- No implementation is authorized by this artifact alone; PLAN/EXEC_PLAN_REVIEW and Justin build approval remain required."
    },
    {
      "title": "Next Artifacts",
      "level": 2,
      "body": "- survey-system-spec\n- qa-release-readiness-spec\n- plan"
    },
    {
      "title": "Unresolved Or Follow On",
      "level": 2,
      "body": "| id | note | topic | status |\n| --- | --- | --- | --- |\n| PTS-FOLLOW-001 | Maturity assessment is V1 as a special reusable maturity-assessment pattern. The broader survey/form engine remains a separate survey-system-spec and should not block the maturity assessment flow. | Standard survey/form engine | separate_spec_needed |\n| PTS-FOLLOW-002 | Route inventory classifies families and custom_allowed candidates. Before build, mark exact routes that are approved custom versus standard B2BEA design-system pages. | Exact route-by-route custom markers | route_inventory_review_needed |\n| PTS-FOLLOW-003 | No current /company route exists in inventory, but surface decisions require /company as private V1 prefix. Company workspace templates should be added when implementation scope reaches that surface. | Company workspace templates | future_family_needed |"
    },
    {
      "title": "Redirects",
      "level": 2,
      "body": "| to | from | reason |\n| --- | --- | --- |\n| /admin/studio | /studio | Decision 3: top-level /studio migrates under single /admin shell. |\n| /admin/studio/media | /studio/media | Decision 3: top-level /studio migrates under single /admin shell. |\n| /vendor | /vendor-portal | Decision 2: private vendor workspace prefix is /vendor. |"
    },
    {
      "title": "Source Summary",
      "level": 2,
      "body": "```json\n{\n  \"route_count\": 97,\n  \"by_disposition\": {\n    \"v1_keep\": 94,\n    \"redirect\": 3\n  },\n  \"by_target_surface\": {\n    \"b2bea_admin\": 11,\n    \"public_site\": 70,\n    \"auth_account\": 8,\n    \"member_portal\": 7,\n    \"vendor_portal\": 1\n  },\n  \"route_inventory_id\": \"2cec821e-07ba-4aca-81fb-078f163adf44\"\n}\n```"
    },
    {
      "title": "Source Artifacts",
      "level": 2,
      "body": "| status | version | artifact_id | artifact_type |\n| --- | --- | --- | --- |\n| draft | 1 | 05e0ed7c-416a-4d8f-853a-bc3dfa3d64f6 | company-workspace-data-spec |\n| draft | 1 | 2f473004-9063-4fe9-8290-5cbd1b19dfb4 | data-model-spec |\n| draft | 4 | 4c3651ac-9a69-4117-a355-750b61f540c9 | design-system-spec |\n| draft | 1 | 355b3249-3af9-45a4-9c45-67777bd2d72d | entitlement-model-spec |\n| draft | 1 | a9636e2f-a4be-4586-82dd-c1a7bf3199fa | publishing-model-spec |\n| draft | 3 | 2cec821e-07ba-4aca-81fb-078f163adf44 | route-family-inventory |\n| draft | 8 | 77853042-e7a4-48bd-91a4-6e48d0484b1b | surface-specs |"
    }
  ],
  "html_path": "artifacts/2026-05-07-b2bea-org-page-template-spec-fcb91f9d23.html",
  "json_path": "artifacts/2026-05-07-b2bea-org-page-template-spec-fcb91f9d23.json"
}