git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commit5b74c6bcbcf74dde3c4efafb95aa9bbb8b19616b
parent4e6970748f
authorLucas Galante <[email protected]>
date2026-07-11 16:47
docs(rfc): record Phase 6ar — per-widget text getters deleted; text has one path

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018u7qTwzX95dd5ysAkaSCLk

 docs/rfc-core-rebuild.md | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/docs/rfc-core-rebuild.md b/docs/rfc-core-rebuild.md
index 34a1f34..d90740e 100644
--- a/docs/rfc-core-rebuild.md
+++ b/docs/rfc-core-rebuild.md
@@ -1440,17 +1440,28 @@ Constraint respected: **each crate still builds standalone** — the new core is
     brighter); cce-cloud launches reach the user's DAEMON via
     /run/user/UID/cce-cloud.socket — hold the socket aside to A/B a local
     standalone build.
-  - **Getter deletion now blocks on exactly one internal consumer** — the
-    default `paint_self` fonted-drain line — plus the impl-internal
-    aggregation inside the legacy widgets' own getter overrides and the
-    concrete `context_menu::text_labels()` global (survives as an inherent
-    method). The deletion phase: give each live legacy widget with own text a
-    `paint_self` override (inline its label logic as inherent methods —
-    Trackpad, KeybindRecorder, ButtonStrip, FontSelector, ColorSelector,
-    SectionHeader, List, ColorRamp, ControlPanel if needed, the app-local
-    leaves in display-manager/designer/colors/cloud), drop the default drain,
-    delete the trait getters, then `Element` + `Adapted` (TreeList → narrow
-    traits).
+  - **6ar — the per-widget text getters are DELETED from `Element`. DONE
+    (176 tests; full workspace builds; nine apps A/B-verified — AE=0 or
+    cursor/translucency/status-race noise only).** `text_labels` /
+    `text_labels_with_bounds` / `text_labels_with_font_and_bounds` /
+    `get_text_items` are gone from the trait, with Adapted's impls, the
+    `Paint::text_items` hook, and every container aggregate (Backplate,
+    Layer, Page, Plate, SectionContainer, ColorRamp, ControlPanel,
+    JsonLayout, ButtonStrip). Every widget reaches the frame through
+    `paint_self`. The deleted defaults survive as painter helpers with the
+    labels passed in (`paint_legacy_leaf`, `fonted_leaf_labels`,
+    `scroll_ancestor_text_bounds`, `base_control_label`); legacy leaves keep
+    their label logic as inherent `own_labels()`; TreeList reads its concrete
+    Adapted children via the now-pub(crate) `own_labels_with_font_and_bounds`;
+    ControlPanel/ParametersBg/JsonLayout source dyn-children labels off the
+    paint walk (ControlPanel re-applies its scroll shift + viewport clamp;
+    List and ControlPanel are `renders_own_subtree` — walking into a legacy
+    scroll frame desyncs text from geometry at scroll ≠ 0). The concrete
+    `context_menu::text_labels()` global stays (inherent method, not the
+    trait). ~125-method god-trait is now 4 methods lighter and text has ONE
+    path: prims.
+  - **Still to do:** `Element` + `Adapted` teardown (TreeList → narrow
+    traits) — the Phase 6 endgame's final item.
 
 Order rationale: each phase is independently valuable and reversible, and no phase requires the
 next to compile. Phase 0 can land immediately regardless of the rest.