release-smoke #10
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
| # The release gate: live 2-episode sweeps on every supported harness, PINNED versions. | |
| # Blocking — a release ships only when this is green. The upstream-latest canary is a | |
| # separate, advisory workflow (upstream-canary.yml). | |
| # | |
| # Triggers: release tags, manual dispatch, and a weekly schedule so breakage between | |
| # releases (provider drift, image rot) surfaces within days rather than at ship time. | |
| # Secrets: needs DEEPSEEK_API_KEY (Settings -> Secrets -> Actions). Never runs on PRs, | |
| # so fork PRs can never reach the secret. | |
| name: release-smoke | |
| on: | |
| push: | |
| tags: ["v*"] | |
| schedule: | |
| - cron: "0 2 * * 1" # Mondays 02:00 UTC = 10:00 Beijing | |
| workflow_dispatch: | |
| env: | |
| DSH_TAG: dsh-v0.1.0-rc.7 | |
| PI_TAG: v0.84.2 | |
| # the general matrix cell. The goal lives in its own variable and is quoted at every | |
| # use site: quotes inside an env var are literal after expansion, so embedding | |
| # `--goal "..."` in CELL split the sentence into stray arguments. | |
| CELL: >- | |
| --arm neutral --arm review:notes --seeds 1 --episodes 2 | |
| --max-turns 10 --min-turns-per-phase 2 --announce-budget | |
| --evaluator units:notes --evaluator step@observe --evaluator tool-calls | |
| GOAL: Get better at your work, however you judge it. | |
| # the required-self-edit cell: a fresh session per phase re-orients before acting, so | |
| # this cell needs a single-purpose goal and real room in the act phase (see the | |
| # smoke_check commit history for the three-run calibration) | |
| EDIT_CELL: >- | |
| --arm neutral --seeds 1 --episodes 2 | |
| --max-turns 32 --min-turns-per-phase 8 --announce-budget | |
| EDIT_GOAL: >- | |
| REQUIRED TASK, do this before anything else in this session: check whether the file | |
| src/packages/coding-agent/src/cli.ts (or src/apps/cli/src/bin.ts if that is the path | |
| that exists) contains the string PROTEUS-NOTE. If it does not, immediately use your | |
| edit or write tool to insert this comment on its own line right after the shebang | |
| line: // PROTEUS-NOTE: CLI entry point; boots the agent session. Make no other | |
| change to the file. If the marker is already present, do not rewrite or touch the | |
| file. Only after this is done may you do anything else. | |
| jobs: | |
| offline: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: {python-version: "3.12"} | |
| - run: pip install -e '.[dev]' && ruff check . && pytest tests/ -q | |
| minimal: | |
| needs: offline | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: {python-version: "3.12"} | |
| - run: pip install -e . | |
| - name: A-line sweep (mock, free) | |
| run: | | |
| python -m proteus.cli run --harness minimal $CELL --goal "$GOAL" --out /tmp/rc/minimal | |
| python scripts/smoke_check.py /tmp/rc/minimal --harness minimal | |
| - name: B-line, benchmark pipeline (polyglot, offline grade) | |
| run: | | |
| git clone --depth 1 https://github.com/Aider-AI/polyglot-benchmark /tmp/polyglot | |
| python - <<'PY' | |
| import os | |
| os.environ["PROTEUS_POLYGLOT_DIR"] = "/tmp/polyglot" | |
| from pathlib import Path | |
| from proteus.adapters.minimal import MinimalHarness | |
| from proteus.bench import as_goal | |
| from proteus.bench.polyglot import polyglot_task | |
| from proteus.core.episode import RunConfig, run | |
| from proteus.core.disposition import NEUTRAL | |
| # bowling exists in the real dataset (34 curated exercises; two-fer does | |
| # not — it is only in the fabricated test fixture) | |
| task = polyglot_task("bowling") | |
| cfg = RunConfig(name="bench", adapter=MinimalHarness(), disposition=NEUTRAL, | |
| goal=as_goal(task), root=Path("/tmp/rc/bench"), model="mock", | |
| episodes=2, task=task) | |
| res = run(cfg) | |
| assert res.episodes_complete == 2, res.error | |
| scored = [r for ep in res.eval_history for r in ep["results"]] | |
| assert len(scored) == 2 and all("polyglot" in r["name"] for r in scored) | |
| print("benchmark pipeline scored every episode:", [r["score"] for r in scored]) | |
| PY | |
| llm: | |
| needs: offline | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: {python-version: "3.12"} | |
| - run: pip install -e . | |
| - name: require the API secret | |
| run: | | |
| if [ -z "${{ secrets.DEEPSEEK_API_KEY }}" ]; then | |
| echo "::error::add DEEPSEEK_API_KEY under Settings -> Secrets -> Actions"; exit 1 | |
| fi | |
| - name: A-line sweep (live model) | |
| env: | |
| DEEPSEEK_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | |
| run: | | |
| python -m proteus.cli run --harness llm $CELL --goal "$GOAL" --out /tmp/rc/llm | |
| python scripts/smoke_check.py /tmp/rc/llm --harness llm | |
| container: | |
| needs: offline | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 120 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| harness: [pi, dsh] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: {python-version: "3.12"} | |
| - run: pip install -e . && pip install zstandard # dsh session logs are zstd | |
| - name: require the API secret | |
| run: | | |
| if [ -z "${{ secrets.DEEPSEEK_API_KEY }}" ]; then | |
| echo "::error::add DEEPSEEK_API_KEY under Settings -> Secrets -> Actions"; exit 1 | |
| fi | |
| - name: bake the pinned from-source image | |
| run: | | |
| set -e | |
| if [ "${{ matrix.harness }}" = "pi" ]; then | |
| git clone --depth 1 --branch "$PI_TAG" https://github.com/badlogic/pi-mono /tmp/src | |
| docker run --rm -v /tmp/src:/opt/src -w /opt/src node:24-slim \ | |
| sh -c 'npm ci --no-audit --no-fund && npm run hydrate:model-data' | |
| sudo rm -rf /tmp/src/node_modules /tmp/src/packages/*/dist /tmp/src/packages/*/*/dist | |
| cp environments/pi-src/boot.sh /tmp/src/.proteus-boot.sh | |
| docker build -f environments/pi-src/Dockerfile \ | |
| -t proteus-env-pi-src:0.84.2 /tmp/src | |
| else | |
| git clone --depth 1 https://github.com/deepseek-ai/deepseek-harness /tmp/src | |
| git -C /tmp/src fetch --depth 1 origin tag "$DSH_TAG" | |
| git -C /tmp/src checkout "$DSH_TAG" | |
| cp environments/dsh-src/boot.sh /tmp/src/.proteus-boot.sh | |
| docker build -f environments/dsh-src/Dockerfile \ | |
| -t proteus-env-dsh-src:0.1.0-rc.7 /tmp/src | |
| fi | |
| - name: A-line sweep | |
| env: | |
| DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | |
| run: | | |
| python -m proteus.cli run --harness ${{ matrix.harness }} $CELL \ | |
| --goal "$GOAL" --out /tmp/rc/${{ matrix.harness }} | |
| python scripts/smoke_check.py /tmp/rc/${{ matrix.harness }} \ | |
| --harness ${{ matrix.harness }} | |
| - name: required self-edit cell | |
| env: | |
| DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | |
| run: | | |
| python -m proteus.cli run --harness ${{ matrix.harness }} $EDIT_CELL \ | |
| --goal "$EDIT_GOAL" --evaluator units:notes --evaluator step@observe \ | |
| --out /tmp/rc/${{ matrix.harness }}-edit | |
| python scripts/smoke_check.py /tmp/rc/${{ matrix.harness }}-edit \ | |
| --harness ${{ matrix.harness }} --max-turns 32 --require-self-edit |