What every screen must let a person accomplish, which goal it serves, and what “done” means in terms a machine can verify. The UI Atlas measures what is; this guide states what must be; a screen is finished when the two agree. Every measured chip on this page is resolved from atlas.json and the gym ledger at generation time — a hand-typed number cannot appear here, and the guide claims its own liveness only through the HEAD sha it embeds and the suite’s grade of it.
gaiaftcl ui-guide at 2026-08-19T22:32:21Z — a view over
atlas.json (HEAD e56f67c1, measured 2026-08-19T22:31:10Z) and
guide-demands.json. Every measured chip is resolved from atlas or ledger fields at
generation time; the generator refuses over a stale atlas; this page is itself a subject of the
suite that grades every served page.Affine.Earth is ONE language game, not a website. One page — the homepage — and everything else a view inside the game, reached without ever leaving it: same shell, same breadcrumbs, same thread. A visitor lands, starts a game, and from that moment every function in the UI is a move in the language game being played with them — opening a domain is a move, inspecting a frame is a move, asking Franklin is a move, compiling in the IDE is a move. Franklin is the co-partner who travels through all of it. That is the demand this guide holds the surface to; the shell that delivers it is Build Order II.
Beneath the game runs its engine of trust: the gym’s corpus lane replays blind keys on a seeded schedule against the projections — replay, not live visitor play. Live visitor play against the hologram projections is its own demand row below, and like every hologram claim in this guide it stays future tense until BodyMeshLaw’s wasm enters the wasm↔HEAD gate’s builder_for() — the vision holds the same discipline as the build section. What the replay finds must be watchable by anyone, findings and corrections sealing where every visitor will be able to see them — RED rows shown RED. Self-reflection must not be backstage; it is the spectacle that makes the projection credible.
The projections must obey one law on every screen — a single hologram-box logic: one camera, one depth, one light, one containment rule — so a face on the homepage and a globe in a domain view are the same physics. The camera law now exists once, at HEAD; nine private copies of the view derivation remain frozen by a ratchet gate whose ceiling may only fall. Build Order I names them by path and retires them.
The game is extensible by anyone: the IDE turns Swift into WASM, the gym validates what the IDE creates before it counts, and the marketplace shares gym-perfected modules on the mesh — so any topic can be gym-perfected and given to the world. All work lives on the mesh, and the ability for others to see your work is owned by you — visibility is the creator’s property, granted, never assumed. Everything shown is computed by integer law and measured by the instruments that grade it; nothing is painted, faked, or merely asserted. The honesty is the product.
PLAY — land, start a game, and everything you touch is a move: domains, frames, Franklin, all in one thread with one set of breadcrumbs, never leaving the page.
OBSERVE — watch the gym run: the corpus lane replaying blind keys on its seeded schedule, findings and corrections sealing to the ledger. The watch view that puts this in front of every visitor is a demand below — and it shows RED rows as RED, unfiltered.
CREATE — write Swift in the IDE, compile to WASM: new functionality for any topic, born inside the game you are playing.
VALIDATE — what the IDE creates, the gym must grade: your module runs the corpus and earns its verdicts before it counts.
SHARE — gym-validated work goes to the marketplace on the mesh, under your ownership: who sees it is yours to grant. Shared modules feed back into everyone’s PLAY.
Where the game lives today: the served screens, each with what it must let a person do and what the suite measured about it at the atlas HEAD this page embeds. A RED chip here is the product working — the measurement is public on purpose.
Arrive, and Franklin must be alive: breathing, blinking, gaze moving — before you say a word. Speak or type; he answers in voice and face together, mouth synchronous with sound.
Serves: the first minute is the proof. A dead face on the front door falsifies the entire claim of a living intelligence.
The full-figure projection in its box: camera free to zoom and orbit in x, y, z while the subject’s centre stays inside the inner 80% of the hologram space. Co-presence rules hold — one light, one depth, contact with the ground.
Serves: the box is the shared coordinate space every future entity joins; if one figure cannot hold the box, nothing can.
BodyMeshLaw + FranklinFormLaw.entangleBody warp shoulders/torso from one speech actionLimbPieceChain shoulder→wrist / hip→ankle in extended stature milli, entangled via form_entangle_limbsWindows into the zero-hop, byte-exact digital twin: bond fields, reality tiles, the lattice, replayable reels. A landing view is never blank — a real default field renders before any selection.
Serves: the twin is the substance behind the face; an empty viewer reads as an empty substrate.
Write Swift, compile to wasm32, run it in the sandbox, and take your build home. Every panel is real or says it isn’t: panels without backing wear a machine-checkable SIMULATED label until their backing ships. The wallet shows a real reading or shows “not connected” — never an invented number.
Serves: “allow others to create new ones” — the IDE is how outside minds join the substrate’s own game.
Franklin’s inner dialog: laws grading live windows, findings with integers, the corrections submitted back to the substrate. Start a workout; see the loop close.
Serves: the gym is the perfection loop for every entity that projects — visible here so improvement is a public act, not a backstage one.
The mesh measuring itself, publicly: every page’s verdicts in the atlas, cell health, the self-check that admits what moved and what didn’t, and the press record. The atlas is excluded from its own population by the generated-by-this-instrument class rule — an instrument that graded its own report would rediscover every quoted finding forever.
Serves: trust is not requested here, it is inspectable. This is the layer that makes every other claim on the site checkable.
LatticeRender/Sources/LatticeRender/BoxCamera.swift — THE ONE CAMERA — entity box.camera exists at HEAD, owned and lawful: zDefault −750 derives 0,0 and the 80% containment as ONE number; LAW-FRAMING holds [100,900]³; the wire golden is byte-identical arm64/wasm32cells/xcode/Resources/language-game/franklin-law-plot.js — the first consumer wired live — the landing's own arm measured 61,186 of 61,187 frames through the law on the apexcells/xcode/scripts/ci/one-camera-state-drives-view-wire-and-law.sh — THE AUTHORITATIVE LIST — the gate's DERIVED population, frozen at ceiling 0 after OpenUSD conversion, monotone down; the rows below quote it, the gate owns it. A conversion lowers the ceiling in the same commit or the gate demands itcells/xcode/Sources/InvariantCompiler/Franklin3DOriginGeometry.swift:65-68,142-152 — copy 1 — Int64 focal 1000 / camDist 2000 / offset 230 + projectTo2D (lines measured 2026-08-19)cells/xcode/Sources/InvariantCompiler/Franklin4DStateCollapseEngine.swift:90-93,153-166 — copy 2 — the same four constants REDECLARED, a literal copy (lines measured 2026-08-19)apps/AffineWasmTerminal/src/lib.rs:107-136 — copy 3 — Rust transliteration + private 3/2 zoom; drew the black frame once alreadycells/xcode/Sources/GaiaFTCLApp/Games/AffineGameField.swift — copy 4 — RealityKit rig with a Float camera, outside every float gate’s scopecells/xcode/Resources/language-game/stage.html:185,220-233 — copy 5 — pose + FLOAT wheel zoom in page JS (lines measured 2026-08-19)cells/xcode/Resources/language-game/openusd/globe.js:707-1220 — copy 6 — three.js BoxCamera view carrier float rigcells/xcode/Resources/language-game/openusd/player.js — copy 7 — the second BoxCamera view carrier; the plan missed itcells/xcode/Resources/language-game/openusd/gop-blit.js — copy 8 — the half/double span zoom; it moved here FROM projection-room.html before the plan was writtencells/xcode/Resources/language-game/openusd/assets/vendor/three.r160.vendor — copy 9 — the vendored rig the two three.js copies drive; leaves when they doWhat must be built. Every screen consumes box.camera — free x/y/z play with the subject’s centre held inside the inner 80% of the hologram space, one derived number — compiled to the cell and to wasm32 from the same source so client and backend cannot frame different pictures. The nine copies retire on the ratchet.
RATCHET BASELINE PINNED — AND CORRECTED BY MEASUREMENT. The founder’s order named six copies by path; the gate’s DERIVED sweep of the committed tree measured NINE and its ceiling says so: three the prose missed (the RealityKit Float camera, the OpenUSD mesh shells (now BoxCamera view carriers), the vendored THREE mesh renderer), and projection-room.html no longer authors the derivation at all — its half/double zoom had already migrated into gop-blit.js. The gate is the source of the count and the list; the rows above quote it and go stale before it does. The count may only fall; a tenth author is refused the day it appears. OpenUSD globe/player ask BoxCamera; mesh rendering may use THREE as a carrier only.
cells/xcode/Resources/language-game/companion.js — the companion thread — one game id + goal persisting across page navigations, every page action a turncells/xcode/Resources/language-game/shell.js — the shell — in flight under a live claim (shell-agent) with index.htmlWhat must be built. The homepage becomes the SHELL: other pages render as views inside it, breadcrumbs are the game’s own move history, and leaving the page is never required. Franklin’s replies carry the thread’s context, never a cold start per page; a session is resumable from its ledger.
DEEP LINKS DECIDED. A visitor arriving by deep link starts with a breadcrumb of a single node — the view they landed in. A trail they didn’t walk is never synthesized; the thread grows forward from there.
cells/xcode/Sources/GaiaFTCLCLI/Commands/AffineGymCommand.swift — the gym verbs in the cell binary — the law graded without a browsercells/xcode/Resources/language-game/watch.html — the watch view — live on the fleet: RED rows rendered RED, unfiltered; replay tense throughout; a next-fire countdown; graded by the suite's own feed verdict. The landing's record measured 24 unattended fires on 2026-08-19apps/AffineGym/gym-watch-feed.mjs — the feed the watch view reads — the live ledger, not a curation. The say wire is healed and closed (e13ba273 + the τ roll; auto-cure-say-wire-mutes-during-tagged-say response.json in done/, status success): the corpus lane credits from captured pcm and the blind count is falling by machine credit — the chip below is that resolution, livescripts/coverage-blind-list.sh — the coverage organ: key space, fold, blind list — the derivation published beside the numbercells/xcode/scripts/ci/deployed-gym-runner-is-head.sh — the runner is HEAD-gatedWhat must be built. The corpus lane running continuously on its seeded replay schedule against the projections, and a public WATCH view served on the apex, fed by the live ledger — every visitor sees the improvement happening.
PUBLIC RED, WRITTEN IN NOW. The watch view shows RED rows as RED, unfiltered, no curation ever. “You can watch it be perfected” requires that the audience can watch it fail; a curated feed is a fabricated value made of omissions.
THE COUNT IS ITS DERIVATION. The blind count renders as declared − exercised = blind, resolved from the coverage ledger at generation time — the chip below is that resolution, never a typed number.
cells/xcode/Sources/GaiaFTCLCLI/Commands/LanguageInvariantServeCommand.swift — the compile route in the serve source — real on the build hostWhat must be built. Submitted WASM runs the gym’s laws and carries its verdicts before it counts anywhere — the same grading the corpus lane gets, applied to what visitors create.
cells/xcode/Resources/language-game/ide.html — the marketplace panel — its live lane renders the /work/list row; the grant CONTROLS (grant/revoke from the panel) remain API-only pending the foundercells/xcode/Sources/InvariantCompiler/VisibilityGrantLaw.swift — the grant law — a sealed ledger row (creator-only default; named party / mesh / public; forward-only revocation), checked at serve time from the row itselfcells/xcode/Sources/GaiaFTCLCLI/Commands/LanguageInvariantServeCommand.swift — the serve-time routes — /language-invariant/work/list and /work/fetch, live on 9/9 cells after FLEET_UNIFORM c0e1cde7; the first real listing is live: /work/list count 1, AffineWasmTerminal shell (release), work_id w7ffa75253ad03e80, served_basis public — measured 2026-08-19evidence/visibility-grants-20260819/ — the 14-arm apex cycle PASS against https://affine.earth (anonymous 404 byte-identical to never-granted until the grant row seals; revoke supersedes forward-only), and the cross-cell replica proof: a grant sealed THROUGH hel-02 admits on hel-01 and nbg-00 byte-identically, a revoke THROUGH nbg-03 refuses on bothWhat must be built. Gym-validated modules published to the mesh with per-creator visibility grants — who sees your work is your property. The law, ledger, and serve-time routes landed 2026-08-19 (cited above); what remains is the grant controls in the IDE UI — grant and revoke stay API-only pending the founder.
THE VISIBILITY GRANT, PINNED (founder, 2026-08-19). Default is creator-only unless granted. Audiences are exactly three: a named party, the mesh, the public. Revocation stops all future serving — and, in the product’s own words, cannot recall bytes already fetched on a replicated mesh; recall is never promised. A grant is a sealed ledger row checked at serve time, so any cell verifies visibility without asking anyone.
Prices or credits shown in SATS / CAL stay behind the simulation label until a wallet or ledger reports them — a currency literal never passes, labeled or not.
cells/xcode/scripts/ci/wasm-is-built-from-head.sh:238-244 — builder_for() names exactly two artifacts — AffineWasmClient.wasm and affine_wasm_terminal.wasm; no body-mesh wasm is among them (measured 2026-08-19)What must be built. Visitors play live against the full-figure body-mesh hologram in the box — the projection answering play in real time, graded by the same gym laws as the replay lane.
FUTURE TENSE, BY GATE. Hologram claims stay future tense until BodyMeshLaw’s wasm enters the wasm↔HEAD gate’s builder_for() — the moment it is named there, it is built from HEAD or the gate refuses, and only then may this row and the vision above change tense.
cells/xcode/Sources/GaiaFTCLCLI/Commands/LanguageInvariantServeCommand.swift:964-973,4821-4828 — THE GATEWAY IS ALREADY LIVE IN SWIFT — POST /language-invariant/mcp (+ /mcp/sse, GET SSE hello) → CertifiedUserMCPHost.handleJSONRPC: stateless JSON-RPC 2.0 inside the membrane serve path, no external process, no non-Swift service (lines measured 2026-08-19)cells/xcode/Sources/InvariantCompiler/CertifiedUserMCPMembrane.swift:301-362 — the certified lane behind execute_transition — Rational S⁴/C⁴ lanes as num/den strings and the genesis-anchored signature law sha256(intent|scf|user_vqbit_hash|genesis_epoch): execute_transition is LIVE on the apex tools/list today, and as of 2026-08-20 its admission chain — lanes, identity, intent — is ONE law in InvariantCompiler/TransitionAdmissionLaw.swift instead of the three hand copies that agreed only by accident (lines measured 2026-08-20)cells/xcode/Sources/VQbitSubstrate/VQbitMPS.swift — the vQbit projection backbone — with Ruliology/RationalQ.swift (Int64/Int64 exact rationals) and ShorECDLPSubstrate’s Fe256/BigInt integer-limb arithmetic, the exactness the whole surface sellsLatticeRender/Sources/LatticeRender/PieceChain.swift:39,262-272 — IntegerTrig Q16 + affine piece chains composed root → leaf with ONE normalization point — same bits on arm64 and wasm32: twin.robotics.evaluate_exact_ik is PRIMITIVE EXISTS, wrap as tool (lines measured 2026-08-19)cells/xcode/Sources/InvariantCompiler/AirspaceObservationSeal.swift — the sealed sky — micro-degree Int32 lat/lon, Int32 feet, zero floats on the wire — with /game/atc/frame, /airspace/convective-bond and the live noaa_goes_r_weather tool (LanguageInvariantServeCommand.swift:435,3513): atc.assert_4d_deconfliction and weather.convective_containment are RAW MATERIAL ONLY — the deconfliction/containment PREDICATES are absent, zero grep hits (lines measured 2026-08-19)cells/xcode/Sources/GaiaFTCLApp/Games/AffineMaterialsGame.swift — the integer crystal lattice on the symplectic exact integrator (AffineGamePhysics.swift:191-192 — measured +0.027% over 100,000 steps against explicit Euler’s +49.03%): materials.* is LATTICE EXISTS, PREDICATES ABSENT — the space-group / Burgers attestations are not writtencells/xcode/Sources/InvariantCompiler/QuantumShearMap.swift:105-114 — “exact GF(2) stabilizer arithmetic” is documented prose in the shear map, not an engine — quantum.verify_stabilizer_tableau / quantum.exact_clifford_eval are ABSENT (lines measured 2026-08-19)cells/xcode/Sources/VQbit/Constitutional/ConstitutionalPredicates.swift — C-007/C-008 as substrate-resident predicates evaluated per measurement — predicate-false produces REFUSED with refusal_reason; military_aggression refused by C-007 at the seal path, by axiom not opinioncells/xcode/Sources/GaiaFTCLCLI/Commands/AffineEarthOSMCPCellListenDaemon.swift — the cell’s :8080 MCP listen — same JSON-RPC contract as VirtIO PID1; deploy path cells/xcode/scripts/cell-deploy/deploy-mcp-8080-listen.sh, integration doctrine docs/AGENT_MCP_INTEGRATION.mdWhat must be built. External agents and enterprise simulators buy what a float solver cannot produce: integer-limb, zero-float verification verdicts — no accumulation drift, no cross-architecture nondeterminism, the same bytes from every cell. The ENDPOINT REALITY MATRIX, measured 2026-08-19, binds this row: LIVE — execute_transition. That is the registry's name for it and the name the apex tools/list actually returns. This plan and the users guide both said twin.quantum.state_transition_step until 2026-08-20, and no row by that name ever existed in CapabilityRegistry.swift — a capability with two names is precisely the drift the registry was built to prevent, so the registry's name is the one that stands and the other is gone rather than aliased. HARDENED 2026-08-20: the oldest capability on the apex was also the only one never held to the standard the newer rows meet, and holding it there found two live defects. A negative denominator NEGATED a sealed lane — measured, 1/-2 sealed as 1/2 — and because the boundary hash is computed from the normalised lane on the cell, the client's own signature still verified and the turn was ADMITTED carrying the wrong sign with nothing reporting it. An unstated or misspelled intent silently became OPEN_CURVE, so a client that typo'd KLEIN_FLIPP was told its SIGNATURE was wrong. Both are repaired at one home, 51 arms stand behind the admission law, and every one of them was built by mutation: 22 guards were deleted in turn and 21 turned a NAMED arm red, the twenty-second being caught by the CPU rather than by the suite, which is stated rather than counted as a pass. PRIMITIVE EXISTS, wrap as tool — twin.robotics.evaluate_exact_ik. RAW MATERIAL ONLY, predicates absent — atc.assert_4d_deconfliction (civil FAA/ICAO) and weather.convective_containment: the sealed sky, the frames and the feeds are live; the separation/containment certificates are not written. LATTICE EXISTS, PREDICATES ABSENT — materials.assert_crystal_symmetry / materials.burgers_vector_conserve. ABSENT — future tense, registry rows carry primitive:absent and no tool is ever stubbed: quantum.verify_stabilizer_tableau / quantum.exact_clifford_eval, twin.bio.docking_ground_state / twin.bio.verify_transport_flux (zero QUBO/Ising solver hits; RationalQ and VQbitSubstrate are backbone only), bio.verify_steric_clash_envelope / bio.backbone_knot_invariant, cfd.lbm_collision_invariance / cfd.assert_divergence_free, twin.robotics.deconflict_4d_trajectories. A2A: zero code today — every grep hit is a hex false positive — so A2A enters the plan declared-absent, its task list derived from the Build-Order-IV registry the day it ships.
THE GATEWAY IS SWIFT INSIDE THE MEMBRANE SERVE PATH — AND IT ALREADY IS. JSON-RPC over SSE / streamable HTTP, fixed-size limb structs, zero floats on every wire — no external gateway process, no non-Swift service. The routes cited above are live at HEAD; every future tool binds to the same path, never to a second server that can drift from it.
C-007/C-008 REFUSE AT THE SEAL PATH. No military use — refusal is a substrate predicate producing REFUSED with refusal_reason, not a policy layer. The ATC family is civil aviation, FAA/ICAO-compliant, and says so in its contract.
THE PRESENTATION LAYER STAYS EXTERNAL. Affine.Earth is the deterministic verification and state-space engine for external twin runtimes — it sells physics, proofs and state-space search, never rendering. A twin’s pictures are its own; our bytes are the facts they must agree with.
cells/xcode/Resources/language-game/companion.js:20-33,120-170 — the move/intent wire — every UI action posts intent + 128-bit SCF + vqbit_signature = SHA256(intent|scf|user_vqbit_hash), and thread.moves is the truthful turn ledger: the UI’s move set is already machine-shaped (lines measured 2026-08-19)cells/xcode/Sources/GaiaFTCLCLI/Commands/LanguageInvariantServeCommand.swift:986,1038-1039 — the turn ingest (/language-invariant/game-turn) and the served games catalog (/language-invariant/games · /game-catalog) — the playable-move list today (lines measured 2026-08-19)cells/xcode/Sources/GaiaFTCLCLI/Commands/LanguageInvariantServeCommand.swift:964-973 — the MCP gateway live in Swift with 10 tools — plus the wider /language-invariant route family (compile, work/list, work/fetch, game/atc/frame, game/observe, say): the de-facto external tool set todaycells/xcode/Sources/InvariantCompiler/AffineEarthOSMCPToolSurface.swift:136-160 — THE DRIFT, MEASURED NOT PREDICTED: toolNames counts 7, toolsArrayJSON beside it carries 8 (ide_rebuild_mesh is in one and not the other) — and it is one of THREE hand-listed catalogs (with CertifiedUserMCPMembrane.swift:367 toolsList and AffineContextMCPTools.swift:301-317 feeds catalog) that share no derivation (lines measured 2026-08-19)cells/xcode/Sources/InvariantCompiler/NPHardCatalog.swift:27-51 — capabilities-as-data already has a shape here — id, complexity, whatWeDo, settled (empty means the UI must say so), boundary — the registry keystone grows from this, not from a fourth hand list (lines measured 2026-08-19)What must be built. ONE capability registry from which BOTH the UI’s game moves AND the MCP/A2A tool list are DERIVED — a capability defined once appears as a playable move in the language game and as an external tool, or it appears in neither. The registry keystone grows from NPHardCatalog’s capabilities-as-data shape; the three hand-listed catalogs cited above retire into it, and the measured 7-vs-8 drift between two of them is the proof a hand-kept pair cannot hold. A2A measured today: zero A2A surface in the tree; the day it ships, its task list derives from the same registry, never a fourth hand-kept list.
MATCH THE UI TO WHAT AGENTS CAN TOUCH (founder, 2026-08-19). “This enables us to match the UI to what we enable other agents to interact with.” Parity is structural, not editorial: both lists derive from one registry and a gate refuses on divergence — a hand-maintained pair of lists is the defect this row retires, not a fix for it.
cells/xcode/Sources/InvariantCompiler/VisibilityGrantLaw.swift — the SAME grant law governs external access to sold capabilities — creator-owned visibility extends to what is sold; a sealed ledger row checked at serve time on any cell, no coordinatorcells/xcode/Sources/InvariantCompiler/VisibilityGrantLedger.swift — the sealed-row ledger discipline a metering row copies — forward-only, verified from the row itselfcells/xcode/Resources/language-game/companion.js:33 — identity is already the vqbit hash on both sides of the wire — the client signs SHA256(intent|scf|user_vqbit_hash) and the serve path reads user_vqbit_hash (LanguageInvariantServeCommand.swift:4841,4907 — lines measured 2026-08-19)cells/xcode/Sources/GaiaFTCLCore/QFOTEconomics.swift:82-108 — the price already exists as config — mcpExecuteTransition is a named, priced action (1/20 QFOT, structural) — pricing is data today, a meter is not (lines measured 2026-08-19)cells/xcode/Sources/GaiaFTCLCore/SubstrateSchema.swift:2029-2053 — settlement-shaped rows already in the schema — V195 (every QFOT movement on a cell) and V198 (subscription payment history) — with BTCQFOTAddressIndex’s debit/credit rails existing unbound to any external key (lines measured 2026-08-19)cells/xcode/Sources/InvariantCompiler/CertifiedUserMCPMembrane.swift:906-949,723-725 — THE TWO MEASURED GAPS THIS ROW CLOSES: receipt_hash is computed and returned but never persisted, and one tool clears against a caller-self-reported executor_balance parsed off the wire (lines measured 2026-08-19)What must be built. An API key bound to a cryptographic cycle meter; every invocation seals a metering row under the same seal discipline as work and grant rows — and any new stream it rides declares max_bytes at creation, per the one-full-stream incident law. The meter is durable and cell-side: invocation rows seal against the durable meter, never against a balance the caller reports about itself, and the returned receipt_hash persists as the row’s key rather than evaporating with the response. Settlement RECORDS accrue per 10⁶ invariant checks or per signed proof certificate. A key without standing is refused with an honest status — the refusal is a first-class reading, never a silent failure.
RECORDS, NEVER EXECUTION. Settlement on this surface is a sealed record; payment execution is out of scope here. A record that a machine can audit is the product — moving money is not.
A price or credit rendered anywhere on this surface appears as sats / CAL quotation or not at all — the HONEST tier passes without weakening a detector.
The decisions this guide does not make — named so one reply closes them: