From f679ef8034bcbb56c83ab7afbbc8badd2bf711b6 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 20 Jul 2026 19:43:47 +0000 Subject: [PATCH] docs: record the DocIr-composition seam (a2ui = DocRenderer's fourth adapter) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aligns a2ui-rs awareness with the OGAR DocIr composition grounding (#217/#218). The composition ruling generalizes this arc, it does not compete with it: render_stream.rs already says "one template projection; serve it as a living screen or re-issue it as a document." Records the OGAR-side widenings this repo will absorb as rename-follows, not re-derivations: - a2ui is DocRenderer's fourth adapter (screen == document, A3) — no parallel renderer trait - the FieldView we consume via render_field_view is the Text-leaf reading of the E-ONE-MASK-THREE-PORTS fold; when OGAR widens it to the renderer-neutral enum (struct -> FieldRow), the wasm/server/paint tiers consume the enum's fold (the paint tier's hand-rolled Skin{Form,Flow} widget dispatch becomes the variant match) — T1 holds (skins, not a second doc-IR vocabulary) - ObjectSlot = the resolve_nested L1/L2 addressing made explicit (desktop->window->region->widget = the A3 brick + ObjectRef + ResolutionMode); behavior still by address (T2) No code change — the composition types are OGAR-side named gaps. Seam record only. Generated with Claude Code --- CLAUDE.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 8cc51b6..dc03795 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -56,6 +56,42 @@ open W1 decision. **Fail-closed:** a missing/narrow role mask never falls back to "emit everything" (`full_for` is a *render* convenience, never an RBAC fallback). RBAC happens BEFORE framing — the frame is dumb transport. +## DocIr composition grounding (OGAR #217 / #218) + +The DocIr composition ruling (`AdaWorldAPI/OGAR docs/DOCIR-COMPOSITION-LAYER.md` +#217, grounded in `docs/DOCIR-COMPOSITION-GROUNDING.md` #218) is **this arc, +generalized — not a competing surface.** a2ui-rs is already the code proof: +`render_stream.rs` says *"one template projection; serve it as a living screen +or re-issue it as a document."* Ground rules that follow, so a future session +absorbs the OGAR-side widenings correctly (they are **expansions, not +rewrites**): + +- **a2ui is `DocRenderer`'s fourth adapter.** A3: *"a screen and a document are + the SAME positional projection; `DocRenderer` gains its fourth adapter."* The + live surface (this repo) sits beside askama / Typst / the paged renderers on + one `DocRenderer` trait — do NOT mint a parallel renderer trait. When OGAR + renames the doctrine's `ProjectionRenderer` to `DocRenderer`, this repo + consumes that trait. +- **The `FieldView` we consume is a fold, being widened.** `render_field_view`'s + `FieldView` (the `ogar-render-askama` struct: `position/label/predicate/value`) + is the **`Text`-leaf reading** of the `E-ONE-MASK-THREE-PORTS` fieldview fold. + OGAR is widening it to a renderer-neutral `enum FieldView {Text, Badge, Table, + ObjectSlot, Geometry, …}` (the struct becomes `FieldRow`, the `Text` payload). + When that lands upstream, `a2ui-wasm` / `a2ui-server` / `a2ui-paint` consume + the **enum's fold** — the widget-per-field-type dispatch the paint tier + already does by hand (`Skin{Form,Flow}`) becomes the enum's variant match. **T1 + holds:** the enum variants are render *skins* (the fold), never a second + closed doc-IR vocabulary beside `RegionKind`. +- **`ObjectSlot` = our nested-ClassView addressing, made explicit.** The + `resolve_nested` L1/L2 drill-down (`a2ui-wasm`) is the ObjectSlot portal: + `desktop → window → region → widget` is `ObjectSlot{target, class_view, + wide_field_mask}` recursion (the A3 Klickwege brick + an `ObjectRef` + + `ResolutionMode`). Behavior still travels by address (T2); the portal carries + a projection, never an inline handler. +- **No code change here yet** — the composition types are OGAR-side named gaps. + This section is the seam record so the widening is a rename-follow, not a + re-derivation. + ## Layout + status | crate | role | status |