Repository navigation
fix(e2e): close gaps a review found in the paired harness #1887
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |