fix(harness,worker): a reading Run's review must survive every harness #35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ryangr0/harness-outcome-dropbox"
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?
ComposePrompttells every reading Run, on every harness, to deliver its review by writing JSON to the file named byPLOEG_OUTCOME_FILE. Onlyopenhandsandexecever set it. Onclaude-codeit was never exported at all;acphad no notion of a drop box.So a reviewer on either wrote its review to the empty string and Ploeg read nothing:
agent_runs.findingsandverdictstayed blank,shiftengine.requestsChangeswas therefore always false, and ADR-0017's review loop was inert — every Shift closedreview_approvedregardless of what the reviewer found, with nothing published to the pull request for a human to read either.values.yamldocumentsharness: {name: claude-code}on a role as supported, so this was reachable configuration.What changed
pkg/harness(DropBoxEnv,DropBoxPath,ReadDropBox,MergeDropBox) rather than a copy per adapter.openhandsmoves onto it too, which is what makes ADR-0018's claim true rather than aspirational.MergeDropBoxcarries the precedence. Findings and verdict are the agent's and always survive — a run that reviewed and then failed its shutdown handshake still did the review. Outcome and summary fill only a gap the adapter left: an adapter that classified a launch failure, a lost lease or a watchdog timeout holds evidence the agent does not, and an agent must not overturn it by writing a cheerful file (R2).resolveOutcomeno longer drops the PR link. Its structured-report arm returned the report untouched, with noLinks— so a reader that correctly wrote a drop box lost the URL while one that returned nothing kept it.publishRoundfinds the pull request by scanning reported links, so a review-only Shift published its findings nowhere.harnesstest.ReadingRunFindingsSurviveTheAdapter, run by all four adapter packages already. It is what stops this recurring on the fifth adapter.Regression tests, proven to fail first
The new property against the unfixed adapters:
Exit status 3 is the script's own guard:
PLOEG_OUTCOME_FILEwas unset, which is the defect stated directly.The link fix, with the change reverted:
Also here
docs/adrs/0018-*(proposed), backlog 109-115 for what this sweep found but did not fix, andarchitecture.md§9 divergence 18. Evidence:docs/research/2026-08-08-benchmarking-the-loop.md§8.Backlog 115 is worth a look on its own: ADR-0017's
close_reasonalready misreports atmaxFixRounds: 1—nextFixRoundchecks money -> cap -> verdict, so a fix round the reviewer approves closes asfix_round_cap_reached. That is one of ADR-0017's own re-evaluation triggers, hit before the loop has run in production.Gates
.forgejo/workflows/on_pull_request.yml— full outputThe golden check does not pass locally, and should not be "fixed". The diff is whitespace only — a blank line before each
---— on a branch that changes nothing underops/helm. My helm is v3.18.4; CI pins v4.2.3, and the two disagree about the blank line before a document separator. Runninghelm-golden.sh updatewould commit that churn and break the CI check. The script's failure message advised exactly that, so this branch fixes the message instead (29bd394).🤖 Generated with Claude Code