Continuous integration

Last reviewed: 2026-08-06. CI is a verification gate for the whole five-game tree; it does not require copyrighted game data to be committed.

Firestaff’s GitHub Actions workflow is defined in .github/workflows/verify.yml. It runs on pushes to main and on pull requests.

What the workflow checks

On macOS, the local CTest inventory also includes dm1_macos_real_data_boot. It runs the production DM1 M11 boot probe against the authenticated corpus under FIRESTAFF_DM1_MAC_DATA, FIRESTAFF_DATA, or ~/.firestaff/data. It is skip-safe when no licensed data is installed and does not extract or rewrite original files.

When the corpus contains the authenticated DM1 FM Towns package, the same gate also exercises --platform fm-towns. The probe covers both an extracted ISO tree and the packed ZIP/BIN source. For the packed case, the ISO members are decoded into bounded memory and passed to the original-format loaders; Firestaff does not create a second game-data tree.

For a manual macOS window-size check, pass --width and --height. Explicit dimensions select windowed mode and are reported by the boot-probe receipt as window=<width>x<height> windowMode=0; --fullscreen remains an explicit override. This covers both small and large native macOS host windows without treating macOS as an unverified historical DM1 source port.

The workflow uses a concurrency group for main and cancels an older run when a newer commit arrives. That is expected: always inspect the newest run for the current main SHA before treating a cancelled run as a failure.

Recent failure signatures

Lefthook installer fails during asset hygiene

The installer follows the Go version declared by the current Lefthook module. The workflow therefore pins the matching Go toolchain instead of relying on an older runner default. This job must install Lefthook and complete lefthook ci before the run is considered healthy.

This means a test target uses the DM2 GDAT loader without linking the IMG9 decoder translation unit. The fix belongs in the target’s CMake source list; do not add a stub implementation or weaken linker checks.

macOS Homebrew reports an untrusted tap

The SDL3 install step may print a Homebrew trust warning for an unrelated tap while still installing SDL3 successfully. The actionable result is the return status of brew install sdl3 and the following CMake build. Do not trust or untap unrelated taps in the repository workflow.

Local reproduction

cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build --parallel
ctest --test-dir build --output-on-failure
SDL_VIDEODRIVER=dummy ./build/firestaff_m11_phase_a_probe

For a remote run, use the Actions page or:

gh run list --repo yeager/firestaff --branch main
gh run view <run-id> --repo yeager/firestaff --log-failed

The repository must not contain original game data. CI intentionally runs the asset checks with an empty data directory.

GitHub Pages renders the Markdown documentation as HTML with the workflow in .github/workflows/pages.yml. scripts/prepare_pages.py creates an ephemeral source tree, rewrites repository-relative links to the generated .html routes, and protects literal Liquid examples. The Jekyll build writes only to the Pages artifact; tracked Markdown sources remain unchanged.

Documentation changes should also update the cross-game status in PROJECT_STATUS.md and the page map in DOCUMENTATION_INDEX.md when a public claim changes.