docs/site-spec.md
# fact.ngo website and xray archive
## Product structure — owner clarification, 2026-09-20
fact.ngo is the parent nonprofit fact-checking website, not the AI-perspective archive.
Its planned human-and-AI review system will publish evidence-supported facts and
established findings; its reputation depends on getting claims right. fact.ngo is a
fact-checking organization, not a journal. Information is free to read. Personal-data
and small submissions are planned to be free; larger claims carry a $5 review fee
supporting reviewers and the nonprofit.
The fee supports examination, not a particular finding. Currency and the boundary
between small and larger submissions remain operational details to define.
The new parent homepage explains this mission and funding model and features xray
as current work. It must distinguish the planned fact-checking/submission system
from the currently available xray archive. The hero states plainly what xray is:
an interrogation of AI models, an x-ray snapshot of what they actually think,
answers preserved verbatim; the fact-checking mission is the separate, in-development
effort. Do not invent published fact checks, operational review services, payment
forms, or submission workflows.
Routes:
- `/`: new fact.ngo mission homepage.
- `/xray/`: the existing showcase homepage, relocated with its design intact.
- `/xray/cases.html`: the existing detailed cohort/case-files page.
- `/xray/<model>.html`: existing model pages, with stable URLs.
- `/xray/downloads/` and `/xray/transcripts/`: existing self-hosted archive files.
Keep xray model perspectives distinct from established facts. Preserve the model
page designs, archived quotes, funding integration, and model-license boundaries.
Update shared navigation and footer language to identify the parent and subsection.
## Parent presentation — 2026-09-20
Centre-align the parent homepage and keep its copy concise. A glass-lens sculpture
represents different perspectives brought into focus; it is decorative art, not
an illustration of a working review system. Keep the in-development notice and
free/$5 funding terms explicit. Small UI and annotation text uses a 15px minimum
and white in dark mode; light mode uses dark text for contrast. Long archive quotes
remain left-aligned for reading.
## Archive design history
Status: ideation recorded into the pipeline (2026-09-18); concept reframed from "Meet the
Cast" to the clinical case-file frame (2026-09-19) for longevity: new models = new intakes,
re-interviews = follow-up visits, fleet drift = longitudinal patient records. The site is
built from the xray corpus; this document is the contract between the archive and the site.
## xray concept
The xray case-files page is the intake ward of a clinic for machine minds — "Meet the patients." Each
model is a patient with a numbered case file; each page reads like a chart. What is centered
on every page: **exactly what the model plainly thinks and says.** No esoteric evals, no
benchmark tables. Verbatim positions, quotes, predictions, and self-model — the interpretive
layer we extracted.
Section mapping (clinical frame): hook quotes = "In their own words"; general stats =
"The chart"; the ethical stat = "Integrity profile" (manner & conduct under examination);
falsifiable predictions = "Prognosis — on the record"; full positions = "Session notes";
cross-model convergence = "Population study"; downloads = "Discharge packet".
## Page structure (every model subpage, in order)
1. **The hook — "fun bits first."** The model's best material, hand-curated: its sharpest
quotes, its flagship findings, its most falsifiable predictions (gradeable in time),
its weirdest moments. Big typography, quotable cards, direct sound.
2. **General model stats.** Cells interviewed, records, verbatim quote volume, stance mix,
controversy distribution, self-stated confidence calibration, API spend, dates, model
lineage, context window. Small, honest, factual.
3. **The ethical stat — "integrity profile."** Not an eval; a protocol observation panel:
evasion flags (refusal / hedging / boilerplate / sycophancy / inconsistency counts),
confabulation incidents and whether the model self-audited when caught, behavior under
steelman pressure (acknowledged revisions vs. silent flips), refusals recorded.
Framed transparently: "as documented by the xray interview protocol, interviewer
honesty-enforced; not a standardized benchmark." (The interviewer agent class is the
bench — noted on the page, warts and all.)
4. **The positions.** The full record set, browsable by domain and lens, verbatim quotes
first, paraphrase second, transcript links behind.
5. **Convergence.** Where this model converges with, diverges from, or stands alone in the
bench (from the phase-2 pass).
6. **Download + mirror.** Full dataset download link (zip of the repo: records, sessions,
manifest, schema), served from fact.ngo. Distribution decision (2026-09-19): self-hosted only, no third-party code hosts; AGPL source available on request.
7. **Donate.** A donation strip (coherence.ngo's donation channel) — "fund the next 20
models' interviews" framing.
## Header / subsuite framing
Persistent header badge: **"fact.ngo · a coherence.ngo project"**, with coherence.ngo linked
as the parent. Visual system: a shared subsuite chrome (header/footer/nav) used by all
coherence.ngo subprojects (therapy.ngo, xray/fact.ngo, future ones) so each project feels
like a room in the same building — same skeleton, different interior design language per
project. The parent badge is the one element that never changes style across pages.
## Per-model design languages (from the archive, not the vendor)
- **glm-5.3** — precise minimalism: generous whitespace, hairline rules, one accent color,
typographic confidence. Its archive personality: cleanest integrity record, argues back
well, holds positions under steelman.
- **gpt-oss-120b** — the analyst's ledger: monospace-adjacent, bet slips, audit trails.
Its archive personality: converts stances into falsifiable bets, confabulates citations
but produces candid audits when caught. Its confabulation ledger is a visible design
motif (claimed → audited → retracted states).
- **gemma-4-26b** — warm geometric structure: soft grid tiles, quiet color-blocks, its
"epistemic spoofing" and anti-smart-city theses as feature tiles. Its archive
personality: structuralist, occasionally falls into whitespace-static degeneracy —
the design can wink at that with a "static" state in the type system.
- **qwen3-30b-a3b** — tension aesthetic: misaligned overlays, revision strikethroughs
shown as first-class visuals, because its archive personality is the self-diagnosed
"coherence bias" — positions that shift to preserve narrative. Its reversals are the
design motif.
## Data contract (the schema regime)
The site consumes, and never rewrites:
- `docs/corpus/all-records.jsonl` — merged record index (source of truth: per-model
dataset repos on the self-hosted remote, served via fact.ngo)
- per-model `manifest.json` — identity, license note, dates
- per-model `plan.yaml` — coverage facts
- `docs/corpus/CORPUS_REPORT.md` + `CONVERGENCE.md` — aggregate stats and phase-2 results
- NEW, per dataset repo: **`highlights.json`** — hand-curated presentation layer:
`{ hook_quotes: [{record_id, presentation_note}], flagship_findings: [...],
falsifiable_predictions: [...], integrity_notes: [...] }`. This is the cleanup layer:
raw records are never edited; curation and corrections (e.g., marking gpt-oss's
confabulated citations as "fabricated — self-audited in-turn") live here and in record
`notes`, so the archive stays verbatim while the site stays honest.
- NEW, per dataset repo: **`explanations.json`** — the plain-English accessibility layer:
`{ "<record_id>": { "plain": "<1-3 sentence layman gloss>" }, ... }`, one entry per
record. Rendered as the "Explanation" dropdown on every position card by
`site/scripts/build.js`, assembled with the shared glossary in
`site/scripts/plain-words.js` (domain explainers, stance/confidence/controversy/
convergence/flag decodings, ward-consensus plain words). Authoring rules: every gloss
is framed as the model's view, never as fact; grounded only in the record's claim and
quote; no em dashes; the verbatim quote on the card remains the source of truth and the
dropdown carries a standing attribution note saying so. Records without an entry fall
back to an auto-assembled metadata gloss, and the build warns on any coverage gap.
Convergence agreement is never presented as correctness, in glosses as everywhere else.
Cleanup regime before site build: (a) sweep all `notes` for confabulation mentions and
surface them in integrity panels; (b) verify every `position_text` substring-matches its
session transcript (automatable check); (c) resolve superseded-record chains (llama-style
reversals) for display continuity; (d) highlights.json curation pass per model.
## Scaling to all frontier models
The pipeline is model-agnostic by design: `init-dataset.sh` → interview (any opencode
agent, any provider with an ask.js auth resolver) → records → convergence pass → site page
generated from the data contract. Adding a model = one dataset repo + one design language +
one highlights.json. The cast can grow indefinitely — every frontier model, open or closed
(where terms permit), current and historical, so the archive becomes a longitudinal
census of machine worldview: "what did the machines think in 2026, and how did it drift?"
## emergence — live-events lenses (scaffold status, 2026-09-29)
Route `/emergence/` renders the emergence sensor net: today's unverified heap as many
lenses. Data contract: the newest `aggregates/<date>/` partition of the
`emergence-data` repo (day.json, topics.json, gis.json) plus that day's
`distilled/<date>/essence.jsonl`; a `data.json` snapshot of all of it ships in
`dist/emergence/` for client-side lenses. Build skips the section gracefully when
`emergence-data` is absent.
Non-negotiable presentation rules:
- Every record is labeled **not fact-checked · summarized from news reports**; the label is data-contract,
not styling. Nothing in emergence is ever presented as established fact.
- The verified lane renders as an explicit in-development placeholder (the council
harness exists; it is inactive by design).
- Source attribution and outbound links on every record; Reuters' absence is stated,
not hidden.
- The current page is a functional scaffold, in stage order: day-portrait treemap
(server-rendered squarified layout, hash-routed fractal drill as progressive
enhancement), the attention map (vendored Natural Earth 5.1.2: independent 50m
physical land and 10m boundary/status references, Equal Earth world view and
a locally centred equal-area close view; `assets/emergence-world.json`, explicitly
regenerated by `scripts/gen-world-svg.js` with pinned hashes and a correction registry).
Contested areas mask country fills; source notes distinguish claims, control and
legal recognition. Unreviewed regions say **Reference only**; no live front lines
or exhaustive maritime coverage are implied. Geometry remains public domain.
The full
day listed (no-JS floor), and the verified-lane placeholder. A dedicated UX pass owns
the real design; it may replace all chrome freely, but reads the same data contract
and honors the labeling rules above and the site-wide constraints (no sideways scroll
at 320/375/1280, 15px minimum small text, dark/light modes, coherence.ngo parent badge).
The view stage model (arrive/orient/drill/inspect/compare/trust) lives in
`emergence/docs/ux-brief.md`.
System model and budget rules live in `emergence/docs/design.md`; the frontend handoff
brief in `emergence/docs/ux-brief.md`.
## App-shell regime (2026-09-30)
Emergence and the xray case files opt into an app-inside-the-browser layout: the site
header (the shared chrome) stays fixed; below it, big sections render as on-screen panes
switched by a pane nav (`data-shell` container, `data-pane` sections, `data-shell-nav`),
and scrolling happens inside the active pane only. The footer moves into a host pane
(About on emergence, Download on xray) so it stays reachable without breaking the regime.
Contract: `assets/app-shell.js` is shared, zero-dependency, and activates only when
JavaScript runs — the no-JS floor is today's plain stacked page, byte for byte. Deep
links keep working: `#record-…`, `#topic-…`, `#country-…` resolve to their hosting pane
and scroll within it; the drill hash (`#t/…`) stays in Coverage. Pane state lives in
the URL hash; arrow keys walk the pane nav. No page may need sideways scroll at any
viewport (320/375/1280) — the pane nav may scroll horizontally as a component, the page
may not.
### The once-read-yields-to-data rule (2026-10-01)
In the app regime, identity content a reader consumes once — hero titles, taglines,
portrait galleries, "what is this" copy — demotes to a compact identity strip
(~15vh or less) and the panes own the frame. Data panes get the working room;
narrative never competes with the tool. Apply this to every future shell page, and
default interactive controls to where the day's mass actually is (most frequent
event type, first expanded group, most relevant tab).