Skip to main content

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:

  1. FocusRequester reaches the native focus target and hardware keys follow preview then bubble dispatch.
  2. the transparent nested-scroll host implements AndroidX NestedScrollingParent3 and reports native pre-scroll consumption.
  3. a failed AndroidView.update restores the previous View configuration, emits a structured RenderFailure, and never publishes the failed candidate's onCommit.

The debug-only test activity uses showWhenLocked and turnScreenOn; it does not disable or alter the device keyguard configuration.

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:

AreaRequired cases
Focustouch-to-focus, programmatic request, clear, next/previous, four-way D-pad, group enter/exit, keyed removal/remount restore
Hardware keysTab/Shift+Tab, Enter/Space, arrows, Back/Escape, preview interception, target bubble, physical keyboard repeat/modifier flags
Text coexistencefocus movement into/out of TextField, IME open/close, hardware typing, selection keys, no duplicate key callback
Nested scrollvertical and horizontal drag, pre/post consumption, touch-to-fling handoff, nested Lazy/Pager/Scrollable combinations, overscroll boundaries
Native interopAndroidX nested child, AndroidX nested parent, one representative third-party nested-scrolling View, non-nested AndroidView fallback
Render failurecomposition failure, native factory/update/reset failure, rollback rebind, onCommit isolation, release failure, session disposal
Lifecyclerotate/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:

ConfigurationLocaleThemeDirectionFont scaleDensity scale
Default referenceEnglishlightLTR1.01.0
Pressure referenceSimplified ChinesedarkRTL1.31.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 RolledBack report must preserve the old visible tree and must not run candidate commit effects.
  • A Committed report may contain isolated post-commit failures; every remaining callback and cleanup operation must still run.
  • Native failures must include operation and nodeKey. Missing metadata is a framework bug, not an application logging concern.
  • A third-party View that mutates hidden internal state from update must be adapted so that update is replay-safe and the external action moves to onCommit.