FrankX combines digital product blueprints (`data/products.json`), source-verified research hubs (`app/research/`), and proxied brand documentation (`app/docs/[[...slug]]/route.ts`) inside `frankxai/frankx.ai-vercel-website`.

## Product catalog structure (`data/products.json`) [#product-catalog-structure-dataproductsjson]

The product catalog in `frankx.ai-vercel-website/data/products.json` defines **21 product entries** rendered at `/products/[slug]` and linked across the homepage and domain hubs. Each record includes `id`, `slug`, `name`, `category`, `badge`, `headline`, `promise`, `transformation[]`, `socialProof`, `offer`, `modules[]`, `faq[]`, `analyticsId`, and optional `delivery` metadata.

Unprovisioned commercial offers route their primary CTA to `/waitlist?intent=<slug>` rather than exposing an unconfigured checkout button.

| Category | Verified catalog entries (`data/products.json`) | Pricing & delivery posture |
|---|---|---|
| **Life Architecture** | `creators-soulbook` (`soulbook`) | Free download (`/soulbook/vault`, PDF blob `products/soulbook/soulbook-7-pillars-framework.pdf`) |
| **Creator Tools** | `vibe-os` (`vibe-os`) | Free web tool (`/products/vibe-os/app` and `/products/vibe-os/docs`) |
| **Creative Intelligence** | `creative-ai-toolkit` (`creative-ai-toolkit`) | `$47` offer; routed to `/waitlist?intent=creative-ai-toolkit` |
| **Creator Systems** | `generative-creator-os`, `agentic-creator-os`, `reality-architect-os`, `system-architect-starter-kit` (`starter-kit`), `command-center-template`, `founders-circle-guild` (`founders-circle`), `infogenius-pro` | Free open-source repo (`realityarchitect`), diagnostic/application flows, or waitlist capture (`/waitlist?intent=starter-kit`, `/waitlist?intent=command-center`) |
| **Music Intelligence** | `5-suno-prompts` (free at `/music-lab`), `suno-prompt-library` (`$27`) | Free prompt guide + waitlist capture (`/waitlist?intent=suno-prompt-library`) |
| **Design + AI** | `aurora-ui-kit` (`$19`), `agentic-content-engine` (`$97`) | Routed to `/waitlist?intent=aurora-ui-kit` and `/waitlist?intent=agentic-content-engine` |
| **Story Systems & Books** | `creation-chronicles` (`$497`), plus 6 book entries (`love-and-poetry`, `spartan-mindset`, `self-development`, `imagination`, `manifestation`, `golden-age`) | Free online reading at `/books/<slug>` |

## Research publication gate (`scripts/check-research-publication.mjs`) [#research-publication-gate-scriptscheck-research-publicationmjs]

Public research claims in `frankx.ai-vercel-website` are gated by `scripts/check-research-publication.mjs`, which validates both `data/research/approved-claims.json` (`validateApprovedClaims`) and the TypeScript source registries `lib/research/sources.ts` and `lib/research/validated-claims.ts` (`findUnsupportedGeneratedGrades`).

### 1. Approved claims ledger (`validateApprovedClaims`) [#1-approved-claims-ledger-validateapprovedclaims]

Every claim in `data/research/approved-claims.json` (`schemaVersion: 1`) must satisfy:

- **Stable slug & dossier:** Unique kebab-case `id`, `domain` slug, `text` (at least 20 characters), and all 9 required `dossier` fields (`question`, `scope`, `method`, `inclusionCriteria`, `exclusionCriteria`, `limitations`, `contraryEvidence`, `correctionCheck`, `rightsDecision`, each at least 20 characters).
- **Publication status:** Must be one of `supported-synthesis`, `vendor-claim`, `preprint-finding`, or `independently-replicated`.
- **Direct HTTPS sources:** Every source requires `title`, `locator`, `version`, `type` (`journal`, `preprint`, `official-report`, `benchmark`, or `documentation`), and a direct HTTPS URL. Search result URLs (`google.com`, `bing.com`, `scholar.*`, `/search`) and self-referential `frankx.ai` URLs are rejected.
- **Independent replication proof:** Claims marked `independently-replicated` require at least two distinct studies from two independent organizations plus a `replicationReceipt` (`protocolUrl`, `resultUrl`, `team`, `performedAt`).
- **Human maker-checker receipt:** `reviewedBy` must be a named human reviewer (never an agent/bot identifier like `ai`, `agent`, `claude`, `codex`, `gpt`, or `llm`), distinct from `draftedBy`, paired with a `reviewReceipt` pinning `repository: 'frankxai/frankx.ai-vercel-website'`, a 40-hex-character `headSha`, `prNumber`, `reviewId`, and `reviewerLogin`.

### 2. Generated grade guard (`findUnsupportedGeneratedGrades`) [#2-generated-grade-guard-findunsupportedgeneratedgrades]

The script parses exported literals (`domainSources`, `validatedClaims`, `researchBriefs`) in `lib/research/sources.ts` and `lib/research/validated-claims.ts` and fails if any entry:

- Uses a search engine URL or self-referential `/research/` citation.
- Marks `type: 'journal'` or `'conference'` without a primary identifier (`doi.org/`, `pubmed.ncbi.nlm.nih.gov/`, or `arxiv.org/abs|pdf/`).
- Claims `confidence: 'high'`, `replicationStatus: 'replicated'`, `evidenceQuality: 'rct'`, or `crossRefCount > 0` without a backing primary source URL.
- Uses the banned `PhD-grade` prestige label anywhere in a string field.

```bash
# Run the research publication gate and its unit test suite
node scripts/check-research-publication.mjs
node --test scripts/tests/research-publication-gate.test.mjs
```

## How `frankx.ai/docs` proxies to `docs-platform` [#how-frankxaidocs-proxies-to-docs-platform]

The App Router handler at `app/docs/[[...slug]]/route.ts` (backed by `lib/docs-proxy.ts`) serves the FrankX documentation tenant at `https://frankx.ai/docs`:

- **Path mapping & content negotiation:** Bare `/docs` maps to `/frankx/intro`. Requests ending in `.md` or carrying `Accept: text/markdown` (weighted higher than `text/html`) resolve to `/llms.mdx/frankx/<slug>/content.md`. `/docs/llms.txt` maps to `/llms-index/frankx` and `/docs/llms-full.txt` maps to `/llms-full.mdx/frankx`.
- **Forwarded headers & timeout budget:** The proxy forwards `accept`, `rsc`, `next-router-prefetch`, `next-router-state-tree`, and `next-url` with a `20,000ms` connect/header timeout (`UPSTREAM_TIMEOUT_MS`) and follows up to `3` manual redirects (`UPSTREAM_REDIRECT_HOPS`), rejecting any redirect that leaves the `frankx` docs prefix.
- **Response rewriting (`rewriteForProxyHost`):** For `text/html` and `text/x-component` responses, root-relative `"/frankx/..."` links are rewritten to `"/docs/..."`, while `"/_next/..."`, `"/llms.mdx/frankx/..."`, and `"/llms-index/frankx"` rewrite to absolute `DOCS_ORIGIN` URLs.
