| from __future__ import annotations |
|
|
| from env.tasks.task_types import CICDTask |
|
|
|
|
| HARD_TASKS: list[CICDTask] = [ |
| CICDTask( |
| task_id="hard-matrix-logic", |
| title="Fix matrix include-exclude logic", |
| description="Matrix includes unsupported versions and causes deterministic CI breakage.", |
| difficulty="hard", |
| failure_stage="test", |
| broken_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| test: |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| os: [ubuntu-latest, windows-latest] |
| python-version: ["3.10", "3.11", "3.13"] |
| steps: |
| - uses: actions/checkout@v4 |
| - uses: actions/setup-python@v5 |
| with: |
| python-version: ${{ matrix.python-version }} |
| - run: pip install -r requirements.txt |
| - run: pytest -q |
| """.strip(), |
| expected_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| test: |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| os: [ubuntu-latest, windows-latest] |
| python-version: ["3.10", "3.11", "3.13"] |
| exclude: |
| - os: windows-latest |
| python-version: "3.13" |
| steps: |
| - uses: actions/checkout@v4 |
| - uses: actions/setup-python@v5 |
| with: |
| python-version: ${{ matrix.python-version }} |
| - run: pip install -r requirements.txt |
| - run: pytest -q |
| """.strip(), |
| logs="test stage failed: wheel build unavailable for windows-latest + python 3.13", |
| error_message="matrix includes unsupported runtime combination", |
| actual_bug="matrix logic is missing an exclude for unstable runtime pair", |
| metadata={"broken_token": "python-version: [\"3.10\", \"3.11\", \"3.13\"]", "fixed_token": "exclude:"}, |
| ), |
| CICDTask( |
| task_id="hard-conditional-deploy", |
| title="Repair deploy conditional", |
| description="Deploy job runs regardless of failed tests due to always() condition.", |
| difficulty="hard", |
| failure_stage="deploy", |
| broken_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| build: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm ci |
| - run: npm run build |
| test: |
| runs-on: ubuntu-latest |
| needs: build |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm test |
| deploy: |
| runs-on: ubuntu-latest |
| needs: test |
| if: always() |
| steps: |
| - run: echo deploying |
| """.strip(), |
| expected_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| build: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm ci |
| - run: npm run build |
| test: |
| runs-on: ubuntu-latest |
| needs: build |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm test |
| deploy: |
| runs-on: ubuntu-latest |
| needs: test |
| if: success() && github.ref == 'refs/heads/main' |
| steps: |
| - run: echo deploying |
| """.strip(), |
| logs="deploy stage triggered despite failing tests on non-main branch", |
| error_message="unsafe deploy condition bypasses quality gates", |
| actual_bug="deploy condition uses always() instead of guarded success check", |
| metadata={"broken_token": "if: always()", "fixed_token": "if: success() && github.ref == 'refs/heads/main'"}, |
| ), |
| CICDTask( |
| task_id="hard-needs-order", |
| title="Fix job dependency ordering", |
| description="Deploy depends only on build and can run before tests complete.", |
| difficulty="hard", |
| failure_stage="deploy", |
| broken_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| build: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm ci |
| test: |
| runs-on: ubuntu-latest |
| needs: build |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm test |
| deploy: |
| runs-on: ubuntu-latest |
| needs: build |
| steps: |
| - run: echo deploying package |
| """.strip(), |
| expected_config=""" |
| name: CI |
| on: [push] |
| jobs: |
| build: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm ci |
| test: |
| runs-on: ubuntu-latest |
| needs: build |
| steps: |
| - uses: actions/checkout@v4 |
| - run: npm test |
| deploy: |
| runs-on: ubuntu-latest |
| needs: [build, test] |
| steps: |
| - run: echo deploying package |
| """.strip(), |
| logs="deploy stage started before tests finished, causing regression release", |
| error_message="deploy dependency graph skips mandatory test gate", |
| actual_bug="deploy job does not depend on test job", |
| metadata={"broken_token": "needs: build", "fixed_token": "needs: [build, test]"}, |
| ), |
| ] |
|
|