#25: sensor spawn/timeout failure fails the run (exit 1) - #33
Merged
Conversation
A spawn/timeout failure must fail the run, not be a false-clean. Add the
plumbing: CheckOutcome.failures, a shared SensorSink { notices; failures },
spawnFailureOutcome / recordSpawnFailure helpers, and skipOutcome for the
spawnWrapped skip path. Additive; nothing consumes it yet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nq6xHU6JtSNpYWhMYjXB15
Their spawn-failure branches now return a failing outcome (message in stderr plus a recorded failure) instead of a benign empty outcome. Still unconsumed by the runner until the sink is wired. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nq6xHU6JtSNpYWhMYjXB15
ruff/deptry sensors so every spawn/timeout failure is recorded, then have run() exit 1 whenever the sink has failures — independent of whether any violations were found. Every successful sensor still renders its full output and the failure notice is still shown. Update docs/sensors.md and DECISIONS.md; collapse allowedFilesBySmell to one expression to stay under the line cap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nq6xHU6JtSNpYWhMYjXB15
devill
force-pushed
the
issue-25-sensor-failure-exit
branch
from
June 17, 2026 15:12
52443cd to
b21ad15
Compare
devill
marked this pull request as ready for review
June 17, 2026 15:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #25.
A sensor that fails to spawn or times out was fail-soft — it surfaced a notice and contributed zero issues, so the run could exit 0 and report "looks good" while a whole class of smells went unchecked. This makes a broken tool a failed run (exit 1), consistent with #18's command-fix policy.
Design
A shared
SensorSink { notices; failures }threaded through the sensor layer. Spawn/timeout failures are recorded intofailures(the message also stays innoticesfor display).run()forces exit 1 wheneverfailuresis non-empty — independent of whether the successful sensors found violations. Every successful sensor still renders its full output. Benign skips (no config, no package.json, unparseable report) stay benign.All sensors are covered: eslint / jscpd / knip (CheckOutcome wraps), ruff (declarative adapter) and deptry (sensor). Timeouts route through the same
exitCode === -1path as spawn failures.Atomic commits
#25: add the sensor-failure channel—CheckOutcome.failures,SensorSink,spawnFailureOutcome/recordSpawnFailure,skipOutcome. Additive.#25: record spawn/timeout failures in the eslint/jscpd/knip wraps.#25: fail the run on a sensor spawn/timeout failure— thread the sink through both presets + ruff/deptry, fold failures into the exit code, tests,docs/sensors.md,DECISIONS.md.Tests
runner.run sensor failuree2e: forces a real spawn failure (a directory where the eslint bin is expected), asserts exit 1, the failure message shown, and the comment sensor's output still rendering.clean-projecttest.Gates
pnpm build,pnpm lint— clean (all touched files under the 200-line cap)pnpm test— 386 passed🤖 Generated with Claude Code
Generated by Claude Code