Served ruling thing:ruling:thing2-one-solver-taffy: Thing 1's per-host layout, Clay, Taffy, Yoga, AccessKit and DOM-mirror practice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 KiB
Thing 2.0: foundation prior art (Eyes pass, 2026-10-03)
Read-only facts with evidence pointers, gathered for the operator's question. No conclusions or recommendations. Facts marked [background] come from prior knowledge and were not re-fetched in this pass; everything else was read today.
The operator's words, verbatim: "I'm thinking about Thing 2.0. I think we learned a lot about what not to do with Thing 1. I feel like doing it right means building on a solid foundation with predictable affordances. Something like https://github.com/nicbarker/clay maybe?"
Part 1: Thing 1 (Eve), what the record shows
1.0 What the record does and does not contain
F:\Projects\Eve\docs\thing-campaign.md(1,352 lines, revision 4, 2026-10-02) is a rename and site campaign (Eve to Thing, the deck page on gamecult.org). It records no lessons about the UI machine itself. The eureka mind'sthingcampaign holds the same: rulings on naming, repo home, deck cuts (thing:ruling:operator-*,thing:cut_spec:cut-deck-*). No Eve architecture findings were found in the mind (semantic query, 48 matches, all rename/deck/substrate).- voidbot
search_history(Discord) returned only 2019-2021 Aetheria UI chatter; nothing on Eve. The operator's Eve words below come from Codex session logs (C:\Users\Meta\.codex\sessions\...) and Claude transcripts.
1.1 Operator's own words (verbatim, with source)
| Date | Words | Source |
|---|---|---|
| 2026-07-02 | "Aetheria view is still busted. All commands are failing, and the layouts are quite bad. Go look at the main menu, it's very confused" | .codex/sessions/2026/07/02/rollout-2026-07-02T12-43-25-...jsonl |
| 2026-07-02 | "...deferred scalar field lowering needs to be an Eve feature, not an Aetheria Electron feature" | same file |
| 2026-07-02 | "...doesn't Eve provide bindings to CultMesh reactive typed state? Eir shouldn't have to reload to display new contents" | .codex/sessions/2026/07/02/rollout-2026-07-02T14-05-11-...jsonl |
| 2026-06-17 | "And if an Eve surface contains a pointer to daemon state, the UI runtime should resolve that automatically" | .codex/sessions/2026/06/17/rollout-2026-06-17T22-22-21-...jsonl |
| 2026-07-10 | "...avoid a giant Eve monorepo as the long-term shape. It will feel good while everything is young, then become a swamp: every runtime build system, plugin fixture, platform SDK, and product demo starts sharing one git status. We are already seeing the smell." | .codex/sessions/2026/07/10/rollout-2026-07-10T02-54-*.jsonl (may be a pasted plan the operator endorsed; the message is in the user turn) |
| undated (Claude) | "the login button returns invalid Eve command result: data must not have additional properties" | a Claude transcript under C:\Users\Meta\.claude\projects\ |
| undated (Claude) | "they're separate, Eve CultUI is the lowering target. I'm not sure about the state of the Unity package, it kinda fell behind in the rush to build Eve" | Claude transcript; also memory F--Projects/memory (Unity CultUI vs Eve CultUI note) |
| 2026-10-03 (above) | AetheriaEve: "an abomination preserved for taxidermy" | Claude transcript |
1.2 Body facts (read today)
Layout semantics are delegated to each host's native layout engine.
- The contract (
Eve/docs/surface-contract-v1.mdl.32, 78-110) is a retained component tree,surface.root, with semantickinds; "Kinds are semantic, not HTML tags. Renderers lower them to native controls". Unknown kinds fall back along the kind path (panel.dialoguetopanel). - Layout vocabulary (
Eve/docs/cultui-style-system.mdl.22, 80-140): partition-first tree, relative or absolute division,sizeinauto,content, px, percent, viewport units orfr;min/max;clip;scroll. - No shared layout solver exists. The browser lowering
(
Eve/packages/eve-browser-lowering/src/index.ts, 2,680 lines) maps layout props onto CSS flexbox (flexDirection,flexWrapat l.679, 1057-1059) and measures withgetBoundingClientRect. Flutter (EveFlutter/lib/main.dart, 1,512 lines, one file) and Unity UI Toolkit (EveUnity/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs, 900 lines) each re-interpret the same props with their own widgets/engine. Unity UI Toolkit's engine "uses the layout principles of Yoga" (docs.unity3d.com/Manual/UIE-LayoutEngine.html). Eve/docs/cultmesh-streaming-ui-framework.mdl.19: "Browser renderer: owns canonical layout behavior, accessibility semantics"; l.120 "the canonical behavior still belongs to the browser Eve runtime".renderer-parity.mdnames the web reference "the first renderer that can be used as a practical comparison oracle". So the layout spec is, in practice, whatever Chrome's flexbox does with the browser lowering's mapping.
Per-renderer component implementations.
- Each runtime carries its own lowerer for the full kind set: web TS (2,680),
Flutter Dart (1,512), Unity UITK (900) plus Unity scene lowerer (932) plus a
1,544-line Unity CultMesh live transport
(
EveUnity/.../Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs), iOS UIKit "EveCanvas", native Android/Kotlin, Fensalir Direct2D spike, EveTui (EveTui/src/eve-tui-shell.mjs, 297 lines). EveElectron 64 lines. - The contract keeps adding domain kinds:
inventory.grid,inventory.item,inventory.drag_sessionas "standard Eve component kinds" (surface-contract-v1.mdl.311-330),vn.stage,embeddedDocumentsslots, scalar/vector field lowering, Japanese-capable font roles and TUI pixel roles (l.359-392). 41 distinct"kind"values appear acrossEve/web/fixtures. - Operator, 2026-07-02, asked that deferred scalar-field lowering move from an Aetheria Electron feature into Eve (1.1).
Parity is evidence-heavy and admitted uneven.
Eve/docs/renderer-parity.md: "Parity is currently uneven by design." Target is "recognizable CultUI fidelity", not pixel identity. Table rows: Flutter "Needs native window capture and tighter text/style normalization"; iOS "Not a plugin projection acceptance target"; Android Kotlin "Not a plugin projection acceptance target"; Fensalir "External adapter spike, not active parity runtime".Eve/docs/parity-testing-harness.md(681 lines): a manifest (tools/parity/parity-manifest.json) of fixtures x runtimes, PNG captures per platform (phone/tablet/desktop; SSH capture on Nightwing, Periwinkle, iOS), runtime capability manifests, and exported gap ledgers (capabilityGaps[],worldSurfaceLoweringGaps[],runtimePluginProjectionGaps[], command-boundary coverage). Parity is asserted on features/claims and screenshots, not on computed geometry.- Eve git: 381 commits; 18 match layout/parity/wrap/overflow (e.g.
e81c81b Measure Sai web layout probe,c0c17be Add web layout probe evidence,c4cd5b5 Polish native Odin wall layout).
Live CultMesh loop.
renderer-parity.md: web reference "Needs live Odin/CultMesh provider feed and command round-trip tests"; Android Flutter "Needs live provider picker and command transport beyond fixture assets"; iOS "still needs provider picker and command transport". The local provider list is a fixture catalog (web/local-provider-catalog.json); live discovery "still belongs to CultMesh/Odin advertisements".- Operator words on reload, auto-resolving state pointers, failing commands and a schema-rejected command result (1.1).
Text and input.
Eve/docs/input-capabilities.mdexists; no Eve doc mentions IME, caret or screen readers (grep ofEve/docs/*.mdforime|caret|accessib|aria|screen readerhit only the "accessibility semantics" ownership line above).control.inputis a kind (surface-contract-v1.mdl.105). Text styling normalization is a named Flutter gap. Font fallback for Japanese is a contract requirement (l.372-387).
Repo shape. Eight repos (Eve, EveUnity, EveFlutter, EveElectron, EveTui,
EvePlugins, EveConformance, AetheriaEve); last commits 2026-07 to 2026-09
(thing-campaign.md B1). The Unity CultUI package in CultLib "fell behind"
(operator) and is a separate lineage.
1.3 Agent inferences (not operator words)
- "The composition model learns from the old Unity CultUI without preserving its
construction accident ... not vertical-first layout" (
surface-contract-v1.mdl.56-58, agent-written doc). - The repo-strategy text attributed in 1.1 to 2026-07-10 reads like an agent's plan; its authorship in the user turn is a fact, its origin is not.
- Pairing of operator complaints with the absence of a shared solver (1.2) is this pass's juxtaposition, not a recorded diagnosis.
Part 2: layout and UI foundations
2.1 Clay (nicbarker/clay), read from README and GitHub API today
- Licence Zlib. Single header
clay.h, C99/C++20, no dependencies. 18.2k stars, 279 open issues, last push 2026-05-20; latest release v0.14, 2025-06-06 (v0.13 2025-02, v0.12 2024-10). Pre-1.0. - Model: per frame,
Clay_SetLayoutDimensions->Clay_SetPointerState->Clay_UpdateScrollContainers->Clay_BeginLayout->CLAY()declarations ->Clay_EndLayout(deltaTime)returns a sortedClay_RenderCommandArray(README l.617-621, l.109). Immediate-mode declaration; Clay retains element state internally by ID (CLAY_ID,CLAY_IDIfor loops, l.305-309). Memory is a caller-provided arena (Clay_MinMemorySize,Clay_Initialize); multiple contexts allowed (l.587-601). - Layout model: flex-like row/column (
layoutDirectionCLAY_LEFT_TO_RIGHT/TOP_TO_BOTTOM),padding,childGap, alignment; sizingCLAY_SIZING_FIT | GROW | FIXED | PERCENTwith min/max. No CSS Grid, no wrap-to-next-row container in the sizing set. - Render commands (complete enum in README):
NONE, RECTANGLE, BORDER, TEXT, IMAGE, SCISSOR_START, SCISSOR_END, OVERLAY_COLOR_START, OVERLAY_COLOR_END, CUSTOM. Text commands are emitted one per wrapped line (l.1034). Transitions API withdeltaTime(l.7, l.489). - Text measurement: user callback
Clay_SetMeasureTextFunction(...)returning width/height; "It is essential that this function is as fast as possible"; Clay caches measurements internally (l.643-649). Wrap modes: words, newlines, none. Shaping, fonts, bidi are the host's. - Scroll and floating: scroll containers via
Clay_UpdateScrollContainers(wheel and drag, smoothing by deltaTime) andClay_GetScrollOffset; floating elements withattachTo(e.g.CLAY_ATTACH_TO_PARENT) and z-index, outside normal flow (l.419). - Input helpers:
Clay_SetPointerState,Clay_Hovered(),Clay_OnHover(cb),Clay_PointerOver(id). Hit boxes are "from the last frame"; README suggests running layout twice per frame if that matters (l.368-373). No keyboard focus model. - Not present: the README has no mention of text input/editing, IME,
keyboard focus or accessibility (grep empty). The web HTML renderer
renderers/web/html/clay-html-renderer.htmlcontains noaria/roleattributes (grep count 0). - Bindings: README "supported bindings": Odin (in-repo) and Rust
(
clay-ui-rs/clay; crateclay-layout0.4.0, updated 2025-06-03, 3,779 downloads). Other implementations: three Go ports. No C#, TypeScript, Dart, Swift or Kotlin binding is listed; the web path is the C header compiled to wasm with clang ("15kb uncompressed .wasm", README l.9). - Renderers in repo (
renderers/): GLES3, SDL2, SDL3, cairo, playdate, raylib, sokol, termbox2, terminal, web (canvas2d,html, prebuiltclay.wasm), win32_gdi. - Performance claim: "Microsecond layout performance" (README l.5); no benchmark table in the README.
2.2 Taffy (DioxusLabs/taffy)
- MIT. 3.6k stars, pushed 2026-10-03, release v0.14.0 2026-08-24.
- Implements CSS Block, Flexbox and CSS Grid (README l.15). Retained tree
TaffyTree<NodeContext>withnew_leaf,new_with_children,compute_layout,layout(node); also a low-level trait API for hosts that own their own tree [background:LayoutPartialTreeetc.]. Leaf measure functions supply text/intrinsic sizes; Taffy does no text layout (README benchmarks note: "require text layout, which neither yoga nor taffy implement"). - Users listed in README: Servo, Blitz, Bevy, Takumi, iocraft (terminal UIs), Slint, Lapce/Floem, Zed/GPUI.
- Bindings: Python (
stretchable); C and WASM bindings are WIP PRs (#404, #394). No official C#/TS/Dart binding. - Tests: "Flexbox layouts are tested by validating that layouts written in this
crate perform the same as in Chrome": HTML fixtures in
test_fixtures/,just gentestdrives Chrome via webdriver and generates Rust tests intotests/generated(CONTRIBUTING.md l.26-35). - README benchmarks vs Yoga (M1 Pro, layout only): comparable, each wins some (e.g. 1,000 nested nodes 329 µs Taffy vs 365 µs Yoga; 100k wide 247 ms vs 136 ms).
2.3 Yoga (facebook/yoga)
- MIT. 18.9k stars, pushed 2026-10-01; latest release v3.2.1 2024-12-13; npm
yoga-layout3.2.1. - "An embeddable and performant flexbox layout engine with bindings for
multiple languages." Repo top level: C++ core (
yoga/),java/,javascript/(wasm),Package.swift; no C# directory today. - Users [background]: React Native, Litho, ComponentKit; Unity UI Toolkit follows Yoga's layout principles (Unity manual, read today).
- Tests:
gentest/(gentest-driver.ts,fixtures/,test-template.html) generates cross-language tests from browser-computed layouts, the same pattern Taffy copied. Flexbox only, no Grid.
2.4 Contrast, briefly
- Morphorm (vizia/morphorm): MIT, 334 stars, pushed 2026-08-21. Layout by stacking with "space" and "stretch" units rather than CSS rules [background on the unit model]; used by Vizia.
- egui [background]: immediate mode, single-pass layout during
declaration (sizes known only after drawing, hence "sizing pass" tricks);
output is
epaintclipped shapes/meshes to thin backends (wgpu, glow, web canvas via eframe); integrates AccessKit; text editing is in-crate. - Slint: uses Taffy (README list) under its own declarative language; renderers femtovg/Skia/software [background].
- Flutter [background]: retained RenderObject tree, "constraints go
down, sizes go up"; the engine paints display lists via Skia/Impeller.
On the web, CanvasKit draws to canvas while a parallel DOM semantics tree
(
flt-semantics) carries accessibility and a hidden DOM input element carries text editing and IME.
2.5 Pattern: typed retained document -> layout -> render commands -> thin backends
- Clay is the direct instance of the last two arrows: one solver, a closed
10-type command list, backends that only draw rectangles/borders/text
lines/images/scissors (
renderers/*, including terminal and termbox2). - Taffy and Yoga cover the solver over a retained tree; the host owns the tree shape, the measure callbacks and painting.
- Parity techniques found in primary sources:
- Taffy and Yoga: generated geometry tests from a reference browser
(
test_fixtures+ gentest), asserting computed boxes, not pixels. - Eve today: screenshot captures per device plus capability/gap ledgers
(
parity-testing-harness.md); no geometry or render-command assertion. - With a single solver emitting commands, the command array is a renderer-independent artifact that can be compared directly; no project read in this pass publishes such a golden-command suite (not found, not searched exhaustively).
- Taffy and Yoga: generated geometry tests from a reference browser
(
2.6 Text input and accessibility for canvas-style renderers on the web
- AccessKit (BSD-3 and MIT/Apache files in repo; pushed 2026-09-29): a
schema for an accessibility tree pushed by the toolkit; "only the platform
adapter needs to retain a complete accessibility tree", which the README
says suits immediate-mode toolkits. Released adapters: Android, iOS, macOS,
Unix (AT-SPI), Windows (UIA). Web adapter is listed under "Planned
adapters": "web (for applications that render their own UI elements to a
canvas)". C bindings (
accesskit-c) and Python bindings exist. - DOM mirroring is the shipped web practice in Flutter web (2.4, background) and is the only web path visible here; Clay's own HTML renderer emits plain DOM without ARIA.
- Text editing/IME: Clay, Taffy and Yoga all leave it to the host. Eve's browser lowering currently gets native inputs from the DOM it builds.
Pointers
- Eve docs:
F:\Projects\Eve\docs\{thing-campaign,renderer-parity,parity-testing-harness,surface-contract-v1,cultui-style-system,cultmesh-streaming-ui-framework}.md - Lowerers:
F:\Projects\Eve\packages\eve-browser-lowering\src\index.ts,F:\Projects\EveFlutter\lib\main.dart,F:\Projects\EveUnity\packages\org.gamecult.eve.unity-uitoolkit\Runtime\EveUiToolkitSurfaceLowerer.cs,F:\Projects\EveTui\src\eve-tui-shell.mjs - Clay: github.com/nicbarker/clay (README,
renderers/); Taffy: github.com/DioxusLabs/taffy (README, CONTRIBUTING.md); Yoga: github.com/facebook/yoga (gentest/); AccessKit: github.com/AccessKit/accesskit (README).