Skip to content

disk-hygiene: preview exits 3 on Windows when the only blocker is execution-platform-unsupported, making the mandatory preview step a guaranteed failure #4011

Description

@kyle-sexton

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

  • preview whose only blockers are execution-platform-unsupported does not exit 3, and its output names the manual handoff lane as the outcome.
  • preview with any per-path blocker still exits 3, including when a platform blocker is also present, demonstrated by a test over a mixed fixture.
  • The exit-code table in the skill and engine docs reflects the new semantics.
  • No blocker verdict content changes; a test shows the reported blockers are identical before and after.
  • scripts/affected-tests.sh --run selects and passes the suites mapped to the changed files.

Out of scope

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions