Urgent: the agent container crashed on startup (NameError: name 'Config' is not defined) — an earlier ruff --fix unquoted a self-referential annotation, safe on CI's Python 3.14 (PEP 649) but evaluated at class-def time on the agent's Python 3.10.
config.py: from __future__ import annotations — the fix, version-agnostic.
agent/ruff.toml: pin the agent to target-version = "py310" (its real runtime) inheriting root rules. Ruff now flags this class as F821, so the CI lint lane catches it instead of shipping a broken image (CI otherwise lints on 3.14, masking 3.10 issues).
client.py: submit-path retry (requested) — a dedicated session with a urllib3 Retry (connect/read/status, 0.5s backoff, 500/502/503/504, POST) so a blip after the GPU work is done doesn't discard it and force a re-download+recompute; a duplicate submit is a harmless 409 no-op. Lease/fetch keep the plain session + loop-level backoff.
**Urgent:** the agent container crashed on startup (`NameError: name 'Config' is not defined`) — an earlier `ruff --fix` unquoted a self-referential annotation, safe on CI's Python 3.14 (PEP 649) but evaluated at class-def time on the agent's Python 3.10.
- `config.py`: `from __future__ import annotations` — the fix, version-agnostic.
- `agent/ruff.toml`: pin the agent to `target-version = "py310"` (its real runtime) inheriting root rules. Ruff now flags this class as **F821**, so the CI lint lane catches it instead of shipping a broken image (CI otherwise lints on 3.14, masking 3.10 issues).
- `client.py`: **submit-path retry** (requested) — a dedicated session with a urllib3 Retry (connect/read/status, 0.5s backoff, 500/502/503/504, POST) so a blip after the GPU work is done doesn't discard it and force a re-download+recompute; a duplicate submit is a harmless 409 no-op. Lease/fetch keep the plain session + loop-level backoff.
Full CI green on dev incl. integration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The agent container (CUDA base, Python 3.10) crashed on startup with
`NameError: name 'Config' is not defined` — an earlier `ruff --fix` unquoted the
`from_env(cls) -> Config` self-reference, which is safe on CI's Python 3.14
(PEP 649 lazy annotations) but is evaluated at class-definition time on 3.10.
CI lint/compile run on 3.14, so it slipped through.
- config.py: `from __future__ import annotations` so the self-referential
annotation is a string, never evaluated — works on 3.10 and every version.
- agent/ruff.toml: pin the agent to `target-version = "py310"` (its real runtime)
and inherit the root rules. Ruff now flags exactly this class as F821, so CI's
lint lane catches it instead of shipping a broken image. (CI otherwise lints on
3.14, masking 3.10 issues.)
- client.py: submit path now retries in-place. A dedicated session with a
urllib3 Retry (connect/read/status, 0.5s backoff, 500/502/503/504, POST) so a
momentary blip after the GPU work is done doesn't discard it and force a full
re-download + recompute elsewhere. A duplicate submit after a lost response is
a harmless 409 no-op. Lease/fetch keep the plain session + loop-level backoff.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Urgent: the agent container crashed on startup (
NameError: name 'Config' is not defined) — an earlierruff --fixunquoted a self-referential annotation, safe on CI's Python 3.14 (PEP 649) but evaluated at class-def time on the agent's Python 3.10.config.py:from __future__ import annotations— the fix, version-agnostic.agent/ruff.toml: pin the agent totarget-version = "py310"(its real runtime) inheriting root rules. Ruff now flags this class as F821, so the CI lint lane catches it instead of shipping a broken image (CI otherwise lints on 3.14, masking 3.10 issues).client.py: submit-path retry (requested) — a dedicated session with a urllib3 Retry (connect/read/status, 0.5s backoff, 500/502/503/504, POST) so a blip after the GPU work is done doesn't discard it and force a re-download+recompute; a duplicate submit is a harmless 409 no-op. Lease/fetch keep the plain session + loop-level backoff.Full CI green on dev incl. integration.
🤖 Generated with Claude Code