Capability verification
This matrix covers the P1 focus/key input, nested scroll, and render-failure/native-effect boundaries. The fast JVM/Robolectric suite remains the default gate; a connected Android device validates the native View dispatch paths.
Automated gates
Run the complete compile and unit-test gate:
./gradlew qaQuick
Run only the P1 connected-device cases:
./gradlew :app:connectedDebugAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=com.viewcompose.P1CoreCapabilitiesUiTest
P1CoreCapabilitiesUiTest verifies on a real Android runtime that:
FocusRequesterreaches the native focus target and hardware keys follow preview then bubble dispatch.- the transparent nested-scroll host implements AndroidX
NestedScrollingParent3and reports native pre-scroll consumption. - a failed
AndroidView.updaterestores the previous View configuration, emits a structuredRenderFailure, and never publishes the failed candidate'sonCommit.
The debug-only test activity uses showWhenLocked and turnScreenOn; it does not disable or alter
the device keyguard configuration.
Navigation lifecycle and resource closure
Run ./gradlew verifyNavigationCoverage for the selected critical-path bundles. The gate rejects
missing execution data or class bundles and enforces Core line/branch floors of 80%/70% plus
Android floors of 70%/60%; its XML and HTML are under
build/reports/viewcompose-quality/navigation-coverage/. These percentages intentionally describe
the owned reducer, lifecycle/scene, executor, owner/session, retention, Back, runtime, and host
paths—not every class in either module.
Run ./gradlew verifyNavigationBenchmarkTraceContracts to reject drift between the runtime's
navigation/frame trace sections and the release benchmark's collectors and labels. qaQuick
consumes both navigation verification tasks.
Run NavigationBackDeviceTest with an explicit ANDROID_SERIAL. A current-target device must run
the complete class; an API 28–30 device must also run terminal-pop reachability, bounded-eviction
reachability, and depth-13 retention evidence. Terminal pop must release the presentation,
LifecycleOwner, and ViewModel. Bounded(2) must release the evicted presentation while retaining
its logical owner and ViewModel. Resource samples record live presentations, Java/native allocated
heap, PSS, and median synchronous pop time under the same warmup and GC procedure; only structural
presentation counts are hard thresholds. Accepted absolute and normalized results, device/build
context, limitations, and next action live in the active navigation evolution plan.
Required device matrix
Before a release that changes one of these systems, cover:
| Area | Required cases |
|---|---|
| Focus | touch-to-focus, programmatic request, clear, next/previous, four-way D-pad, group enter/exit, keyed removal/remount restore |
| Hardware keys | Tab/Shift+Tab, Enter/Space, arrows, Back/Escape, preview interception, target bubble, physical keyboard repeat/modifier flags |
| Text coexistence | focus movement into/out of TextField, IME open/close, hardware typing, selection keys, no duplicate key callback |
| Nested scroll | vertical and horizontal drag, pre/post consumption, touch-to-fling handoff, nested Lazy/Pager/Scrollable combinations, overscroll boundaries |
| Native interop | AndroidX nested child, AndroidX nested parent, one representative third-party nested-scrolling View, non-nested AndroidView fallback |
| Render failure | composition failure, native factory/update/reset failure, rollback rebind, onCommit isolation, release failure, session disposal |
| Lifecycle | rotate/recreate after focused or scrolled state, background/foreground with a pending frame, dispose with pending coroutine/fling |
Minimum platform coverage is API 24, one API 28-30 device, and the current target API. Add a hardware-keyboard or TV/ChromeOS target when focus traversal or key mapping changes.
Post-release Demo pressure matrix
Run the deterministic real-device matrix with:
./gradlew :app:connectedDebugAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=com.viewcompose.DemoPostReleaseVisualMatrixUiTest
The suite uses scenario IDs and Android resource IDs rather than visible copy. Each run owns and replaces only its scenarios' evidence files, rejects capture unless the target application window is active, and records one metadata file beside every screenshot. It executes this pairwise matrix:
| Configuration | Locale | Theme | Direction | Font scale | Density scale |
|---|---|---|---|---|---|
| Default reference | English | light | LTR | 1.0 | 1.0 |
| Pressure reference | Simplified Chinese | dark | RTL | 1.3 | 1.25 |
The accepted 2026-08-22 Xiaomi MI 6/API 28 run passed 3/3 methods in 71.693 s: 32 screenshots and
metadata records across 12 scenarios passed automated assertions and manual review. Evidence covers
popup/shadow geometry and dismissal, exact three-column Grid edges, segmented insets, pressed and
released standard/One UI navigation, bidirectional nested-list handoff, and focused-editor reveal
above the IME for all five scroll owners.
An earlier 26-frame run was rejected for MIUI/window contamination, a weak Grid assertion, and
release-only navigation evidence. Hardening added six frames (+23.1%) and made coverage
improved, not faster. The complete Demo APK then exposed Activity touch-coordinate and
Collections tag coupling at 135/137; hard-cutting both contracts plus dismissing the IME before
device-level taps produced 137/137 in 742.903 s. This is behavioral/isolation evidence, not a
performance baseline.
Limitations: one API 28 device and a pairwise matrix do not cover the Cartesian product or every platform tier. Screenshots prove visible geometry; native touch, dismissal, nested-scroll, focus, IME, and reset assertions provide behavior. Re-run affected systems and add API 24 plus the current target when a release requires the full matrix.
Framework contract audit acceptance
The 2026-09-06 audit baseline at d64710459df73f3b42067767bb2f4f273b9eff33 passed 818
standalone JVM tests and 39 AI tests while ten probes exposed defects and two findings were
confirmed from source. All twelve corrections are now integrated with main revision
048b63af03ca51d8f44a042fc7b26d9bae85ed01, including upstream PR #274.
On macOS 14.1.2 arm64, JDK 21, Kotlin 2.2.10, Gradle 9.3.1, and Node 24.19.0, the integrated candidate passes 2118 tests across all 40 selected Framework, app, and integration tasks. This includes 1270 tests across the twelve changed artifacts; these populations overlap. AI verification passes 397/397 tests and Phase 0 contracts. The two additional integration regressions cover temporary Node path aliases and isolation of generated Preview task history. Test-count growth describes coverage, not a normalized performance gain.
Complete qaQuick, qaPreview, all three required documentation/tooling-isolation/release-intent
gates, and the fixed compiler and render corpora pass. Complete versioned API verification rebuilds
all six immutable source revisions. The website's type, build, accessibility, size-budget, shell,
and version checks pass. Local Maven publication uses a short-lived test signing key; no public
Maven or npm artifact is published by this acceptance.
The refreshed Knowledge Bundle contains 85 capabilities, 540 symbols, and 220 samples. Static inference/resolution/generation and actual released-Maven render/compare/repair evidence were recaptured against its exact source identity. All 37 changed visual fixture files differ only in identity strings and derived hashes. XML and screenshot PNG/render-tree bytes and acceptance thresholds remain unchanged. The screenshot baseline passes 12/12 semantic and 15/15 structure checks with 0 mismatches among 2,523,781 compared pixels. The deliberate regression still produces 2221 mismatched pixels; the proposed rollback restores 0 and passes all six gates. Invalid, cancelled, revoked, and reused authorization cases retain their rejection behavior. These fixed released-harness pixels are no material change; they do not establish current-source device parity.
The integration also corrects two execution-environment defects: temporary Node executables remain
transient through physical/aliased temporary roots, and generated Preview requests use separate
Gradle task histories while sharing dependency downloads. A cold image-binding Preview now retains
its required resource classes and reproduces the accepted image and comparison denominators.
The unpublished 0.8.0 package passes deterministic packaging and installed CLI/MCP/Agent flows;
it supersedes the initial local 0.7.1 candidate. Public consumers remain on 0.7.0.
The conclusion is improved correctness at the audited transaction, subscription, text-history, resource, focus, cleanup, process, frame, and cache boundaries. The initial implementation record preserves the earlier partial acceptance; the integration record records the completed verification, source hashes, environment, and package identity.
Device resource appearance and OEM IME behavior remain with Host, Renderer, and image-adapter owners. Windows process-tree behavior remains with AI tooling. Cache reuse and frame performance require controlled measurements. Retain these regressions and execute those named follow-ups before making broader device or performance claims.
Failure triage
- A
RolledBackreport must preserve the old visible tree and must not run candidate commit effects. - A
Committedreport may contain isolated post-commit failures; every remaining callback and cleanup operation must still run. - Native failures must include
operationandnodeKey. Missing metadata is a framework bug, not an application logging concern. - A third-party View that mutates hidden internal state from
updatemust be adapted so thatupdateis replay-safe and the external action moves toonCommit.