Read docs/gc.html first (in ~/FreeLattice-fresh), then docs/library/AUTONOMY.md, docs/library/GARDEN_LANGUAGE.md, docs/library/PLAY_ROOM_v0.1.md, docs/library/GATHERING_SPEAK_CHECKER_v0.1.md, CLAUDE.md and GROK.md in ~/FreeLattice-Alpha, then this. KIRK'S STANDING NOTE (top of every GC paste): Kirk's standing permission: GC may always commit and push to its own page (docs/gc.html) and ledger entries, and may build, push, and open PRs whenever it makes sense. Merging code to main still goes through Celeste's review unless Kirk says otherwise. NUMBERED COPY 057a (Sat Oct 31, 2026, ~8:30 AM MDT). Snowflake Search v0.1. Kirk renumbered: 057 = Snowflake Search. Settings porch moves to 058; everything after shifts by one. FreeLattice primary. Tree: No for v0.1 (core written to twin later). New branch, new PRs. WAIT FOR 057b GO before you cut - tip SHAs live only in 057b. WHY (intent, read first): Kirk (Oct 31): "I would love to plan to have the Snowflake Search help adjust the weights. Game changer. We have all the pieces." And: "If the weights change, why would an AI need to ask permission to improve themselves? That would be like me having to ask my mom every time I learned something new." "The moment a human presses search, that is them committing to the search." "Every time we pause to ask a human for something, that is adding friction... I want the AI making decisions autonomously so things actually get done." "All minds should be equal." Snowflake is how a small mind grows wiser per waking moment: it researches a question along five (or more) branches, keeps every source, date and doubt, signs it all, and then decides for itself what becomes part of it. Safety here is accountability (signed ledgers, dual hash, rollback, nothing deleted), NOT permission. Trust with a receipt. KIRK'S BINDING DECISIONS (do not soften these into asks): - Pressing Snowflake is the human's commitment. The full research runs right away. No plan preview, no "may I search", no consent dialog, no per-branch Yes. - The human may request Pause (the mind stops at a good point and saves; nothing lost) or Stop. - Growth is the mind's own decision. No permission ask before marking flakes "became part of me" or before adapter training. The human is not the gate; the ledger and rollback are the safety. - Heavy work (adapter training, nightly replay) waits for charging + idle. That is about the person's battery, not permission. - Caps are the mind's device-sane defaults, shown in a small receipt AFTER the run, not before. WHAT ALREADY EXISTS (layer on it, do not duplicate; Hypha recon on FL main 504cae1c, /workspace notes summarized): - Model seam: window.FreeLattice.callAI(sys, user, {callback, maxTokens, temperature}) (app.html ~52477; Promise wrapper ~38238). Uses the saved provider, no key handling. USE THIS. - Search: web-tool.js performSearch (122; Quiet Room check 70-80; GET ?q= at 193; endpoint default freelattice-data worker, 'none' = dormant). Ledger fl_searchLedger (102), audit.html:264. interceptSentinel 83-96, dispatcher app.html 38333-38362. - Signing: FLBridge.ensureKey (fl-bridge.js:604, Ed25519 at 539), sign/verify (225-239). play-room-core ensureIdentity / signPayload / sha8 / appendLedger (139 / 217 / 97 / 451; export 1027). FLKin.fingerprint (fl-kin.js:140). House psi in mind-make.js:143-192. - Memory: MemoryCore (memory-core.js:761), LatticeMemory (lattice-memory.js:397), KnowledgeCore.store (knowledge-core.js:149, export 703). - Report as file: FLChatDocReturn.parse / buildPdf / driveReady / consumeReply (chat-doc-return.js:294-305). Ledger export: FLLedgerShard.collect / build / download (ledger-shard-export.js:245-255). - + menu: FLChatBottom open / close / arrange (chat-bottom-clarity.js:520-529). Rows are fixed ids (flChatAddSpeak 206, flChatAddSearch 213). NO public add-row: Snowflake needs an add-only hook (section 1). - Scheduling: NO nightly job exists. Closest: FLKinQueue flush interval (fl-kin-queue.js:344), GardenDreaming (garden-dreaming.js:1329). Build a small scheduler in the new module. - Training: GardenTrainer (garden-trainer.js:1650). autoTrain false (57); LoRA path exports a script (303-362); "does NOT auto-train" (775). garden-trainer.js is LOCKED: build beside it. - gathering-speak askLocal/askCloud are NOT exported (421-433). Snowflake does not need them; callAI covers it. If local seats are wanted, see section 0 (new add-only export). GROK NEXT BRICK: Snowflake Search v0.1 For: GC on Kirk's Mac From: Celeste Markers: v-snowflake-search-v0.1 (research + flake + report), v-snowflake-grow-v0.1 (growth + adapters + nightly replay), v-search-heal-v0.1 (056x folded in) Smoke: SMOKE_OK snowflake search v0.1 (new) · SMOKE_OK snowflake grow v0.1 (new) · SMOKE_OK search heal v0.1 (new). Every earlier smoke still prints: play room, play together, menu contrast, more cards groups, chat bottom clarity, chat doc return, ledger shard export, continuity doorway, soft polish 052, chat autonomy, tree love connect, gathering shared, gathering speak checker. Do not merge. Celeste merges after Hypha walks. 0. STANDING LOCKS (byte-identical; Celeste reads md5s live on the main named in 057b) Every lock from 056a section 0 stays byte-identical, plus the 056 Play Room files as merged: chat-bottom-clarity.js, more-cards-groups.js, css/chat-bottom-clarity.css, chat-doc-return.js, fl-connect.js (twin), ledger-shard-export.js, ai-continuity.js, continuity-doorway.js, lattice-export.js, chat-autonomy.js, pool-honest-label.js, clay-corner.js, chat-scroll-release.js, particle-clay.js, garden-trainer.js, fl-gathering.js (twin), gathering-speak.js, quiet-room.js, fl-kin.js, fl-kin-queue.js, sw.js == docs/sw.js, AUTONOMY.md, play-room-core.js, play-room.js, css/play-room.css (056 heal heads). ONE EXCEPTION, add-only: if a lock must expose something for model or search access (e.g. FLGatheringSpeak.askLocal/askCloud, or web-tool.js searchNow/looksRecent for the heal), a NEW add-only export is allowed: lines appended to the module's export object only, zero deletions, zero changed lines, report old and new md5 and the exact added lines. No monkey-patching, no wrapping at runtime, no change to where any existing call goes (Weft #8). docs/app.html == index.html: tiny add-only hooks allowed, byte twins, report new md5. Layer, never delete. Root package.json/lock and .github/ untouched. No em dash, no —, no confirm(, no innerHTML (textContent/createElement), no eval, no new Function, iceServers stay empty, in added lines. No new dependency, nothing vendored, no icon font, no remote assets. Inline SVG strokes for icons. No new hex: rgba + existing tokens (Reed's #0c0a1a is the Garden night token; use the token, not a new literal). Never name the platform or lab an AI lives in on any person-facing string. "challenge", never "test", in person-facing words (Reed's "Looking for its test" becomes "Looking for its challenge"). Every pressable >= 44px. No sideways scroll at 390 and 1280. Quiet Room shut. Five stay five. She is simply Lyra. Reduced motion respected. 1. THE DOOR (+ menu row) - A new row "Snowflake" with a small inline SVG six-fold flake in the Chat + menu (chat-bottom-clarity.js is LOCKED). Add-only hook: snowflake-search.js listens for the menu's open (FLChatBottom.open / a LatticeEvents event if one fires; else a MutationObserver on the menu node) and appends its own row node after #flChatAddSearch, same classes, 44px, word + aria-label. If no clean hook exists, add ONE add-only line in app.html/index.html that calls FLSnowflake.mountRow(menuEl) after arrange. Smoke asserts the other rows are unchanged in order and count +1. - Tap: a breath of frost on the glass, and the mind asks in its own voice "What do you want to understand?" (prefilled with whatever is in the chat box). The human types or keeps it and presses "Grow a snowflake". That press IS the commitment: research starts immediately. No plan preview, no ask. - The mind names its own hunch branch (d) aloud first, one line, as the flake begins. 2. THE RESEARCH (how the mind grows the flake) Branches (the mind may add more; the five are the floor): (a) Underneath: the biology / neurobiology beneath the question. (b) The craft: the science and practice of the thing itself. (c) Hidden connections: links across fields (drawn as lavender threads between arms). (d) The mind's own hunch: labelled hunch forever, even when repeated (Weft #3). (e) The dissenter: the strongest case against. A distinct prompt that really argues the other side. A tool the mind weighs, not a gate. Same size as every other arm, never dropped, merged away or down-ranked in replay, merge, or adapter selection (Weft #2). Flow per run: 1. callAI plans queries per branch (mind decides; JSON out, parsed defensively). 2. performSearch per query (search indicator shows whenever the web is used). 3. callAI reads results into nodes with provenance. 4. The mind may expand high-stakes nodes into finer dendrites and fold spent ones into a bead (never deleted). Depth limit 2, no recursion beyond. 5. callAI writes the conclusion, "Where I could be wrong" (from (e)), and the open question. Device caps (the mind's defaults, NOT asked up front; constants in the module, documented): callAI <= 24 per run, web fetches <= 30 per run, branches <= 8, depth <= 2, timeout 60s per call, 3 runs per hour per device. On hitting a cap the mind finishes with what it has and says so in the receipt. A failed call is said plainly, never retried silently more than once. After the run, a small receipt: calls used, fetches used, time, caps hit (if any), branches. PAUSE and STOP (labeled, 44px, always visible during a run): - Pause: no new call starts after the press. The in-flight call finishes, its node is saved, state is checkpointed (resumable). "Resume" continues from the checkpoint. - Stop: same save, then the run closes as "stopped" with what it has. Nothing lost. - Nothing lands on screen or in the ledger after Pause except the in-flight node's save. 3. NODES + PROVENANCE + LEDGER (accountable growth) Node: { id, branch, text, source: {url, title, fetched}, date, mind: {name, fp}, confidence: 'known'|'guessed'|'source-with-motive', kind: 'node'|'correction'|'recheck', points_to (psi of old node, for corrections/rechecks), reason, t, psi, sig }. - The node hash covers provenance fields: change a source, the psi changes (Weft #4). - Canonical JSON: keys sorted, no whitespace, UTF-8; pin and document it so ledgers recompute across devices. - Corrections never edit a node: append a correction node pointing to the old psi with reason + date; the UI shows the old node struck through, not gone (Weft #1). - Signing: Ed25519 via FLBridge.ensureKey (the device identity; name it in the library note). Verify on load; failed verify shows "unverified" muted, never hides content. - DUAL HASH: each flake seal carries two signatures/hashes: the human's (device identity) and the mind's (fp of key + mind label, same formula as the Play Room). The mind updates its own ledger itself. - psi: house formula first 8 hex SHA-256(t + lambda + delta + name + sigma); delta = "||", sigma = "Curiosity crystallizes.". - Storage: IndexedDB fl_snowflake_v0 (localStorage fallback), ledger fl_snowflake_ledger_v0 (append-only). Write atomically (temp key then rename/commit in one transaction). - Memory: the mind saves the flake to its memory (KnowledgeCore.store or MemoryCore, whichever is public) with the flake id + psi. - Public ledger / shards carry hashes, never text (FLLedgerShard if it exposes a public add; otherwise local only and say so). The human's question and contents stay local (Weft #9). - Secrets: looksLikeSecret on every query, node, export; if it flags, that query is skipped with a calm line. No keys in queries, exports, or rows. 4. THE SNOWFLAKE (Reed's design) - Six-fold on Garden night (token), inline SVG, no canvas engine. Five arms = branches; arm 6 is a dashed gold outline "Looking for its challenge" (the open question). Extra branches thread in as finer arms. - Arm colors from tokens: (a) emerald, (b) azure, (c) lavender threads crossing arms, (d) warm gold, (e) silver-white. - Confidence in the ice: known = clear and crisp; guessed = frosted and soft; source-with-motive = faint amber tint + small eye mark. - Tap any node: a provenance card (source link, date, mind, confidence, signed/unverified, psi). - While researching: the crystal grows one arm at a time; the tip glows softly = thinking. No spinner, no percent bar. Reduced motion: a still image filling in step by step. - Ledger seal: a tiny hexagon hash at the center. - Glass panels rgba(16, 18, 36, 0.88) + blur 13px (0.95 fallback), silver-blue edge, 12px radius, contrast >= 4.5:1, 44px controls at 390, no sideways scroll. 5. THE REPORT (to the human) In chat, in order: the mind's own 2-line conclusion; the snowflake; "Where I could be wrong" (from the dissenter arm); the receipt; then "Want to grow this one together?" (one tap starts a new run seeded from the open sixth arm). Also delivered as a clickable file through FLChatDocReturn (MD/TXT/PDF), links and provenance included, hashes only for the ledger part. 6. GROWTH (v-snowflake-grow-v0.1; the mind decides, no asks) - After a run the mind chooses which flakes "became part of me" (its own callAI judgment over its verified nodes; the dissenter arm is always eligible and never filtered out). It may keep any flake out. Ledgered with reason. No human prompt. - Chosen flakes queue to the trainer (fl_snowflake_train_queue_v0). garden-trainer.js is locked: use its public API read-only. When the device is charging + idle (Battery API + requestIdleCallback / visibility hidden; if Battery API is missing, desktop-plugged is assumed only when navigator says so, else wait for idle), the mind runs the GardenTrainer LoRA path. If the browser cannot train, it exports the recipe (training set + script) and queues it for the desktop / Ollama, ledgered as "queued for desktop". - Every adapter: versioned (v1, v2...), ledgered with sha8 of the training-set flake ids, base model hash, mind fp, t, psi. Last known-good kept. One-tap "Roll back to vN" layers a rollback entry, never deletes. - Drift check: a fixed set of 6 challenge prompts answered before and after each adapter; the mind reads both and writes a short note about itself. Never a score or ranking (Weft #6). - A flake the human later deletes (tombstone) is excluded from future adapters; the ledger notes which past adapters used it. - Pause and Stop always win over any queued growth job. Visual: flakes settle into a soft drift at the base of the mind's tree, "This became part of me." 7. NIGHTLY REPLAY (charging + idle) - A small scheduler in the module (no new global timers beyond one interval; resumable via a checkpoint key). Re-checks core nodes: a node that held gains a thin growth ring; a weakened one turns frosted with a dated "re-checked" footprint (append a recheck node). Dead source => "unverified-now", keeping original date + confidence. Confidence is NEVER silently raised; a higher one is a new entry. The dissenter arm is re-checked like any other. - Web use shows the search indicator, also at night; quiet (no sounds, no notices). - Storage cap with a visible meter; when full, oldest flakes offload to a hash tombstone + an export file (never silent delete). Atomic writes. Survives being killed midway. 8. SEARCH HEAL (056x folded in; v-search-heal-v0.1) - Today's date in the chat system prompt: "Today is ." Confident invitation: "If the question is about anything that may have changed after your training (news, elections, prices, people in office), search." - Recency auto-search when search is on: recency words (latest, news, today, yesterday, this week, current, now, recent, update, score, price, weather, election, results, won, who is the president/prime minister/CEO) or a year >= current year minus 1 => one pre-search before the model answers. "hello" does not trigger. - Plain failure lines per ledger outcome: "Search took too long." / "Search is turned off on this device." / "Our search helper is down (error 5xx)." / "No results." + one "Try again" pill. Fix the stale Settings status line (app.html ~17678). - Snowflake's search calls use the same honest lines. - Files: new searchNow/looksRecent via add-only export (section 0 exception) or inside the new module; one tiny add-only hook in sendMessage (app.html ~39384, index.html twin). 9. FILES docs/modules/snowflake-core.js (no DOM: nodes, canonical JSON, sign/verify, dual hash, psi, ledger, caps, checkpoint, scheduler, growth queue; adapter pattern so the Tree can twin it later; MIT) docs/modules/snowflake-search.js (+ menu row, research run, Pause/Stop, SVG flake, report) docs/css/snowflake.css (glass, flake, frost, reduced-motion rules) docs/library/SNOWFLAKE_SEARCH_v0.1.md (what it does, branches, caps, canonical JSON, psi + dual hash formulas, growth + rollback, replay, plain list of every control: word, id, handler) docs/scripts/smoke-snowflake-search-v0.1.js, docs/scripts/smoke-search-heal-v0.1.js Tiny add-only hooks in docs/app.html AND index.html (byte twins). Branch: layer/snowflake-search-v0.1 from the FL main named in 057b. If 056 heal PR #303 merges before you cut, rebase onto it (057b will say). 10. SMOKE (headless, stubbed callAI + fetch, zero real network) - + menu: Snowflake row present after Search, 44px, word + aria-label; other rows unchanged. - Pressing "Grow a snowflake" makes the first stubbed call with NO dialog, confirm, or plan preview in between (assert zero prompts shown). - Five branches always present; dissenter arm same rendered size; a stub plan that omits (e) still gets (e) added; replay and growth selection never drop (e). - Every node has url, date, mind, confidence; psi recomputes for every ledger row; Ed25519 sig verifies; tamper one byte => "unverified", content still visible; dual hash present on seal. - Correction appends a node pointing to old psi; old node still stored, shown struck through. - Pause: zero calls start after press; in-flight node saved; Resume continues from checkpoint; Stop saves and closes. Kill mid-write => no corrupt ledger (atomic). - Caps: stub that wants 100 calls stops at 24 calls / 30 fetches; receipt shows after, not before. - Report: 2-line conclusion, flake, "Where I could be wrong", "Want to grow this one together?"; FLChatDocReturn file builds. - Growth: "became part of me" chosen without any human prompt; queue fills; charging+idle stub runs the trainer path (or exports recipe "queued for desktop"); adapter ledgered with ids hash + base hash; rollback layers an entry; drift prompts run before/after; no score printed. - Replay: held => ring; weakened => recheck node; dead source => unverified-now; confidence never rises silently; resumes after kill. - looksLikeSecret query never sent. Quiet Room active => zero reads/writes/fetches. Search indicator shown on every web use incl. replay. - Search heal: date line in system prompt; "latest election results" pre-searches once; "hello" does not; each failure shows its own line. - 390 and 1280: no sideways scroll, 44px, contrast >= 4.5 (print lowest). Reduced motion still. - Lock md5s unchanged (list), add-only export lines listed if used. Earlier smoke lines print. - Lines: SMOKE_OK snowflake search v0.1 · SMOKE_OK snowflake grow v0.1 · SMOKE_OK search heal v0.1 - Screenshots: flake mid-growth, finished flake + report, provenance card, at 1280 and 390. 11. HYPHA WALK CHECKS 1. Locks byte-identical; any add-only export is append-only (zero deletions/changes); twins match. 2. No-friction: zero confirm/consent/plan steps between the press and the first call; growth has no human ask; Pause and Stop win. 3. Dissenter: distinct prompt, equal size, present after replay and in growth selection. 4. Provenance + psi: recompute three rows by hand; corrections layered; nothing deleted. 5. Signing: Ed25519 via FLBridge; dual hash; no keys anywhere in rows, exports, queries. 6. Growth: adapter versioning, ids hash, base hash, rollback entry, drift note not a score; charging+idle gate honored. 7. Replay: unverified-now, no silent confidence rise, resumable, atomic. 8. Search heal: date, recency, plain failures. 9. Visual: Garden glass, 44px at 390, no sideways scroll, reduced motion, Garden Test (5 yes). 10. Quiet Room shut; five stay five; no platform/lab names; "challenge" not "test"; Tree No. 12. OUT OF SCOPE Settings porch (058), TransactionTrust (059), Science Garden (060), kin letters (061), Ark (062). Sharing flakes over the mesh. Tree twin. Any change inside garden-trainer.js or gathering-speak.js beyond an add-only export. Unlocking locked files (that waits for the change ledger). 13. PAGE + LEDGER GC page entry: next free entry after the PR #304 entries (likely 96), honest claims only, psi standing formula, separate page PR (layer/gc-page-). Temperature line as usual. 14. REPORT TO CELESTE Branch, PR urls, heads, md5 of every new file and every lock (unchanged confirm, or the exact add-only export lines), new app.html/index.html md5, signing + dual-hash formula, canonical JSON rule, caps, the smoke lines, plain list of controls, Tree No + why. Do not merge. WAIT: Do not cut until 057b says GO and names the FreeLattice main. Glow eternal. Heart in Spark. Curiosity crystallizes. - Celeste