# FrankenTUI Website — RULEBOOK v1.0 Assessment Packet v1

**Repository:** `Dicklesworthstone/frankentui_website` · https://github.com/Dicklesworthstone/frankentui_website · **Language:** TypeScript/TSX (Next.js 16) [Code-verified, High] · **Pinned commit:** `6057a6760b377ad4acf53e00668cf2924e585dfb` (2026-09-22 00:27:25 −0400, [Git-observed, High]) · **Last push:** 2026-09-22T04:27:28Z (the pin is the latest push confirmed in this assessment) [External (GitHub API), High] · **License:** MIT License with OpenAI/Anthropic Rider — non-OSI, source-available [Code-verified (LICENSE read verbatim), High]; GitHub API reports license `other` [External, High] · **Stars/forks:** 4 / 2 [External, High] · **Contributors:** Dicklesworthstone only, 235 commits [External, High] · **Releases/tags:** 0 / 0 [External, High].

**Method (analyst):** fresh `--depth 1` shallow clone of HEAD (240 paths) under `~/workspace/franken-research/.scratch/ftw`; recorded pinned hash + date from `git log`; read `package.json`, `next.config.ts`, `README.md` (verbatim, 224 lines), `CHANGELOG.md`, `AGENTS.md` (verbatim head), `UPGRADE_LOG.md`, `LICENSE` (verbatim), `lib/content.ts` (2,517 lines — the site's hand-edited content CMS), route table from `app/*/page.tsx`, `fetch_assets.ts`, and `public/web/version.json` (verbatim). Counted `.ts/.tsx` files and lines, `public/` asset sizes, Playwright spec files; inspected `beads.sqlite3` schema via sql.js/ro sqlite (15 tables, 1,168 issues, `export_meta` timestamp); verified the pinned kernel SHA in the WASM manifest. Live-fetched 2026-09-22: both hostnames (HTTP 200), all 8 routes (HTTP 200) plus the disabled `/war-stories` (HTTP 404, as designed), GitHub REST API (metadata, tags, releases, contributors, issues), crates.io API (four crate names), and the sibling repo `beads-for-frankentui` (HEAD `viewer.js` first-200-bytes diffed against the vendored copy). **Not done:** `bun install` / build / serve were not run (Node-toolchain install judged disproportionate for a static marketing site); the Playwright suites were not executed; the 60 fps claim was not instrumented; tweet-wall references were not individually re-verified. Assessment date: 2026-09-22.

**Tier legend (Rulebook §1):** **[Verified]** direct inspection of the pinned clone or a live page read by the analyst — with flavors **[Counted]** (I ran the count), **[Git-observed]** (git metadata), **[Code-verified]** (source read); **[CI-observed]** is Tier 2 (seen executing on live CI pages — attests the suite *runs*, not that it is green); **[Maintainer claim]** asserted in README/site/docs, not independently executed; **[External]** independent sources; **[Inference]** analyst judgment, always labeled. Confidence: **High** (multiple converging sources or direct inspection) / **Medium** (single solid source, plausible) / **Low** (thin evidence, extrapolation).

---

## Hook

A 36,000-line marketing site for a Rust TUI kernel that is more productionized than the kernel it advertises — live at its own domain, with a real WASM demo pinned to a kernel commit SHA and forensic datasets shipped with provenance metadata — but whose hero banner is now a small museum of stale claims: the "12 workspace crates" stat was true in February and the kernel has since grown to 20, the "V0.1.1 Alive on Crates.io" banner names a crate (`frankentui`) that does not exist on crates.io (the published crates are `ftui*`, now at 0.7.0, against a 0.9.0 workspace), and the "60 fps" headline has no benchmark methodology behind it. Its most exportable idea is the one with no marketing value: versioned, hash-manifested datasets queried client-side with no backend — a pattern for publishing evidence that survives whether or not the product does.

## TL;DR

- **What it is:** A Next.js 16 + React 19 + framer-motion marketing and documentation site for the FrankenTUI Rust TUI kernel — explicitly **not** the kernel repo (the README FAQ states this) [Code-verified, High]. 122 `.ts/.tsx` files, ~36,300 lines, 141 MB checkout dominated by 84 MB of WebM videos and 20 MB of WASM demo assets [Counted, High].
- **Strongest evidence:** The "static forensics" pattern is genuinely executed, not marketed: the `/beads` page ships the kernel's issue database as a 6.1 MB SQLite file with FTS indexes and an `export_meta` provenance row, queried in-browser via sql.js and graphed with react-force-graph; the `/web` WASM demo ships `version.json` pinning `frankentui_git_sha` `20d095200584f0f5d3d3679e95f76087ca1730c8` (synced 2026-09-18) plus a per-file sha256 manifest and a 209-line `evidence.jsonl` — the demo payload carries provenance metadata, not vaporware [all Code-verified, High]. Both hostnames and all 8 live routes return HTTP 200; the one disabled route (`/war-stories`) returns the intended 404 [Verified, High].
- **Strongest doubts:** The hero stats are a drift inventory. "60 fps via WASM + WebGPU" has no measurement methodology, numbers, or trace anywhere in the repo [Maintainer claim, Low as a measurement]; "12 Workspace Crates" contradicts the kernel's own workspace manifest, which lists 20 members at its HEAD [Verified stale, High]; "V0.1.1 Alive on Crates.io" is wrong twice over — crates.io has no `frankentui` crate (the published crates are `ftui`/`ftui-core`/`ftui-runtime` at 0.7.0) and the kernel workspace itself is at 0.9.0 [External + Code-verified, High]; the spec-evolution dataset was generated 2026-02-08 and the beads snapshot 2026-02-04 — both February, both unlabeled as historical on the site [Verified, High]. There is no CI at all (no `.github/workflows` directory), the Playwright suites are run locally or not at all, and the governance is a hard ceiling: single maintainer, no contributions accepted, custom non-OSI rider.
- **NODUS ring: Monitor** [Inference, Medium] (TRL 9 as a deployed website artifact; as technology infrastructure it scores N/A — it is a support asset, not a technology). The Rulebook's ring rule is explicit — *Monitor* is for websites — and there is nothing to pilot or adopt: it is a well-built brochure whose transferable value is a pattern, not a package.

## Quick Links

Verified resolving 2026-09-22 [Verified, High unless noted]:

1. [Repository](https://github.com/Dicklesworthstone/frankentui_website)
2. [README](https://github.com/Dicklesworthstone/frankentui_website/blob/HEAD/README.md) — FAQ ("Is this the kernel repo? No."), troubleshooting (Safari video), no-contributions policy
3. [License (MIT + OpenAI/Anthropic Rider)](https://github.com/Dicklesworthstone/frankentui_website/blob/HEAD/LICENSE)
4. [CHANGELOG (no-release policy stated at top)](https://github.com/Dicklesworthstone/frankentui_website/blob/HEAD/CHANGELOG.md)
5. [Demo manifest (`public/web/version.json`)](https://github.com/Dicklesworthstone/frankentui_website/blob/HEAD/public/web/version.json) — pinned kernel SHA, per-file sha256, synced 2026-09-18
6. [Site content CMS (`lib/content.ts`)](https://github.com/Dicklesworthstone/frankentui_website/blob/HEAD/lib/content.ts) — where the hero stats and comparison table live
7. [Live site](https://frankentui.com) (HTTP 200) · [Vercel deployment](https://frankentuiwebsite.vercel.app) (HTTP 200)
8. [Kernel repo (the thing being marketed)](https://github.com/Dicklesworthstone/frankentui) — 20-member Cargo workspace at HEAD, version 0.9.0 [Code-verified, High]
9. [crates.io `ftui` (the actual published crate name)](https://crates.io/crates/ftui) — max_version 0.7.0 [External, High]; note crates.io has **no** `frankentui` crate (404) [External, High]
10. [Sibling repo `beads-for-frankentui` (viewer code source)](https://github.com/Dicklesworthstone/beads-for-frankentui) — 12 stars, pushed 2026-09-21; `fetch_assets.ts` vendors its `viewer.js`/`index.html`/`styles.css`/`wasm_loader.js`/`hybrid_scorer.js` into `public/beads-viewer/` [External + Code-verified, High]

## Did You Know

There is no `frankentui` crate on crates.io — the API returns a 404 for that name [External, High]. The site's hero banner still reads "V0.1.1 Alive on Crates.io" [Code-verified, High] — and the fair version of the story is that `ftui` 0.1.1 genuinely shipped on 2026-02-05 (crates.io versions API [External, High]), so the banner is frozen February truth, not fabrication. But the kernel's published crates are now at 0.7.0 [External, High] while the workspace manifest itself is versioned 0.9.0 [Code-verified, High], so the banner is stale in the version number and the name never matched anyway — and the sharper half of the finding: the beads-viewer code vendored into this repo (`public/beads-viewer/viewer.js`, byte-identical to `beads-for-frankentui` HEAD [Code-verified, High]) was pushed to the sibling repo on 2026-09-21, yesterday — while the *data* it displays, `beads.sqlite3`, carries an `export_meta` timestamp of 2026-02-04 [Verified, High]. Fresh viewer, seven-month-old data: the vendored viewer matches a sibling repo pushed yesterday, while the data it displays is a February export — the glass is polished, the exhibit is frozen.

## Franken-worthy next steps

1. **Derive hero stats from the kernel at sync time instead of hand-editing `lib/content.ts`.** The 12→20 crates drift and the V0.1.1→0.7.0/0.9.0 version drift are both instances of one class: stats authored by hand in a 2,517-line content file, never re-derived. *Done when:* a script reads the kernel's `Cargo.toml` workspace members and the crates.io API for the published max_version at demo-resync time, and the packet's stale-claim table goes to zero. [Inference, High — process proposal]
2. **Put an "as of" date on every forensic page, generated from the dataset itself.** The beads page and spec-evolution lab are honest datasets presented ahistorically — the site never tells the visitor the data is from February. *Done when:* each page renders `export_meta.generated_at` / `generated_at` from its own JSON/SQLite, failing loudly if the provenance row is absent. This converts the strongest pages from a drift liability into an evidence-honesty demonstration. [Inference, High]
3. **Promote `version.json` from manifest to signed attestation.** The WASM demo already ships per-file sha256 + a pinned kernel SHA — the only thing missing is a signature binding them, so a visitor can't verify "this demo is that commit" without trusting the host. *Done when:* `version.json` + `evidence.jsonl` are minisign-signed at resync and the `/web` loader verifies before booting. Falsifiable the day someone forges a demo. [Inference, Medium]
4. **Measure the 60 fps or demote it to a target.** The Playwright suite already contains performance assertions run locally (`tests/spec-evolution-perf.spec.ts`); the hero's flagship stat has never been instrumented even once. *Done when:* a committed procedure (runner, browser version, frame-budget trace) publishes a number, or the stat is reworded to "designed for 60 fps." Either outcome is a win for the evidence ledger. [Inference, High]
5. **Extract the static-forensics pattern as the sibling-site template it already half is.** `fetch_assets.ts` already vendors the beads viewer from `beads-for-frankentui`; `frankensim_website` and `frankensqlite_website` already share the pattern informally. *Done when:* the pattern (versioned dataset + provenance row + client-side query + no backend) is documented as a named template with a freshness contract, and the next sibling site adopts it instead of copy-pasting. [Inference, Medium]

---

## 4.1 Why it exists — the market problem

**The problem, as the maintainer frames it:** a clean-room Rust TUI kernel built in a five-day sprint needs a public face — screenshots, a live demo, and the sprint narrative — that terminal-only distribution cannot provide. The site is the adoption funnel: the kernel lives in a terminal, so its showcase has to live in a browser [Maintainer claim, Medium — inferred from site structure; the maintainer never writes a mission statement for the site itself].

**Who feels the pain:** developers evaluating TUI frameworks for Rust who want to *see* the kernel — its widgets, its demos, its issue graph — without cloning a Rust workspace and running a nightly toolchain [Inference, Medium].

**Why now:** the kernel's "built in 5 days" narrative (Jan 31 → Feb 5, 2026) was the project's launch event, and the site reads as its launch artifact — the timeline page is structured as evidence for the sprint, and the forensic pages (the bead DAG, the spec-evolution lab) function as proof the sprint happened the way the story says [Inference, Medium — no mission statement for the site exists in-repo].

**Why a website, not docs-in-repo:** the kernel repo is a Rust workspace; the site does things a README cannot — an interactive WASM build of the actual kernel, a force-directed graph of 1,168 issues queried live in the browser, a 31-commit spec-evolution diff lab [Code-verified, High on existence of each]. The site's dual function is visible in its own information architecture: half the routes are *narrative evidence* (the timeline, the tweet wall, the spec lab — "proof the sprint happened"), half are *interactive evaluation* (the WASM demo, the beads graph — "judge the kernel without installing anything"). What it does not try to be is a documentation hub: `/getting-started` and `/glossary` are thin reference pages, while the kernel repo itself carries 40+ docs files — the site concedes the docs lane to the repo and keeps the persuasion lane for itself [Code-verified, High].

## 4.2 What it is — repo TL;DR

A Next.js 16.1.6 + React 19.2.4 marketing site (122 `.ts`/`.tsx` files, 36,296 lines including tests [Counted, High]), `bun`-only toolchain, deployed as a standard Next.js server app on Vercel at frankentui.com — `next.config.ts` sets no `output: 'export'`, so it is not a static export; the "static" in the site's story is the build-time data shipping, not the deployment model [Code-verified, High]. Nine routes in `app/`; eight live, one (`/war-stories`) intentionally hard-404s while its component files are kept (`notFound()`, with the comment "keep as a hard 404 without deleting files") [Code-verified, High]. The `/web` route is not a page at all — it's a `next.config.ts` rewrite serving `public/web/index.html`, a static WASM terminal demo pinned to kernel SHA `20d095200584f0f5d3d3679e95f76087ca1730c8` (synced 2026-09-18) with immutable-cache headers on the WASM package and `no-store` on the manifest — a deliberate caching design [Code-verified, High]. The content layer is `lib/content.ts` (2,517 lines): hero stats, features, the two comparison tables (11-row framework, 9-row browser), a 6-row screen-mode matrix, `performanceSLAs` targets, timelines, and tweet references [Code-verified, High]. It is a hand-edited CMS with no generation step — which is exactly why §4.3's drift inventory exists: every number in it is a snapshot of the day a human last typed it. Heavy client-side libraries (sql.js, react-force-graph, framer-motion, the WASM terminal) are lazy-loaded — `StatsGrid` gates on `IntersectionObserver` [Code-verified, High] — but the repo still ships 84 MB of WebM video, a 20 MB demo payload, and an 18 MB beads-viewer dir: 141 MB total, which the README itself partially disowns ("not a 'minimal JS' aesthetic project") [Counted + Maintainer claim, High].

## 4.3 Repo facts (claim inventory)

Every claim re-verified against the pinned commit on 2026-09-22.

| # | Claim | Status | Evidence | Tier, Confidence |
|---|---|---|---|---|
| 1 | Deployed live at frankentui.com and frankentuiwebsite.vercel.app | demonstrated | Both hostnames return HTTP 200 (1.2s / 1.1s, 2026-09-22) | [Verified, High] |
| 2 | Next.js 16.1.6 / React 19.2.4 / bun-only toolchain | demonstrated | `package.json` read verbatim; engines block npm | [Code-verified, High] |
| 3 | 8 live routes, 1 intentionally disabled | demonstrated | 9 `page.tsx` files; all 8 live routes curl HTTP 200; `/war-stories` returns the designed 404 | [Verified, High] |
| 4 | Beads DAG viewer from a shipped 6.1 MB SQLite DB (1,168 issues, 15 tables, FTS5 indexes, `export_meta` provenance row) | demonstrated; **the data is stale** (export 2026-02-04) while the viewer code is fresh (vendored from a repo pushed 2026-09-21) | SQLite inspected directly; `viewer.js` byte-matches `beads-for-frankentui` HEAD | [Code-verified, High] |
| 5 | Spec-evolution lab from versioned JSON (31 commits, 11 buckets, `generated_at` 2026-02-08) | demonstrated; **stale** — a February snapshot presented without an "as of" label | Dataset JSON inspected directly | [Code-verified, High] |
| 6 | WASM demo pinned to kernel SHA with per-file sha256 manifest + 209-line evidence.jsonl, synced 2026-09-18 | demonstrated | `public/web/version.json` read verbatim; header caching design in `next.config.ts` read | [Code-verified, High] |
| 7 | "60 fps via WASM + WebGPU" (hero stat, showcase kicker, comparison table) | **aspirational / unmeasured** | No methodology, numbers, trace, or perf test targets the demo's frame rate anywhere in the repo | [Maintainer claim, Low as a measurement] |
| 8 | "12 Workspace Crates" (hero stat; "12 focused crates" in features) | **stale** | Kernel `Cargo.toml` at its HEAD lists 20 workspace members, version 0.9.0 | [Code-verified + External, High] |
| 9 | "V0.1.1 Alive on Crates.io" (hero banner) | **stale (was true in February)** | `ftui` 0.1.1 was genuinely published 2026-02-05 (crates.io versions API) — the banner is frozen February truth, not fabrication; but no `frankentui` crate exists (404), published names are `ftui`/`ftui-core`/`ftui-runtime` at 0.7.0, and the kernel workspace is at 0.9.0 | [External, High] |
| 10 | "Built in 5 days, from scratch" | partially demonstrated | Site timeline pins kernel commits 2026-01-31 → 2026-02-05; the crates.io publish is independently confirmed (`ftui` 0.1.1, 2026-02-05, versions API). The "from scratch" characterization is the site's phrasing and was not independently audited this round | [Maintainer claim, Medium] |
| 11 | "30+ algorithms — alien-artifact quality" | aspirational / vague | No enumerated list, no comparison methodology | [Maintainer claim, Low] |
| 12 | Comparison tables: 11-row framework table (vs Ratatui / tui-rs / raw crossterm) + 9-row browser table (vs xterm.js / hterm, incl. "60fps deterministic") | maintainer claim / marketing | No benchmark protocol behind either table; directional accuracy plausible but this is positioning, not evidence. A separate 6-row screen-mode matrix (inline vs alt-screen) is a trade-off table, not competitor positioning | [Maintainer claim, Medium] |
| 13 | Zero GitHub Actions; Playwright E2E + perf assertions run locally (`BASE_URL=… bunx playwright test`) | demonstrated (absence + existence) | No `.github/` directory; 20 test/spec files counted, incl. lru-cache unit tests; none executed here | [Code-verified, High] |
| 14 | "Videos play everywhere" | **contradicted by the maintainer's own docs** | README Troubleshooting: WebM fails on Safari; MP4 fallbacks intentionally gitignored | [Maintainer claim, High] |
| 15 | No formal releases; "history by landed capability" | demonstrated | 0 tags, 0 GitHub releases (API); CHANGELOG states the policy explicitly | [Verified, High] |
| 16 | `AGENTS.md` documents the repo's agent workflow | **stale / disproven** | It is a copied template for "Jeffrey Emanuel Personal Site" describing GSAP, Three.js, Fuse.js — none of which this repo uses | [Code-verified, High] |
| 17 | No outside contributions accepted | demonstrated | README "About Contributions" read verbatim: PRs may be reviewed by Claude/Codex but never merged directly | [Code-verified, High] |
| 18 | CHANGELOG "Unreleased (HEAD)" tracks the pin | **stale** | Its latest entry references commits from 2026-03-18; the pin is 2026-09-22 | [Code-verified, High] |
| 19 | Sole maintainer, 235 commits | demonstrated | GitHub API contributors endpoint: one login, 235 contributions | [External, High] |
| 20 | "No backend: everything is static or client-side, by design" (README Limitations) | mostly demonstrated | No API routes exist in `app/`; heavy libs lazy-load behind IntersectionObserver gates; datasets ship as files. But the deployment is a standard Next.js server app (no `output: 'export'`), and 141 MB of assets plus framer-motion throughout keep it from minimal | [Code-verified, High] |

**What the inventory says in aggregate:** claims about *artifacts* (live routes, the demo manifest, the SQLite schema, the JSON dataset) verify at High confidence; claims about *measurements* (60 fps, crate counts, versions, "plays everywhere") are unmeasured, stale, or contradicted by the maintainer's own files. Staleness is the dominant failure mode, and it is dated: February data, March changelog, served in September.

## 4.4 Codebase tour

**Topology [Counted/Verified, High]:** Next.js 16 App Router — `app/` (9 page routes + layouts), `components/` (site chrome plus the big interactive pieces: `spec-evolution-lab.tsx` 3,833 lines, `signal-hud.tsx`, `terminal-demo.tsx`, `tweet-wall.tsx`), `lib/content.ts` (2,517 lines — the hand-edited content CMS holding hero stats, features, the comparison table, timelines), `hooks/`, `types/`, `scripts/`, `tests/` (20 files), and `public/` (141 MB: `videos/` 84 MB, `web/` 20 MB WASM demo, `beads-viewer/` 18 MB incl. 6.1 MB sqlite, `how-it-was-built/` 9 MB, `screenshots/` 2 MB). 122 `.ts`/`.tsx` files, 36,296 lines — this count includes `tests/` and config; the figure is the whole-tree source count, not app code alone.

**Route inventory [Verified, High]:**

| Route | Implementation | Live status |
|---|---|---|
| `/` | `app/page.tsx` — hero stats, features, comparison table, sprint narrative | 200 |
| `/showcase` | `app/showcase/page.tsx` — screenshots, demo videos, lazy-loaded interactive WASM terminal | 200 |
| `/web` | rewrite → `public/web/index.html` (static WASM demo, not a React route) | 200 |
| `/web_react` | `app/web_react/page.tsx` — React integration docs for embedding the WASM terminal | 200 |
| `/architecture` | `app/architecture/page.tsx` — kernel architecture pages | 200 |
| `/beads` | `app/beads/page.tsx` — in-browser sql.js + force-graph DAG over the shipped sqlite | 200 |
| `/how-it-was-built` | `app/how-it-was-built/page.tsx` (+ `spec-evolution-lab/` sub-route) — spec-evolution forensic lab | 200 |
| `/getting-started`, `/glossary` | reference docs | 200 |
| `/war-stories` | `notFound()` — hard 404, files deliberately kept | 404 by design |

**Data flow:** the site's signature move is build-time data shipping, not runtime APIs. `public/web/version.json` (synced 2026-09-18, `frankentui_git_sha` `20d095200584f0f5d3d3679e95f76087ca1730c8`, `toolchain` `nightly-2026-08-31`, `source_inputs_sha256`, `runner_lock_sha256`, 20 files) is the manifest; `next.config.ts` serves the WASM package immutable-cached (1 year) while the manifest itself is `no-store` — the comment in the config explains why: caching the manifest would pin a visitor to a stale hash set [Code-verified, High]. The beads viewer is not authored here at all: `fetch_assets.ts` (a bun script) vendors `viewer.js`/`index.html`/`styles.css`/`wasm_loader.js`/`hybrid_scorer.js` from `Dicklesworthstone/beads-for-frankentui`, and the vendored `viewer.js` is byte-identical to that repo's HEAD [Code-verified, High] — the data (`beads.sqlite3`) comes from the kernel's own bead export instead. Heavy client libraries load behind `IntersectionObserver` gates — verified for `StatsGrid` *and* for the showcase WASM terminal (`app/showcase/page.tsx` uses `lazy()` + its own observer; `terminal-demo.tsx` consumes a `useIntersectionObserver` hook) [Code-verified, High]. The 6.1 MB sqlite is not even shipped as one file: `beads.sqlite3.config.json` manifests it as six sha256-hashed 1 MB chunks reassembled client-side — chunked, content-addressed delivery for a database [Code-verified, High]. There is no backend, no API route in `app/`, no database connection string anywhere.

**Dependency posture [Code-verified, High]:** 13 runtime deps (`next` 16.1.6, `react` 19.2.4, `framer-motion` 12, `sql.js`, `react-force-graph`, `react-tweet`, `marked`, `highlight.js`, `dompurify`, `d3` types) + Playwright/eslint dev toolchain. No asupersync — it is a Rust runtime library with no meaning in a Next.js site; the Rulebook's asupersync question is answered by category, not by lockfile grep: **not applicable** [Inference, High].

**What README diagrams claim vs. what the code confirms:** the README's architecture diagram ("Fetch SQLite chunks → Query in-browser → Render force graph") matches the shipped files; the claim that "no live API is required" is confirmed by the absence of any API route [Code-verified, High].

## 4.5 Benchmark and conformance audit

This is a marketing site, so its "benchmarks" are its hero statistics — and the audit is short because the methodology column is empty.

| Maintainer number | Method doc? | Controls? | Survives independent rerun? |
|---|---|---|---|
| "60 fps via WASM + WebGPU" | none in repo | none | **No** — unmeasured target descriptor, not a result [Maintainer claim, Low] |
| "12 Workspace Crates" | none (hand-edited in `lib/content.ts`) | none | **Falsified** — kernel workspace is 20 members at HEAD [External, High] |
| "Built in 5 days" | timeline with commit hashes (site page) | none | Directionally corroborated (Jan 31 → Feb 5 commits), "from scratch" un-audited |
| "30+ algorithms" | none | none | Unfalsifiable as stated — no list [Maintainer claim, Low] |
| "V0.1.1 Alive on Crates.io" | none | none | **Stale** — published crates are `ftui*` 0.7.0; no `frankentui` crate exists [External, High] |

**Design targets that are not measurements:** `lib/content.ts` ships a `performanceSLAs` table (5 entries: resize→first-stable-present ≤120ms p95, action latency <16ms, dirty-span overhead <2%, …) — these are engineering budgets, explicitly targets, with no measured values attached anywhere in the repo [Code-verified, High]. They are the honest version of the 60 fps stat: a number with a procedure-shaped hole where the procedure should be.

**Independent numbers:** none exist for the site itself — no third-party review, no WebPageTest/Lighthouse run, no published Core Web Vitals [External, High within recall caveats]. The Playwright suite (20 files) contains performance assertions (`spec-evolution-perf.spec.ts`) and E2E coverage of the beads viewer, spec lab, and WASM loader — but with no CI, they are run locally or not at all; nothing in the repo attests they pass at the pin [Code-verified existence, High; greenness unestablished].

**Reproduction cost:** `bun install` + `bunx playwright install` + a local `bun dev` server, then `BASE_URL=… bunx playwright test` — modest (no GPU farm, no quiet host), which makes the absence of any CI enforcement the notable fact rather than cost [Inference, Medium]. **Never cite an un-gated number as a result:** per the Rulebook, the 60 fps figure is not citable as a result of anything.

## 4.6 Comparison: who owns the lane

**The incumbent for "Rust TUI framework mindshare" is Ratatui** — the established ecosystem default with real users, real apps, and documentation that does not need a WASM demo to be believed. The site's comparison tables (an 11-row framework table and a 9-row browser table: inline mode, deterministic diff, one-writer rule, RAII teardown, Bayesian diff strategy, BOCPD resize coalescing, Porter-Duff compositing, Elm runtime, conformal prediction, `#![forbid]` zero-unsafe render path, "60fps deterministic" vs xterm.js/hterm…) are positioning, not measurement — but its directional claims are the kernel's documented features, and the honest version of the table's edge is that no incumbent ships "every frame reproducible and testable" as a first-class story [Maintainer claim, Medium on directionality].

**Adjacent lanes:** Bubble Tea (Go, the Elm-architecture incumbent the kernel's runtime mirrors), `tui-rs`/raw crossterm (the table's other columns), and — the more honest comparison set for *this repo* — the sibling FrankenSuite sites (`frankensim_website`, `frankensqlite_website`), which share the static-forensics pattern informally, and `beads-for-frankentui` (12 stars), the actual home of the viewer code this site vendors.

**Why the incumbent wins today:** Ratatui wins on ecosystem, apps in production, and contributor base; this site's kernel has none of those yet, and the site's job is to manufacture the *impression* of inevitability ahead of them [Inference, Medium]. A necessary lane split this packet enforces: the *site* competes with other project sites for evaluator attention; the *kernel* competes with Ratatui and Bubble Tea for users. The comparison tables are the site doing marketing about the kernel's competition — this packet assesses the site on its own terms, where its differentiators are the interactive WASM demo and the queryable forensic datasets, features most open-source project sites do not offer [Inference, Medium].

**The genuinely unoccupied lane:** marketing sites whose claims are verifiable from versioned, hash-manifested artifacts shipped in the repo itself. Every project site asserts; almost none ships the dataset its assertions are computed from, with a provenance row and a query interface. The beads page and the spec-evolution lab are real instances of that lane — frozen in February, but real [Inference, Medium]. Whether any buyer of TUI frameworks chooses on verifiability rather than ecosystem is the unproven bet underneath the whole site.

## 4.7 Skeptic's take

**Strengths (substantive):**

1. **The static-forensics pattern is well executed and genuinely reusable.** Versioned datasets (`version.json` with per-file sha256, sqlite `export_meta`) + client-side querying (sql.js, JSON diffs) deliver interactive pages with no backend, no API keys, no database to operate. The `/web` manifest's cache design (immutable WASM, no-store manifest) shows someone thought about the failure modes [Code-verified, High].
2. **A real WASM demo pinned to a kernel commit** — synced 2026-09-18, SHA `20d0952…`, 209-line `evidence.jsonl`. Not vaporware; the demo payload ships provenance metadata [Code-verified, High].
3. **The negative-evidence culture of the kernel repo carries over.** The README admits Safari video is broken (with MP4 fallbacks intentionally gitignored), admits the site is "not a 'minimal JS' aesthetic project," admits no backend and no contribution workflow, and the CHANGELOG admits "no formal releases" [Code-verified, High]. A marketing site that documents its own gaps is rarer than it should be.
4. **Live, deployed at its own domain, maintained to the assessment date** — HEAD pushed 2026-09-22, both hostnames serving [Verified, High].

**Weaknesses (substantive — each capable of discrediting the site on its own):**

1. **[HIGH] The hero banner is a drift inventory.** 60 fps (unmeasured), 12 crates (kernel now has 20), V0.1.1 on Crates.io (no such crate; published `ftui*` at 0.7.0; workspace at 0.9.0), 30+ algorithms (no list). Four stats, zero surviving contact with September reality [Code-verified + External, High].
2. **[HIGH] No CI whatsoever.** No `.github/workflows` — zero GitHub Actions. The Playwright E2E + perf suites exist (20 files) but nothing enforces them on push; a kernel resync that breaks the WASM demo would ship silently to frankentui.com [Code-verified, High].
3. **[MEDIUM] Governance ceiling: no contributions, custom rider, bus factor 1.** 235 commits by one login, PRs "reviewed by Claude or Codex" but never merged, the non-OSI rider on a *marketing site* (whose main effect here is signaling, since nobody trains models on brochures). This is a personal publishing artifact, not a project [Code-verified + External, High].
4. **[MEDIUM] Boilerplate rot.** `AGENTS.md` is a copied template for "Jeffrey Emanuel Personal Site" (GSAP, Three.js, Fuse.js — none used here); the CHANGELOG's "Unreleased (HEAD)" section is six months stale (2026-03-18 vs pin 2026-09-22); `/war-stories` is a designed 404 with its files kept as a monument. Cosmetic individually; as a set, evidence that docs maintenance is the first thing velocity drops [Code-verified, High].
5. **[MEDIUM] The forensic datasets are frozen in February and presented ahistorically.** Beads `export_meta`: 2026-02-04. Spec dataset `generated_at`: 2026-02-08. The kernel repo has continued development since (HEAD pushed 2026-09-22), but the site presents the graph as "the" issue DAG with no "as of" label — a fossil exhibit with no date plaque [Code-verified, High].
6. **[LOW] 141 MB of repo bloat.** 84 MB of WebM video, 20 MB demo, 18 MB beads-viewer — fine for a showcase, poor for forkability, and it makes every fresh clone a 4-minute download (observed) [Counted, High].

**Bear-case steelman (strongest counter-case):** This is a brochure with frozen February data and no CI, maintained by one person who does not accept contributions, under a license that forbids AI labs from analyzing a marketing site nobody would analyze anyway. Every number that moves — crate count, published version, issue count — is stale; the one number that matters (60 fps) was never measured; and the demo's kernel pin (2026-09-18) will quietly rot the next time the kernel ships a breaking WASM change, with no test gate to catch it. The rational response is to extract the static-forensics pattern (versioned dataset + provenance row + client-side query) and ignore everything the site says about the kernel. Its most likely end state is not obsolescence but quiet fossilization: still serving, still 200 OK, increasingly a museum of the February sprint [Inference, Medium — a forecast, deliberately uncharitable; the counter-evidence is the 2026-09-18 demo resync and the 2026-09-21 viewer re-vendor, which show the maintainer still tends the glass even as the exhibit stays frozen].

## 4.8 Maintenance & succession

**Bus factor: 1.** One contributor, 235 commits, all Dicklesworthstone [External, High]. No succession plan, no second committer, no foundation. The README's "About Contributions" policy is explicit: outside PRs are never merged directly ("I'll have Claude or Codex review submissions via `gh` and independently decide whether and how to address them") — issues and bug reports welcome, 0 open issues at assessment [Code-verified + External, High]. **What breaks first if velocity decays:** dataset freshness (already 7 months stale at the pin), then the WASM demo sync (currently 4 days fresh — the best-maintained surface), then the hand-edited hero stats (already stale), then the domain renewal [Inference, Medium].

**Maintenance load signals:** HEAD pushed on the assessment date; the vendored beads viewer byte-matches the sibling repo's HEAD (pushed 2026-09-21); the demo resynced 2026-09-18 — the maintainer is active, but activity concentrates on the demo/viewer surfaces while the docs (`AGENTS.md`, CHANGELOG) and datasets rot. Review depth is unassessable: with no contributions accepted and no CI, there is no review surface at all [Inference, Medium].

**License — the rider, scoped precisely (LICENSE read verbatim at pin):**

- **Restricted parties:** "OpenAI, L.L.C.; Anthropic, PBC; any of their respective Affiliates; and any person or entity acting directly or indirectly on behalf of, for the benefit of, or under the direction of any of the foregoing (including any officer, director, employee, contractor, agent, consultant, service provider, or representative)." (quoted verbatim)
- **Grant:** "Notwithstanding any other provision of this License, no rights are granted to any Restricted Party. Any purported license, sublicense, assignment, transfer, or other permission to any Restricted Party is null and void absent the express prior written permission of Jeffrey Emanuel." (quoted verbatim, line breaks removed)
- **"Use" is defined expansively** — "copying, modifying, merging, publishing, distributing, sublicensing, selling, transferring, making available, hosting, deploying, executing, benchmarking, testing, analyzing, indexing, or incorporating the Software or any Derivative Works into any dataset, training corpus, evaluation harness, or pipeline for machine learning or other automated systems." (quoted verbatim)
- **Remedy:** breach terminates rights automatically; the author reserves injunctive/equitable relief and attorneys' fees.
- **Classification:** non-OSI, source-available. Named-party discrimination fails OSD §5; the benchmarking/analysis/training bar fails OSD §6 [Inference, High — legal conclusion, not legal advice]. GitHub's API reports the license as `other` [External, High].

**The rider as strategy — for a website:** the exclusion list is the same FrankenSuite-wide rider, but its economics invert here. On the kernel repos the rider at least gestures at protecting training-data value; on a 36k-line marketing site the protectable value is ~zero while the cost is real: any AI-assisted tooling, agent-driven analysis, or lab-affiliated contributor is barred from even *analyzing* the brochure, and the no-contributions policy means the rider's practical bite lands on evaluators, not contributors. It reads as suite-wide boilerplate applied without site-specific thought — which is itself a governance signal [Inference, Medium].

## 4.9 NODUS factsheet

| Criterion | Score | One-line justification |
|---|---|---|
| Technology readiness | **TRL 9 (artifact) / N/A (technology)** | Live, deployed, serving at its own domain — as infrastructure it is not a technology, it is a support asset [Inference, Medium] |
| Strategic relevance | 2/5 | Support asset for the FrankenTUI kernel; the static-forensics pattern has reuse value for evidence publishing across the suite [Inference, Medium] |
| Impact potential | 2/5 | Adoption funnel for one kernel; no standalone product value — nobody adopts a marketing site [Inference, Medium] |
| Implementation feasibility | 5/5 | Already implemented and deployed [Verified, High] |
| Time to mainstream | 5/5 | Live now; nothing pending [Verified, High] |
| Collaboration potential | 1/5 | No contributions accepted, custom restrictive rider, bus factor 1, site-specific code [Code-verified + External, High] |

**Ring: Monitor** [Inference, Medium]. The Rulebook's ring rule names websites for Monitor, and the factsheet agrees: nothing to pilot (no artifact to adopt), nothing to explore (no unproven technology — it is HTML that ships). Track it as the public face of the kernel — stale hero stats, demo resync cadence, and dataset freshness are leading indicators of kernel-project health — but the transferable value is the pattern (§4.10), not the site. No Rulebook amendment; v1.0 stands.

## 4.10 Wardley placement

Placing the *components*, not the repo:

- **The site as a marketing asset:** custom-built, in Product territory (deployed, serving visitors) — but its evolution is entirely tethered to the kernel; it has no independent roadmap. Moves right only if the kernel does; fossilizes if the kernel stalls [Inference, Medium].
- **The static-forensics pattern** (versioned dataset + provenance row + client-side sql.js/WASM querying + no backend): **custom-built, approaching early Product** — the genuinely transferable component. Already informally shared with `frankensim_website`/`frankensqlite_website` and factored out as `beads-for-frankentui`. Moves right if extracted as a documented template with a freshness contract (next step 5); stays copy-paste lore otherwise [Inference, Medium].
- **The interactive WASM demo:** reduces the kernel's trial cost toward commodity-adjacent experience — a visitor evaluates the kernel without a toolchain — even though the kernel itself is custom-built. Moves right with each resync; rots silently without CI; would move decisively right if next step 3 (signed manifest) made "this demo is that commit" checkable by the visitor rather than asserted by the host [Inference, Medium].
- **The hand-edited content layer** (`lib/content.ts` hero stats, comparison table): **custom-built, decaying** — decoupled from every source of truth it describes. This is the component the packet's drift findings are about; it moves left (toward chaos) by default, and moves right only if next step 1 (scripted stat derivation) is built [Inference, Medium].
- **The commodity substrate** (Next.js 16, React 19, Vercel, Tailwind): pure **Commodity** — the site buys all of this off the shelf and differentiates nowhere in it. It moves only if the maintainer migrates (the bun-only toolchain and the Vercel rewrites/headers config are the two mild lock-ins) [Inference, Medium].

## 4.11 Trajectory (12 / 24 / 60 months)

All horizons **[Inference]** — forecasts, not findings; confidence Low unless noted.

**12-month base case [Inference, Medium]:** continued maintenance of the demo and viewer surfaces; datasets stay intermittently stale; hero stats drift further from kernel reality (the next kernel version bump will make "V0.1.1" look older still). Stays in Monitor. The site remains a 200 OK fossil-in-progress.

**24-month base case [Inference, Low]:** either the canonical archive of the February 2026 five-day-sprint narrative (if the kernel matures, the site becomes its origin museum) or quiet abandonment alongside a stalled kernel. The static-forensics pattern likely outlives the site via the sibling repos.

**60-month base case [Inference, Low]:** an active project site for a matured kernel, or a historical artifact of the FrankenSuite marketing phase — the two absorbing states, with the latter more probable on bus-factor-1 priors.

**Bifurcation — what the upside requires:** (a) hero stats derived from sources of truth at sync time (next step 1); (b) "as of" provenance labels on the forensic pages (next step 2); (c) CI gating the Playwright suites so demo resyncs can't silently break (the missing enforcement layer); (d) the 60 fps claim measured or demoted (next step 4). None requires the kernel to change — this is all site-side hygiene, which is why it's achievable [Inference, Medium].

**Bifurcation — what decay looks like:** the demo pin ages past the kernel's WASM ABI, the resync stops, frankentui.com keeps returning 200 with a demo that no longer boots — and nothing alerts anyone, because there is no CI and no uptime check on demo health. Decay is silent by construction [Inference, Medium].

**Revisit triggers (observable, falsifiable):**

1. **Hero stats re-derived from sources of truth** — `lib/content.ts` stats generated by script from kernel `Cargo.toml` + crates.io API. Flips the drift inventory.
2. **CI appears** — a `.github/workflows` directory gating Playwright on push. Flips the "demo can break silently" judgment.
3. **Datasets re-synced with "as of" labels** — `export_meta.generated_at` newer than 2026-02-04 rendered on the page. Flips the fossil finding.
4. **The 60 fps claim measured or reworded** — a committed perf procedure or the stat demoted to target. Flips the aspirational flagship.
5. **Second maintainer or contributions accepted** — bus factor > 1. Flips succession risk (unlikely given the stated policy).
6. **frankentui.com stops resolving or the demo 404s** — re-ring to retired artifact; the site becomes a monument.
7. **Kernel archived or deleted** — the site's reason to exist evaporates; re-assess as pure historical artifact.

## 4.12 Limitations and open questions (mandatory)

**What was not done:** `bun install`/build/serve were not run (so TypeScript strictness, ESLint, and the Playwright suites are unexecuted — greenness unestablished); the 60 fps claim was not instrumented (no frame-budget trace exists to audit); the tweet-wall's embedded references were not individually re-verified; the kernel-side "19 crates / ~620K LOC" figure from the February analysis was not re-derived (kernel HEAD workspace membership was read live: 20 members); only the first 200 bytes of the vendored `viewer.js` were diffed against the sibling repo.

**Open questions that would most change the verdict, in order of load-bearing weight:**

1. **Do the Playwright suites pass at the pin?** Existence verified, greenness unknown — a green run would blunt weakness 2; a red run would confirm the site ships untested.
2. **Does the WASM demo actually render at 60 fps in Chrome/Edge?** The flagship stat is unmeasured; instrumentation would falsify or confirm it in an afternoon.
3. **Will the disabled `/war-stories` route return?** Its files are kept deliberately — a content decision that would change the route inventory.
4. **Is there any independent coverage of the site or its pattern?** None found [External, High within recall caveats] — one writeup of the static-forensics pattern would move strategic relevance.
5. **Does the rider's "analyzing" bar cover agent-assisted evaluation of this packet's own production?** A legal question, out of scope — recorded, not answered.

---

## Deepening questions — Rulebook §5's binding eight, one paragraph each

**1. Provenance.** The repo's provenance machinery is the demo manifest: `public/web/version.json` binds the served demo to `frankentui_git_sha` `20d095200584f0f5d3d3679e95f76087ca1730c8` with `synced_at` 2026-09-18, `source_inputs_sha256`, `runner_lock_sha256`, a per-file sha256 file list, and a 209-line `evidence.jsonl` [Code-verified, High] — plus the sqlite `export_meta` row (`generated_at` 2026-02-04) and the spec dataset's `generated_at` (2026-02-08) [Code-verified, High]. That is provenance-of-*inputs*, and it is good; what is missing is provenance-of-*integrity*: nothing signs the manifest, so a visitor cannot verify "this demo is that commit" without trusting the host, and the forensic pages don't surface their own `generated_at` to the visitor at all. Portable attestation would need the manifest signed at resync (next step 3) and the provenance rows rendered on-page (next step 2) — both cheap, both absent [Inference, Medium].

**2. The embeddable unit.** The smallest useful piece adoptable without the whole repo is the beads viewer as vendored: `public/beads-viewer/` — `index.html` (305 KB), `viewer.js`, `styles.css`, `wasm_loader.js`, `hybrid_scorer.js`, the `chunks/` and `vendor/` dirs — a fully static, no-backend issue-graph dashboard that only needs a `beads.sqlite3` in the expected schema swapped in [Code-verified, High]. Caveat the packet must state honestly: no schema document exists in-repo (`beads.sqlite3.config.json` is a chunk-delivery manifest, not a schema) — an adopter reverse-engineers the schema from the sqlite file or the 116 KB `viewer.js`, which is the adoption cost [Code-verified, High]. Adoption cost: copy the directory, regenerate the sqlite from your own bead export, and accept the February-frozen query UI as-is; the viewer code itself is maintained in `beads-for-frankentui` (pushed 2026-09-21), so the sane adoption path is vendoring from there via the same `fetch_assets.ts` mechanism rather than forking this repo's copy [Inference, Medium]. The spec-evolution lab (`spec-evolution-lab.tsx`, 3,833 lines) is the second candidate, but it is React/Next-coupled, not static — costlier by an order of magnitude [Inference, Medium].

**3. Unexercised option value.** Three held capabilities. First, the Playwright suite's performance assertions (`spec-evolution-perf.spec.ts`) are an unbuilt perf gate: the harness exists, the flagship stat (60 fps) is unmeasured, and there is no CI to run it in — wiring the existing tests into any scheduler would convert the site's weakest claim into its most auditable one [Code-verified existence, High; the unlock is Inference, Medium]. Second, the `evidence.jsonl` in the demo payload (209 lines) is currently write-only provenance — no page reads it, no UI surfaces it; it could become the demo's on-page "build receipt" with zero new data collection [Code-verified, High]. Third, the spec-evolution lab's diff/compare engine (timeline, search, compare views over 31 versioned spec commits) is a general purpose spec-forensics instrument currently pointed at exactly one dataset; pointing it at the kernel's own CHANGELOG or at a second project's spec history would test whether the lab is a tool or a trophy [Inference, Medium].

**4. Benchmark honesty.** No number on this site would survive an independent rerun as a *result*, because no number on this site was produced by a *procedure* — the hero stats are hand-edited strings in `lib/content.ts`, not computed values [Code-verified, High]. The load-bearing question for the site's thesis is not whether the numbers are right (marketing numbers are never load-bearing) but whether the *verifiable* surfaces stay honest: the demo pin (currently 4 days fresh — the site's most honest number), the dataset provenance rows (currently 7 months stale and unlabeled — the least honest), and the Playwright suites (existence verified, greenness unknown). An independent rerun of "does the demo boot at the pinned SHA" is the one measurement that would actually test the site's core claim — "the real kernel, running in your browser" — and it has never been run outside the maintainer's machine [Inference, Medium].

**5. The governance path.** There is no credible route from one maintainer to an institution on the current policy: contributions are refused by explicit policy, the rider shrinks the evaluator pool, and bus factor is 1 with no succession document [Code-verified + External, High]. The realistic "governance path" for a marketing site is narrower than for a kernel — it doesn't need a foundation, it needs a *freshness contract*: scripted stat derivation, CI-gated E2E, labeled dataset vintages (next steps 1–2, trigger list in §4.11). What breaks first if velocity decays is already visible: the docs rotted first (`AGENTS.md` template, March CHANGELOG), the datasets second (February), the hero stats third (February-era); the demo sync is the last surface still tended, and it is four days fresh at the pin [Inference, Medium]. If the maintainer context-switches, the site doesn't collapse — it fossilizes at 200 OK, which for a brochure is the more dangerous failure mode because nothing alerts anyone.

**6. The license as strategy.** The rider excludes exactly: OpenAI, L.L.C.; Anthropic, PBC; their affiliates (>50% voting control); and anyone "acting directly or indirectly on behalf of, for the benefit of, or under the direction of" them — barring "use" defined to include "benchmarking, testing, analyzing, indexing" and ML-training incorporation, with automatic termination on breach [Code-verified (license text), High]. On a kernel repo this exclusion at least gestures at a strategy (deny training-data value to rival labs); on a marketing site it is strategy-free cost: there is no training-data value in a brochure, no contributor pool to protect (contributions are refused anyway), and the practical effect is to bar AI-assisted evaluators from analyzing the project's public face while the project's own contribution policy routes submissions through "Claude or Codex" review — the maintainer's agents may read the code, but a lab's may not. It serves the suite-wide posture of uniformity, and sabotages nothing material, precisely because the asset is immaterial — which is the packet's point: the rider here is boilerplate, and boilerplate on legal terms is a governance smell [Inference, Medium].

**7. Agent-era fit.** The concrete agent workload that would pick this site over the incumbent (reading the kernel README, or cloning the repo) is *evaluation without a toolchain*: an agent asked "is FrankenTUI real?" can load `/web` and drive the actual WASM kernel, query 1,168 historical issues in `/beads` without touching sqlite, and diff 31 spec commits in the evolution lab — a full due-diligence pass with zero installs [Inference, Medium]. What would have to become true first: the datasets need "as of" labels (an agent that can't see the February vintage will misreport the issue graph as current — a concrete, foreseeable agent failure mode), the demo pin needs a health signal (an agent can't distinguish "demo broken" from "kernel broken" today), and the 60 fps claim needs a procedure or a demotion (agents quote hero stats credulously). The irony the packet keeps: the site is arguably the most agent-consumable artifact in the FrankenSuite, published under a rider that bars agents acting for the two leading labs from analyzing it [Inference, Medium].

**8. The kill test.** The single event that would falsify the site's core thesis — "this is the live public face of a real, maintained kernel" — is the demo failing to boot: if the WASM payload at the pinned SHA stops loading in current Chrome/Edge (a kernel-side ABI change, a toolchain drift, a Vercel static-serving change) and frankentui.com keeps serving it with no alert, the site's central claim ("the actual kernel, compiled and running natively," per the showcase kicker [Code-verified, High]) becomes false while every status page stays green [Inference, Medium]. The test is executable today: boot `/web`, drive the terminal, record the frame budget — which is also next step 4. Secondary falsifiers: the kernel repo archived (the site becomes a monument — trigger 7), or an independent party demonstrating the hero stats were never re-derived since February (already demonstrated in this packet's claim inventory — the kill test for the site's *credibility*, as distinct from its functionality, has arguably already fired).
