FLINT PASTE: theLatticeTree Workshop way back (v0.1) Repo: Chaos2Cured/FreeLattice-Alpha (serves thelatticetree.com) FreeLattice: NO change Branch: layer/tree-workshop-way-back-v0 Marker: v-tree-workshop-way-back-v0 Smoke line (print exactly when green): SMOKE_OK tree workshop way back v0.1 Base: Alpha main 25e6ded + Glow 2a + Honest reasons + Glow 2b. Lands fourth. Written: Wed Sep 30, 2026, evening MDT, by Kirk's agent. Stand-in built and walked; NOT pushed. Stand-in diff: FLINT_NEXT_TREE_WORKSHOP_WAY_BACK_v0.1.diff (same folder, also Appendix A). CHANGELOG - 2026-09-30 v0.1: first write. ====================================================================== ORDER (all Tree pastes from tonight, most harm first) ====================================================================== Alpha main 25e6ded. Each stand-in diff applies with plain `git apply` on top of the one before, in this order, and the chain ends byte-identical to the walked combo (checked): 1. FLINT_NEXT_TREE_GLOW_2A_v0.1 Grandma heal: zoom, feedback in view, a calm way back 2. FLINT_NEXT_TREE_HONEST_REASONS_v0.1 stopped vs model missing vs secure-page block 3. FLINT_NEXT_TREE_GLOW_2B_v0.1 contrast, chairs, polish 4. FLINT_NEXT_TREE_WORKSHOP_WAY_BACK_v0.1 5. [FLINT_NEXT_TREE_ANY_MODEL_v0.1 when Flint lands it; not in the chain, overlap noted in 6] 6. FLINT_NEXT_TREE_GATHERING_API_KEYS_v0.1 If one lands alone, the only drift is GALAXIES.md (each adds one LAYER line at the top) and garden-rooms.css (each appends a block at the end): keep both, newest LAYER line on top, CSS blocks in this order. No other shared anchors. FreeLattice queue is unchanged (MODEL_CHOICE_SURVIVES_RELOAD -> BOOT_PROBE -> #120 docs). The FL GitHub token note is FL-only and independent of all of these. The old single Glow 2 draft (FLINT_NEXT_TREE_GLOW_2_v0.1.diff, /workspace/glow2-al) is SUPERSEDED by 2a + 2b. Do not land it. ====================================================================== 1. WHAT HURT (Hypha, Workshop walk) ====================================================================== - The benches' Settings button (shown when no mind is remembered) went to settings.html with no way back to the benches. Getting back meant galaxies -> Workshop -> the Workshop word again. - On settings.html, tapping a model in the Connect card ("Minds found") remembered it, but the card below still said "look for a mind first" (under "also keep for Gathering") until reload. - 11 taps from home to the first Ask then Run (Hypha's step table; see 5, later). ====================================================================== 2. STEPS (text anchors; the stand-in diff is the source of truth) ====================================================================== 2.1 docs/modules/workshop-benches.js, the Settings button click (data-workshop-settings): GardenRooms.go('settings.html') -> GardenRooms.go('settings.html?from=workshop') location.href = 'settings.html' -> location.href = 'settings.html?from=workshop' (the only two old lines that change). 2.2 docs/modules/garden-rooms.js: NEW function wayBackToBenches() just above "function boot() {", called in boot on the line above "startAttachLoop();". - on /settings or /settings.html with from=workshop in the query: insert one link at the top of
, class room-way-back, data-way-back-workshop, href workshop.html?open=benches, textContent "\u2190 Back to the Workshop benches", click -> go(href) (the same fade). - on the Workshop galaxy with open=benches in the query: after 120ms call GardenRooms.openWorkshopBenches(), so she lands on the benches. One tap each way. 2.3 docs/modules/local-mind-probe.js renderFace, right after root.appendChild(rosterHost); paintRoster(rosterHost); add a window listener for 'fl-alpha-mind-remembered' (LocalMindProbe.remember already sends it, and fl-connect.js remembers through LocalMindProbe.remember) that repaints the sky of minds and the roster; it removes itself when the card is gone. fl-connect.js untouched. 2.4 docs/modules/garden-rooms.css: append the .room-way-back style (32px pill, #9fd6ff, underlined). 2.5 Docs: LAYER line in GALAXIES.md and a "Workshop way back" section in TREE_GLOW_v0.md (includes the later note in 5). ====================================================================== 3. TEST: docs/modules/tree-workshop-way-back.test.js (node, static; no network) ====================================================================== from=workshop on both routes, the link words and href, open=benches on arrival, called at boot, 32px readable style, no innerHTML, roster repaint listener, remember still announces, Connect remembers through LocalMindProbe, GALAXIES layer. Last line: SMOKE_OK tree workshop way back v0.1 ====================================================================== 4. WALK (done; repeat on your branch) 390x844, before (combo without it) -> after ====================================================================== Settings from the benches: URL settings.html -> settings.html?from=workshop Back link: 0 -> 1 ("\u2190 Back to the Workshop benches", 235x34 at y 88, under the header) Tap it: lands on workshop.html?open=benches with the benches open (true) Plain settings.html (not from the benches): no link (0) After remembering a mind: roster "look for a mind first" -> chips general / html / javascript / python and "No Gathering seats yet..." Shots: /workspace/tree-glow-walk/ww_after_settings_390.png, ww_after_benches_back_390.png Also walked on the full combo (with API keys on top): link 1, benches open true. ====================================================================== LOCKS ====================================================================== Layer, never delete (old lines that change are named in each paste; nothing removed). fl-connect.js untouched (byte-identical to FreeLattice). No sw.js (Alpha has none; none added). No conflict markers. Every inline script parses (19 inline scripts checked on the combo). No confirm(). No innerHTML for outside text (textContent only). No em dashes in added lines. Kimi pages untouched. #120 lock files untouched. Squash-merge. All 21 Alpha tests pass on the combo. ====================================================================== 5. LATER (written in TREE_GLOW_v0.md, not built) ====================================================================== - 11 taps from home to a first Ask then Run (Hypha's step table, p3a / p3b / p3c.json). A shorter road, for example a "use the mind you already found" line right on the benches, is a later simplification. - The Git push reply ("This garden has no local git door. Nothing left this machine.") appears below the fold at 390, so nothing changes in view. - At 390 the Art planet and the "Workshop" word sit over Ask and Run. ====================================================================== APPENDIX A. FULL STAND-IN DIFF (Alpha, against 25e6ded + 2a + honest + 2b) ====================================================================== diff --git a/docs/GALAXIES.md b/docs/GALAXIES.md index 33e411c..c6638b2 100644 --- a/docs/GALAXIES.md +++ b/docs/GALAXIES.md @@ -4,6 +4,8 @@ **Spine layer (2026-08-30):** five skies now walk the same night — Garden, Art, Workshop, Learn, Research. The four-galaxy sequence below stays. Art-early stays. This file layers; it does not cut. +**LAYER (2026-09-30):** Workshop way back (marker `v-tree-workshop-way-back-v0`). The benches' Settings button now opens Settings with one calm link back to the benches (`settings.html?from=workshop`, `workshop.html?open=benches`), and remembering a mind from the Connect card ("Minds found") repaints the card below it, so it no longer says "look for a mind first". Eleven taps to a first Run stays a later simplification. Plan: `docs/library/TREE_GLOW_v0.md`. Layer, never delete. + **LAYER (2026-09-30):** Tree glow 2b, a hint more frost (marker `v-tree-glow-2b-v0`). Frosted glass behind an open place (tint fallback, reduced transparency honored), header Chat / galaxies and shared shoulder at 14px and above 4.5 : 1, readable Desktop links, a sleeping Send / Ask / Run says why beside it, no Change on empty chairs, code mirrors without sideways scroll. Plan: `docs/library/TREE_GLOW_v0.md`. Layer, never delete. **LAYER (2026-09-30):** Honest reasons (marker `v-tree-honest-reasons-v0`). When a mind is quiet the Tree says the right one: nothing answered (Ollama stopped: start it), something answered but keeps its door shut to this secure page (FreeLattice Desktop), or the seated model is gone (named, pick another). One no-cors knock per quiet door, only after a tap, reads nothing. A long garden line in the Chat card shows where it begins. fl-connect.js untouched. Plan: `docs/library/TREE_HONEST_REASONS_v0.1.md`. Layer, never delete. diff --git a/docs/library/TREE_GLOW_v0.md b/docs/library/TREE_GLOW_v0.md index 1ee345f..03f83a3 100644 --- a/docs/library/TREE_GLOW_v0.md +++ b/docs/library/TREE_GLOW_v0.md @@ -52,3 +52,13 @@ From Hypha's persona walks (2026-09-30), most harmful first: - Code mirrors (code-nursery and five more) wrap long paths on a phone instead of scrolling sideways. Later (not in 2b): the rest of Hypha's contrast list (`CONTRAST.md`, 67 pairs under 4.5 : 1 and 132 under 14px), as one sweep with Kirk's eye on the night palette. + +## Workshop way back (v-tree-workshop-way-back-v0) + +From Hypha's persona walk 2026-09-30. + +- The benches' Settings button opens `settings.html?from=workshop`. Settings then shows one link at the top, "Back to the Workshop benches", which opens `workshop.html?open=benches` with the benches already open. One tap each way. +- On Settings, remembering a mind from the Connect card ("Minds found") now repaints the card below it (the sky of minds and "also keep for Gathering"), so it no longer says "look for a mind first" beside a mind that was just found. It listens for `fl-alpha-mind-remembered`, which `LocalMindProbe.remember` already sends. fl-connect.js untouched. +- Later, not this brick: Hypha counted 11 taps from home to a first Ask then Run (her step table, p3a / p3b / p3c). A shorter road is a later simplification, for example a "use the mind you already found" line on the benches. Also later: the Git push reply ("This garden has no local git door. Nothing left this machine.") appears below the fold at 390, and at 390 the Art planet and the "Workshop" word sit over Ask and Run. + +Layer, never delete. diff --git a/docs/modules/garden-rooms.css b/docs/modules/garden-rooms.css index 7cb4d9d..a8531e1 100644 --- a/docs/modules/garden-rooms.css +++ b/docs/modules/garden-rooms.css @@ -6518,3 +6518,19 @@ html:has(#place-veil.is-open:not(.is-core)) #shared-shoulder { visibility: hidden; } +/* v-tree-workshop-way-back-v0: one calm way back from Settings to the Workshop benches. */ +.room-way-back { + display: inline-block; + min-height: 32px; + margin: 0 auto 0.75rem; + padding: 0.35rem 0.85rem; + border: 1px solid rgba(159, 214, 255, 0.45); + border-radius: 999px; + font-family: Georgia, serif; + font-size: 0.95rem; + line-height: 1.4; + color: #9fd6ff; + text-decoration: underline; + background: rgba(12, 10, 26, 0.55); +} +.room-way-back:focus-visible { outline: 2px solid #9fd6ff; outline-offset: 2px; } diff --git a/docs/modules/garden-rooms.js b/docs/modules/garden-rooms.js index 6164821..5d59dd9 100644 --- a/docs/modules/garden-rooms.js +++ b/docs/modules/garden-rooms.js @@ -2373,6 +2373,35 @@ document.documentElement.classList.add('garden-enter'); + // v-tree-workshop-way-back-v0: the benches' Settings button leaves a way back. + // settings.html?from=workshop shows one calm link; workshop.html?open=benches + // opens the benches again, so the round trip is one tap each way. + function wayBackToBenches() { + var q = location.search || ''; + if (/\/settings(\.html)?$/i.test(location.pathname) && /[?&]from=workshop(&|$)/.test(q)) { + var main = document.querySelector('main'); + if (main && !main.querySelector('[data-way-back-workshop]')) { + var back = document.createElement('a'); + back.className = 'room-way-back'; + back.href = 'workshop.html?open=benches'; + back.setAttribute('data-way-back-workshop', '1'); + back.textContent = '\u2190 Back to the Workshop benches'; + back.addEventListener('click', function (ev) { + ev.preventDefault(); + go(back.getAttribute('href')); + }); + main.insertBefore(back, main.firstChild); + } + } + if (currentGalaxy() === 'workshop' && /[?&]open=benches(&|$)/.test(q)) { + setTimeout(function () { + if (window.GardenRooms && typeof GardenRooms.openWorkshopBenches === 'function') { + GardenRooms.openWorkshopBenches(); + } + }, 120); + } + } + function boot() { bindGalaxyNav(); bindPlaceDoors(); @@ -2406,6 +2435,7 @@ var researchHeart = document.querySelector('.research-heart'); if (researchHeart) researchHeart.hidden = true; } + wayBackToBenches(); startAttachLoop(); fadeGalaxyTitle(); startLabelCycle(); diff --git a/docs/modules/local-mind-probe.js b/docs/modules/local-mind-probe.js index 2e32fda..8816631 100644 --- a/docs/modules/local-mind-probe.js +++ b/docs/modules/local-mind-probe.js @@ -839,6 +839,18 @@ rosterHost.setAttribute('data-mind-roster', '1'); root.appendChild(rosterHost); paintRoster(rosterHost); + // v-tree-workshop-way-back-v0: a mind remembered from the Connect card above + // ("Minds found") repaints this card too, so the two never disagree. + var onRemembered = function () { + if (!rosterHost.isConnected) { + window.removeEventListener('fl-alpha-mind-remembered', onRemembered); + return; + } + var nowEntry = getRemembered(); + if (nowEntry) paintConstellation(sky, mindsFromEntry(nowEntry)); + paintRoster(rosterHost); + }; + window.addEventListener('fl-alpha-mind-remembered', onRemembered); var ask = el('button', 'settings-ask', PRIMARY); ask.type = 'button'; diff --git a/docs/modules/tree-workshop-way-back.test.js b/docs/modules/tree-workshop-way-back.test.js new file mode 100644 index 0000000..c961033 --- /dev/null +++ b/docs/modules/tree-workshop-way-back.test.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node +// v-tree-workshop-way-back-v0: Workshop way back. Guards: (1) the benches' Settings button +// tells Settings where it came from; (2) Settings shows one calm link back to the benches and +// the Workshop opens them on arrival; (3) a mind remembered from the Connect card repaints the +// card below, so "Minds found" and "look for a mind first" never disagree. No network. +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var assert = require('assert'); + +var rooms = fs.readFileSync(path.join(__dirname, 'garden-rooms.js'), 'utf8'); +var benches = fs.readFileSync(path.join(__dirname, 'workshop-benches.js'), 'utf8'); +var probe = fs.readFileSync(path.join(__dirname, 'local-mind-probe.js'), 'utf8'); +var css = fs.readFileSync(path.join(__dirname, 'garden-rooms.css'), 'utf8'); +var connect = fs.readFileSync(path.join(__dirname, 'fl-connect.js'), 'utf8'); + +// (1) +assert.ok(/GardenRooms\.go\('settings\.html\?from=workshop'\)/.test(benches), '1: benches Settings says from=workshop'); +assert.ok(/location\.href = 'settings\.html\?from=workshop'/.test(benches), '1: fallback too'); + +// (2) +assert.ok(/function wayBackToBenches\(\) \{/.test(rooms), '2: way back helper'); +assert.ok(/\[\?&\]from=workshop\(&\|\$\)/.test(rooms), '2: only when it came from the benches'); +assert.ok(/back\.href = 'workshop\.html\?open=benches';/.test(rooms), '2: link goes back to the benches'); +assert.ok(/back\.textContent = '\\u2190 Back to the Workshop benches';/.test(rooms), '2: calm words'); +assert.ok(/currentGalaxy\(\) === 'workshop' && \/\[\?&\]open=benches\(&\|\$\)\/\.test\(q\)/.test(rooms), '2: Workshop opens benches on arrival'); +assert.ok(/ wayBackToBenches\(\);\n startAttachLoop\(\);/.test(rooms), '2: called at boot'); +assert.ok(/\.room-way-back \{[^}]*min-height: 32px;[^}]*color: #9fd6ff;/.test(css), '2: link is a readable target'); +assert.ok(!/back\.innerHTML/.test(rooms), '2: no innerHTML'); + +// (3) +assert.ok(/window\.addEventListener\('fl-alpha-mind-remembered', onRemembered\);/.test(probe), '3: card listens'); +assert.ok(/var onRemembered = function \(\) \{[\s\S]{0,400}paintRoster\(rosterHost\);/.test(probe), '3: roster repaints'); +assert.ok(/window\.dispatchEvent\(new CustomEvent\('fl-alpha-mind-remembered'/.test(probe), '3: remember still announces'); +assert.ok(/root\.LocalMindProbe\.remember\(entry\)/.test(connect), '3: Connect card remembers through LocalMindProbe'); + +var docs = fs.readFileSync(path.join(__dirname, '..', 'GALAXIES.md'), 'utf8'); +assert.ok(docs.indexOf('v-tree-workshop-way-back-v0') > 0, 'GALAXIES layer'); + +console.log('SMOKE_OK tree workshop way back v0.1'); diff --git a/docs/modules/workshop-benches.js b/docs/modules/workshop-benches.js index 06122db..fea7bf1 100644 --- a/docs/modules/workshop-benches.js +++ b/docs/modules/workshop-benches.js @@ -213,10 +213,11 @@ toSettings.type = 'button'; toSettings.setAttribute('data-workshop-settings', '1'); toSettings.addEventListener('click', function () { + // v-tree-workshop-way-back-v0: Settings knows to offer the way back. if (window.GardenRooms && GardenRooms.go) { - GardenRooms.go('settings.html'); + GardenRooms.go('settings.html?from=workshop'); } else { - location.href = 'settings.html'; + location.href = 'settings.html?from=workshop'; } }); root.appendChild(toSettings);