Skip to content

release-smoke

release-smoke #10

Workflow file for this run

# 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