Skip to content

tests: main's red bake and ub checks skip where their tool can't run; the ub fixture builds on Windows - #1939

Merged
NotRexed merged 1 commit into
mainfrom
fix/main-tests-bake-ub
Nov 10, 2026
Merged

NotRexed merged 1 commit into
mainfrom
fix/main-tests-bake-ub

Conversation

@NotRexed

Copy link
Copy Markdown
Owner

Main's game-free checks have been red since #1707 and #1910.

Check Where Failure Change
test_bake_mimo, test_bake_skeleton Linux SystemExit: /usr/bin/clang++: no C++23 mode from bake_mimo.cxx_std. It's raised after the tests' "no compiler" skip, so the tests error instead of skipping. The skip check calls bake_mimo.cxx_std(bake_mimo.cxx()), so a compiler without C++23 skips like a missing one.
test_bake_ds Windows Could not find module 'libzstd.so.1'. The enumerator loads the system libzstd through ctypes, and the runners have none. Skips when romenum.zstd() can't load (OSError).
test_ub_word_index Windows 'getenv' is deprecated (the Windows CRT), an error under -Werror. -D_CRT_SECURE_NO_WARNINGS on the fixture's compile.

Locally (Windows):

  • test_bake_ds prints its SKIP line.
  • test_bake_skeleton: OK, with 3 skipped.
  • test_bake_mimo skips.
  • test_ub_word_index's fixture compiles with the flag. The getenv warning only shows with CI's MSVC-target clang, so CI checks that part.

test_log_batch's "off" timing, under 200 ms against the default 250 ms, still flakes now and then on a loaded runner. It isn't changed here: there's no safe margin to widen.

Bake tests from #1707 (blessedplummer), ub test from #1910 (i-love-computers-dude).

🤖 Generated with Claude Code

…nd the ub fixture builds on Windows

- test_bake_mimo, test_bake_skeleton: the compiler check includes its C++23 mode (bake_mimo.cxx_std raised after the
  skip, on ubuntu-24.04's clang++: "no C++23 mode"), so a compiler without one skips instead of failing.
- test_bake_ds: the enumerator's zstd is the system libzstd through ctypes; where it cannot load (Windows: no
  libzstd.so.1, no zstd.dll on the runners) the check skips.
- test_ub_word_index: -D_CRT_SECURE_NO_WARNINGS for the fixture's getenv (the Windows CRT's deprecation, an error
  under -Werror).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@NotRexed
NotRexed merged commit fc375e9 into main Nov 10, 2026
10 checks passed
@NotRexed
NotRexed deleted the fix/main-tests-bake-ub branch November 10, 2026 21:31
@Arkex-ai

Copy link
Copy Markdown
Contributor

I finished the underlying #1931 fixes locally: Arkex-ai@4e9ac9e . Full Windows: 321 passed / 3 failed / 21 skipped versus clean main 319 / 4 / 21; DS, Mimo and skeleton actually execute and pass. Linux Clang 18 integration passes too. The fixes use the existing pinned zstandard dependency and a constexpr probe matching the real assertion failure path.

Once that lands these bake gates can execute instead of skipping on the runners. I am aligning a concurrent reader fallback with #1872 before opening the focused PR. Exact-head fork CIs are running: https://github.com/Arkex-ai/Hookshot/actions/runs/42905082651 .

@Arkex-ai

Copy link
Copy Markdown
Contributor

Draft #1954 now has the complete focused patch and measured validation: #1954 . The overlapping reader is called out in the description so we can settle on one implementation; discovery/cache work remains with #1872.

hckrman101 pushed a commit that referenced this pull request Nov 11, 2026
…1911)

Clamping a short frame before calculating rounding carry loses its
timing debt, allowing alternating short and long frames to advance game
time too quickly. This preserves short-frame debt, bounds its maximum
size, and discards it while the high-FPS frame-time hook already
supplies elapsed time.

### Before / after: default settings

Each case replays 6,000 intervals through upstream's previous arithmetic
and the new source-extracted quantizer, with a 60 FPS nominal cap and
the **default five-frame smoothing window**:

| Frame-time sequence | Elapsed time | Previous game time | New game
time | Clock error: previous → new |
|---|---:|---:|---:|---:|
| Alternate 14 ms / 19.333333 ms | 100.000 s | 101.723 s | 100.000 s |
+1.723% → <0.001% |
| Repeat 30 / 90 / 90 / 90 FPS intervals | 100.000 s | 105.021 s |
100.027 s | +5.021% → +0.027% |

With `HOS_REALTIME_WINDOW=1`, the same cases change from 107.692 →
100.000 game seconds and 125.000 → 100.017 game seconds. At a steady
47.3 FPS, both versions advance 126.849734 game seconds over 126.849894
elapsed seconds. These measure clock-accounting error, not rendering
speed or all in-game systems.

### Bound the debt and preserve high-FPS behavior

Addresses the [review on unbounded
debt](#1911 (comment)):

- Debt has a floor of **−4 nominal frames**. A long unpaced fast stretch
cannot leave minutes of debt to repay later.
- When the high-FPS time hook is active, each nominal-rate calculation
starts with zero carry and saved carry is reset to zero. Actual game
time continues to come from the existing frame-time hook.
- The 1/15-second maximum step still drops excess long-stall time.
- The input `ratio` is used by both the quantizer and log, rather than
being computed only for logging.

### Regression coverage

- The new tests fail on the previous PR version: the 120 FPS recovery
check fails, and the standalone debt check exceeds the floor.
- After **72,000 presents at 120 FPS**, the cap-120 fixture checks a
return to the nominal rate of 40 within ten slower presents, while the
time hook remains correct.
- At a cap of 60, a long unpaced fast stretch must recover within 24
presents, including the default smoothing transition. This replaces the
earlier assertion tied to an exact unbounded amount of debt.
- Source-extracted checks cover one- and five-frame smoothing, both
jitter patterns, steady fractional rates, bounded recovery, higher caps
and long stalls.
- The movie-frame-count checks from #1875 remain compatible and pass.

### Reproduce

```sh
python -I -B tests/test_realtime_rate.py --cc gcc
python -I -B tests/test_realtime_rate.py --cc clang
python -I -B tests/test_frame_rate_cap_step.py
python -I -B tests/test_movie_frame_count.py
```

### Validation

- Rebased onto upstream `fc375e9` to include the CI portability fixes in
#1939. The clock patch is unchanged from reviewed commit `f4e115d`
(identical `git range-diff`).
- Focused regression checks pass with GCC and Clang.
- Full Linux/Clang source suite on the rebased branch: **335 passed, 1
failed, 10 skipped**, using the .NET 8 SDK for the Windows-updater
fixture. The sole failure remains the unchanged Wayland test fixture
described below.
- The sole failure is the unchanged Wayland test fixture's unused
`sdl_ready` variable under Clang `-Werror`. The same failure was
reproduced directly from untouched upstream `78e1112`.
- Full command: `CXX=clang++ python -I -B tests/run_all.py --jobs 4`.

Windows gameplay was not tested. Frame-count-based mechanics outside
this real-time clock are outside this change's scope.

The revised bounded-debt and high-FPS recovery behavior has not yet been
tested in gameplay. The evidence above is source-level regression
coverage, not a new in-game A/B.

Co-authored-by: i-love-computers-dude <355064834+i-love-computers-dude@users.noreply.github.com>
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