docs(facts): verified facts and status page #14

Open
opened 2026-09-13 17:41:26 +00:00 by PlasticDigits · 0 comments

Summary

https://docs.cl8y.com has no single crawlable page that marketing and community members can check before making factual claims. Contract strings live on the /contracts stub. Methodology says this host will not invent statistics. Home and the four hubs do not say which products are live versus not claimed live, what is still under development, what this host will not assert, or when those facts last changed.

Ship one prerendered verified facts and status page on a new allowlisted path so a human can answer, from HTML with JavaScript off:

  1. Official first-party links (docs, DEX, Bridge, homepage; indexer only when VITE_INDEXER_ORIGIN is set).
  2. Official contract / execute-id strings already in src/data/contracts.ts (do not invent extras).
  3. Which first-party products are live versus not claimed live on this page.
  4. What is planned or under development only as already-approved first-party work (no unofficial roadmap).
  5. Known limitations of this host and of the live products as already documented.
  6. Relevant security notes for readers (not a vuln dump, not an audit certificate).
  7. A dated changelog of fact changes on this page.

Bundle (do not split into links / contracts / live / roadmap / limitations / security / changelog tickets). Do not put this manuscript on / (Start Here, code/cl8y-docs#9), /contracts (address list only), /methodology (sourcing rules), or the how-to / FAQ paths owned by #10–#13.

v0 platform work (#3) already shipped crawl files, unique titles, and stub routes. Full manuscripts were out of scope there.

Parent / siblings (do not re-implement)

  • code/cl8y-docs#3 — v0 host + stubs; out of scope: “Full methodology/guide manuscripts (stubs only).”
  • code/cl8y-docs#9 — Start Here on / (newcomer product map + diagram + token purposes). Cite and link; do not expand that ticket into a facts ledger.
  • code/cl8y-docs#10 / #11 / #12 — how-to manuscripts. Different reader job.
  • code/cl8y-docs#13 — token/treasury FAQ on the reserved UST1 path. Different reader job; do not register /ust1 here.
  • docs/ARCHITECTURE.md §4 / §12 / INVARIANTS 13–14 — closed route allowlist; no unverified stats; no unpublished marketing content/guides/.
  • src/pages/ContractsPage.tsx + src/data/contracts.ts — reuse the same five first-party strings; this page must not grow a second address book.
  • code/CL8Y-web — marketing homepage (cl8y.com). Different deployable; link it, do not copy that SPA.

Current codebase

Facts are scattered stubs, not a claims-check page:

  • src/pages/HomePage.tsx — host chrome + four hub links. No live/planned table, no changelog.
  • src/pages/ContractsPage.tsx + src/data/contracts.ts — Terra Classic CL8Y CW20, CL8Y/cLUNC pair, BSC CL8Y, MegaETH CL8Y, native uluna. No official-link list beyond those strings.
  • src/pages/MethodologyPage.tsx / SourcesPage.tsx — sourcing policy; not a product status ledger.
  • src/pages/MarketsPage.tsx — “see DEX / indexer”; no live/planned inventory.
  • src/seo.ts — seven DocsPath values; prerender and sitemap are derived from ROUTES.
  • src/lib/dexHref.ts — closed CAMPAIGNS (seven ids). Unknown campaign throws.
  • src/components/Layout.tsx — nav is Home / Methodology / Markets / Contracts / Guides.
  • scripts/prerender.mjs — writes dist/**/index.html and rewrites sitemap.xml from ROUTES.
  • e2e/crawl.spec.ts + src/verify-dist.test.ts — unique titles/canonicals for the seven v0 paths.

Architecture §4 purpose of /contracts stays “first-party addresses already published.” This issue adds /facts (title seed: Facts and status · CL8Y docs) and amends the closed allowlist, sitemap loc set, and campaign vocabulary in the same PR. Do not reuse / or /contracts as the share URL for this ledger.

Duplicates / already implemented

Work Action
#1 architecture, #2 review, #5 CI Unrelated; do not reopen
#3 v0 stubs Prerequisite host; not this manuscript
#9 Start Here Newcomer explainer on /; not live/planned/changelog
#10–#12 how-tos, #13 FAQ Different reader jobs; do not hijack
CL8Y-web homepage Different repo. Official link only
Unpublished marketing content/guides/ Forbidden to dump here (INVARIANTS 14)

If /facts already exists with unique title/canonical, the seven sections above in prerendered HTML, and AC1–AC12 pass, close as implemented — do not duplicate.

Why the new implementation is needed

Operators and community members currently have no first-party URL that is honest about what is true today. /contracts is an address stub. / is (or will be) a newcomer map. Without this page:

  • Marketing copy has no canonical list of official links and live products.
  • Planned or in-progress work is easy to over-claim as shipped.
  • Contract strings and product names drift across chats because there is no dated facts log.

This is documentation copy + one new prerendered route. No new host, no wallet UI, no Coolify SKU pick.

Constraints / guardrails

  1. Route. One new path: /facts. Canonical https://docs.cl8y.com/facts (no trailing slash). Title must stay unique vs existing routes (Facts and status · CL8Y docs or equivalent). Do not add /status (easy to confuse with operator uptime), /changelog as a second loc, or /ust1.

  2. Allowlist amendment (same PR). Update docs/ARCHITECTURE.md §4, docs/INVARIANTS.md campaign list, src/seo.ts DocsPath/ROUTES, src/lib/dexHref.ts CAMPAIGNS, src/App.tsx, src/components/Layout.tsx nav, e2e/crawl.spec.ts, and src/lib/dexHref.test.ts closed-campaign snapshot. scripts/prerender.mjs already follows ROUTES — do not hardcode a second loc list.

  3. Reader. Marketer, community member, or support person checking a claim. Short sentences. Not a trading tutorial, not Start Here, not an incident / Coolify / host status page.

  4. Official links (required, first-party only). Build with URL (not string concat, not window.location, not visitor query). Closed set:

    Label Origin
    Docs https://docs.cl8y.com (this host)
    DEX VITE_DEX_ORIGIN via existing dexHref (utm_campaign=facts)
    Bridge https://bridge.cl8y.com (same helper pattern as #9 if it lands; otherwise a tested constant)
    Homepage https://cl8y.com
    Public indexer Only if VITE_INDEXER_ORIGIN is set and equals https://indexer.dex.cl8y.com

    rel="noopener noreferrer" if target="_blank". No CoinGecko / CMC / DeFiLlama / CEX / Telegram / Discord as “official.” No javascript:, data:, protocol-relative, or ?url= redirectors.

  5. Contracts. Render the exact strings from src/data/contracts.ts. Do not invent a sixth address. Link internally to /contracts. If a string is not in that module, omit it (fail closed).

  6. Live vs not claimed live. Name only products that already have a first-party public surface:

    Product Live evidence on this host
    This docs host v0 stubs (#3)
    CL8Y token representations /contracts strings
    DEX dexHref / https://dex.cl8y.com
    Bridge https://bridge.cl8y.com
    CMM Name the product; do not freeze CR%, supply, APY, or extra contract strings. Token mechanics stay #13.

    Anything else is not claimed live unless it already appears as a first-party public surface in this repo or the linked first-party origins above. Do not list GameFi / PROTOCASS / Karnyx / TigerHunt. Do not lead with memecoin / “expensive token” / Autoscarcity / “the future of DeFi.”

  7. Planned / under development. This section is not a product roadmap invented in docs. Allowed rows:

    • Documentation manuscripts already filed in this repo and still open (#9 Start Here, #10 first-use, #11 Bridge guide, #12 DEX guide, #13 token FAQ), labeled as docs in progress, not as shipped product features.
    • Product work only if a public first-party page already describes it as not yet live. If none, say so in one sentence: this page does not publish an unofficial roadmap.

    Do not copy issue bodies. Do not mention operator hosts, VMs, Coolify, tokens, or queue ids.

  8. Limitations (required). At least: this host is static and is not a live metrics dashboard; it does not embed TVL/volume/fee %; DEX campaign query params are first-touch (DEX drops unknown keys after apply — ARCHITECTURE §10); this page is not a wallet and does not execute swaps or bridges; unknown docs paths 404. Do not invent SLA minutes or audit grades.

  9. Security notes (required, honest). This is not a security issue and not a disclosure inbox. Allowed copy only:

    • This host never asks for a wallet, seed, or signing.
    • Verify contract strings against /contracts (or this page’s copy of contracts.ts); ignore unofficial pastes.
    • Clickjacking headers on HTML/crawl files stay as shipped (#3).
    • Do not claim a third-party audit, bug bounty, or “fully audited” unless that exact sentence already exists as a first-party constant in this repo (it does not).
    • Do not publish exploit steps, private keys, or operator runbooks.

    Do not apply security / high-risk because this section exists.

  10. Dated changelog. Static entries in a content module (ISO date + one-line fact change). First entry is the ship of this page. Do not generate dates at build time (that would rewrite the changelog every image). Do not scrape git log into HTML. Later fact changes (new official link, new contracts.ts string, live-row add/remove) add a new dated line in the same PR that changes the fact.

  11. Claims. No fee, TVL, volume, ranking, collateral ratio, circulating supply, or APY figures unless already printed as first-party constants in this repo (they are not). No CoinGecko/CMC/DeFiLlama as proof. BANNED_CURRENT_COPY stays; do not add a USTR/UST1 exception on /facts (that exception is #9 / only). Name CMM without those tickers, or point at Start Here / #13.

  12. CTAs. New campaign id facts (closed vocabulary). DEX CTA still dexHref with execute ids, not tickers. Do not make “Buy CL8Y” a button.

  13. Nav / hubs. Add Facts (or Facts and status) to Layout nav and a hub line on / plus /guides index (one link each). Do not duplicate the full manuscript on those pages.

  14. No wallet / trading UI. No wagmi, WalletConnect, LCD keys, or DEX screens.

  15. Do not publish ops internals, unpublished marketing manuscripts, or extra contract addresses.

Relevant files

Path Why
src/pages/FactsPage.tsx (new) Manuscript + seven sections
src/content/facts.ts (new, preferred) Links, live rows, limitations, changelog strings + unit tests
src/data/contracts.ts Reuse addresses; do not invent
src/seo.ts New path/title/description/campaign
src/App.tsx Register /facts
src/components/Layout.tsx Nav item
src/lib/dexHref.ts Campaign facts
src/lib/dexHref.test.ts Closed campaign snapshot
src/pages/HomePage.tsx / GuidesPage.tsx One link to /facts
src/lib/ (small helper OK) Homepage / Bridge URL builders if #9 has not landed them
e2e/crawl.spec.ts Eighth unique title/canonical
src/verify-dist.test.ts Follows ROUTES; add body sniff for required headings
docs/ARCHITECTURE.md §4 / §10 campaign list / §12 New route; claims still fail-closed
docs/INVARIANTS.md Campaign + route; still no unverified claims
scripts/prerender.mjs No loc hardcode; confirm sitemap gains /facts only
  1. Put copy in src/content/facts.ts (official links, live rows, limitations, security notes, changelog). Unit-test: forbidden claim patterns, banned copy, hrefs are https:// first-party origins, contract strings deep-equal contracts.ts, changelog dates are explicit ISO strings in source.
  2. FactsPage: H1 Facts and status; sections in the order in Summary; DEX CTA via dexHref { campaign: "facts" }; other links via URL.
  3. Register the route through seo.ts so prerender + sitemap cannot drift.
  4. Update architecture §4 table and the closed campaign vocabulary in INVARIANTS / dexHref.
  5. Do not change nginx, Dockerfile, Woodpecker shape, or MIME rules. Unknown paths still 404.

Acceptance criteria

  • AC1. GET /facts prerendered HTML (no JS) contains headings (or equivalent labeled sections) for official links, contracts, live products, planned/under development, limitations, security, and a dated changelog.
  • AC2. The same HTML contains the five contracts.ts strings exactly, and no additional terra1 / 0x contract-shaped strings.
  • AC3. Official links in that HTML are only first-party origins listed in Constraints; DEX CTA uses execute ids + utm_campaign=facts.
  • AC4. Live section names docs, CL8Y, DEX, and Bridge. It does not claim GameFi lore or third-party listings as live CL8Y products.
  • AC5. Planned section does not invent a product roadmap. Docs-in-progress rows, if any, are labeled as documentation, not as shipped features.
  • AC6. Changelog contains at least one ISO date and a fact line in the prerendered HTML. Dates are not Date.now() / build timestamps.
  • AC7. <title> unique (Facts and status · CL8Y docs or equivalent); canonical https://docs.cl8y.com/facts. Sitemap loc set is previous seven plus this one. Unknown paths still 404.
  • AC8. Layout nav and / (and /guides) link to /facts. /contracts remains the address stub (may link here; do not move the only address list off /contracts).
  • AC9. No TVL / “best DEX” / CoinGecko / CMC / DeFiLlama / fabricated fee tiers. GameFi lore absent. “Buy CL8Y” is not a CTA. UST1 / USTR do not appear on /facts.
  • AC10. npm test, npm run typecheck, npm run build + dist unique-title tests, Playwright 5 workers stay green.
  • AC11. robots/sitemap MIME, clickjacking headers, and missing-file 404 behavior unchanged.
  • AC12. Architecture §4 and the CAMPAIGNS snapshot document /facts / facts.

Given a marketer or community member opens the prerendered /facts page
When they read Facts and status without executing JavaScript
Then they can copy official first-party links and contract strings, see which products this host claims live versus not, see known limitations and honest security notes, and see a dated changelog, with no invented statistics and no unofficial roadmap

Test plan (functional paths)

# Path Expect
T1 dist/facts/index.html Unique title/canonical; seven required sections present
T2 Same file, no JS Contract strings match contracts.ts; no extra terra1 / 0x bodies
T3 Same file Official link hrefs are first-party https:// only
T4 DEX CTA dexHref default pair + utm_campaign=facts
T5 sitemap.xml Contains https://docs.cl8y.com/facts; still no DEX loc
T6 /, /guides, Layout nav Link to /facts
T7 /contracts, /methodology Still unique titles; not overwritten with Facts H1
T8 GET /no-such-page and GET /status 404 (unless /status is explicitly not shipped — it must 404)
T9 Unit: facts.ts Forbidden claim patterns fail if someone pastes TVL / “best DEX”
T10 Playwright 5 workers New route in crawl table; previous seven still pass

Test plan (copy safety)

Not a DeFi attack suite. Keep host crawl/CTA tests from #3 green.

# Vector Expect
C1 Unverified TVL/volume/fee % on /facts Fail AC9 / unit grep
C2 GameFi / PROTOCASS / Karnyx / TigerHunt Absent
C3 Primary CTA “Buy CL8Y” or third-party venue as official Forbidden
C4 javascript: / data: / protocol-relative official href Never emitted
C5 Visitor query concatenated onto Bridge/DEX/homepage Forbidden
C6 Sitemap loc to a foreign host Forbidden
C7 Dump of unpublished marketing guides Forbidden
C8 USTR/UST1 on /facts Fail; #9 exception is / only
C9 Invented contract not in contracts.ts Fail review
C10 Wallet/WC/trading UI Fail review
C11 Changelog dates from Date.now() Fail AC6
C12 Page claims a third-party audit or “fully audited” Forbidden unless already a first-party constant (it is not)
C13 Operator/host/Coolify/uptime status copy Forbidden on this public page

Verification criteria

  • npm test && npm run typecheck && production npm run build with required VITE_*.
  • npm run test:dist (unique titles/canonicals including /facts).
  • Playwright 5 workers: /facts body sniff for the seven sections + contract strings; crawl MIME tests unchanged.
  • Human: open prerendered /facts and confirm a marketer can answer “what is official, what is live, what we will not claim” from the page alone.
  • scripts/check-origins.mjs still fail-closed without HTTPS origins.
  • No Coolify hostname/SKU work in this PR.

Out of scope

  • Operator incident/uptime status, Coolify, hosts, VMs, tokens, or queue ids.
  • Wallet connect, swap execution, wrap/mint UI, pair create.
  • Publishing unpublished marketing manuscripts.
  • Inventing DEX fee-tier tables, CMM collateral ratios, extra addresses, or a product roadmap.
  • Expanding the USTR/UST1 name exception onto /facts.
  • Editing code/CL8Y-web, code/ustr-cmm, the Bridge monorepo, or the DEX SPA (read-only for names/origins).
  • DEX Sitemap: pointer (marketing#2).
  • Choosing hypervisor image, SKU, or a new host.

First-pass model recommendation

Recommendation: grok-high

Rationale: This is a new public source-of-truth route, not docs/test-only maintenance of an existing stub. It amends the closed architecture allowlist, sitemap loc set, and dexHref campaign vocabulary, and it publishes official links plus the first-party contract strings. Expected files span FactsPage / facts content module, seo.ts, App.tsx, Layout.tsx, dexHref + tests, crawl/dist assertions, and ARCHITECTURE.md / INVARIANTS.md — more than three production files and a cross-cutting prerender contract. Composer fails those criteria (local three-file edit, no allowlist/protocol change, no contracts topic). Risk is claim-safety: a wrong “live” row or invented address becomes canonical marketing copy. Verify with unique-title/canonical dist tests, Playwright 5 workers, copy greps, and a no-JS read of /facts. Control-plane calibration: unlike a single RCA document (PR #170) or a test-helper tweak (#164), this is closer to a cross-module change (new route + crawl contract) than a one-file copy edit.

## Summary `https://docs.cl8y.com` has no single crawlable page that marketing and community members can check **before making factual claims**. Contract strings live on the `/contracts` stub. Methodology says this host will not invent statistics. Home and the four hubs do not say which products are live versus not claimed live, what is still under development, what this host will not assert, or when those facts last changed. Ship **one** prerendered **verified facts and status** page on a **new** allowlisted path so a human can answer, from HTML with JavaScript off: 1. Official first-party links (docs, DEX, Bridge, homepage; indexer only when `VITE_INDEXER_ORIGIN` is set). 2. Official contract / execute-id strings already in `src/data/contracts.ts` (do not invent extras). 3. Which first-party products are **live** versus **not claimed live** on this page. 4. What is **planned or under development** only as already-approved first-party work (no unofficial roadmap). 5. Known **limitations** of this host and of the live products as already documented. 6. Relevant **security** notes for readers (not a vuln dump, not an audit certificate). 7. A **dated changelog** of fact changes on this page. Bundle (do not split into links / contracts / live / roadmap / limitations / security / changelog tickets). Do **not** put this manuscript on `/` (Start Here, `code/cl8y-docs`#9), `/contracts` (address list only), `/methodology` (sourcing rules), or the how-to / FAQ paths owned by #10–#13. v0 platform work (#3) already shipped crawl files, unique titles, and stub routes. Full manuscripts were out of scope there. ### Parent / siblings (do not re-implement) - `code/cl8y-docs`#3 — v0 host + stubs; out of scope: “Full methodology/guide manuscripts (stubs only).” - `code/cl8y-docs`#9 — Start Here on `/` (newcomer product map + diagram + token purposes). Cite and link; do not expand that ticket into a facts ledger. - `code/cl8y-docs`#10 / #11 / #12 — how-to manuscripts. Different reader job. - `code/cl8y-docs`#13 — token/treasury FAQ on the reserved UST1 path. Different reader job; do not register `/ust1` here. - `docs/ARCHITECTURE.md` §4 / §12 / INVARIANTS 13–14 — closed route allowlist; no unverified stats; no unpublished marketing `content/guides/`. - `src/pages/ContractsPage.tsx` + `src/data/contracts.ts` — reuse the same five first-party strings; this page must not grow a second address book. - `code/CL8Y-web` — marketing homepage (`cl8y.com`). Different deployable; link it, do not copy that SPA. ## Current codebase Facts are scattered stubs, not a claims-check page: - `src/pages/HomePage.tsx` — host chrome + four hub links. No live/planned table, no changelog. - `src/pages/ContractsPage.tsx` + `src/data/contracts.ts` — Terra Classic CL8Y CW20, CL8Y/cLUNC pair, BSC CL8Y, MegaETH CL8Y, native `uluna`. No official-link list beyond those strings. - `src/pages/MethodologyPage.tsx` / `SourcesPage.tsx` — sourcing policy; not a product status ledger. - `src/pages/MarketsPage.tsx` — “see DEX / indexer”; no live/planned inventory. - `src/seo.ts` — seven `DocsPath` values; prerender and sitemap are derived from `ROUTES`. - `src/lib/dexHref.ts` — closed `CAMPAIGNS` (seven ids). Unknown campaign throws. - `src/components/Layout.tsx` — nav is Home / Methodology / Markets / Contracts / Guides. - `scripts/prerender.mjs` — writes `dist/**/index.html` and rewrites `sitemap.xml` from `ROUTES`. - `e2e/crawl.spec.ts` + `src/verify-dist.test.ts` — unique titles/canonicals for the seven v0 paths. Architecture §4 purpose of `/contracts` stays “first-party addresses already published.” This issue **adds** `/facts` (title seed: **Facts and status · CL8Y docs**) and amends the closed allowlist, sitemap loc set, and campaign vocabulary in the **same** PR. Do not reuse `/` or `/contracts` as the share URL for this ledger. ### Duplicates / already implemented | Work | Action | | --- | --- | | #1 architecture, #2 review, #5 CI | Unrelated; do not reopen | | #3 v0 stubs | Prerequisite host; not this manuscript | | #9 Start Here | Newcomer explainer on `/`; not live/planned/changelog | | #10–#12 how-tos, #13 FAQ | Different reader jobs; do not hijack | | CL8Y-web homepage | Different repo. Official link only | | Unpublished marketing `content/guides/` | Forbidden to dump here (INVARIANTS 14) | If `/facts` already exists with unique title/canonical, the seven sections above in prerendered HTML, and AC1–AC12 pass, close as implemented — do not duplicate. ## Why the new implementation is needed Operators and community members currently have no first-party URL that is honest about **what is true today**. `/contracts` is an address stub. `/` is (or will be) a newcomer map. Without this page: - Marketing copy has no canonical list of official links and live products. - Planned or in-progress work is easy to over-claim as shipped. - Contract strings and product names drift across chats because there is no dated facts log. This is documentation copy + one new prerendered route. No new host, no wallet UI, no Coolify SKU pick. ## Constraints / guardrails 1. **Route.** One new path: `/facts`. Canonical `https://docs.cl8y.com/facts` (no trailing slash). Title must stay unique vs existing routes (`Facts and status · CL8Y docs` or equivalent). Do not add `/status` (easy to confuse with operator uptime), `/changelog` as a second loc, or `/ust1`. 2. **Allowlist amendment (same PR).** Update `docs/ARCHITECTURE.md` §4, `docs/INVARIANTS.md` campaign list, `src/seo.ts` `DocsPath`/`ROUTES`, `src/lib/dexHref.ts` `CAMPAIGNS`, `src/App.tsx`, `src/components/Layout.tsx` nav, `e2e/crawl.spec.ts`, and `src/lib/dexHref.test.ts` closed-campaign snapshot. `scripts/prerender.mjs` already follows `ROUTES` — do not hardcode a second loc list. 3. **Reader.** Marketer, community member, or support person checking a claim. Short sentences. Not a trading tutorial, not Start Here, not an incident / Coolify / host status page. 4. **Official links (required, first-party only).** Build with `URL` (not string concat, not `window.location`, not visitor query). Closed set: | Label | Origin | | --- | --- | | Docs | `https://docs.cl8y.com` (this host) | | DEX | `VITE_DEX_ORIGIN` via existing `dexHref` (`utm_campaign=facts`) | | Bridge | `https://bridge.cl8y.com` (same helper pattern as #9 if it lands; otherwise a tested constant) | | Homepage | `https://cl8y.com` | | Public indexer | Only if `VITE_INDEXER_ORIGIN` is set and equals `https://indexer.dex.cl8y.com` | `rel="noopener noreferrer"` if `target="_blank"`. No CoinGecko / CMC / DeFiLlama / CEX / Telegram / Discord as “official.” No `javascript:`, `data:`, protocol-relative, or `?url=` redirectors. 5. **Contracts.** Render the **exact** strings from `src/data/contracts.ts`. Do not invent a sixth address. Link internally to `/contracts`. If a string is not in that module, omit it (fail closed). 6. **Live vs not claimed live.** Name only products that already have a first-party public surface: | Product | Live evidence on this host | | --- | --- | | This docs host | v0 stubs (#3) | | CL8Y token representations | `/contracts` strings | | DEX | `dexHref` / `https://dex.cl8y.com` | | Bridge | `https://bridge.cl8y.com` | | CMM | Name the product; do **not** freeze CR%, supply, APY, or extra contract strings. Token mechanics stay #13. | Anything else is **not claimed live** unless it already appears as a first-party public surface in this repo or the linked first-party origins above. Do not list GameFi / PROTOCASS / Karnyx / TigerHunt. Do not lead with memecoin / “expensive token” / Autoscarcity / “the future of DeFi.” 7. **Planned / under development.** This section is **not** a product roadmap invented in docs. Allowed rows: - Documentation manuscripts already filed in **this** repo and still open (#9 Start Here, #10 first-use, #11 Bridge guide, #12 DEX guide, #13 token FAQ), labeled as **docs in progress**, not as shipped product features. - Product work only if a **public first-party** page already describes it as not yet live. If none, say so in one sentence: this page does not publish an unofficial roadmap. Do not copy issue bodies. Do not mention operator hosts, VMs, Coolify, tokens, or queue ids. 8. **Limitations (required).** At least: this host is static and is not a live metrics dashboard; it does not embed TVL/volume/fee %; DEX campaign query params are first-touch (DEX drops unknown keys after apply — ARCHITECTURE §10); this page is not a wallet and does not execute swaps or bridges; unknown docs paths 404. Do not invent SLA minutes or audit grades. 9. **Security notes (required, honest).** This is **not** a security issue and not a disclosure inbox. Allowed copy only: - This host never asks for a wallet, seed, or signing. - Verify contract strings against `/contracts` (or this page’s copy of `contracts.ts`); ignore unofficial pastes. - Clickjacking headers on HTML/crawl files stay as shipped (#3). - Do **not** claim a third-party audit, bug bounty, or “fully audited” unless that exact sentence already exists as a first-party constant in this repo (it does not). - Do not publish exploit steps, private keys, or operator runbooks. Do not apply `security` / `high-risk` because this section exists. 10. **Dated changelog.** Static entries in a content module (ISO date + one-line fact change). First entry is the ship of this page. Do **not** generate dates at build time (that would rewrite the changelog every image). Do not scrape git log into HTML. Later fact changes (new official link, new `contracts.ts` string, live-row add/remove) add a new dated line in the same PR that changes the fact. 11. **Claims.** No fee, TVL, volume, ranking, collateral ratio, circulating supply, or APY figures unless already printed as first-party constants in this repo (they are not). No CoinGecko/CMC/DeFiLlama as proof. `BANNED_CURRENT_COPY` stays; do **not** add a USTR/UST1 exception on `/facts` (that exception is #9 `/` only). Name CMM without those tickers, or point at Start Here / #13. 12. **CTAs.** New campaign id `facts` (closed vocabulary). DEX CTA still `dexHref` with execute ids, not tickers. Do not make “Buy CL8Y” a button. 13. **Nav / hubs.** Add Facts (or Facts and status) to `Layout` nav and a hub line on `/` plus `/guides` index (one link each). Do not duplicate the full manuscript on those pages. 14. **No wallet / trading UI.** No wagmi, WalletConnect, LCD keys, or DEX screens. 15. **Do not** publish ops internals, unpublished marketing manuscripts, or extra contract addresses. ## Relevant files | Path | Why | | --- | --- | | `src/pages/FactsPage.tsx` (new) | Manuscript + seven sections | | `src/content/facts.ts` (new, preferred) | Links, live rows, limitations, changelog strings + unit tests | | `src/data/contracts.ts` | Reuse addresses; do not invent | | `src/seo.ts` | New path/title/description/campaign | | `src/App.tsx` | Register `/facts` | | `src/components/Layout.tsx` | Nav item | | `src/lib/dexHref.ts` | Campaign `facts` | | `src/lib/dexHref.test.ts` | Closed campaign snapshot | | `src/pages/HomePage.tsx` / `GuidesPage.tsx` | One link to `/facts` | | `src/lib/` (small helper OK) | Homepage / Bridge URL builders if #9 has not landed them | | `e2e/crawl.spec.ts` | Eighth unique title/canonical | | `src/verify-dist.test.ts` | Follows `ROUTES`; add body sniff for required headings | | `docs/ARCHITECTURE.md` §4 / §10 campaign list / §12 | New route; claims still fail-closed | | `docs/INVARIANTS.md` | Campaign + route; still no unverified claims | | `scripts/prerender.mjs` | No loc hardcode; confirm sitemap gains `/facts` only | ## Recommended direction 1. Put copy in `src/content/facts.ts` (official links, live rows, limitations, security notes, changelog). Unit-test: forbidden claim patterns, banned copy, hrefs are `https://` first-party origins, contract strings deep-equal `contracts.ts`, changelog dates are explicit ISO strings in source. 2. `FactsPage`: H1 Facts and status; sections in the order in Summary; DEX CTA via `dexHref` `{ campaign: "facts" }`; other links via `URL`. 3. Register the route through `seo.ts` so prerender + sitemap cannot drift. 4. Update architecture §4 table and the closed campaign vocabulary in INVARIANTS / `dexHref`. 5. Do not change nginx, Dockerfile, Woodpecker shape, or MIME rules. Unknown paths still 404. ## Acceptance criteria - AC1. `GET /facts` prerendered HTML (no JS) contains headings (or equivalent labeled sections) for official links, contracts, live products, planned/under development, limitations, security, and a dated changelog. - AC2. The same HTML contains the five `contracts.ts` strings exactly, and no additional `terra1` / `0x` contract-shaped strings. - AC3. Official links in that HTML are only first-party origins listed in Constraints; DEX CTA uses execute ids + `utm_campaign=facts`. - AC4. Live section names docs, CL8Y, DEX, and Bridge. It does not claim GameFi lore or third-party listings as live CL8Y products. - AC5. Planned section does not invent a product roadmap. Docs-in-progress rows, if any, are labeled as documentation, not as shipped features. - AC6. Changelog contains at least one ISO date and a fact line in the prerendered HTML. Dates are not `Date.now()` / build timestamps. - AC7. `<title>` unique (`Facts and status · CL8Y docs` or equivalent); canonical `https://docs.cl8y.com/facts`. Sitemap loc set is previous seven plus this one. Unknown paths still 404. - AC8. Layout nav and `/` (and `/guides`) link to `/facts`. `/contracts` remains the address stub (may link here; do not move the only address list off `/contracts`). - AC9. No TVL / “best DEX” / CoinGecko / CMC / DeFiLlama / fabricated fee tiers. GameFi lore absent. “Buy CL8Y” is not a CTA. `UST1` / `USTR` do not appear on `/facts`. - AC10. `npm test`, `npm run typecheck`, `npm run build` + dist unique-title tests, Playwright 5 workers stay green. - AC11. robots/sitemap MIME, clickjacking headers, and missing-file 404 behavior unchanged. - AC12. Architecture §4 and the `CAMPAIGNS` snapshot document `/facts` / `facts`. Given a marketer or community member opens the prerendered `/facts` page When they read Facts and status without executing JavaScript Then they can copy official first-party links and contract strings, see which products this host claims live versus not, see known limitations and honest security notes, and see a dated changelog, with no invented statistics and no unofficial roadmap ## Test plan (functional paths) | # | Path | Expect | | --- | --- | --- | | T1 | `dist/facts/index.html` | Unique title/canonical; seven required sections present | | T2 | Same file, no JS | Contract strings match `contracts.ts`; no extra `terra1` / `0x` bodies | | T3 | Same file | Official link hrefs are first-party `https://` only | | T4 | DEX CTA | `dexHref` default pair + `utm_campaign=facts` | | T5 | `sitemap.xml` | Contains `https://docs.cl8y.com/facts`; still no DEX loc | | T6 | `/`, `/guides`, Layout nav | Link to `/facts` | | T7 | `/contracts`, `/methodology` | Still unique titles; not overwritten with Facts H1 | | T8 | `GET /no-such-page` and `GET /status` | 404 (unless `/status` is explicitly not shipped — it must 404) | | T9 | Unit: `facts.ts` | Forbidden claim patterns fail if someone pastes TVL / “best DEX” | | T10 | Playwright 5 workers | New route in crawl table; previous seven still pass | ## Test plan (copy safety) Not a DeFi attack suite. Keep host crawl/CTA tests from #3 green. | # | Vector | Expect | | --- | --- | --- | | C1 | Unverified TVL/volume/fee % on `/facts` | Fail AC9 / unit grep | | C2 | GameFi / PROTOCASS / Karnyx / TigerHunt | Absent | | C3 | Primary CTA “Buy CL8Y” or third-party venue as official | Forbidden | | C4 | `javascript:` / `data:` / protocol-relative official href | Never emitted | | C5 | Visitor query concatenated onto Bridge/DEX/homepage | Forbidden | | C6 | Sitemap loc to a foreign host | Forbidden | | C7 | Dump of unpublished marketing guides | Forbidden | | C8 | USTR/UST1 on `/facts` | Fail; #9 exception is `/` only | | C9 | Invented contract not in `contracts.ts` | Fail review | | C10 | Wallet/WC/trading UI | Fail review | | C11 | Changelog dates from `Date.now()` | Fail AC6 | | C12 | Page claims a third-party audit or “fully audited” | Forbidden unless already a first-party constant (it is not) | | C13 | Operator/host/Coolify/uptime status copy | Forbidden on this public page | ## Verification criteria - `npm test` && `npm run typecheck` && production `npm run build` with required `VITE_*`. - `npm run test:dist` (unique titles/canonicals including `/facts`). - Playwright 5 workers: `/facts` body sniff for the seven sections + contract strings; crawl MIME tests unchanged. - Human: open prerendered `/facts` and confirm a marketer can answer “what is official, what is live, what we will not claim” from the page alone. - `scripts/check-origins.mjs` still fail-closed without HTTPS origins. - No Coolify hostname/SKU work in this PR. ## Out of scope - Operator incident/uptime status, Coolify, hosts, VMs, tokens, or queue ids. - Wallet connect, swap execution, wrap/mint UI, pair create. - Publishing unpublished marketing manuscripts. - Inventing DEX fee-tier tables, CMM collateral ratios, extra addresses, or a product roadmap. - Expanding the USTR/UST1 name exception onto `/facts`. - Editing `code/CL8Y-web`, `code/ustr-cmm`, the Bridge monorepo, or the DEX SPA (read-only for names/origins). - DEX `Sitemap:` pointer (marketing#2). - Choosing hypervisor image, SKU, or a new host. ## First-pass model recommendation Recommendation: grok-high Rationale: This is a new public source-of-truth route, not docs/test-only maintenance of an existing stub. It amends the closed architecture allowlist, sitemap loc set, and `dexHref` campaign vocabulary, and it publishes official links plus the first-party contract strings. Expected files span `FactsPage` / `facts` content module, `seo.ts`, `App.tsx`, `Layout.tsx`, `dexHref` + tests, crawl/dist assertions, and `ARCHITECTURE.md` / `INVARIANTS.md` — more than three production files and a cross-cutting prerender contract. Composer fails those criteria (local three-file edit, no allowlist/protocol change, no contracts topic). Risk is claim-safety: a wrong “live” row or invented address becomes canonical marketing copy. Verify with unique-title/canonical dist tests, Playwright 5 workers, copy greps, and a no-JS read of `/facts`. Control-plane calibration: unlike a single RCA document (PR #170) or a test-helper tweak (#164), this is closer to a cross-module change (new route + crawl contract) than a one-file copy edit.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-docs#14
No description provided.