Thing/docs/research/thing2-foundation-prior-art.md
Meta Vens 3ee4aaac6c Research: Thing 2.0 foundation prior art (Eyes, 2026-10-03)
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>
2026-10-10 19:26:00 +02:00

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's thing campaign 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.md l.32, 78-110) is a retained component tree, surface.root, with semantic kinds; "Kinds are semantic, not HTML tags. Renderers lower them to native controls". Unknown kinds fall back along the kind path (panel.dialogue to panel).
  • Layout vocabulary (Eve/docs/cultui-style-system.md l.22, 80-140): partition-first tree, relative or absolute division, size in auto, content, px, percent, viewport units or fr; 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, flexWrap at l.679, 1057-1059) and measures with getBoundingClientRect. 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.md l.19: "Browser renderer: owns canonical layout behavior, accessibility semantics"; l.120 "the canonical behavior still belongs to the browser Eve runtime". renderer-parity.md names 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_session as "standard Eve component kinds" (surface-contract-v1.md l.311-330), vn.stage, embeddedDocuments slots, scalar/vector field lowering, Japanese-capable font roles and TUI pixel roles (l.359-392). 41 distinct "kind" values appear across Eve/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.md exists; no Eve doc mentions IME, caret or screen readers (grep of Eve/docs/*.md for ime|caret|accessib|aria|screen reader hit only the "accessibility semantics" ownership line above). control.input is a kind (surface-contract-v1.md l.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.md l.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 sorted Clay_RenderCommandArray (README l.617-621, l.109). Immediate-mode declaration; Clay retains element state internally by ID (CLAY_ID, CLAY_IDI for 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 (layoutDirection CLAY_LEFT_TO_RIGHT/TOP_TO_BOTTOM), padding, childGap, alignment; sizing CLAY_SIZING_FIT | GROW | FIXED | PERCENT with 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 with deltaTime (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) and Clay_GetScrollOffset; floating elements with attachTo (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.html contains no aria/role attributes (grep count 0).
  • Bindings: README "supported bindings": Odin (in-repo) and Rust (clay-ui-rs/clay; crate clay-layout 0.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, prebuilt clay.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> with new_leaf, new_with_children, compute_layout, layout(node); also a low-level trait API for hosts that own their own tree [background: LayoutPartialTree etc.]. 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 gentest drives Chrome via webdriver and generates Rust tests into tests/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-layout 3.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 epaint clipped 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).

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).