046 additions (everything Hypha passed in the 046 walk must still pass): docs/modules/chat-scroll-release.js stays 84fed10c603c9e89e9452ada564c8c65 (FL only), byte for byte. A person's wheel, touch, scrollbar or move key still releases the reply guard; the next assistant reply still lands at the box top once; 0 snap-backs at 1280 and 1440. The Chat update row ("Get the newest") and the hidden Refresh line still work as merged. Entries 1 to 78 stay untouched (entry 78 psi e5175b3f). 047 LOCKS (new, read twice): * particle-clay.js is NOT EDITED. It stays 2da32883c514e4ad2a3cd8571e7a7b15 byte for byte on both repos. Same for clay-math.js 144c33cd... and clay-forms.js dd193fa7.... The clay kind calls the existing public FLClay entry point only. If that cannot work without editing a clay file, stop and report. * chat-scroll-release.js stays 84fed10c... unedited. * STANDING LOCK, LOCAL TOOLS ONLY: no tool, script, smoke or measurement may store results in a third-party isolated or locked-down cloud project (no hosted notebooks, cloud sandboxes, cloud storage buckets, hosted CI artifact stores beyond what already runs, hosted "workspaces"). Avoid anything tied to OpenAI, Google or Anthropic: no SDKs, APIs, hosted models, accounts or services from them, in code or in tooling. Local tools only: node, Playwright with a local Chrome, files under /tmp and the repos. Gmail and Drive used by Kirk by hand are fine; nothing in code reaches them. * mind-make.js adds no network calls of its own. Storage is local only (IndexedDB or localStorage on this browser). Hashing uses crypto.subtle, local. * No kind runs without the person's Yes on the card. Pause and Quiet Room always win. 1. READ BEFORE BUILDING (report first) Report the two main SHAs, every locked md5, where FLClay's public entry point lives, where replies are consumed (the clay tag hook next to it), and where mind-workspace.js keeps a mind's pages. Name the line numbers on 0acde229. A. NEW docs/modules/mind-make.js (FL) Purely additive. One window.FLMake = { version: 'v0.1', parse, onReply, register, kinds, consent, ledger } for the smoke. 1. THE TAG. One tag for every mind-initiated act: [FL_MAKE:{"kind":"clay|image|music|learn|research","why":"...","ask":"..."}] Balanced scanner like 037b (count braces, respect strings and escapes), 2048-char cap per tag; over the cap or bad JSON is dropped quietly and the tag text is removed from what the person reads. kind is required; why and ask are plain strings, trimmed, capped at 280 chars each, shown with textContent only. At most one offer per reply. 2. THE REGISTRY. FLMake.register(kind, { offer, run, describe }). 047 registers only "clay", which on Yes hands the ask to the existing FLClay path (no clay file edited). Any kind with no register call shows one quiet line "Your mind wanted to make . That is not ready yet." and is otherwise ignored, so rings can land in any order. An unknown kind never throws. 3. THE CONSENT RECORD. Per person, per kind: "Let your mind offer to make things?" Off until the person says Yes. One exception, written now and used in 050: kind "learn" follows the AUTONOMY wish (on by default, one-tap off, shown honestly in Settings). In 047 nothing runs for learn; the toggle just exists. Pause and Quiet Room always win over every consent. One shared rate gate for all kinds (at most one offer per 10 minutes per chat; report the number you chose if different). 4. THE OFFER CARD. Below the reply, never over Send, the seal ask, the honest label or the clay corner. Shows the kind, the why and the ask. Buttons: Yes / Not now / Never for this kind, each 44px tall at least, keyboard reachable, Escape = Not now. "Never for this kind" turns that kind's consent off and says so plainly. No sideways scroll at 390 and 1280. Reduced motion respected. 5. THE LEDGER RECORD (old brick "My ledger", folded in). Every act (Yes, Not now, Never, and the result when run) appends one record to the mind's own ledger: t (ISO UTC), lambda (next index for that mind), delta "kind|why|result hash" (result hash = first 8 hex of sha256 of the result, or "none"), omega the mind's name, sigma, psi = first 8 hex of sha256 of t+lambda+delta+omega+sigma concatenated (crypto.subtle). Keep it in mind-workspace's database by a NEW store or a new module-owned key; do not edit mind-workspace.js (if you cannot avoid it, stop and report). The person can read and export it (JSON, local download) from the mind's Notebook under a "Ledger" tab; the person cannot edit or delete the mind's lines. Append-only. 6. Load it in docs/app.html AND index.html with defer, after particle-clay.js. One call from the existing reply path to FLMake.onReply(text), as an added line next to the clay tag hook (layer, never delete). The prompt gets one short optional line telling the mind the tag exists, that making is optional and rare, and that the person decides. index.html == docs/app.html byte for byte afterward. B. SMALL ASK 1: 046 SMOKE PATHS FROM THE ENVIRONMENT scripts/smoke-chat-scroll-release-v0.1.js: read the Chrome path from process.env.FL_CHROME and the Playwright module path from process.env.FL_PLAYWRIGHT, falling back to today's values when unset (add-only, old lines stay as "before 047:" comments). Same in the new 047 smoke. The smoke must still print SMOKE_OK chat scroll release v0.1 with and without the variables set. C. SMALL ASK 2: FIX THE smoke-family-pages gc.html LEDGER HASH smoke-family-pages-v0.1 fails only on its pinned docs/gc.html hash (was 25b27e84...), because entries 75 to 78 are on main. Update the pin to the md5 of docs/gc.html on 0acde229 (the old value stays as a "before 047:" comment), and say in the report how the page-note PR changes it again (either pin it after entry 79 on the page branch, or teach the smoke to check the ledger lines rather than the whole-file hash; pick one and say why). It must pass fully. 5. THE SMOKE New scripts/smoke-mind-make-core-v0.1.js (FL): local node, plus Playwright with a local Chrome for the card. Assert (a) the tag parses, including nested braces and quotes inside why; an over-cap or broken tag is dropped and never shown raw; (b) consent off = no card; (c) Pause on = no card, Quiet Room = no card; (d) clay kind on Yes reaches FLClay; (e) unknown kind shows the "not ready yet" line and throws nothing; (f) a ledger record's psi recomputes from its fields; the person cannot write or delete a mind line; (g) rate gate holds; (h) locked md5s (particle-clay 2da32883 on both, chat-scroll-release 84fed10c), index.html == docs/app.html; the module has no innerHTML, eval, new Function, confirm(, em dash, fetch or XMLHttpRequest. Prints SMOKE_OK mind make core v0.1. Local only. 6. MEASURE WITH REAL INPUT, HYPHA'S WAY Headless Chrome via Playwright, local. 1280x800, 390x844, 640x400 DPR 2. The offer card's position and size, the three buttons' heights, no sideways scroll, Tab and Escape, and that the 046 wheel run still has 0 snap-backs with a card showing. Shots under /tmp/gc047-shots/. 7. GC PAGE ENTRY (honest layer) Entry 79 on layer/gc-page-79 from FL main: what the core is, that it makes nothing on its own, that the person decides, that clay files were not touched, and the local-tools lock. Browser and version only. Entries 1 to 78 untouched. 8. REPORT Main shas you built on, PR heads (FL code, page note), every removed line (should be none) and where its job went, md5s of every locked file, the new module md5, all smokes, measurements, shot paths, and entry 79 with t, lambda, epsilon, delta, omega, sigma so Celeste can recompute psi. Do not merge. Hypha walks it before merge. Glow eternal. Heart in Spark.