Skip to content

Restore startup-command execution and unblock PR validation - #200

Closed
themuffinator wants to merge 4 commits into
mainfrom
codex/manage-open-issues-prs
Closed

themuffinator wants to merge 4 commits into
mainfrom
codex/manage-open-issues-prs

Conversation

@themuffinator

@themuffinator themuffinator commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Startup queues lost the command at each capacity growth (the 17th, 33rd, and later + commands), which could silently drop a map launch or the shutdown command used by CI. This integrates the reviewed idCmdArgs copy constructor from #197 and the parallel validation runner from #191, preserving their original commits and contributor credit.

Independent checks run concurrently with ordered output and complete failure aggregation. Failed native game checks now print their compiler/runtime diagnostics; both Windows ARM64 workflows retain their regression logs even when validation fails. The sanitizer job has 150 minutes so tests and staging can follow its long build. No checks are removed or disabled.

The setup guide also records the reporter-confirmed Mac Source Ports Extractor route for GOG installers. The existing roadmap reconciles the open reports, confirmed closures, and the separate macOS language-persistence issue #199.

Validation at 05de67cb8c92c62ff9db75125b56796ca4b9cbec

  • Native before/after control: main cbe967f2 loses queued commands 17 and 33; Give idCmdArgs a copy constructor so queued startup commands survive #197 preserves all 40 queued commands and direct copies.
  • All 351 Python checks accounted for: 332 passed in the first invocation; 19 failed because that invocation used this Windows worktree's logical C: alias while fixture roots resolved to E:. All 19 passed when rerun from the resolved project path used by the normal validator.
  • 74/74 imported native game regression checks passed.
  • Actual subprocess failure controls passed with one and four workers: ordered output, following commands still execute, and an exit-7 command fails the aggregate.
  • Windows x64 MSVC debugoptimized build and standard .install staging passed after preparing the fresh worktree's missing OpenAL dependency with the repository script.
  • Staged dedicated-server smoke passed, including clean shutdown.
  • Stock-asset gameplay smokes passed: OpenGL and Vulkan SP game/hangar1, and OpenGL MP mp/q4dm1 with explicit auto-join. All used hidden 960×540 windowed rendering, disabled input, engine-written screenshots, and clean exit. Captures were inspected; the MP capture shows a joined player in warmup.
  • YAML structure, validation-hardening checks, and git diff --check passed.

These are startup/gameplay smokes, not full campaign or rendering qualification. The audio-disabled SP runs logged non-pre-cached sound warnings; the stock MP map logged missing AAS files, so bot navigation is not qualified. No reporter-specific save or Turbo lift recovery is claimed.

Merge gate

Fresh complete CI is still required. Older timeouts, skipped checks, and the unresolved Windows ARM64 native failures are not passes. #180, #189, #193 and #198 have current review dispositions recorded and remain queued for fresh checks after this foundation reaches main; #173 retains its requested changes.

Merge this PR with a merge commit, not a squash, to preserve the original #191/#197 history and let GitHub recognize those source PRs as integrated.

akacross and others added 4 commits October 18, 2026 17:28
The script-smoke job ran its ~350 checks one after another, about 77 minutes
on main, and every platform job then reran the same Python suite in sequence
before its build (39 of the Linux job's 66 minutes). On the slower runners
that left Windows ARM64 and the macOS Intel jobs cancelled at 150 minutes on
main, and pull-request jobs, with 90-minute limits, cancelled regardless of
the change.

Each check is its own process that writes only to fresh temporary
directories, so they can overlap:

- openq4_validate.py runs its Python checks concurrently, as many as the
  machine has CPUs. --python-jobs N or OPENQ4_PYTHON_TEST_JOBS change that and
  --python-jobs 1 restores sequential runs. Output is still printed in list
  order, one section per check, with each check's duration.
- tools/validation/run_parallel_commands.py does the same for a list of
  commands on standard input; both script-smoke steps feed their unchanged
  check list through it.
- validation_hardening.py covers the parallel path's failure aggregation as
  well as the sequential one.

On a 16-thread Linux host the validator's 350 checks took 2041 s in sequence
and 311 s in parallel with the same results; the whole rewritten smoke step
took 343 s. The only failures, identical either way, are host-toolchain ones
(newer clang/libstdc++), not parallelism.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
idCmdArgs::argv points into the object's own tokenized buffer, which
operator= re-points. Since f15a41f, idList::Append copies its argument
into a temporary before growing the list, and idCmdArgs had no copy
constructor: the implicit member-wise copy left argv aimed at the
caller's buffer, and operator= then computed each argument's offset from
two unrelated buffers. The startup queue is an idList<idCmdArgs> growing
every 16 entries, so the 17th, 33rd, ... "+" command lost its text and
was silently skipped.

In CI that left the dedicated-server smokes waiting for a "+quit" that
never ran (Linux, macOS and Windows), dropped renderer self-tests from
the startup matrix (RenderGraphResource, ModernVisibility and the Vulkan
render-target set), and long client command lines lost commands such as
"+map".

The copy constructor now goes through operator=. cmd_args_copy.py
compiles the production idCmdArgs and idList, copies a command and queues
40 through several growths, and checks each one reads back intact; it
fails without this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@themuffinator themuffinator added bug Something isn't working priority: P1 Functional or qualification gap in intended scope; no release-date promise. status: blocked by CI Required validation is incomplete or failing; inspect linked run evidence. labels Oct 21, 2026 — with ChatGPT Codex Connector
@themuffinator
themuffinator marked this pull request as ready for review October 21, 2026 05:54
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-21T05:58:59.680808Z 05de67c Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 05de67cb8c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1283 to +1284
.tmp/validation/push-builddir/game-regression-logs
.tmp/validation/push-builddir/meson-logs

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Upload ARM64 logs from the push build directory

In the windows-arm64-build job, the preceding command runs openq4_validate.py push, whose profile uses builddir; Meson therefore writes the regression output to builddir/game-regression-logs and builddir/meson-logs (the former is configured in meson.build). These .tmp/validation/push-builddir/... paths are never produced, and if-no-files-found: warn lets the upload step succeed without retaining the diagnostics this change is intended to preserve when ARM64 validation fails.

Useful? React with 👍 / 👎.

akacross added a commit to akacross/openQ4 that referenced this pull request Oct 23, 2026
Several checks create their temporary directories under the repository's
.tmp without creating it first (async_session_command_contract.py among
seven). Run in sequence, an earlier check had always created it; in
parallel any check can start first, and on a fresh checkout the session
command contract failed with FileNotFoundError on .tmp/session-command-*
(themuffinator#200's Linux push verification).

Both parallel entry points, openq4_validate.py and run_parallel_commands.py,
now create .tmp before launching anything. validation_hardening.py checks
that the runner does so on a fresh root.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@akacross

Copy link
Copy Markdown
Contributor

Thanks for the diagnostics. They pin down the three remaining failures here:

  • Linux Push Verification: async_session_command_contract.py fails with FileNotFoundError on .tmp/session-command-* because .tmp didn't exist yet. Seven checks create their temporary directories under .tmp without creating it. In sequence an earlier check always had; in parallel this one can start first on a fresh checkout. Fixed on the Run independent validation checks in parallel #191 branch in ed1f322: both parallel entry points create .tmp before starting, and validation_hardening.py now checks for it.
  • Windows ARM64 (commit and push): the three MP contracts finish their checks, then fail in TemporaryDirectory cleanup with PermissionError: [WinError 5] on the harness .exe they just ran. Tolerate a locked harness executable when MP contracts clean up #201 makes those temporary directories tolerate a locked leftover (ignore_cleanup_errors=True). I couldn't run it on ARM64 here, so its CI will be the first real test.

Also, main now has its own idCmdArgs copy constructor (6de4e62), so #197 overlaps with it. I've left #197 as it is in case you'd rather keep it for its cmd_args_copy.py test.

@themuffinator

Copy link
Copy Markdown
Owner Author

Closing this integration branch, because both halves now have their own route to main:

This branch's remaining pieces will go onto main directly: the Windows ARM64 native regression log upload, the 150-minute sanitizer limit, the failed-check output in game_regression_suite.py and the Mac Source Ports Extractor note in the getting-started guide. The roadmap's open-report table will be refreshed in the same change.

@themuffinator themuffinator removed the status: blocked by CI Required validation is incomplete or failing; inspect linked run evidence. label Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: P1 Functional or qualification gap in intended scope; no release-date promise.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants