From 4801a24089964860db7f4855be21d2d4313c7eab Mon Sep 17 00:00:00 2001 From: ysopwnable <161784452+N0zoM1z0@users.noreply.github.com> Date: Wed, 7 Oct 2026 16:16:55 +0800 Subject: [PATCH] ci: verify native arm64 and Intel macOS workflows (#898) --- .github/workflows/ci.yml | 58 ++++++++++++++++++++++++++++++++++++++-- docs/testing.md | 26 +++++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83218a639..8d6bea208 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -244,15 +244,41 @@ jobs: if: github.event_name == 'push' || needs.changes.outputs.package == 'true' strategy: fail-fast: false + max-parallel: 2 matrix: - os: [ubuntu-latest, macos-14] + include: + - os: ubuntu-latest + platform: linux + architecture: x64 + - os: ubuntu-24.04-arm + platform: linux + architecture: arm64 + - os: macos-14 + platform: darwin + architecture: arm64 + - os: macos-15-intel + platform: darwin + architecture: x64 runs-on: ${{ matrix.os }} + timeout-minutes: 20 + env: + NODE_OPTIONS: "--max-old-space-size=1024" + UV_THREADPOOL_SIZE: "2" steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version-file: .nvmrc cache: npm + - name: Verify native runtime identity + env: + EXPECTED_CI_PLATFORM: ${{ matrix.platform }} + EXPECTED_CI_ARCHITECTURE: ${{ matrix.architecture }} + run: >- + node -e "const assert = require('node:assert/strict'); + assert.equal(process.platform, process.env.EXPECTED_CI_PLATFORM); + assert.equal(process.arch, process.env.EXPECTED_CI_ARCHITECTURE); + console.log(JSON.stringify({ platform: process.platform, architecture: process.arch, node: process.version }));" - run: npm ci - uses: actions/download-artifact@v4 with: @@ -318,16 +344,44 @@ jobs: if: github.event_name == 'push' || needs.changes.outputs.code == 'true' strategy: fail-fast: false + max-parallel: 2 matrix: - os: [ubuntu-latest, windows-latest] + include: + - os: ubuntu-latest + platform: linux + architecture: x64 + - os: ubuntu-24.04-arm + platform: linux + architecture: arm64 + - os: macos-14 + platform: darwin + architecture: arm64 + - os: macos-15-intel + platform: darwin + architecture: x64 + - os: windows-latest + platform: win32 + architecture: x64 runs-on: ${{ matrix.os }} timeout-minutes: 10 + env: + NODE_OPTIONS: "--max-old-space-size=1024" + UV_THREADPOOL_SIZE: "2" steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version-file: .nvmrc cache: npm + - name: Verify native runtime identity + env: + EXPECTED_CI_PLATFORM: ${{ matrix.platform }} + EXPECTED_CI_ARCHITECTURE: ${{ matrix.architecture }} + run: >- + node -e "const assert = require('node:assert/strict'); + assert.equal(process.platform, process.env.EXPECTED_CI_PLATFORM); + assert.equal(process.arch, process.env.EXPECTED_CI_ARCHITECTURE); + console.log(JSON.stringify({ platform: process.platform, architecture: process.arch, node: process.version }));" - run: npm ci - name: Verify real Node Inspector discovery and observation run: npm run verify:inspector diff --git a/docs/testing.md b/docs/testing.md index 6c98eeca1..0251937ad 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -179,7 +179,7 @@ requires unresolved table bounds or case mappings to remain visible as residual unknowns. `npm run verify:inspector` requires the supported Node.js runtime and installed -REA dependencies. CI runs it on Linux and Windows. It starts owned loopback +REA dependencies. CI runs it on Linux and macOS x64/arm64 and Windows x64. It starts owned loopback Node Inspector fixtures and verifies discovery and passive observation through the CLI and stdio MCP, including special filenames, unresolved discovery locations, and independently resolved loaded scripts. Double-quote filenames @@ -312,6 +312,30 @@ Keep the provider-specific acceptance path independent from optional cross-compilers. Cross-format failures belong to the cross-format lane and must not make native host acceptance unavailable. +## Native platform baseline in CI + +CI exercises the pinned Node.js runtime on native hosted runners: + +| Host | Runner | Baseline checks | +| --------------------- | ------------------ | ---------------------------------------------------------------------------------------- | +| Linux x64 | `ubuntu-latest` | Installed package and real Node Inspector CLI/MCP | +| Linux arm64 (aarch64) | `ubuntu-24.04-arm` | Installed package and real Node Inspector CLI/MCP | +| macOS arm64 | `macos-14` | Installed package and real Node Inspector CLI/MCP | +| macOS x64 | `macos-15-intel` | Installed package and real Node Inspector CLI/MCP | +| Windows x64 | `windows-latest` | Curated capabilities, native controls, installed package and real Node Inspector CLI/MCP | + +Package and Inspector matrices assert the actual Node platform/architecture +before verification and record those values with the Node version. Each matrix +runs at most two jobs concurrently with explicit timeouts and Node heap/thread +limits. Package checks cover installation, CLI/MCP discovery, target-free +analysis, configuration backups/recovery, Evidence and owned lifecycle; Inspector +checks execute source-owned loopback targets and special filename cases. + +These native baseline checks complement the Linux source-test shards and the +separate Apple-artifact and real-provider lanes. Actual Hopper, Ghidra, IDA, +browser and managed-tool claims require their corresponding verification lanes. +Runner labels follow the [GitHub hosted-runner reference](https://docs.github.com/en/actions/reference/runners/github-hosted-runners). + ## Developer commands Use source feedback while editing, explicit boundary checks for the changed