From ea8b92c2870663279c42016c28af645cf7975d45 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Mon, 3 Aug 2026 12:28:46 -0400 Subject: [PATCH] Add Linux core validation workflow --- .github/workflows/core-validation.yml | 59 +++++++++++++++++++++++++ docs/PROJECT-STRUCTURE.md | 1 + docs/platform-portability.md | 2 +- docs/remake-architecture-and-roadmap.md | 20 ++++++--- docs/tools-reference.md | 8 ++++ 5 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/core-validation.yml diff --git a/.github/workflows/core-validation.yml b/.github/workflows/core-validation.yml new file mode 100644 index 0000000..cd2fc9c --- /dev/null +++ b/.github/workflows/core-validation.yml @@ -0,0 +1,59 @@ +name: Core validation + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: core-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + core: + name: Linux core gate + runs-on: ubuntu-24.04 + timeout-minutes: 15 + env: + DOTNET_CLI_TELEMETRY_OPTOUT: "1" + DOTNET_NOLOGO: "true" + NUGET_XMLDOC_MODE: skip + PYTHONUTF8: "1" + steps: + - name: Check out repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Set up Python 3.11 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.11" + architecture: x64 + + - name: Set up .NET SDK + uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0 + with: + global-json-file: global.json + + - name: Report toolchain + run: | + python --version + dotnet --version + + - name: Run asset-independent validation + run: python -X utf8 tools/validate.py --level core + + - name: Upload failure logs + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: core-validation-${{ github.run_id }}-${{ github.run_attempt }} + path: build/validation/** + if-no-files-found: ignore + retention-days: 7 diff --git a/docs/PROJECT-STRUCTURE.md b/docs/PROJECT-STRUCTURE.md index 0b5c539..059a4f6 100644 --- a/docs/PROJECT-STRUCTURE.md +++ b/docs/PROJECT-STRUCTURE.md @@ -32,6 +32,7 @@ S:\Game Hacking\Eushully\Himegari\ ← workspace root (three siblings) ├── global.json pins the validated .NET 8 SDK feature band ├── .editorconfig / .gitattributes UTF-8, indentation, text/EOL, and binary-file policy; │ tracked source and generated references use canonical LF + ├── .github/workflows/core-validation.yml read-only Ubuntu-hosted asset-independent core gate ├── run-godot.ps1 / run-godot.cmd tracked development launcher + Windows wrapper; │ resolves Godot/game-root from parameters, environment, │ PATH, and the conventional sibling install diff --git a/docs/platform-portability.md b/docs/platform-portability.md index d9c25ad..f7a9fa4 100644 --- a/docs/platform-portability.md +++ b/docs/platform-portability.md @@ -55,7 +55,7 @@ claiming portable exports. | Game-install, runtime metadata, and repository discovery | `GameRootSelection` accepts `--game-root`, then probes the executable directory and current working directory for `SYS4INI.BIN`; on Unix the frontend prefers inherited shell `PWD` because Godot may change the process directory during project startup. Godot injects the selected root into its catalog and loose-first ALF store. `Himegari.csproj` embeds generated `build/opcodes.json`, and the frontend loads that assembly resource rather than `Paths.OpcodesJson`. `Paths.cs` remains a development/test locator; its page-map use is compiled only for `TOOLS` builds | Installed game data and packaged VM metadata no longer depend on the workspace sibling layout. The Linux export passed an explicit absolute game root outside the repository and read the installed archives. Exported automatic page maps use `user://diagnostics/page-maps`; editor/development runs preserve `build/page-map-.jsonl` | Let the future profile launcher pass `--game-root`, and run executable-directory/CWD plus case/permission smoke gates on Linux and macOS | | Archive parity oracle | One integration test launches `bin/BinExtractALF.exe` | Windows-only test helper, not a shipped runtime dependency | Skip/replace on non-Windows CI; runtime ALF/AAI readers do not depend on it | | Native RE tools | Frida/Ghidra helpers target the original `AGE.EXE`; supporting utilities include Windows executables and Windows command conventions | Development/research only | Keep separate from export requirements; document platform prerequisites per tool | -| Python workflow and core CI | The operating guide uses Windows `py -3.11`; `validate.py` launches child tools through `sys.executable` and has POSIX process-group cleanup plus `ps`-based leak auditing | The asset-independent core gate is platform-neutral. Tracked generated references and the engine solution/project files now have canonical LF blobs, so Linux regeneration and a fresh checkout do not acquire EOL-only drift | Run the first hosted gate on Linux with an explicitly provisioned Python 3.11 interpreter and `python -X utf8 tools/validate.py --level core`; keep private corpus and Godot runtime phases outside public CI | +| Python workflow and core CI | The operating guide uses Windows `py -3.11`; `validate.py` launches child tools through `sys.executable` and has POSIX process-group cleanup plus `ps`-based leak auditing | The asset-independent core gate is platform-neutral. Tracked generated references and the engine solution/project files have canonical LF blobs. The read-only `ubuntu-24.04` workflow provisions Python 3.11 plus `global.json`'s SDK and invokes the same core driver; private corpus and Godot runtime phases stay outside hosted CI | Confirm the first hosted result after a remote is selected and the workflow is pushed; retain Windows-native GDI parity and private installed-game/runtime checks as separate trusted gates | No authored runtime code currently calls native DirectSound, Direct3D, Vulkan, Metal, or OpenGL. Mentions of those APIs in `docs/engine-re.md` describe the original AGE implementation. Both the software-oracle display diff --git a/docs/remake-architecture-and-roadmap.md b/docs/remake-architecture-and-roadmap.md index 1846bdd..7504fdb 100644 --- a/docs/remake-architecture-and-roadmap.md +++ b/docs/remake-architecture-and-roadmap.md @@ -920,6 +920,16 @@ do not mix mechanical moves with semantic changes. validation remains green, and a Linux Git comparison reports no unstaged EOL drift. The first hosted CI job can therefore target Linux rather than carrying forward a Windows-runner dependency. + **Linux core workflow (2026-08-03):** item 2 is implemented as `.github/workflows/core-validation.yml`. One + read-only `ubuntu-24.04` job provisions Python 3.11 and the SDK selected by `global.json`, reports both resolved + versions, and invokes the existing asset-independent core driver. Pull requests, `main` pushes, and manual + dispatch share the job; branch-local concurrency cancels superseded runs, and seven-day validation-log upload + occurs only after failure. The workflow has no cache, secrets, private corpus, Godot runtime, packaging, or + deployment access. All four official actions are pinned to full immutable release SHAs. `actionlint` accepts + the workflow and the underlying Python 3.11 core gate remains green locally. Because no remote is configured, + the tracked workflow is dormant and its first hosted Linux execution remains a publication-time confirmation, + not a condition hidden by this commit. + **Not cleanup targets:** generated `build/` output, the two intentional solution files, historical `docs/superpowers/` plans/specifications, and fidelity-specific complexity that is directly covered by the native ABI. Reorganization is successful when ownership and reproduction become clearer, not when the raw @@ -1266,10 +1276,10 @@ layer's rendering diverges from ADV; save layout. --- ## 8. Immediate next step -Continue step 5 of the **codebase consolidation** maintenance slice with an asset-independent CI workflow that -provisions Python 3.11 and the `global.json` .NET SDK on Linux, then invokes -`python -X utf8 tools/validate.py --level core`. Keep the private game corpus and Godot runtime out of the -hermetic CI job, preserve the validation driver's failure and POSIX child-process semantics, and avoid -introducing a second build/test command path. +Continue step 5 of the **codebase consolidation** maintenance slice by making the user-owned project-license and +third-party-artifact decisions required before distribution. Resolve, replace, or exclude the unverified +BinExtractALF/LzssCpp and Kelebek-derived material before adding the canonical license, notice, and checksum/ +provenance manifest set. Do not infer a license choice, publish/configure a remote, or remove local artifacts as +part of that decision. Concrete playthrough blockers may still preempt this bounded maintenance work; the consolidation effort does not replace Phase B gameplay validation or the open cross-platform gates. diff --git a/docs/tools-reference.md b/docs/tools-reference.md index 4e5fd8e..5086b79 100644 --- a/docs/tools-reference.md +++ b/docs/tools-reference.md @@ -35,6 +35,14 @@ by a failed preflight; rebuild each through its owning tool in this reference. R `--godot`, then `AGE_GODOT_CONSOLE`, then `godot4`/`godot`/`godot-mono` on `PATH`. Game-root resolution uses `--game-root`, then `AGE_GAME_ROOT`, then the conventional sibling install and always requires `SYS4INI.BIN`. +The hosted wrapper is `.github/workflows/core-validation.yml`: a read-only `ubuntu-24.04` job provisions +Python 3.11 and the SDK selected by `global.json`, then runs +`python -X utf8 tools/validate.py --level core`. Pull requests, pushes to `main`, and manual dispatch select the +same gate; superseded branch runs are cancelled, and `build/validation/**` is retained for seven days only when +the job fails. It has no secrets, cache, game corpus, Godot runtime, packaging, or deployment access. Until a +remote is configured and the commit is pushed, the tracked workflow is dormant and its first hosted result is +still pending. + ## Container parse / disassemble | Tool | Purpose | Run | Reads → Writes |