Parent: https://github.com/craft-native/craft/issues/393 Related native extent/lifecycle repair: https://github.com/craft-native/craft/issues/435
Observable failure
The Android 35 default arm64 SDK image, revision 2, advertises the required Vulkan surface/swapchain maintenance support but cannot complete the maintained native fixture's first 61 actual frames within the unchanged 30-second stage deadline. The final controlled run reaches 31 frames, one native session and no input events; public Surface.present takes about 984ms while CPU scene drawing takes 0.306ms and GPU readback 0.010ms. The actual native/window extent is 256x192 throughout.
The same consumed source files and identical decompressed public package archive pass all 370 frames, four native sessions, two real pointer events, five independently anchored actual compositor captures and complete disposal on Android 35 Google APIs arm64 revision 9. The image selection is the only command/candidate difference. Both rows dispose every owned process group, native guest and generated workspace.
Earlier instrumented default-image runs isolate the external presentation-fence path: the guest MESA worker logs completion promptly, while its enclosing vkWaitForFences call often returns near a full second later. One baseline sample has 31 waits, median worker completion 0ms and median return lag 991ms. A per-image presentation-resource prototype did not resolve it. Short-polling controls are diagnostic evidence only and are absent from the source candidate.
The exact installed guest driver source revision and internal notification defect are not yet established. Do not attribute a particular upstream implementation until binary/source provenance or a minimized driver reproduction proves it.
Required work and acceptance
- Minimize the external-fence completion failure using the real maintained native public interface or a genuine Vulkan/ANativeWindow driver probe, preserving all original failure receipts.
- Identify the owning guest driver/system-image source and exact affected binary/revision. Link the upstream defect or fix rather than adding a Craft polling/reconnect workaround.
- Qualify any corrected, normally installed released toolchain against the same actual View extents, 61-frame/30-second stage deadlines, 1000ms native wait budgets, complete scene/input/capture and ownership gates.
- Rerun both the previously failing image and the maintained passing image with matching consumed-source identities; retain separate truthful outcomes.
- Keep software-emulator scope separate from physical GPU/device execution and full native game/fidelity claims.
No raised guards, shortened tick/frame scenarios, successful blank/no-op rendering, synthetic lifecycle callbacks, abandoned processes or hidden failed matrix rows.
Initial retained identities
Baseline repository revision: 806d3d5 plus the #435 reviewed source candidate. The compared public archive's decompressed tar SHA256 is ad6fea1c71fbf8ca32702139506418f0d027bb0d67667a1deea730e71f1f6bc0; all 1,066 archive members and every recorded consumed source file match. Original gzip archives are retained separately because their timestamp headers differ.
Android emulator 37.2.13 build 16740729, hardware CPU virtualization, software llvmpipe LLVM 21.1.4, NDK 27.2.12479018, Gradle 8.11.1, pinned Zig 0.18.0-dev.146+35accc0.
Default image original installed-byte SHA256 values:
- system.img:
794b4c44ed71c18399fdc20027212e2cdbb2cb9c8616daf2996983d79bccf1ff - vendor.img:
43a41517c15237e7cefc58ec02012d531feb9aa825c731bcb23ed915485daeb8 - kernel-ranchu:
a9dda2ae115395ea352bca2201294b4df0020a7f425cbfae879ee66a03a8f19f
Local original receipts: /tmp/craft-vulkan-android-acceptance/run-Wk0UjT (passing Google APIs row), run-diL5If (failed default row), and /tmp/craft-vulkan-final-image-matrix.json. Canonical source/CI receipt links will be appended during delivery; this open issue does not claim the default row is qualified.