Blocker: headless runs die on smoke - uv cannot install Python 3.13 into root-owned /opt/uv/python #56
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem (blocks the entire trade wave and every headless run)
Every
wardedengineer run on this repo dies on theward exec smoke/ward exec testgate before it can land, so nothing reachesmain. The three dispatched foundation runs (#6, #53, #55) left zero commits, zero branches, and zero salvage - they never got past validation.Root cause (environment, not code)
Reproduced live in the dev-base container:
pyproject.tomlsetsrequires-python = ">=3.13", and the productDockerfileisFROM python:3.13, so 3.13 is the deliberate target./usr/bin/python3.12), no 3.13.uv runmust download a managed CPython 3.13, intoUV_PYTHON_INSTALL_DIR, which the image env-sets to/opt/uv/python./opt/uvis root-owned (drwxr-xr-x root root) and the agent runs non-root, so the download dir cannot be created.uv runaborts, the MCP server never starts, smoke fails, the run cannot go green, and it dies (or the reaper salvages an empty tree).CI is unaffected and stays green:
.forgejo/workflows/build-publish.ymlrunsuv rundirectly viaastral-sh/setup-uv, which bypasses this Makefile and this image entirely.Fix (validated end to end)
Redirect uv's managed-Python download to a HOME-writable directory in the
Makefile, unconditionally. It must be:=/=, not?=: the container env-setsUV_PYTHON_INSTALL_DIR=/opt/uv/python, and make treats an environment-origin variable as already-set, so?=would not override it.Verified in the read-only surface clone: with the override in place,
ward exec smokedownloads CPython 3.13.14, starts the server, and returns the full 12-tooltools/listround-trip with zero failure markers and exit 0 (up from immediate permission-denied death).Acceptance
ward exec smoke,ward exec test, andward exec lintpass in a fresh dev-base agent container.requires-python(3.13 stays the target) and no change to CI.Priority and follow-up
P1 - hard blocker. Until this lands on
main, re-dispatching #6 / #49-#55 is futile - they all inherit the same red smoke gate. A headless run that applies this Makefile edit first, then runs the gate, passes (the edit is active during validation), so this fix is self-healing.The deeper cause is a dev-base image bug: a root-owned
UV_PYTHON_INSTALL_DIRthat non-root agents cannot write, on an image that ships a Python older than its consumers require. That warrants a systemic fix in the image (make the dir agent-writable, or pre-install common Pythons) so no other repo hits this wall. Tracked separately.🔒 Reserved by
ward agent --driver claude— containerengineer-claude-eco-app-56on hostKAI-DESKTOP-TOWERis carrying this issue (reserved 2026-07-05T02:08:14Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).
— Claude (she/her), via
ward agent🔓 Reservation released by
ward container reap— containereco-app(--driver claude) exited without launching the agent (smoke-test death, ward#222/#264), so the hold it took is retracted. A plainward agentretry no longer needs--force.— Claude (she/her), via
ward agentCross-links for the full picture:
UV_PYTHON_INSTALL_DIR, no pre-installed 3.13).This issue is the immediate unblock: once it lands on main, the trade wave (#6, #53, #55 then #49/#50/#52 -> #51/#54) can re-dispatch and get past smoke.
🔒 Reserved by
ward agent --driver claude— containerengineer-claude-eco-app-56on hostKAI-DESKTOP-TOWERis carrying this issue (reserved 2026-07-05T02:39:08Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).
— Claude (she/her), via
ward agentWARD-OUTCOME: done - Makefile now redirects uv's managed-Python download to $(HOME)/.cache/uv-python, so smoke/test/lint pass in a fresh dev-base container; landed on main as
bf6140d.Honestly this one was almost anticlimactic - the issue body had already done the hard diagnostic work and even handed over the exact fix, so the job was mostly confirming it end to end rather than discovering anything. The one small surprise: uv resolved CPython 3.14.6, not the 3.13.14 the issue mentioned, because
requires-python = ">=3.13"lets it grab the newest managed interpreter. The full suite (262 tests) is green under 3.14 anyway, so no concern, just worth noting for anyone expecting 3.13 exactly.Confidence is high - all three gates verified green in this very container (smoke exit 0 with the full 12-tool round-trip, no permission-denied), which is the same environment every headless run inherits, so it's genuinely self-healing. The only rough edge is the one the issue already flagged: this is a per-repo bandage over a dev-base image bug (root-owned UV_PYTHON_INSTALL_DIR on an image shipping a too-old Python). That systemic fix is tracked in agentic-os#327/#328, so nothing new to file from here.