Skip to content

fix(e2e): close gaps a review found in the paired harness #1887

fix(e2e): close gaps a review found in the paired harness

fix(e2e): close gaps a review found in the paired harness #1887

Workflow file for this run

name: Main
on:
push:
branches:
- master
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
concurrency:
group: master-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
quality:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ~/.cache/prek
key: prek-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Run checks
run: make check
- name: Check OpenAPI contract
run: make contract-test
tests:
timeout-minutes: 40
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.12", "3.13", "3.14"]
fail-fast: false
defaults:
run:
shell: bash
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
with:
python-version: ${{ matrix.python-version }}
- name: Run unit tests
run: make unit-test
- name: Run end-to-end tests
run: make e2e-test
evaluation-tests:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
# `evaluation/` is its own uv project with its own `testpaths`, so the root
# unit-test job never collected it and the benchmark's own tests were only
# ever run by hand. The job starts at the unit subtree because that is the
# subtree this change owns; `evaluation/tests/web` and
# `evaluation/tests/contract` are already red on `master` for reasons
# unrelated to the benchmark, and gating them here would make this check
# red before it could report anything.
- name: Run the evaluation project unit tests
run: |
set -o pipefail
make evaluation-unit-test 2>&1 | tee evaluation/pytest.log
# A pull request from a fork cannot read this run's raw job log — the log
# endpoint answers `Must have admin rights to Repository` — so a red check
# is otherwise an exit code and nothing else. Both the step summary and an
# annotation are readable by the contributor, and the annotation is the one
# that still says something when the failure happened before the tests ran.
- name: Report the failing cases
if: failure()
run: |
{
echo "### evaluation unit tests"
echo
echo '```'
uv --version || true
python3 -V || true
echo '```'
echo
if grep -qE '^(FAILED|ERROR) ' evaluation/pytest.log; then
echo '```'
grep -E '^(FAILED|ERROR) ' evaluation/pytest.log
echo '```'
else
echo "No failing case was reported, so the run failed before the tests ran:"
echo
echo '```'
tail -n 40 evaluation/pytest.log
echo '```'
fi
} >> "$GITHUB_STEP_SUMMARY"
detail=$(tail -n 25 evaluation/pytest.log | awk '{gsub(/%/, "%25"); gsub(/\r/, "%0D"); printf "%s%%0A", $0}')
echo "::error title=evaluation unit tests failed::${detail}"
code-seekdb:
timeout-minutes: 20
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.14"]
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
with:
python-version: ${{ matrix.python-version }}
- name: Test code indexing with embedded seekdb
run: make code-seekdb-test
windows-unit-portability:
timeout-minutes: 20
runs-on: windows-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Check Windows worker types
run: >-
uv run --locked --no-sync ty check --python-platform win32
src/powercontext/builtin/runtime/artifact_processing.py
tests/builtin/runtime/test_artifact_processing.py
- name: Verify spawned worker lifecycle on Windows
run: uv run --locked --no-sync pytest -q tests/builtin/runtime/test_artifact_processing.py
- name: Verify unsupported native indexing is skipped on Windows
run: >-
uv run --locked --no-sync pytest -q
tests/builtin/test_native_code.py
tests/builtin/test_native_code_multilanguage.py
tests/e2e/test_native_code_multilanguage.py
- name: Exercise fixtures without Windows long-path support
shell: pwsh
run: |
Set-ItemProperty -LiteralPath 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Value 0
# Keep pytest's default temporary root: a short --basetemp would hide
# regressions in the nested checkout fixtures covered by issue #1501.
- name: Run Windows portability regressions
shell: pwsh
run: >-
uv run pytest -q
tests/builtin/artifacts/skill/test_package.py
tests/builtin/runtime/test_external_skills.py
tests/test_cli.py::test_remote_enroll_can_install_automatic_service_in_one_command
tests/test_openclaw_cli.py::test_build_openclaw_plugin_runs_pnpm_install_non_interactively
tests/test_opencode_cli.py
tests/test_service.py
tests/test_service_bootstrap.py
tests/test_service_environment.py
tests/test_cli_workbuddy.py::test_setup_workbuddy_remote_checkout_refreshes_the_requested_ref
hermes-skills:
timeout-minutes: 15
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Check out the supported Hermes host
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: NousResearch/hermes-agent
ref: e624e9fde561e1add9388384012b295fde669ade # v2026.8.18 / CLI 0.20.4
path: .hermes-native
persist-credentials: false
- name: Verify native Skill discovery and metadata
env:
POWERCONTEXT_HERMES_SOURCE: ${{ github.workspace }}/.hermes-native
run: uv run pytest tests/e2e/test_hermes_skills.py
dsh-package:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the Python environment
uses: ./.github/actions/setup-python-env
- name: Set up project tools
uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
- name: Test DSH package
run: make js-test
- name: Test built plugin in the real DSH runtime
run: make dsh-runtime-test
- name: Verify DSH guidance adapter requests and results
run: uv run pytest "tests/test_integration_guidance_evaluation.py::test_native_adapter_handoff_uses_real_request_mapping_and_response_envelopes[dsh]"
pi-package:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the Python environment
uses: ./.github/actions/setup-python-env
- name: Set up project tools
uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
- name: Test Pi package
run: make pi-test
- name: Verify Pi guidance adapter requests and results
run: uv run pytest "tests/test_integration_guidance_evaluation.py::test_native_adapter_handoff_uses_real_request_mapping_and_response_envelopes[pi]"
opencode-package:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the Python environment
uses: ./.github/actions/setup-python-env
- uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
- name: Test OpenCode package
run: make opencode-test
- name: Verify OpenCode guidance adapter requests and results
run: uv run pytest "tests/test_integration_guidance_evaluation.py::test_native_adapter_handoff_uses_real_request_mapping_and_response_envelopes[opencode]"
openclaw-package:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the Python environment
uses: ./.github/actions/setup-python-env
- uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
# The pinned OpenClaw SDK requires the SQLite runtime shipped with Node 24.15+.
- run: mise install node@24.15.0
- name: Test OpenClaw package
run: mise exec node@24.15.0 -- make openclaw-plugin-test
- name: Verify OpenClaw guidance adapter requests and results
run: mise exec node@24.15.0 -- uv run pytest tests/test_integration_guidance_evaluation.py::test_openclaw_handoff_adapter_preserves_generated_source_identity
opendal-package:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the Python environment
uses: ./.github/actions/setup-python-env
with:
python-version: "3.12"
- name: Test OpenDAL package
run: make opendal-test
website-link-validation-windows:
timeout-minutes: 20
runs-on: windows-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up website tools
uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
- name: Install website dependencies
run: pnpm --dir website install --frozen-lockfile
- name: Test route scanning and link validation
run: pnpm --dir website test:links
check-website:
timeout-minutes: 20
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Set up website tools
uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1
- name: Check website
run: make docs-test