Drafted by an AI agent from an operator-confirmed interview (run 20260908-home-d1).
Parent
Parent: #4004. Refs #3347, whose F3 records the whole-lane platform gate this exit code is a symptom of.
Superseded if #4007 lands. An engine-native Windows Recycle Bin apply removes the blocker entirely, and this issue closes with it. Until then, Windows operators hit this on every run.
Problem
The skill makes preview a mandatory step before the manual handoff lane. On Windows that mandatory step always fails.
On this run, preview against plan-medium.json returned, for every candidate, exactly one blocker: execution-platform-unsupported. That blocker is a fact about the platform, not about any path. It is expected, it is documented, and it is identical for all five candidates. preview still exited 3.
A non-zero exit that occurs on every invocation on a platform carries no information. It is worse than no signal, because it trains the operator to ignore the exit code of the one command whose job is to say "do not proceed" — and to reach past it into the manual lane, which is exactly what the run did five times.
The verdict content was correct. Only the exit status was wrong.
Proposed fix
Distinguish a platform-capability blocker from a per-path blocker.
If the only blockers across all candidates are execution-platform-unsupported:
- exit 0, or a distinct reserved code that is not 3, and
- report the manual handoff lane as the outcome, since that is what the operator is being routed to.
Reserve exit 3 for a blocker that is about a path: a candidate that changed, a container that is not empty, a path that cannot be validated. Those are the cases where "do not proceed" means something.
If any per-path blocker is present alongside the platform blocker, exit 3 as today. The platform blocker must not mask a real one.
Design constraints
- No change to which paths are eligible, or to the blocker verdicts themselves. This is exit-status semantics only.
- The distinction must survive the mixed case: a run with one drifted path and a platform blocker still exits 3.
- If a distinct reserved code is chosen over 0, it must be documented alongside the existing exit codes.
Acceptance criteria
Out of scope
Drafted by an AI agent from an operator-confirmed interview (run
20260908-home-d1).Parent
Parent: #4004. Refs #3347, whose F3 records the whole-lane platform gate this exit code is a symptom of.
Superseded if #4007 lands. An engine-native Windows Recycle Bin apply removes the blocker entirely, and this issue closes with it. Until then, Windows operators hit this on every run.
Problem
The skill makes
previewa mandatory step before the manual handoff lane. On Windows that mandatory step always fails.On this run,
previewagainstplan-medium.jsonreturned, for every candidate, exactly one blocker:execution-platform-unsupported. That blocker is a fact about the platform, not about any path. It is expected, it is documented, and it is identical for all five candidates.previewstill exited 3.A non-zero exit that occurs on every invocation on a platform carries no information. It is worse than no signal, because it trains the operator to ignore the exit code of the one command whose job is to say "do not proceed" — and to reach past it into the manual lane, which is exactly what the run did five times.
The verdict content was correct. Only the exit status was wrong.
Proposed fix
Distinguish a platform-capability blocker from a per-path blocker.
If the only blockers across all candidates are
execution-platform-unsupported:Reserve exit 3 for a blocker that is about a path: a candidate that changed, a container that is not empty, a path that cannot be validated. Those are the cases where "do not proceed" means something.
If any per-path blocker is present alongside the platform blocker, exit 3 as today. The platform blocker must not mask a real one.
Design constraints
Acceptance criteria
previewwhose only blockers areexecution-platform-unsupporteddoes not exit 3, and its output names the manual handoff lane as the outcome.previewwith any per-path blocker still exits 3, including when a platform blocker is also present, demonstrated by a test over a mixed fixture.scripts/affected-tests.sh --runselects and passes the suites mapped to the changed files.Out of scope
handoff-verify's own exit-status defect, filed separately in this umbrella.