Skip to content

Commit 2f70c04

Browse files
spec(047): record PR #440 + quantified V1 dispatch coverage (76/95 = 80% arms; 76/87 = 87% of V1-reachable)
Updates §14 in both the spec and tracker to reference PR #440 and add an explicit coverage table breaking the 95 legacy switch arms into 76 routed / 11 reachable-deferred / 8 permanent composition-primitive carves, plus the enumerated path-to-100% for the follow-up PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0a8aac3 commit 2f70c04

2 files changed

Lines changed: 49 additions & 14 deletions

File tree

docs/specs/047-extensible-control-model.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,20 @@ ARM64 stable-AC re-capture on `LAPTOP-4MEP83VI` remains deferred for the §14 ra
14331433

14341434
**Phase 3 finish carry-forwards:** none remaining for the typed-items host families that were on Phase 3's scope (LazyVStack/HStack, ItemsRepeater<T>, ListView<T>, GridView<T>, TreeView, FlipView (simple), TabView, Pivot). The engine surface is complete. Production swap (Phase 4 cleanup) registers each descriptor in `RegisterV1BuiltInHandlers` and deletes the matching legacy `MountXxx` switch arm.
14351435

1436-
**Phase 3 deferred / not-attempted** (recorded for the Phase 3.5 / Phase 4 prelude — element types in the legacy `Reconciler.Mount` switch that have neither a Phase 1 V1 handler nor a Phase 3 descriptor; see `tasks/047-extensible-control-model-implementation.md` for the full enumeration). **Updated in Phase 3 completion (PR 16636c0d):** the engine gap is closed (`TemplatedFlipViewElement<T>` ported via the new `PreMountedItems` ChildrenStrategy + `TemplatedFlipViewDescriptor`), and every previously-deferred descriptor on the Phase 3 batch list is now both authored AND registered in `RegisterV1BuiltInHandlers`: untyped items hosts (`GridView`, `ItemsView`, `ItemContainer`), heavy / specialized controls (`WebView2`, `NavigationView`, `TitleBar`, `MediaPlayerElement`, `AnimatedVisualPlayer`, `MapControl`, `SemanticZoom`, `AnnotatedScrollBar`, `RefreshContainer`, `SwipeControl`, `ParallaxView`), polymorphic / a11y (`IconElement` via the new `IDecoratorElementHandler` engine extension, `SemanticElement`, `AnnounceRegion`). What still ships unregistered (intentional carve list, documented inline in `RegisterV1BuiltInHandlers`): the dialog / overlay family (`ContentDialog`, `Flyout`, `Popup`, `MenuBar`, `MenuFlyout`, `CommandBar`, `CommandBarFlyout`) — modal lifecycle needs decorator-style ports beyond the IDecoratorElementHandler shape; the stateful `NavigationHostElement` — `Reconciler.UnmountRecursive` intercepts before the V1 arm and needs a small refactor; `TabViewDescriptor` — bisect ratifies the documented gaps (spec 045 §2.4 drag pipeline, §2.2 pinnable headers, in-place CanUpdate, conditional `SelectedIndex` write, `TabStripHeader` / `TabStripFooter` slots) need engine work (post-children mount-hook + `ImperativeBridged` for named slots); the XAML interop bridges (`XamlHost`, `XamlPage`) — descriptors exist but `XamlInterop.Register` populates `_typeRegistry` at startup so V1 auto-registration would clash; and the Reactor composition primitives (`Component`, `Func`, `Memo`, `ErrorBoundary`, `CommandHost`, `Validation.*`) — these sit ABOVE the V1 handler protocol and Phase 4 cleanup keeps their legacy arms. The A|B parity bar is met for every registered element: 9134 xunit + 4410 selftest (V1 ON ≡ V1 OFF), 0 failures both flags.
1436+
**Phase 3 deferred / not-attempted** (recorded for the Phase 3.5 / Phase 4 prelude — element types in the legacy `Reconciler.Mount` switch that have neither a Phase 1 V1 handler nor a Phase 3 descriptor; see `tasks/047-extensible-control-model-implementation.md` for the full enumeration). **Updated in Phase 3 completion (PR #440, commit 16636c0d):** the engine gap is closed (`TemplatedFlipViewElement<T>` ported via the new `PreMountedItems` ChildrenStrategy + `TemplatedFlipViewDescriptor`), and every previously-deferred descriptor on the Phase 3 batch list is now both authored AND registered in `RegisterV1BuiltInHandlers`: untyped items hosts (`GridView`, `ItemsView`, `ItemContainer`), heavy / specialized controls (`WebView2`, `NavigationView`, `TitleBar`, `MediaPlayerElement`, `AnimatedVisualPlayer`, `MapControl`, `SemanticZoom`, `AnnotatedScrollBar`, `RefreshContainer`, `SwipeControl`, `ParallaxView`), polymorphic / a11y (`IconElement` via the new `IDecoratorElementHandler` engine extension, `SemanticElement`, `AnnounceRegion`). What still ships unregistered (intentional carve list, documented inline in `RegisterV1BuiltInHandlers`): the dialog / overlay family (`ContentDialog`, `Flyout`, `Popup`, `MenuBar`, `MenuFlyout`, `CommandBar`, `CommandBarFlyout`) — modal lifecycle needs decorator-style ports beyond the IDecoratorElementHandler shape; the stateful `NavigationHostElement` — `Reconciler.UnmountRecursive` intercepts before the V1 arm and needs a small refactor; `TabViewDescriptor` — bisect ratifies the documented gaps (spec 045 §2.4 drag pipeline, §2.2 pinnable headers, in-place CanUpdate, conditional `SelectedIndex` write, `TabStripHeader` / `TabStripFooter` slots) need engine work (post-children mount-hook + `ImperativeBridged` for named slots); the XAML interop bridges (`XamlHost`, `XamlPage`) — descriptors exist but `XamlInterop.Register` populates `_typeRegistry` at startup so V1 auto-registration would clash; and the Reactor composition primitives (`Component`, `Func`, `Memo`, `ErrorBoundary`, `CommandHost`, `Validation.*`) — these sit ABOVE the V1 handler protocol and Phase 4 cleanup keeps their legacy arms. The A|B parity bar is met for every registered element: 9134 xunit + 4410 selftest (V1 ON ≡ V1 OFF), 0 failures both flags.
1437+
1438+
**Quantified V1 dispatch coverage (post-PR #440):**
1439+
1440+
| Bucket | Arms | Notes |
1441+
|---|---:|---|
1442+
| Routed through V1 (Phase 1 handler or Phase 3 descriptor) | 76 | Production dispatch path when V1 ON |
1443+
| Reachable-but-deferred (overlays 7 + NavigationHost 1 + TabView 1 + XamlHost/Page 2) | 11 | Follow-up PR closes these |
1444+
| Intentionally above V1 (Reactor composition primitives) | 8 | Permanent carve; Phase 4 keeps legacy arms |
1445+
| **Total switch arms** | **95** ||
1446+
1447+
- **Coverage of V1-reachable surface:** 76 / 87 ≈ **87%** (excludes the 8 composition primitives that are permanently above the protocol).
1448+
- **Coverage of all element-type switch arms:** 76 / 95 ≈ **80%**.
1449+
- **Path to 100% reachable:** the next PR ports the 11 deferred (overlays, NavigationHost, TabView gap closure, XamlHost/Page unification). Phase 4 cleanup follows.
14371450

14381451
**Phase 3 finish advisory perf** — Cloud PC x64 re-capture under `docs/specs/047/phase3-results/CPC-ander-YTZ3O-x64-advisory/2026-05-28-phase3-finish-3x5/` (n=15, 3 launches × 5 reps). V1 ON (descriptors) vs V1 OFF (today), against prior `2026-05-27-phase3-closeout-3x5/`:
14391452

docs/specs/tasks/047-extensible-control-model-implementation.md

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,19 +1027,41 @@ protocol — Phase 4 cleanup keeps their legacy arms):**
10271027
orchestrate child reconciliation rather than wrap a single WinUI
10281028
control, so the V1 handler protocol does not apply.
10291029

1030-
**Phase 3 completion status:** Every element type in the production
1031-
codebase either (a) routes through V1 dispatch (Phase 1 hand-coded
1032-
handler OR Phase 3 descriptor registered in
1033-
`RegisterV1BuiltInHandlers`), (b) is a Reactor composition primitive
1034-
intentionally kept above the V1 protocol, or (c) is in the explicit
1035-
deferred carve list above with a documented gap-closure path. The
1036-
A|B parity bar — V1 ON ≡ V1 OFF across the full xunit + selftest
1037-
matrix — is met for every registered element: 9134 xunit + 4410
1038-
selftest, 0 failures both flags. Phase 4 cleanup can delete every
1039-
legacy `MountXxx` / `UpdateXxx` method that backs an element that
1040-
has been registered through V1; the legacy switch arms for the
1041-
composition primitives + the deferred carve list must remain until
1042-
their respective follow-up PRs land.
1030+
**Phase 3 completion status (PR #440 — landed-pending-merge):**
1031+
Every element type in the production codebase either (a) routes
1032+
through V1 dispatch (Phase 1 hand-coded handler OR Phase 3
1033+
descriptor registered in `RegisterV1BuiltInHandlers`), (b) is a
1034+
Reactor composition primitive intentionally kept above the V1
1035+
protocol, or (c) is in the explicit deferred carve list above with
1036+
a documented gap-closure path. The A|B parity bar — V1 ON ≡ V1 OFF
1037+
across the full xunit + selftest matrix — is met for every
1038+
registered element: 9134 xunit + 4410 selftest, 0 failures both
1039+
flags. Phase 4 cleanup can delete every legacy `MountXxx` /
1040+
`UpdateXxx` method that backs an element that has been registered
1041+
through V1; the legacy switch arms for the composition primitives
1042+
+ the deferred carve list must remain until their respective
1043+
follow-up PRs land.
1044+
1045+
**Quantified V1 dispatch coverage (post-PR #440):**
1046+
1047+
| Bucket | Arms | % of total |
1048+
|---|---:|---:|
1049+
| Routed through V1 (76 = 5 Phase 1 + 6 base-derived + 64 standard descriptors + 1 decorator) | 76 | 80% |
1050+
| Reachable-but-deferred (overlays 7, NavigationHost 1, TabView 1, XamlHost/Page 2) | 11 | 11.6% |
1051+
| Intentionally above V1 (composition primitives — permanent carve) | 8 | 8.4% |
1052+
| **Total `Reconciler.Mount.cs` switch arms** | **95** | **100%** |
1053+
1054+
- **Coverage of V1-reachable surface (excludes 8 composition primitives):** 76 / 87 ≈ **87%**.
1055+
- **Coverage of all switch arms:** 76 / 95 ≈ **80%**.
1056+
- **Path to 100% reachable:** the follow-up PR closes the 11 deferred:
1057+
1. Port the 7 overlay descriptors (ContentDialog, Flyout, Popup, MenuBar, MenuFlyout, CommandBar, CommandBarFlyout) — needs a decorator strategy variant for modal lifecycle beyond `IDecoratorElementHandler`.
1058+
2. Refactor `NavigationHostElement` cleanup path so V1 can own it (internal-expose `MountNavigationHost` / `UpdateNavigationHost`, duplicate cleanup logic in the V1 handler, remove the `UnmountRecursive` intercept).
1059+
3. Close `TabViewDescriptor` gaps (engine post-children mount-hook + `ImperativeBridged` for named slots + port `BuildTabHeader` / `BuildPinButton` / `TryUpdatePinHeaderInPlace` + drag pipeline trampolines + conditional `SelectedIndex` write + in-place `CanUpdate`).
1060+
4. Unify `XamlInterop.Register` with V1 auto-registration so `XamlHostElement` / `XamlPageElement` descriptors can register without `EnsureRegistrableElementType` clash.
1061+
1062+
Phase 4 cleanup (deletion of legacy switch arms + `UseV1Protocol`
1063+
flag) is unblocked for the 76 routed arms today; the remaining 11
1064+
arms unblock as the follow-up PR lands each closure.
10431065

10441066
**Carry-forward known defects** (from Phase 1):
10451067

0 commit comments

Comments
 (0)