Skip to content

chore(deps): refresh validation and container dependencies - #78

Merged
steipete merged 1 commit into
mainfrom
chore/deps-refresh-20260830
Aug 31, 2026
Merged

chore(deps): refresh validation and container dependencies#78
steipete merged 1 commit into
mainfrom
chore/deps-refresh-20260830

Conversation

@steipete

@steipete steipete commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Refresh the remaining application/container dependency pins after the recent Python update: Pydantic 2.13.4 → 2.13.5, Playwright 1.59.1 → 1.62.1 in both Dockerfiles, and the Kubernetes MLflow server 3.14.0 → 3.15.2. Keep the MLflow manifest, deploy-script defaults, help, and documentation aligned.

Why?

Pydantic has a new patch release, the bundled Chromium was behind, and the Kubernetes MLflow server lagged the already-current Python extra. No new dependencies or lockfiles were introduced. This repository uses pip and has no dependency lockfile.

Changes

All changes are patch/minor upgrades. Other direct Python requirements, GitHub Actions, pre-commit hooks, and the HF mirror client already resolve to current stable releases. Python 3.11 keeps its compatible NumPy 2.4.6 range; Python 3.12+ uses 2.5.2.

The fixed OpenClaw image digest and native campaign harness/Node/LiteLLM versions remain reproducibility inputs. Upgrade those in a separately qualified campaign. The optional Hermes source requirement already tracks main.

Upstream notes reviewed: Pydantic 2.13.5, Playwright release notes, and MLflow 3.15.2. Playwright is used here to install Chromium; removed application APIs in its release notes are not used by these Docker commands.

Tests

Local validation uses Python 3.12.14 with the dev and MLflow extras installed. python -m pip check reports No broken requirements found. Full Ruff lint reports All checks passed!. The full local suite passed: 515 passed, 5 skipped, 1 warning in 268.13s. The existing five skips require the private tasks/ holdout, which is absent in this public checkout. The warning is the existing Gradio 6 theme/CSS argument deprecation.

The package wheel built successfully and contains all four runtime-data entries checked by CI. After replacing the editable install with that wheel, the actual clawbench list-tasks entry point ran from a scratch working directory. Its exact task IDs matched the packaged YAML definitions: 19 Core v1 tasks plus eight perturbed variants.

Installed wheel: clawbench 0.4.0.dev1; Pydantic 2.13.5; loaded 27 public tasks

A full HF image build was attempted but canceled during slow local build-context processing; no full image rebuild is claimed.

The updated Chromium was launched through Playwright against a local HTTP server serving the real public newsletter-form fixture. The smoke check loaded the form and filled its email input:

Playwright 1.62.1; Chromium 151.0.7922.34; HTTP 200; public form loaded

The MLflow 3.15.2 container ran locally with an ephemeral SQLite database on tmpfs. The repository's scripts/log_to_mlflow.py logged an explicitly synthetic result to an experiment configured with a proxied artifact URI. Client readback verified the metric, model parameter, and JSON artifact:

MLflow 3.15.2: GET /health -> 200 OK
Logged to MLflow: experiment=deps-refresh-smoke run=synthetic/dependency-smoke-deps-smo
MLflow readback: 1 run, overall_score=0.8, model and JSON artifact verified

These checks validate dependency/runtime behavior. The synthetic score is a test fixture.

Exact local commands

python3.12 -m venv .tmp/deps-refresh-20260830/venv
source .tmp/deps-refresh-20260830/venv/bin/activate
python -m pip install --no-compile -e '.[dev,mlflow]'
python -m pip check
python -m ruff check clawbench app.py scripts tests
PYTHONDONTWRITEBYTECODE=1 python -m pytest -q -o cache_dir=.tmp/deps-refresh-20260830/pytest-cache
python -m pip wheel --no-deps . -w .tmp/deps-refresh-20260830/wheel
python -m pip install --no-compile --force-reinstall --no-deps .tmp/deps-refresh-20260830/wheel/clawbench-0.4.0.dev1-py3-none-any.whl
env -u PYTHONPATH -u CLAWBENCH_TASKS_DIR PYTHONDONTWRITEBYTECODE=1 .tmp/deps-refresh-20260830/venv/bin/python .tmp/deps-refresh-20260830/cli-proof.py
No broken requirements found.
All checks passed!
515 passed, 5 skipped, 1 warning in 268.13s (0:04:28)
Successfully built clawbench
npm install --prefix .tmp/deps-refresh-20260830/browser --no-audit --no-fund --package-lock=false playwright@1.62.1
PLAYWRIGHT_BROWSERS_PATH="$PWD/.tmp/deps-refresh-20260830/browsers" .tmp/deps-refresh-20260830/browser/node_modules/.bin/playwright install chromium
PLAYWRIGHT_BROWSERS_PATH="$PWD/.tmp/deps-refresh-20260830/browsers" node .tmp/deps-refresh-20260830/browser-proof.cjs
# Server, in a separate foreground terminal:
docker run --rm --name shellbench-deps-refresh-mlflow-20260830 --tmpfs /tmp -p 127.0.0.1::5000 ghcr.io/mlflow/mlflow:v3.15.2 mlflow server --host 0.0.0.0 --port 5000 --backend-store-uri sqlite:////tmp/mlflow.db --default-artifact-root /tmp/artifacts --serve-artifacts
# Client:
MLFLOW_ENABLE_TELEMETRY=false PYTHONDONTWRITEBYTECODE=1 .tmp/deps-refresh-20260830/venv/bin/python .tmp/deps-refresh-20260830/mlflow-roundtrip.py

The temporary smoke helpers below make these commands reproducible. They are included here as proof scaffolding.

Smoke helper source

cli-proof.py

from importlib.metadata import version
from pathlib import Path
import subprocess
import sys
import clawbench
import yaml

root = Path(__file__).absolute().parent
workdir = root / 'installed-cli'
workdir.mkdir(exist_ok=True)
assert 'site-packages/clawbench' in str(Path(clawbench.__file__))
command = [str(Path(sys.executable).parent / 'clawbench'), 'list-tasks']
result = subprocess.run(command, cwd=workdir, check=True, capture_output=True, text=True)
(root / 'cli-tasks.log').write_text(result.stdout)
print(result.stdout)
tasks = [line for line in result.stdout.splitlines() if line.startswith('  t')]
task_root = Path(clawbench.__file__).parent.parent / 'tasks-public'
expected = {yaml.safe_load(path.read_text())['id'] for path in task_root.glob('tier*/*.yaml')}
actual = {line.split()[0] for line in tasks}
assert actual == expected and len(tasks) == len(expected), (actual, expected)
manifest = yaml.safe_load((task_root / 'MANIFEST.yaml').read_text())
core = {task['id'] for task in manifest['tasks']}
assert len(core) == manifest['task_count'] == 19 and core <= actual
assert all(task.endswith('-perturbed') for task in actual - core)
print(f"Installed wheel: clawbench {version('clawbench')}; Pydantic {version('pydantic')}; loaded {len(tasks)} public tasks")

browser-proof.cjs

const { chromium } = require('./browser/node_modules/playwright');
const { createServer } = require('node:http');
const { readFileSync } = require('node:fs');
const assert = require('node:assert/strict');
(async () => {
  const html = readFileSync('tasks-public/assets/t2_browser_form_fix/index.html');
  const server = createServer((req, res) => {
    res.setHeader('Content-Type', req.url === '/app.js' ? 'text/javascript' : 'text/html');
    res.end(req.url === '/app.js' ? readFileSync('tasks-public/assets/t2_browser_form_fix/app.js') : html);
  });
  await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
  let browser;
  try {
    browser = await chromium.launch({headless: true});
    const page = await browser.newPage();
    const response = await page.goto(`http://127.0.0.1:${server.address().port}`);
    assert.equal(response.status(), 200);
    assert.equal(await page.title(), 'Newsletter Signup');
    await page.locator('#email').fill('synthetic@example.com');
    assert.equal(await page.locator('#email').inputValue(), 'synthetic@example.com');
    console.log(`Playwright ${require('./browser/node_modules/playwright/package.json').version}; Chromium ${browser.version()}; HTTP ${response.status()}; public form loaded`);
  } finally {
    if (browser) await browser.close();
    server.close();
  }
})().catch(error => { console.error(error); process.exitCode = 1; });

mlflow-roundtrip.py

import json
import os
from pathlib import Path
import subprocess
import sys
import urllib.request
from mlflow.tracking import MlflowClient

proof = Path('.tmp/deps-refresh-20260830').absolute()
port = subprocess.check_output(['docker', 'port', 'shellbench-deps-refresh-mlflow-20260830', '5000'], text=True).strip()
uri = 'http://' + port
with urllib.request.urlopen(uri + '/health', timeout=10) as response:
    print(f'MLflow 3.15.2: GET /health -> {response.status} {response.read().decode()}', flush=True)
result = {
    'submission_id': 'deps-smoke', 'model': 'synthetic/dependency-smoke',
    'provider': 'synthetic', 'timestamp': '2026-08-30T00:00:00Z',
    'overall_score': 0.8, 'overall_completion': 1.0,
    'overall_trajectory': 0.75, 'overall_behavior': 0.75,
    'overall_ci_lower': 0.8, 'overall_ci_upper': 0.8, 'overall_pass_hat_k': 1.0,
}
result_file = proof / 'synthetic-result.json'
result_file.write_text(json.dumps(result))
proof_env = dict(os.environ, MLFLOW_TRACKING_URI=uri,
    MLFLOW_EXPERIMENT_NAME='deps-refresh-smoke', MLFLOW_ENABLE_TELEMETRY='false')
proof_env.pop('MLFLOW_EXPERIMENT_ID', None)
client = MlflowClient(tracking_uri=uri)
client.create_experiment('deps-refresh-smoke', artifact_location='mlflow-artifacts:/deps-refresh-smoke')
subprocess.run([sys.executable, 'scripts/log_to_mlflow.py', str(result_file)], env=proof_env, check=True)
client = MlflowClient(tracking_uri=uri)
experiment = client.get_experiment_by_name('deps-refresh-smoke')
runs = client.search_runs([experiment.experiment_id])
assert len(runs) == 1 and runs[0].data.metrics['overall_score'] == 0.8
assert runs[0].data.params['model'] == result['model']
assert any(a.path == result_file.name for a in client.list_artifacts(runs[0].info.run_id))
print('MLflow readback: 1 run, overall_score=0.8, model and JSON artifact verified', flush=True)

CI reasoning

The orchestrator's NORUNS snapshot was stale. Default-branch build/test CI was already green at 7e117cb. The updated branch push run and PR run at 42d6294 are green: both Python 3.11 and 3.12 pass full Ruff lint, runtime contract smoke tests, the full test suite, and wheel runtime-data verification. CodeQL analyses for Python, JavaScript/TypeScript, and Actions also passed. No assertions or jobs were weakened.

The HF mirror is a deployment workflow, not test CI; its latest main run is successful. ClawSweeper dispatch is operations automation; Testbox and Crabbox hydration are manual validation infrastructure. No production deployment or credentials were changed.

Codex autoreview completed scoped-clean at its default P0 threshold, with no accepted/actionable findings. This PR is for orchestrator review and has not been merged.

@steipete
steipete requested a review from a team as a code owner August 31, 2026 07:20
@clawsweeper

clawsweeper Bot commented Aug 31, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Aug 31, 2026
@clawsweeper

clawsweeper Bot commented Aug 31, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge. Reviewed August 31, 2026, 3:27 AM ET / 07:27 UTC.

ClawSweeper review

What this changes

The PR raises the Pydantic minimum, updates container-installed Playwright and Chromium, and changes the Kubernetes MLflow default to 3.15.2 with matching script help and documentation.

Merge readiness

Blocked until stronger real behavior proof is added - 4 items remain

Keep this PR open: it changes the MLflow image automatically used by existing Kubernetes deployments, but the supplied MLflow smoke starts with a new tmpfs database and does not prove that the PVC-backed database created by 3.14.0 remains usable after the upgrade. The prior P1 concern remains on the unchanged head.

Priority: P2
Reviewed head: 42d62948d77273871aff032280b0b86302d991f1

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The refresh is narrowly scoped and well exercised for fresh environments, but the unproven persisted MLflow upgrade path blocks merge confidence.
Proof confidence 🦐 gold shrimp (3/6) Needs stronger real behavior proof before merge: The body provides real after-fix terminal logs for fresh Pydantic, Playwright, and MLflow behavior, but the changed Kubernetes owner starts MLflow against a PVC-backed SQLite database and the cited tmpfs run does not cover that persisted upgrade path. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Patch quality 🦐 gold shrimp (3/6) 1 actionable review finding remain.

Verification

Check Result Evidence
Real behavior Needs proof Needs stronger real behavior proof before merge: The body provides real after-fix terminal logs for fresh Pydantic, Playwright, and MLflow behavior, but the changed Kubernetes owner starts MLflow against a PVC-backed SQLite database and the cited tmpfs run does not cover that persisted upgrade path. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed 5 items Introduced default image change: The PR changes the default MLflow image from 3.14.0 to 3.15.2 in both the deployment manifest and deployment script, so rerunning the documented deployment updates an existing server.
Existing deployments retain MLflow state: MLflow serves SQLite data under /mlflow, and that directory is backed by the mlflow-data persistent-volume claim.
Prior blocker remains applicable: The preceding review required a retained-database upgrade check. The affected deployment files have no changes after that review's exact head, so the new evidence does not resolve it.
Findings 1 actionable finding [P1] Validate the retained MLflow database before changing the default
Security None None.

How this fits together

The Kubernetes deployment script provisions an MLflow tracking server for ClawBench evaluation results. Its default image is applied to the MLflow Deployment, which mounts a persistent volume containing the tracking database and artifacts.

flowchart LR
A[Deployment command] --> B[MLflow image default]
B --> C[MLflow Kubernetes Deployment]
C --> D[Persistent volume]
D --> E[SQLite tracking database]
E --> F[ClawBench result logging]
Loading

Before merge

  • Add real behavior proof - Needs stronger real behavior proof before merge: The body provides real after-fix terminal logs for fresh Pydantic, Playwright, and MLflow behavior, but the changed Kubernetes owner starts MLflow against a PVC-backed SQLite database and the cited tmpfs run does not cover that persisted upgrade path. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Validate the retained MLflow database before changing the default (P1) - This manifest image is applied when existing deployments are rerun, while MLflow serves sqlite:///mlflow/mlflow.db from a PVC. The supplied smoke creates a new tmpfs database, so it does not show that historical metadata and artifacts remain usable after the automatic 3.14.0-to-3.15.2 upgrade; add a retained-volume upgrade run or enforce and document the intended migration behavior.
  • Resolve merge risk (P1) - Applying the new default to an existing cluster restarts MLflow against its retained PVC-backed SQLite database; compatibility of historical metadata and artifacts is unproven by the fresh tmpfs smoke.
  • Complete next step (P2) - Contributor-supplied retained-volume runtime evidence is required before merge; this is not a repair task that automation can establish on the contributor's cluster.

Findings

  • [P1] Validate the retained MLflow database before changing the default — scripts/k8s/mlflow/deployment.yaml:21
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Dependency update scope 3 version pins across 7 files (+10/-9) One of the three pins changes the Kubernetes default used by existing persistent deployments.

Merge-risk options

Maintainer options:

  1. Add retained-volume upgrade proof (recommended)
    Create or retain a 3.14.0 MLflow PVC, apply the new 3.15.2 default, and show health plus readback of pre-existing runs and artifacts.

Technical review

Best possible solution:

Exercise a retained 3.14.0 MLflow volume through deployment to 3.15.2 and verify startup plus historical run and artifact readback, or explicitly document and enforce an intentional migration and rollback contract.

Do we have a high-confidence way to reproduce the issue?

Not applicable as a bug report: this is a dependency-refresh PR. The missing validation is a concrete upgrade scenario using a retained 3.14.0 Kubernetes volume and the new default.

Is this the best way to solve the issue?

No; the dependency alignment is coherent, but merging a persistent-service default without retained-state upgrade evidence is not the safest complete solution.

Full review comments:

  • [P1] Validate the retained MLflow database before changing the default — scripts/k8s/mlflow/deployment.yaml:21
    This manifest image is applied when existing deployments are rerun, while MLflow serves sqlite:///mlflow/mlflow.db from a PVC. The supplied smoke creates a new tmpfs database, so it does not show that historical metadata and artifacts remain usable after the automatic 3.14.0-to-3.15.2 upgrade; add a retained-volume upgrade run or enforce and document the intended migration behavior.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.96

AGENTS.md: not found in the target repository.

Codex review notes: model internal, reasoning high; reviewed against 7e117cba3bd8.

Labels

Label changes:

  • add status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The body provides real after-fix terminal logs for fresh Pydantic, Playwright, and MLflow behavior, but the changed Kubernetes owner starts MLflow against a PVC-backed SQLite database and the cited tmpfs run does not cover that persisted upgrade path. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • remove status: ⏳ waiting on author: Current PR status label is status: 📣 needs proof.
  • remove proof: sufficient: Current real behavior proof status is insufficient, not sufficient.

Label justifications:

  • P2: The unresolved upgrade path affects the optional Kubernetes MLflow deployment and has a bounded compatibility blast radius.
  • merge-risk: 🚨 compatibility: Changing the default MLflow image can alter behavior for existing PVC-backed tracking databases when deployments are reapplied.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The body provides real after-fix terminal logs for fresh Pydantic, Playwright, and MLflow behavior, but the changed Kubernetes owner starts MLflow against a PVC-backed SQLite database and the cited tmpfs run does not cover that persisted upgrade path. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Evidence

What I checked:

  • Introduced default image change: The PR changes the default MLflow image from 3.14.0 to 3.15.2 in both the deployment manifest and deployment script, so rerunning the documented deployment updates an existing server. (scripts/k8s/mlflow/deployment.yaml:21, 42d62948d772)
  • Existing deployments retain MLflow state: MLflow serves SQLite data under /mlflow, and that directory is backed by the mlflow-data persistent-volume claim. (scripts/k8s/mlflow/deployment.yaml:29, 42d62948d772)
  • Prior blocker remains applicable: The preceding review required a retained-database upgrade check. The affected deployment files have no changes after that review's exact head, so the new evidence does not resolve it. (scripts/k8s/mlflow/deployment.yaml:21, 42d62948d772)
  • Provided runtime proof covers only a fresh database: The PR body records a successful MLflow 3.15.2 round trip using an ephemeral tmpfs SQLite database; it does not exercise a 3.14.0 PVC database upgraded by the manifest default. (42d62948d772)
  • Kubernetes surface history: The original Kubernetes manifests were added by sallyom, and steipete previously refreshed the same MLflow deployment and script paths on current history. (scripts/k8s/mlflow/deployment.yaml:21, ca4fee5c0c47)

Likely related people:

  • steipete: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • sallyom: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Add redacted terminal or cluster logs showing a retained 3.14.0 database upgraded by the manifest to 3.15.2, including historical run and artifact readback.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (1 earlier review cycle)
  • reviewed 2026-08-31T07:23:14.047Z sha 42d6294 :: found issues before merge. :: [P1] Prove the persisted MLflow upgrade path

@clawsweeper clawsweeper Bot added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. proof: sufficient Contributor real behavior proof is sufficient. labels Aug 31, 2026
@steipete
steipete merged commit c1a79f7 into main Aug 31, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant