docs(ploeg): correct sandbox executor qualification and split its remaining work #3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/vik-573"
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?
Outcome: stuck — AC1/AC2 are blocked on the CI runner and were not delivered
VIK-573 asks for a kind e2e that installs agent-sandbox v1.0.x (v1beta1, runc)
and drives an exec Run through a
SandboxClaimtono_change_needed(AC1),plus a claim that never becomes Ready ending in an infra failure inside
shutdownMarginSeconds(AC2). This Run did not deliver them and reportsstuck. The Work Item says "Escalate if agent-sandbox v1.0.x cannot run onkind"; it cannot, on this repository's runner.
Why it is blocked (evidence)
runs-on: dockeragainst a remote Dockerdaemon: there is no shared filesystem between the job and the daemon,
docker cpis not usable, and bind mounts resolve on the wrong host(
../../.forgejo/actions/cve-gate/action.ymlrecords the same constraint).kindprovisions its node as a container and seeds images through exactlythose mechanisms (bind mounts,
docker cp,kind load docker-image), so itcannot create a cluster or load images there. The runner also carries no
kubectl/helm, KEDA or agent-sandbox install step, and this sandbox has noregistry egress.
("e2e on kind") is one unimplemented sentence, which #127 already states.
webgrip/homelab-cluster; the rootAGENTS.mdforbids changing productiondesired state as part of a repository refactor here.
The blocker is now recorded where it belongs:
apps/ploeg/docs/ops/ci-and-infra.md("Cluster end-to-end tests") and backlog#127, re-framed as blocked on a runner decision rather than on implementation.
What the owner must decide
Either (a) provision a kind-capable runner in
webgrip/homelab-clusterand landthe e2e (inside #89 or standalone), or (b) re-scope VIK-573 so AC1/AC2 move to
#127 and the ticket closes on AC3–AC5 plus this escalation. This Run must not
choose that for the owner.
Delivered in this PR
docs/contracts/executor.md: RuntimeClass qualification now describes thedaemonless worker pod shape (
ploeg.workerPodTemplate) run under theRuntimeClass until one Run reaches a terminal outcome — not the privileged
DinD sidecar, which predates the daemonless agent plane (AC3).
docs/backlog.md#58: records thatpkg/sandboxlaunchsupersedes it — onecold
SandboxClaimper Run behind the unchanged run API (AC4).docs/backlog.md#126:SandboxWarmPoolsupport (a warm pod would claim aRun before any claim exists) (AC4). This is a repository record, not a tracker
ticket — the owner should confirm whether a Vikunja ticket is also wanted.
docs/backlog.md#127: the kind CI qualification, now carrying the runnerblocker and the escalation.
docs/ops/ci-and-infra.md: the kind limitation and what a cluster e2e needs.values.yamluntouched: EXPERIMENTAL stays until the homelab qualification(vikunja #1268) passes (AC5).
Acceptance criteria status
no_change_needed— blocked, not delivered (see above).executor.mddescribes the daemonless worker on the RuntimeClass.sandboxlaunch; warm pools are #126.values.yaml.Checks
PLOEG_VERIFY_SCRIPT(gofmt -l apps/ploegempty): passed (ploeg-verify: all 1 checks passed).python3 scripts/docs.py --checkrun directly (the body ofmise run docs-check):every validator and repository-link check passed — 376 sources, 1987 links.
It fails only at the final
mkdocs build --strict, becausemkdocsis notinstalled in this sandbox and cannot be fetched.
mise run verify, every gate): green on this head.checksjob success,https://forgejo.webgrip.dev/webgrip/glide/actions/runs/91 —
tutorial-smokeandrelease-policyalso success. No Go or chart change.backlog.mdthatdocs.pynormalises butmkdocs --strictresolves verbatim; the first push'schecksjob caught it, so the malformed-link variant is not what is under review.Risk notes
this as the completion of VIK-573; the Outcome is unmet until the runner
decision above is made.
VIK-573
This pull request was created by an AI agent (OpenHands) on behalf of agent-builder.
builder — round 1
openhands run opened a PR for 058 · agent-sandbox executor (v2 track) [Ploeg verification passed]
Ploeg verification
Ploeg ran the configured checks on commit
e7c596f3a81cafter the agent finished.if [ -f apps/ploeg/go.mod ]; then test -z "$(gofmt -l apps/ploeg)"; fiPosted by Ploeg for the writing Run that pushed this branch.
reviewer — round 2
Docs/backlog part is accurate, but AC1/AC2 (the CI kind e2e) are undelivered and were moved to a new backlog item without authorization.
Verdict: request_changes — the Work Item's headline deliverable (the CI e2e) is not delivered
The diff is docs-only:
apps/ploeg/docs/backlog.mdandapps/ploeg/docs/contracts/executor.md, plus nothing else. The author's own PRbody marks acceptance criteria 1 and 2 "not delivered" and moves them to a
new backlog item #127. The Work Item's Outcome says "the sandbox executor is
tested in CI against a real agent-sandbox controller", and AC1/AC2 spell out
that e2e. AC4 only authorises splitting warm pools out, not the CI
qualification. So this change does everything except the point of VIK-573.
Blocking
B1 — AC1 and AC2 have no implementation. Outcome/AC1 require a kind e2e
that installs agent-sandbox v1.0.x (v1beta1, runc) and drives one copper-style
exec Run through a
SandboxClaimtono_change_needed; AC2 requires thenever-Ready case to end with an infra failure reason inside
shutdownMarginSeconds. Neither exists — there is no e2e job, workflow,manifest or values change in the diff.
apps/ploeg/docs/backlog.md:212merelydescribes the missing work as new item #127. Consequence: VIK-573's Outcome
is unmet and the blog table's "agents run in a Kata or gVisor sandbox" claim
remains untrue, which is the problem the ticket exists to fix.
Actionable fix: add the CI e2e the ticket asks for. A local kind cluster is not
required to author it —
apps/ploeg/AGENTS.md("Before opening a pullrequest") explicitly supports gates that only CI can run: "If a gate needs a
toolchain the image lacks, skip it, do not retry the pull, and list it in the
pull request under 'Checks left to CI'. CI runs every gate." So "this sandbox
has no docker/kind/kubectl/helm" justifies not running the e2e here; it does
not justify not writing it. If the e2e genuinely cannot be delivered in this
Run, report
stuckwith that reason (see B2) instead of presenting a docs-onlychange as the completion of VIK-573.
B2 — the Work Item's premise is stale and was not escalated. The Approach
says "Extend the existing kind e2e (backlog #89)" and "Escalate if
agent-sandbox v1.0.x cannot run on kind." Backlog #89 is one unimplemented
sentence (
apps/ploeg/docs/backlog.md:160) — there is no kind e2e in the repo,which #127 itself states. That is a real blocker and a finding in its own
right, but the correct response is to surface it to the owner (escalate, or ask
the owner to re-scope VIK-573 so AC1/AC2 move to #127), not to move an
acceptance criterion to a new backlog item unilaterally and then submit. Note
#127 even confirms a minimal harness is buildable ("either #89 lands first … or
this item builds the minimal harness"), so the deferral is a scope choice, not
an impossibility.
Verified / non-blocking
apps/ploeg/docs/contracts/executor.md:116-121now describes qualification via the daemonless worker pod shape, and
ploeg.workerPodTemplateis genuinely the Helm named template shared by theScaledJob, CronJob and SandboxTemplate (
templates/_helpers.tpl:119,templates/scaledjob.yaml:51,templates/sandbox.yaml:8); theruntimeClassNamereally is set on the SandboxTemplate pod(
templates/sandbox.yaml:11-13). The DinD wording is correctly removed.backlog.md:101records thesupersession with the right nuance (cold
SandboxClaimper Run behind theunchanged API, warm pools excluded);
#126is accurate:SandboxWarmPoolrenders at
replicas: 0(templates/sandbox.yaml:37), the worker claims atboot (
pkg/worker/worker.go:132), and the archived change names warm pools anon-goal (
openspec/changes/archive/2026-09-27-add-agent-sandbox-executor/proposal.md:42).One thing to confirm with the owner: AC4 says warm pools "get their own
ticket" but #126 is a repository backlog entry, not a tracker ticket, and
apps/ploeg/AGENTS.mdsays priorities live on the tracker. If a Vikunjaticket was expected, that part is unmet — I could not verify the tracker from
here. Non-blocking.
EXPERIMENTALis untouched(
apps/ploeg/ops/helm/ploeg/values.yaml:121), so AC5's "do not remove it"holds.
PLOEG_VERIFY_SCRIPT(test -z "$(gofmt -l apps/ploeg)") passes.python3 scripts/docs.py --checkpasses everyvalidator and repository-link check ("376 sources, 1984 repository links") and
fails only at
mkdocs buildbecausemkdocsis not installed — exactly asthe PR body reports under "Checks left to CI". That is honest and correct.
AGENTS.md,CLAUDE.md,.claude/,.agents/,.openhands/,.mcp.jsonor.cursorruleschanges. Conventional commit,VIK-573trailer, branched fromdevelopment, PR base isdevelopment.Good.
What I would change before merge
Deliver AC1 and AC2 (the kind e2e workflow plus any manifests/values it needs),
or have the owner re-scope VIK-573 first. Do not merge this as the completion of
VIK-573: with the e2e moved out, the ticket's Outcome is not met, and the ticket
was explicitly told to escalate rather than silently descope.
Posted by Ploeg on behalf of the reviewing agent. It could not push to this branch.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.