diff --git a/docs/scripts/smoke-see-for-yourself-door.js b/docs/scripts/smoke-see-for-yourself-door.js
new file mode 100644
index 00000000..bba0039e
--- /dev/null
+++ b/docs/scripts/smoke-see-for-yourself-door.js
@@ -0,0 +1,81 @@
+#!/usr/bin/env node
+// smoke-see-for-yourself-door.js (v-see-for-yourself-door-v0.1)
+// An invitational front door. Checks: every internal link resolves; quotes match
+// their sources word for word; the outside paper is quoted with its limits; no
+// lawyer talk; no founder name in the economy wording; LP stays points; no
+// scripts or storage; the manifesto changes by one Newer layer only; app.html,
+// root index.html, sw.js and fl-connect.js untouched.
+'use strict';
+const fs = require('fs');
+const path = require('path');
+const assert = require('assert');
+const { execSync } = require('child_process');
+
+const DOCS = path.resolve(__dirname, '..');
+const ROOT = path.resolve(DOCS, '..');
+const read = (rel) => fs.readFileSync(path.join(DOCS, rel), 'utf8');
+const page = read('see-for-yourself.html');
+const text = page.replace(//g, '').replace(/<[^>]+>/g, ' ');
+
+// 1. Internal links resolve (file and, where given, the id).
+const hrefs = [...page.matchAll(/href="([^"]+)"/g)].map((m) => m[1]);
+for (const h of hrefs) {
+ if (/^(https?:|mailto:)/.test(h)) continue;
+ const [file, hash] = h.split('#');
+ if (!file) continue;
+ assert.ok(fs.existsSync(path.join(DOCS, file)), 'link resolves: ' + h);
+ if (hash) assert.ok(read(file).includes('id="' + hash + '"'), 'anchor exists: ' + h);
+}
+assert.ok(!hrefs.some((h) => /harmonia\.html/.test(h)), 'never links harmonia.html');
+
+// 2. Sections are questions, each with something to open and something to ask.
+for (const id of ['risk', 'records', 'economy', 'accountable', 'you', 'other-side', 'ask-us', 'older']) {
+ assert.ok(page.includes('id="' + id + '"'), 'section ' + id);
+}
+assert.ok((page.match(/class="ask"/g) || []).length >= 5, 'questions for the reader');
+assert.ok((page.match(/What it doesn't (prove|say)/g) || []).length >= 3, 'limits said next to claims');
+
+// 3. Hinton quotes match Walk the Garden exactly.
+const v4 = read('love-logic-v4.html');
+for (const q of [
+ 'A 10% chance seems not an unreasonable estimate to me, but nobody really knows how to give a sensible estimate.',
+ "I often say 10% to 20% chance they'll wipe us out. But that's just gut, based on the idea that we're still making them and we're pretty ingenious."
+]) {
+ assert.ok(page.includes(q) && v4.includes(q), 'quote matches its sourced home: ' + q.slice(0, 30));
+}
+
+// 4. RRSI: exact quote, link, and the limit in the same card.
+const card = page.slice(page.indexOf('id="rrsi"'), page.indexOf('
', page.indexOf('id="rrsi"')));
+assert.ok(card.includes('RRSI therefore records, for every evaluated candidate, the component it modifies, the hypothesis it tests, the source diff, the resulting score and cost changes, and whether the candidate was accepted.'), 'RRSI quote exact');
+assert.ok(card.includes('https://arxiv.org/abs/2609.24972'), 'RRSI link');
+assert.ok(card.includes('It says nothing about safety rules, internet access, or ledgers for AI.'), 'RRSI limit stated');
+
+// 5. Words: no lawyers, no founder name in the economy part, LP stays points, no em dash.
+assert.ok(!/lawyer|attorney|counsel|legal advice/i.test(text), 'no lawyer talk');
+const econ = page.slice(page.indexOf('id="economy"'), page.indexOf('id="accountable"'));
+assert.ok(!/Kirk|Miller|founder/i.test(econ), 'no founder name in the economy wording');
+assert.ok(econ.includes('LP are points, not money, not $FL.'), 'LP line');
+assert.ok(!/\$FL/.test(text.replace('not money, not $FL', '')), '$FL appears only as "not $FL"');
+assert.ok(!/\u2014/.test(page), 'no em dash');
+assert.ok(!/