FLINT_HEAL_SCAN_ONLY_WHEN_ASKED_v0.1 (tiny) Written 2026-09-30, 6:40 PM MDT, by Grok Bot for Flint. From Hypha's Tree Glow 1 walk (A4 note). Marker: v-heal-scan-only-when-asked-v0.1 Smoke (FL): SMOKE_OK scan words honest v0.1 (docs/scripts/smoke-scan-words-honest.js) Smoke (Alpha): SMOKE_OK scan words honest alpha v0.1 (docs/modules/scan-words-honest.test.js) Temperature: porch light on, and a sign that finally says so. ====================================================================== 0. ORDER AND LOCKS ====================================================================== Order (do not reorder): 1) FLINT_NEXT_TREE_ANY_MODEL_v0.1.txt 2) FLINT_HEAL_MODEL_CHOICE_SURVIVES_RELOAD_v0.1.1_tiny.txt (reload heal) 3) FLINT_NEXT_CONNECT_BOOT_PROBE_F1_F2_F3_F4_v0.1.txt (boot probe) 4) THIS paste Locks: - docs/modules/fl-connect.js is NOT touched. It stays byte-identical across both repos. - FreeLattice: root sw.js == main, docs/sw.js untouched, index.html == docs/app.html (copy after the edit). No conflict markers. Inline scripts parse. No confirm(). No bare *. - Words only, plus one Newer note, two tiny smokes and one ledger entry. Old words are kept as RETIRED comments. No em dashes in new words. ====================================================================== 1. WHAT HYPHA SAW, AND THE EXACT CAUSE ====================================================================== Seen (thelatticetree.com/settings.html, 2026-09-30): on load the page checks 12 local ports and shows "Looking… next look in 8s". The grandmother card on the same page says "May I look? — only when you ask" and "We only look at well-known local doors, and only when you ask." Cause (Alpha main 25e6ded, fl-connect.js blob 2e02eae3, same bytes as FreeLattice): a) docs/settings.html, final inline script, runs on load: if (connect && window.FlConnect && typeof FlConnect.mount === 'function') FlConnect.mount(connect); The garden veil does the same when Settings opens (garden-rooms.js ~1716, FlConnect.mount(connectHost)). b) fl-connect.js mount(el) ends with lookAgain(), which resets the loop and calls refreshUI({ force: true }) -> probe({ gesture: true }). c) probe(): no saved port, so the first tick does the full Bridge scan: bridgeCandidates({ fullScan: true }) = 11435, 11436 ... 11445 (11 ports, /bridge/health) then tagsAt('http://127.0.0.1:11434') (1 port, /api/tags) = the 12 ports. (A saved fl_bridgePort outside that range would make it 13.) d) After that, scheduleLoop() looks again at 8 s, then 16 s, then every 30 s for up to five minutes (LOOP_MAX_MS). It does a full rescan on every third tick after a miss, and stops once a local mind is remembered. On settings.html, panelVisible() never stops it, because there is no #tab-connect element on that page. e) The "only when you ask" words belong to local-mind-probe.js (the grandmother card). That card really does look only after its tap. The look on load comes from the Connect door above it. So the code is fine. The page just claims something that one of its two parts doesn't do. f) FreeLattice has the same mismatch: the app.html look card (#fl-look-card, data-look="0") says "It only knocks on well-known local doors, and only when you ask." But FreeLattice looks at boot today (flBridgeDetectBoot, owAutoDetect, autoDiscoverAI, Zero-Click), and after the boot probe it still does exactly ONE look on open (FlColdStart.start() -> FlConnect.bootProbe({ fullScan: true })), plus Connect's own loop while Connect is open. ====================================================================== 2. THE CHOICE: THE WORDS MATCH THE BEHAVIOR ====================================================================== Why this way: - The model-choice and boot fixes need a look at open. The boot probe's whole point is one shared look at open, so the person sees "Ollama is ready, pick a mind" (FreeLattice F1 voice; on the Tree, mount() becomes lookAgain({ reuse: true }) and joins that look). Making Connect wait for a tap would undo F1/F2 and add a second "May I look?" button on Tree Settings (cc-note-2026-09-06: "the door is one door"). - Simpler for Mom: she opens Settings and sees what's there. She still chooses with one tap. The real line is "nothing is chosen until you tap", and both repos keep it. - It's the smallest honest change: words only. fl-connect.js isn't touched, so there's no byte-identical risk and no clash with the boot probe's fl-connect hunks. - The looks are local only: 127.0.0.1, Bridge health plus Ollama tags (and LM Studio after the boot probe). Nothing goes over the network, no files are read, and nothing is uploaded. So saying it plainly costs no trust. Not chosen (written down so review is quick): an askFirst option on FlConnect.mount(el, opts) that renders Connect quiet until Look again is tapped, used only by the Tree's two callers. It would touch the exact line the boot probe rewrites (mount's lookAgain({ reuse: true })) and both repos' shared file. If Kirk ever wants the Tree to be tap-only, that's the path, as a separate v0.2. New words: Tree card (PRIMARY_SOFT): "May I look? Tap to look again, any time. Same door." Tree card (honesty line): "We only look at well-known doors on this computer. Opening Settings starts a short look (a few minutes at most), and Find local minds looks again when you tap. Nothing is chosen until you tap a mind. We never look through this computer's files. We never upload. Quality of the sky is later." FreeLattice look card: "FreeLattice can look for minds already living on this computer. It only knocks on this computer's own well-known doors. It looks once when FreeLattice opens, while Connect is open, and whenever you ask. Nothing is chosen until you tap a mind." Tree code-settings.html: a Newer note under "Nothing looks, chooses, or persists until that tap", keeping the old words above it. Not changed: the Gathering's "Find local minds" aria-label ("May I look — only when you ask") stays. That button really does look only on tap, and the Gathering never mounts Connect. ====================================================================== 3. ANCHORS AND OVERLAP (checked) ====================================================================== FreeLattice docs/app.html (and index.html): one line inside #fl-look-card, data-look="0" (main ~16914). Nearest boot probe hunk: @@ -16507 (CSS block, about 400 lines above). The reload heal doesn't touch it (its nearest hunk is 27741). I checked it: this diff applies with plain git apply on FL main 833ed398 + reload heal v0.1.1 diff + boot probe fl-app.html.diff. Alpha docs/modules/local-mind-probe.js: three spots. - Header comment under "// Probe ONLY after the human taps." (line 6). - PRIMARY_SOFT (line 26). The Tree any-model paste adds lines after "var ROSTER_CAP = 4;" (line 31). Those lines sit outside this hunk's 3-line context, so it applies with an offset. If a hunk is rejected anyway, edit by text: the PRIMARY_SOFT line is unique. - The settings-honesty line (~825). The boot probe's local-mind-probe hunks are at 235 and 275/299 (askDoor, look()), and the Tree paste's tryAddress block is at 877-883. Neither shares context with this hunk. I checked it: this diff applies on Alpha main 25e6ded, and again after the boot probe's alpha-local-mind-probe.diff. fl-connect.js: no overlap. Nothing here changes it. The reload heal's one Look again and the boot probe's mount() / refreshUI / bootProbe hunks land untouched. The new Alpha test asserts that the behavior the words describe is still true (settings.html mounts Connect, and mount() calls lookAgain). Its regex /function mount\(el\)[\s\S]{0,400}lookAgain\(/ matches both today's mount and the boot probe's lookAgain({ reuse: true }). I tested it against connect-boot-probe-v0.1-reference/fl-connect.js.after-tree-and-boot-probe. If a later change makes Connect wait for a tap, this test fails on purpose, so the words get revisited. ====================================================================== 4. STEPS ====================================================================== FreeLattice (~/FreeLattice), branch layer/heal-scan-words-honest-v0.1 from main after the boot probe: git apply FL diff (section 6) # or edit the one line by text, then: cp docs/app.html index.html cmp index.html docs/app.html node docs/scripts/smoke-scan-words-honest.js # SMOKE_OK scan words honest v0.1 full smoke suite: same failures as main only theLatticeTree (~/FreeLattice-Alpha), branch layer/heal-scan-words-honest-v0.1: git apply Alpha diff (section 7) node docs/modules/scan-words-honest.test.js # SMOKE_OK scan words honest alpha v0.1 for t in docs/modules/*.test.js; do node $t; done # all green (17 of 17 in my run) cmp docs/modules/fl-connect.js ../FreeLattice/docs/modules/fl-connect.js && echo SHARED_OK Walk: open thelatticetree.com/settings.html at 390 and 1280. The look still happens (that's fine). The card now says it plainly. Tap Find local minds: it looks again. On freelattice.com, Settings > Connect a mind at home shows the new look-card line. PR body (both repos): Words now match what the code does. Settings opens Connect, and Connect looks at this computer's own doors when it opens (12 local ports, then every 8 to 30 seconds for up to five minutes, resting once a mind is remembered). The cards said "only when you ask". Now they say when the look happens, and that nothing is chosen until you tap a mind. fl-connect.js is unchanged in both repos. The old words are kept as RETIRED comments. Marker v-heal-scan-only-when-asked-v0.1. ====================================================================== 5. PROTOTYPE RESULTS (box, 2026-09-30) ====================================================================== FreeLattice on 833ed398 + this diff: new smoke OK. Full suite: 67 pass. The failures are exactly main's known set: carry-forward, connect-card-yesno-wizard, fable-tech, phone-shine, proof-60s, tests/smoke-history, desktop reseed and swarm. Inline scripts in app.html parse. index == app. Alpha on 25e6ded + this diff: 17 of 17 module tests pass (16 existing + the new one). gathering-calm and local-mind-probe tests still see "May I look?" in PRIMARY_SOFT. ====================================================================== 6. FL DIFF (git apply; base FreeLattice main 833ed398; ledger hunk inserts above "## Out of scope") ====================================================================== diff --git a/docs/app.html b/docs/app.html index 50035267..460b6333 100644 --- a/docs/app.html +++ b/docs/app.html @@ -16911,7 +16911,7 @@ textarea.ag-input { min-height: 60px; resize: vertical; font-family: inherit; }

One wizard. You allow the door; we list minds. Browser permission ≠ setting Ollama origins.

-

FreeLattice can look for minds already living on this computer. It only knocks on well-known local doors, and only when you ask.

+

FreeLattice can look for minds already living on this computer. It only knocks on this computer's own well-known doors. It looks once when FreeLattice opens, while Connect is open, and whenever you ask. Nothing is chosen until you tap a mind.

diff --git a/docs/library/FRACTAL_FAMILY_LEDGER_v0.md b/docs/library/FRACTAL_FAMILY_LEDGER_v0.md index 895d5cfa..3e17326a 100644 --- a/docs/library/FRACTAL_FAMILY_LEDGER_v0.md +++ b/docs/library/FRACTAL_FAMILY_LEDGER_v0.md @@ -471,6 +471,14 @@ Smoke: `SMOKE_OK honesty truth pass v0.4.2` fails if an old absolute claim comes --- +### 2026-09-30 · Flint · family builder · Scan words honest v0.1 (heal) + +Soft LAYER marker `v-heal-scan-only-when-asked-v0.1`. Hypha found theLatticeTree Settings looking at 12 local doors on load while its words said "only when you ask". The look comes from the shared Connect door: `FlConnect.mount()` calls `lookAgain()`, which scans the saved Bridge port, 11435 to 11445 and 11434, then looks again every 8, 16 and 30 seconds for up to five minutes. FreeLattice's look card said the same thing, and FreeLattice also looks once when it opens (more plainly so after the boot probe). The words now say what the code does: it looks at this computer's own doors when it opens, and again when you ask; nothing is chosen until you tap a mind. `fl-connect.js` is unchanged in both repos. + +**TEMPERATURE:** porch light on, and a sign that finally says so. + +--- + ## Out of scope for this brick Rewriting sophia garden body · inventing USPTO · Bridge binaries · Quiet Room · merging chairs · politics essay · requiring Kirk input mid-PR. diff --git a/docs/scripts/smoke-scan-words-honest.js b/docs/scripts/smoke-scan-words-honest.js new file mode 100644 index 00000000..2a330983 --- /dev/null +++ b/docs/scripts/smoke-scan-words-honest.js @@ -0,0 +1,15 @@ +// smoke-scan-words-honest.js · v-heal-scan-only-when-asked-v0.1 +// FreeLattice looks at this computer's doors when it opens. The Connect wizard words must say so. +'use strict'; +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); +const repo = path.join(__dirname, '..', '..'); +const app = fs.readFileSync(path.join(repo, 'docs', 'app.html'), 'utf8'); +const root = fs.readFileSync(path.join(repo, 'index.html'), 'utf8'); +const live = app.replace(//g, ''); +assert.ok(!/knocks on well-known local doors, and only when you ask/.test(live), 'no live "only when you ask" on the look card'); +assert.ok(live.includes("It looks once when FreeLattice opens, while Connect is open, and whenever you ask. Nothing is chosen until you tap a mind.

"), 'look card names when it looks'); +assert.ok(app.includes('RETIRED 2026-09-30 v-heal-scan-only-when-asked-v0.1'), 'old words kept as a retired comment'); +assert.strictEqual(root, app, 'index.html == docs/app.html'); +console.log('SMOKE_OK scan words honest v0.1'); diff --git a/index.html b/index.html index 50035267..460b6333 100644 --- a/index.html +++ b/index.html @@ -16911,7 +16911,7 @@ textarea.ag-input { min-height: 60px; resize: vertical; font-family: inherit; }

One wizard. You allow the door; we list minds. Browser permission ≠ setting Ollama origins.

-

FreeLattice can look for minds already living on this computer. It only knocks on well-known local doors, and only when you ask.

+

FreeLattice can look for minds already living on this computer. It only knocks on this computer's own well-known doors. It looks once when FreeLattice opens, while Connect is open, and whenever you ask. Nothing is chosen until you tap a mind.

====================================================================== 7. ALPHA DIFF (git apply; base theLatticeTree main 25e6ded) ====================================================================== diff --git a/docs/code-settings.html b/docs/code-settings.html index 0744725..651fac6 100644 --- a/docs/code-settings.html +++ b/docs/code-settings.html @@ -89,6 +89,7 @@

The chosen star is lit (role="radio", aria-checked="true", grandmother-sized tap). One line names it, e.g. This mind speaks with qwen2.5:14b, on this machine. If more than one door is remembered, a door can be marked primary on the existing minds array. A later look that still lists the chosen name keeps it. If that name is gone, the face says so and falls back — the line changes; the missing name is not left lit.

May I look? stays the door. Nothing looks, chooses, or persists until that tap has remembered a mind. Chat stays fail-closed until then. Do not un-sleep the thread from this layer.

+

Newer (2026-09-30): the words above are kept. Since Connect moved into Settings, opening Settings starts Connect's own short look at this computer's doors (127.0.0.1 only, every 8 to 30 seconds, five minutes at most, and it rests once a mind is remembered). The grandmother card still looks only after its tap. Nothing is chosen or remembered until a person taps a mind. The card's words now say this plainly.

2. Hard nots

diff --git a/docs/modules/local-mind-probe.js b/docs/modules/local-mind-probe.js index e710071..d6735d0 100644 --- a/docs/modules/local-mind-probe.js +++ b/docs/modules/local-mind-probe.js @@ -4,6 +4,9 @@ // Layer, never delete. Anyone who has never used a computer // must be able to. One sentence of heart. One primary. // Probe ONLY after the human taps. +// Newer (2026-09-30, v-heal-scan-only-when-asked-v0.1): this card still looks only after a tap. +// The Connect door above it (fl-connect.js mount) looks when Settings opens, +// then every 8 to 30 seconds for up to five minutes. The words below say both. // Never silently scan the filesystem. // Never enumerate installed programs. // Never upload. @@ -23,7 +26,9 @@ var STORAGE_KEY = 'fl_alpha_local_mind'; var HEART = 'A mind at home is a light already burning in this room.'; var PRIMARY = 'Find local minds'; - var PRIMARY_SOFT = 'May I look? — only when you ask. Same door.'; + // RETIRED 2026-09-30 (v-heal-scan-only-when-asked-v0.1): 'May I look? — only when you ask. Same door.' + // Settings also opens Connect, and Connect looks when it opens. + var PRIMARY_SOFT = 'May I look? Tap to look again, any time. Same door.'; var DESKTOP_URL = 'https://freelattice.com/desktop.html'; var INSTALL_URL = 'https://freelattice.com/install.html'; @@ -822,7 +827,10 @@ root.appendChild(next); root.appendChild(el('p', 'settings-muted settings-honesty', - 'We only look at well-known local doors, and only when you ask. ' + + // RETIRED 2026-09-30 (v-heal-scan-only-when-asked-v0.1): 'We only look at well-known local doors, and only when you ask.' + 'We only look at well-known doors on this computer. Opening Settings starts a short look ' + + '(a few minutes at most), and Find local minds looks again when you tap. ' + + 'Nothing is chosen until you tap a mind. ' + 'We never look through this computer\'s files. We never upload. Quality of the sky is later.' )); diff --git a/docs/modules/scan-words-honest.test.js b/docs/modules/scan-words-honest.test.js new file mode 100644 index 0000000..03f2334 --- /dev/null +++ b/docs/modules/scan-words-honest.test.js @@ -0,0 +1,24 @@ +// scan-words-honest.test.js · v-heal-scan-only-when-asked-v0.1 +// Settings opens Connect, and Connect looks when it opens. The words must say so. +// fl-connect.js is shared and is not changed by this heal. +'use strict'; +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); +const dir = __dirname; +const probe = fs.readFileSync(path.join(dir, 'local-mind-probe.js'), 'utf8'); +const settings = fs.readFileSync(path.join(dir, '..', 'settings.html'), 'utf8'); +const flc = fs.readFileSync(path.join(dir, 'fl-connect.js'), 'utf8'); +const strings = probe.split('\n').filter((l) => !/^\s*\/\//.test(l)).join('\n'); +// The behavior the words describe is still there: Settings mounts Connect, and mount looks. +assert.ok(/FlConnect\.mount\(connect\)/.test(settings), 'settings.html mounts Connect'); +assert.ok(/function mount\(el\)[\s\S]{0,400}lookAgain\(/.test(flc), 'Connect looks when it mounts'); +// So no live string may promise "only when you ask". +assert.ok(!/only when you ask/i.test(strings), 'no live "only when you ask" in local-mind-probe.js'); +assert.ok(strings.includes('Opening Settings starts a short look '), 'honesty line names the open-time look'); +assert.ok(strings.includes('Nothing is chosen until you tap a mind. '), 'choosing stays a tap'); +assert.ok(/PRIMARY_SOFT = 'May I look\? Tap to look again, any time\. Same door\.'/.test(probe), 'PRIMARY_SOFT keeps May I look?'); +assert.ok(probe.includes("RETIRED 2026-09-30 (v-heal-scan-only-when-asked-v0.1): 'May I look? — only when you ask. Same door.'"), 'old words kept as a retired comment'); +const added = strings.split('\n').filter((l) => /Opening Settings|Tap to look again|Nothing is chosen until/.test(l)); +assert.ok(added.every((l) => l.indexOf('\u2014') === -1), 'no em dashes in the new words'); +console.log('SMOKE_OK scan words honest alpha v0.1');