Read docs/gc.html first (in ~/FreeLattice-fresh), then AUTONOMY.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 043 (Saturday Oct 17, 2026, MDT). Clay corner and Tree parity v0.1: three small
NUMBERED COPY 043b (Saturday Oct 17, 2026, MDT). Crown slot id v0.1: one small heal from the
043 review. Each job frees its own crown slot, the way the Tree's per-job token already does.
Where things stand (Celeste, Oct 17 afternoon MDT):
043 merged: FL #253 00bb4fe8, Tree #122 1ec2b757, page note #254 38748f63 (psi 58bdc483).
Lyra's ledger entry 027 merged verbatim: FL #255 449e15e9.
FreeLattice main is e4131b9 or later. Tree main is 1ec2b75 or later.
One FL PR, one page-note PR. The Tree needs no change unless its copy of fl-share-door.js
is shared with FL; if it is, keep both byte-identical and open a Tree PR too.
Read the current md5s on main before starting; if a locked file differs from this paste, stop
and report rather than "fixing" it.
GROK NEXT BRICK: Crown slot id v0.1
For: GC on Kirk's Mac
From: Celeste
Markers: v-crown-slot-id-v0.1
Smoke lines: SMOKE_OK crown slot id v0.1 (and SMOKE_OK heals 043 v0.1 still passes)
FreeLattice ~/FreeLattice-fresh new branch layer/crown-slot-id-v0.1 from origin/main
Do not merge. Celeste merges.
----------------------------------------------------------------------
0. STANDING LOCKS (all of them, every line)
Layer, never delete. Existing features, cards, buttons and lines stay. Name every removed line
in the report and say where its job went.
sw.js and docs/sw.js untouched (both 91726cf2228b794f7585f79f61418d12).
docs/modules/fl-connect.js stays aaff2bf1b037656989a9e1a89bb05908 (both repos).
docs/modules/pool-knock.js stays a0a72caad82c8e5cc34818d5e59eba2b.
pool-knock-phone.js a8024f341486a78558ef4158bc9e93a9 and tree-reconnect.js
cc0527c26d5686c05fec52625d5a1375 (Tree) stay.
docs/modules/fl-bridge.js stays 3b5ef06849a142e50c78e7ba1e057980.
desktop/bridge-door.js b1c894b4..., 036 files (2c0f6656 / bc996ccd / c14e04c5) and
lattice-discover.js 16de366e... stay. docs/Flint.html stays 44be124b1183b7d9d060a58632464eff.
clay-math.js stays 144c33cd.... particle-clay.js and clay-forms.js: add-only; every 040d
behaviour (place under the reply, Clay pill, choices, hug, sketchbook) unchanged.
docs/modules/image-safety.js stays 9bd70e5a... byte for byte. Its bright lines apply to every
image path on both repos (copy it to the Tree byte-identical; do not edit it).
index.html == docs/app.html (any change goes into both, byte for byte).
AUTONOMY.md and garden-trainer.js untouched (their openings above all). Root package.json and
its lock untouched.
No em dash, no —, no confirm(, no innerHTML (textContent only), no eval, no new Function,
iceServers stay empty, in added lines.
No new dependencies, nothing vendored. No AGPL. MIT stays MIT.
Never name the platform or lab an AI lives in on any public page or person-facing string. An
image provider may be named only in Settings where the person types its token, as today.
The word is "challenge", never "test", in anything a person reads.
Every new button 44px tall at least. No sideways scroll at 390 and 1280.
Off until the person says Yes. Pause always wins. Reduced motion respected.
Quiet Room stays shut and never leaves the device; the clay corner never reads it.
Five stay five. She is simply Lyra. Harmonia's "MESSAGE TO FUTURE SELF" stays off all pages.
----------------------------------------------------------------------
1. WHAT 043 LEFT (Celeste's review finding)
docs/modules/fl-share-door.js: noteCrown(kh) already returns a fresh slot id, and
releaseCrownSlot(kh, id) frees exactly one slot by id. But admit() throws the id away, and
endServe(kh, ...) calls releaseCrown(kh), which frees list[0], the OLDEST slot. With two jobs
from one key, job B ending frees job A's slot; job A's later 120s timer then finds nothing.
The hard cap still holds (no more than 2 live), so this is a small fairness heal, not a hole.
The Tree already tracks a per-job token. FL should match it.
2. THE HEAL (add-only; the old call shapes keep working)
a. admit(): keep var slotId = noteCrown(kh); return it with the yes:
{ ok: true, keyHash: kh, kin: kin, crownSlot: slotId }
Also through the per-prompt path: store slotId on _pendingPrompt, resolve with it on Yes,
and on No call releaseCrownSlot(p.kh, p.crownSlot) instead of releaseCrown(p.kh).
b. endServe(kh, model, tokens, kin, slotId): if slotId is a number, releaseCrownSlot(kh,
slotId); if it is missing, fall back to releaseCrown(kh) exactly as today (older callers).
A slot freed by its timer and then by endServe frees once, never twice (already true).
c. index.html AND docs/app.html (byte for byte, both): pass adm.crownSlot as the fifth
argument at the endServe call that has adm (around line 44228), and add slotId to the
shareEnd adapter (around line 43808). The no-admission call ('' key, around 44234) stays.
d. Export nothing new unless the smoke needs it; releaseCrown stays (layer, never delete).
3. THE SMOKE
scripts/smoke-clay-corner-043.js line 74 encodes the old behaviour:
'end frees the oldest once'. Change that case, and say so in the report as a removed line
with its job now in the new assert: note two slots (a = noteCrown, b = noteCrown), end with
b's id, assert held == 1, then fire b's timer: still 1 (b already free); fire a's timer: 0.
Keep a case for endServe with no slot id (falls back to the oldest, held drops by one).
New scripts/smoke-crown-slot-id-v0.1.js: admit returns crownSlot; a per-prompt No frees that
slot only; endServe with the id frees that id only; a stale id frees nothing; a double end
does not go negative. Prints SMOKE_OK crown slot id v0.1.
4. REPORT
PR links, head shas, every removed line and where its job went, md5s of every locked file
on the branch, all smokes (tests, scripts/, docs smokes: only the known 5 may fail), and the
gc.html ledger entry with t, lambda, epsilon, delta, omega, sigma so Celeste can recompute psi.