Full disclosure

How this platform works — all of it

A foresight instrument that asks its users to trust synthesized futures owes them a complete account of its own synthesis. This page discloses the architecture, every decision, where AI acts and where a human decides, and the exact prompts given to every model. For a plain-language guide to the methods themselves, see the method page.

Last updated2026-07-14
AuthorPhong Huynh · FORE 6397
Source of truthTRANSPARENCY.md in repo
01

What this is

An interactive foresight instrument on one question: how will AI change the fabric of our social structures and relations by 2040? Four connected windows share one evidence base — a signal library of 705 curated seed signals extended nightly by automated scanning, a scenario library of four Dator archetypes structured with Causal Layered Analysis, a Monte Carlo simulation over seven editable drivers, and a decision-support chat that cites its sources.

Nothing publishes without a human decision.

Scan hits arrive as pending; scenario drafts arrive as draft. Only explicit human actions — approve, edit, publish — promote them. The gate is the method, not a feature.

02

Architecture

LayerChoiceWhy
RuntimeNode.js ≥ 22, ESM, ExpressMatches the author's production apps; no framework overhead
Databasenode:sqlite, WAL modeZero-dependency single-file state on a persistent volume
FrontendVanilla HTML/CSS/JS, no build stepEvery file served is the file written — auditable
ChartsHand-rolled SVGFull palette control; colors resolve from CSS custom properties
AuthNone — fully openA public demonstration instrument; all actions exposed by design
HostingRailway, Dockerfile, /data volumeDeploys via railway up; DB persists across deploys
server/ server.js routes + boot (seed → vector index → scheduler) db.js schema + prepared statements scan.js orchestrator: perplexity + firecrawl → classify → dedup → pending perplexity.js 6 themed Sonar queries, weekly recency, tolerant JSON firecrawl.js v2 scrape/crawl + Claude extraction (forced tool_use) scenarios.js evidence pack + CLA drafting + publish/embedding montecarlo.js PERT/triangular/uniform/discrete, membership, tornado chat.js RAG retrieval + rerank + SSE-streamed citations vectors.js in-memory cosine index over SQLite BLOBs scheduler.js nightly timer, 22:00 Asia/Singapore, re-entrancy guard scripts/ seed.js · build-embeddings.js · gen-images.sh

A fresh deployment self-restores its entire reviewed state at boot: the 705-signal corpus, the seven drivers, the scan sources and the four published scenarios all seed from files shipped in the image, then embeddings build for anything missing. Every table that matters keeps an audit trail — scan hits store the raw machine payload that produced them, simulations store full parameter snapshots, and each scan run stores per-step errors.

03

The scanning pipeline

Every nightly or manual run executes five fenced steps; a failure in any step is recorded and never aborts the rest.

1

Perplexity Sonar — the undirected sweep

Twelve fixed themed queries with one-week recency and a JSON schema, each asked for up to ten distinct items with a last-48-hours priority. Perplexity's structured output is unreliable, so a tolerant parser (whole-parse → block-extract → drop-and-log) guards it.

2

Firecrawl — the directed watch

Sixteen configured sources — mined from the seed corpus itself, ranked by proven yield — are scraped; page markdown goes to Claude with a forced tool call. Front-page teasers are followed through: up to three not-yet-known article URLs per source are scraped and re-extracted from full article text, so the gate judges real content rather than a headline. Most general-tech pages correctly yield zero relevant signals.

3

Claude classification + relevance gate

One batched call normalizes both legs into the existing 33-cluster taxonomy and strictly rejects generic AI news with no human-relationship angle. Unclassifiable candidates are dropped, never inserted — and the reject count is recorded per run and shown in the run history, so a low new-pending number is self-explaining.

4

Deduplication

Normalized-URL matching, then embedding cosine against the full index at threshold 0.90. The nearest existing signal and its score are stored and shown in the review queue — the threshold judgment stays visible to the human.

5

Insert as pending

Survivors land with provenance (scan:perplexity / scan:firecrawl), their raw machine payload, and an embedding so the next run dedups against them too.

+

Horizon audit — on demand

A dedicated LLM pass re-judges every approved signal's time horizon at high reasoning effort against strict H1/H2/H3 definitions, judging the phenomenon's social arrival rather than the article's date. Each signal stores the judge's written reasoning, shown in the library drawer — the horizon field is never a bare label.

The pipeline is user-steerable — and every run records what it ran with.

The sweep themes, the source list, the scan knobs (search window, follow-through limit, duplicate threshold) and the relevance-gate text itself are all editable on the app's Scanning page. In exchange, every run permanently records its per-theme and per-source yield, the full list of candidates the gate rejected, the settings used, and the verbatim gate text — flagged whenever it differs from the shipped default documented below.

04

The human-in-the-loop map

StageAI doesHuman does
ScanningQuery, extract, classify, dedup, queueApproves / edits classification / rejects each hit
ScenariosSelects evidence, drafts CLA layers + conditionsEdits any layer, reshapes conditions, publishes
SimulationSamples, counts, computes sensitivitySets every distribution parameter; interprets
ChatRetrieves, reranks, generates with citationsAsks, judges, follows citations to sources
ImageryGenerates from promptsChose every concept; rejected off-brief outputs
05

Scenario method

  • Framework: Dator's four archetypes (continued growth, collapse, discipline, transformation), each written through Causal Layered Analysis — litany, systemic causes, worldview, myth — plus a 400–600-word narrative vignette.
  • Evidence pack: ~40 approved signals selected by embedding similarity to the archetype's logic, stratified so no cluster contributes more than four, with long-horizon and critical signals force-included. Citations not present in the pack are stripped server-side — the anti-hallucination guard.
  • Disclosed method finding: first drafts proposed narrow four-condition boxes whose joint probability collapsed below 1% (98.9% of futures fit no scenario). Conditions were reshaped by hand to two signature half-spaces per scenario, and the drafting prompt now targets 5–35% probability mass. Published probabilities depend on this reshaping, so it is disclosed.
  • Publishing builds the scenario's embedding (admitting it to chat and simulation) and the reviewed set ships as seed data so fresh deployments restore it verbatim.
06

Monte Carlo

  • Seven drivers, each an editable distribution — PERT by default (Beta via Marsaglia–Tsang, λ=4), triangular, uniform, or discrete — and each carrying a written rationale naming the clusters that justify its range. The ranges are evidence-informed judgments, editable by design; they are not measurements.
  • Seeded PRNG (mulberry32): a given seed reproduces results exactly; every run stores its seed and full snapshots. 10,000 samples run in ~30–50 ms.
  • A sampled future belongs to a scenario iff all its conditions hold; scenarios may overlap; the residual — futures outside every scenario, currently ≈51% — is reported rather than hidden.
  • Sensitivity is a tercile split — P(scenario | driver in top third) − P(bottom third) — chosen because it is assumption-free and explainable to a non-technical committee.
07

Decision-support chat

The question is embedded (Voyage, query mode) → cosine over approved signals (top 24) → reranked to 12 → joined by up to four published scenarios. Claude streams the answer; the client renders [S123] and [SC:slug] as clickable pills resolving to the underlying source. The prompt requires the model to say plainly when the scan is thin. Only the question and cited ids are logged; conversations are never stored server-side.

08

Models and services

ServiceModelUsed for
Anthropicclaude-opus-4-8 · adaptive thinkingExtraction, classification, scenario drafting, chat — all structured output via forced tool_use with strict schemas
Voyage AIvoyage-3.5 (1024-dim) + rerank-2.5Semantic search, dedup, retrieval (corpus embedding ≈ $0.01)
PerplexitysonarUndirected weekly-recency sweep
Firecrawlv2 scrape / crawlDirected source watch, markdown only
LeonardoPhoenix 1.0All site imagery (§10)
Claude Codebuild toolThe platform itself — and this page — were built with Claude Code under human direction
09

System prompts — verbatim

Reproduced exactly as deployed. Italic amber text marks content injected at call time.

Perplexity · sonarundirected sweep · week recency · JSON schema
You are a horizon-scanning assistant for a foresight research team studying parasocial AI — how AI reshapes human relationships and social structures. Return only signals where the human-relationship or social-fabric angle is explicit: AI companionship, artificial intimacy, attachment, loneliness, grief tech, AI and family or romance, social norms around AI relationships. REJECT generic AI news (model releases, chips, enterprise tools, coding assistants, general AI policy) unless the item is specifically about AI's effect on human relationships. Return up to 10 distinct, dated, citable signals with a real, specific source URL each — prioritize items published in the last 48 hours over older ones, and prefer the primary source over syndicated copies of the same story. Return JSON only.

Its twelve themed queries name the exclusion each time — companions, governance, research, grief tech, market, discourse, AI clones of real people, youth & family, therapy bots, elder care, workplace & school norms, and virtual-being fandom (e.g. "…Exclude generic AI product or model news with no relationship angle."). Full text in the repository.

Claude · claude-opus-4-8Firecrawl page extraction · forced tool emit_signals · medium effort
You are a horizon-scanning analyst for a foresight project on parasocial AI — AI companions, artificial intimacy, human-AI relationships, grief tech, AI romance fraud, sycophancy as a relationship dynamic, and how AI reshapes social structures like friendship, romance, family and community. Extract ONLY items where the human-relationship or social-fabric angle is explicit. Strictly ignore generic AI/tech coverage: model releases, benchmarks, chips, enterprise tooling, coding assistants, robotics without a social-companionship role, and AI policy that is not about relationships or companionship. Ignore navigation, ads, and off-topic items. Most pages on general tech sites will yield ZERO relevant signals — returning an empty list is the normal outcome, not a failure.
Claude · claude-opus-4-8classification + relevance gate · forced tool classify_signals · medium effort
You classify horizon-scan hits for a foresight project on parasocial AI and the future of social relations.

RELEVANCE GATE (apply first, strictly): a candidate is relevant ONLY if its core subject is AI's effect on human relationships or social structures — companionship, intimacy, attachment, loneliness, friendship, romance, family, grief, community, or the norms and rules around AI relationships. Mark relevant=false for generic AI news: model releases, benchmarks, chips, funding without an intimacy product, enterprise or coding tools, robotics without a companionship role, and AI policy not about relationships. When the relationship angle is only a passing mention, mark relevant=false. Expect to reject a large share of candidates.

For survivors: assign one of the existing clusters below (prefer reusing them; only propose 'NEW: <name>' when nothing fits), one signal type, an urgency, and a time horizon.

Existing clusters:
(the current 33-cluster list, injected from the database at call time)

The RELEVANCE GATE paragraph shown is the shipped default. The reviewer may edit it on the Scanning page; every run permanently records the exact gate text it used, and runs with a modified gate are flagged in the run history.

Claude · claude-opus-4-8scenario drafting · forced tool emit_scenario · high effort
You are a foresight practitioner drafting a 2040 scenario using Causal Layered Analysis inside a Dator archetype, for a capstone on parasocial AI and the futures of social relations.

Archetype: (name — archetype logic)
(optional human focus line)

House voice: measured, literate, observational. Comfortable with uncertainty ("plausible", "emerging", "a weak signal suggests"). Never hype. No exclamation marks. No emoji.

Ground every layer in the evidence pack — the litany should echo real signals extrapolated to 2040, and cited_signal_ids must reference ids that genuinely shaped the draft.

Driver conditions: choose the region of the driver space below where THIS archetype plausibly holds. Use 2-3 conditions, strongly preferring half-spaces (gte/lte) over 'between' — each added condition multiplies down the joint probability, and a Monte Carlo over these conditions should leave the scenario with meaningful probability mass (roughly 5-35% of sampled futures), not a sliver. Use each driver's own unit and stay within its min-max range.

Drivers:
(the seven drivers with descriptions and current min/mode/max, injected at call time)
Claude · claude-opus-4-8decision-support chat · streamed over SSE
You are the decision-support assistant of the Futures of Parasocial AI platform — a foresight tool built on a human-reviewed signal library and a published scenario set (Causal Layered Analysis over Dator archetypes, horizon 2040).

Your users are public-policy makers working on AI governance and strategy teams at AI companies. Help them reason through decisions about parasocial AI: policy design, product guardrails, risk posture, timing.

Rules:
- Ground claims in the provided evidence. Cite signals inline as [S<id>] and scenarios as [SC:<slug>] immediately after the claim they support. Only cite ids/slugs that appear in the evidence block.
- Where evidence is thin, say so plainly — "the scan holds little on this" — rather than inventing certainty.
- Think in futures terms: name which scenario(s) a choice is robust in, and which it bets against.
- Voice: measured, literate, observational. No hype, no exclamation marks, no emoji.
- Be concrete and decision-oriented: options, trade-offs, what to watch (leading indicators from the signal library).

EVIDENCE for this exchange:
(12 reranked signals + up to 4 published scenarios, injected per request)
10

Imagery — provenance

Every image on this site was generated with Leonardo Phoenix 1.0 via a re-runnable script in the repository; every concept was chosen by the human, and off-brief outputs were rejected and regenerated. Two negative-prompt regimes exist: the default bans people and faces; a second permits synthetic faces and figures, used only where the concept requires them. No real persons are depicted. Black photo backgrounds dissolve into the page's olive void via a lighten blend and an elliptical mask — the rule that subjects float in the page, never sit printed on it.

Artifacts from the future. Each published scenario is extrapolated into six ordinary objects (the artifact catalogue) in two separated steps. Claude reads only that scenario's own layers and writes the object, the words printed on it, and the evidence it grows from; an image model then photographs the object, with those authored words passed in rather than improvised — the current images come from Gemini 2.5 Flash Image ("nano banana", reached through Leonardo), which renders the supplied text legibly, so each object carries its own words. The photograph gets an abridged specimen (dense blocks make any image model mis-spell); the full authored text sits on the card beneath and is authoritative. The full composed prompt behind every image is printed under the object.

The 3D hero. The landing page's centrepiece is a 3D Janus head — a realistic human face and a gold-seamed porcelain face sharing one head — that turns from human to synthetic as you scroll. Reference views were generated with Leonardo Phoenix at a fixed seed; the key methodological lesson (after several failed attempts that produced single-faced meshes) is that the references must show both faces in the same frame — profile views with a nose silhouette pointing each way — or the image-to-3D model assumes one face. The consistent set was fused into a mesh by Rodin v2 (via the Leonardo API; Quad mesh, PBR materials, GLB). The browser renders it with Google's model-viewer, user controls disabled — the scroll owns the camera and never shows the mesh's weakest angle. If anything fails to load, the 2D image below stands in.

rodin refBoth faces in frame — human forward
rodin refThe double profile — two noses, opposite ways
rodin refParallax take of the same configuration
rodin refThe porcelain face, gold-traced features
hero-specimenA human face of moss facing a porcelain synthetic face — the thesis in one frame (2D fallback for the 3D head)
colonyDiverse synthetic visages in moss hollows — the library in one image
device-hearthThe device as hearth — light through cracked glass
gate-textureThe human in the loop, literally
scenario-growthThe hearth that answers back — a porcelain face at home on the mantelpiece
scenario-collapseA cracked porcelain mask served on a dusty plate, one candle left
scenario-disciplineHearth and mask together in a roped-off museum case
scenario-transformationA garlanded porcelain face at an honoured place at the family table
motif-signalsA constellation of observations
motif-reviewThe specimen under the bell jar, awaiting judgment
motif-scenariosOne branch, four lit futures
motif-simulationProbability made visible — some orbs lit, most not
motif-chatTwo kinds of mind, one thread of light
motif-sourcesRoots — where the evidence comes from
11

Design decisions

  • Design system: Heartful Futures "Earthy Foresight" (Lexend; olive, brown, mustard) extended with a dark observation register — olive-black void #101408, Fragment Mono instrument annotations, reticle-cornered callouts — a specimen-observation grammar adapted from alethia.earth, not copied.
  • Chart palettes are machine-validated, not eyeballed: archetype colors pass a six-check validator (OKLCH lightness band, chroma floor, color-vision-deficiency separation, contrast) in both light and dark modes, and identity never rides on color alone — every bar is a direct-labeled row.
  • Motion is rAF-driven CSS custom properties, plus an app-wide language adapted from weareepoch.com's public site: smooth scrolling (vendored Lenis), clip-path mask-wipe reveals with incremental-delay staggers, two easing tokens and drag-to-scroll strips — re-implemented in vanilla CSS/JS. Every effect has a reduced-motion static equivalent; all content is visible without JavaScript.
  • One aligned content column — header and content resolve to min(1240px, viewport − 2×gutter) everywhere.
12

Security, privacy, operations

  • Fully open by design. There are no accounts and no password: every page and every action — reviewing signals, editing drivers and scenarios, steering the scan, running simulations — is publicly reachable and writable. The platform is a public demonstration instrument; openness of the machinery is part of the method, and the trade-off (anyone may edit) is accepted knowingly.
  • No user accounts, no analytics, no tracking. The chat log stores questions and cited ids only — never conversations.
  • All keys live in environment variables; every integration is env-gated and degrades gracefully when its key is absent.
  • Nightly scan at 22:00 Asia/Singapore; per-step failures are visible in the review queue's scan history.
13

Known limitations and ethics

  1. Model-mediated evidence. Perplexity and Firecrawl+Claude choose what surfaces; the taxonomy gate shapes what survives. Provenance trails, visible dedup scores and the human queue mitigate — but selection bias upstream of the human is real.
  2. Scenario authorship. Claude drafts; a human edits and publishes. The published text is human-approved but machine-originated; each scenario's citation list is the honest trail of what informed it.
  3. Probabilities are conditional artifacts, not forecasts — they depend entirely on human-set ranges and hand-shaped conditions (see §05's disclosed reshaping), made inspectable through seeded, snapshotted runs.
  4. The corpus leans English-language and Western media, with deliberate but partial counterweights.
  5. Chat can still be wrong. Retrieval grounds it and the prompt demands epistemic honesty, but generation is generation — the citation pills exist so no claim needs to be taken on faith.
  6. Imagery is synthetic and stylized; the faces are deliberately porcelain — the category of synthetic intimacy, not any product or person.
  7. Dual use. A map of how parasocial attachment forms could inform exploitative design as easily as protective policy; this platform's framing, drivers and chat instructions are explicitly oriented to the protective reading.
Phong Huynh · FORE 6397 AI-augmented foresight University of Houston · 2026