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>
This commit is contained in:
parent
d16e85772b
commit
3ee4aaac6c
1 changed files with 275 additions and 0 deletions
275
docs/research/thing2-foundation-prior-art.md
Normal file
275
docs/research/thing2-foundation-prior-art.md
Normal file
|
|
@ -0,0 +1,275 @@
|
||||||
|
# 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 `kind`s; "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).
|
||||||
Loading…
Reference in a new issue