Skip to content

Unblock the script smoke job: pinned SDK headers, unwired checks, macOS wording - #202

Open
akacross wants to merge 5 commits into
themuffinator:mainfrom
akacross:ci/android-console-pinned-sdl
Open

akacross wants to merge 5 commits into
themuffinator:mainfrom
akacross:ci/android-console-pinned-sdl

Conversation

@akacross

@akacross akacross commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Unblocks the Validation Script Smoke job. It currently fails on main (e.g. c302254b) and on every PR, so all platform jobs are skipped. Fixing the first failure exposed three more behind it. This PR fixes all four.

1. Native harnesses need headers the smoke job never downloads

  • android_console_input.py, added to the smoke list in 1bc4c14, required a full SDL3 tree: RuntimeError: SDL3 headers required.
  • openxr_lifecycle.py compiled against subprojects/OpenXR-SDK-*/include: fatal error: 'openxr/openxr.h' file not found. On main this test was never reached.

Both now get headers through a new tools/tests/pinned_archive_headers.py, which follows the convention sdl3_clipboard_status.py uses for its sources:

  • An existing provisioned tree is used as it is.
  • Otherwise it takes the wrap's pinned archive from subprojects/packagecache or an HTTPS download, checks it against source_hash and a size bound, and writes only include/<dir>/*.h members (bounded in count and size) into the check's temporary directory. The archive is never unpacked wholesale.
  • Its offline self-test covers extraction, tamper refusal and the provisioned-tree preference.
  • --sdl-include still works.

A scan of all 393 smoke checks found no others reading an unprovisioned subproject. glew, stb_vorbis and openal-soft-prebuilt are committed to the repo.

2. validation_hardening.py: three checks were never wired in

ui_capture_multiplayer_rosters.py (1d0cbb8) and ui_capture_system_refresh.py (6a4696c) were wired nowhere, and ui_player_identity.py (c302254) was missing from openq4_validate.py. All three are offline and pass, and they're now wired like their neighbours.

3. macOS wording checks after the documentation rewrites

macos_matrix_policy.py, macos_metal_bridge.py and macos_native_backend_containment.py still expected sentences that c5f23a5 (Mac Source Ports credit) and 4054e7a (v0.13.2 notes) replaced. The stated policy hasn't changed:

  • The getting-started checks now follow the guide's new wording: GitHub packages are an Apple Silicon/arm64 preview, there are no Intel or universal2 packages, and Rosetta is unsupported.
  • README.html checks are unchanged.
  • The v0.13.2 note gets back the canonical "Metal bridge around the OpenGL renderer, not a native Metal renderer" and "comparison-only diagnostic infrastructure, not a release backend" phrases that every other release note carries, with no change in meaning.

Verification (Linux x64)

  • Full smoke list run locally (398 commands, parallel): passes except nine native harnesses that only this machine's clang 23.1 / GCC 16 headers reject (-Wunused-but-set-global under -Werror, and a missing <cstdint> in SystemDisplay.h). CI's compilers don't raise either.
  • Simulated smoke runner (no provisioned subprojects, only wraps and the cached archives): 86 SDL3 and 7 OpenXR headers extracted; the android check and all 19 OpenXR lifecycle cases compile and pass.
  • HTTPS archive path: not exercised locally. CI will download the archives, which is the same path sdl3_clipboard_status.py already uses in this job.

🤖 Generated with Claude Code

akacross and others added 2 commits October 23, 2026 11:27
1bc4c14 added android_console_input.py to the script smoke job, which runs
before Meson provisions any subproject. The test required a full SDL3 tree
under subprojects/ and raised "SDL3 headers required", failing the smoke
job on main and every PR, which skips all platform jobs.

When no tree exists, the test now takes the public headers from the pinned
SDL3 archive the way sdl3_clipboard_status.py takes its sources: the
archive comes from the package cache or an HTTPS download, is checked
against the wrap's SHA-256 and size bound, and only include/SDL3/*.h
members (bounded in count and size) are written to the test's own
temporary directory. An existing tree or --sdl-include is used as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With android_console_input.py passing, the smoke job reached three more
checks that fail on main:

- openxr_lifecycle.py compiled against subprojects/OpenXR-SDK-*/include,
  which the smoke job never provisions ("openxr/openxr.h file not found").
  Both native-harness checks now take headers through the new
  pinned_archive_headers.py: an existing tree as it is, otherwise only
  include/<dir>/*.h members of the wrap's pinned archive, from the package
  cache or HTTPS, checked against source_hash and bounded in size and count.
  Its offline self-test covers extraction, tamper refusal and the
  provisioned-tree preference.
- validation_hardening.py: ui_capture_multiplayer_rosters.py and
  ui_capture_system_refresh.py were wired nowhere, and ui_player_identity.py
  was missing from openq4_validate.py. All three are offline and pass.
- The macOS wording checks still expected sentences that the getting-started
  rewrite for Mac Source Ports and the rewritten v0.13.2 notes replaced. The
  getting-started checks follow its new wording (same policy: GitHub packages
  are an Apple Silicon/arm64 preview, no Intel/universal2 packages, Rosetta
  unsupported); the v0.13.2 note restores the canonical bridge and
  comparison-only phrases every release note carries.

The full smoke list now passes locally apart from nine native harnesses
that only clang 23 / GCC 16 headers reject (-Wunused-but-set-global, a
missing <cstdint>), which CI's compilers do not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@akacross akacross changed the title Read android_console_input's SDL3 headers from the pinned archive Unblock the script smoke job: pinned SDK headers, unwired checks, macOS wording Oct 23, 2026
main's 8cb58aa already restored the 0.13.2 Metal-bridge wording and the
getting-started checks, so both conflicts take main's side.
The macOS runners' Apple libc++ reads <android/api-level.h> when a
standard header is included with __ANDROID__ defined, so android_async
and android_lifecycle failed to compile there, and android_console_input
also lacked <initializer_list>. Each harness now includes its standard
headers with __ANDROID__ undefined, as the console harness already did
for SDL, and defines it again for the engine code.

Checked with clang and LLVM libc++ plus a shim that fails any standard
header read under __ANDROID__ (all three failed before, pass after), and
with g++/libstdc++ and Windows clang.
@themuffinator

Copy link
Copy Markdown
Owner

Thanks, this is the fix every PR has been waiting on. I've pushed two commits to the branch:

  • ff3c9d7 merges main. Both conflicts were in the macOS wording, which main's 8cb58aa had already restored the same way, so they take main's side. Part 3 of the description is therefore already on main; the pinned headers and the newly wired checks remain.

  • 8b8d9e4 fixes the macOS failures that your previous run exposed once the smoke job got through. android_async, android_lifecycle and android_console_input compiled with -D__ANDROID__, and Apple's libc++ then includes <android/api-level.h> from its own headers. The console harness was also missing <initializer_list>. Each harness now includes its standard headers with __ANDROID__ undefined, as the console harness already did for SDL, and defines it again for the engine code.

    Locally I used clang with LLVM libc++ plus a shim that fails any standard header read under __ANDROID__. All three failed before the change and pass after it. They also pass with g++/libstdc++ and Windows clang.

I'll merge once this run is green.

The sanitizer job's core-safety test failed in the clock-wrap case:
`now + latency + jitter` overflowed int at INT_MAX. The delay line already
compares due times as a wrapping clock, so the sum is now formed as
unsigned. The case driver's own `now++` overflowed the same way; it now
derives the clock from the elapsed step. The no-jitter mutation control
follows the new expression.

With ASan+UBSan, main's header reports the overflow and this one passes,
and network_impairment_state still sees all six controls fail.
@akacross

Copy link
Copy Markdown
Contributor Author

Thanks for the merge and the Android-header fix. The smoke job is green, and the platform jobs ran for the first time in days.

None of the six red jobs failed a test. All six were cancelled at the 90-minute PR limit:

Job Cancelled in
Linux x64 GCC Wayland libdecor / no-libdecor Run native Wayland validation
macOS Intel x64 OpenGL / Metal Run selected validation profile
Windows ARM64 Run selected validation profile
Linux x64 ASan+UBSan Run sanitizer build

In the libdecor job, for example, the 408 Python checks ran one after another from 09:02 to 10:18 (76 minutes), and the native tests that follow were cut off. That's the time #191 recovers: its own run took 15–19 minutes for the same checks with 4 jobs.

So this run can't go fully green with main's current check runner, and #191's smoke job can't pass until this lands. Two ways out of that loop:

  1. Merge Unblock the script smoke job: pinned SDK headers, unwired checks, macOS wording #202 now on the evidence above: every job that completed passed, including the smoke job, Windows x64, both macOS ARM64 jobs and all four Linux ARM64 jobs. Then merge Run independent validation checks in parallel #191, after which the next runs fit the limit.
  2. Or I can merge Run independent validation checks in parallel #191's branch into this one, so a single run shows the result with both.

Separately, the sanitizer job's 150 minutes from #200 didn't make it to main (it's 90 again). Its build alone took about 82 of those minutes in earlier runs, so it'll keep being cut off until it gets that time back. I can add that to this PR or to #191 if you'd like.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants