Skip to content

change check cannot fail for anything CI gates on: clippy is missing from the verification command set #708

Description

@0xLeif

specsync change check is the local gate that decides a change is verified. It runs the project's configured verification commands. Those commands do not include clippy, but CI does:

.specsync/sdd.json  ->  cargo test change::, cargo test, two Python validators
ci.yml:288          ->  cargo clippy -- -D warnings

So a change can be locally ✓ verified, pass change audit --strict, get an independent review, and still be BLOCKED in CI.

This is not hypothetical — it happened today

PR #705 went green locally, was pushed, and CI reported the test job as failed. Every test passed — 2376 and 406. The failure was a later step in that job: manual implementation of Option::map. Two costs, and the second is worse:

  1. A wasted CI round trip and a force of attention onto the wrong thing.
  2. The job name said "test" while the failure was clippy. Reading the job name rather than the failing step sends you to look for a broken test that does not exist.

Why it matters more than convenience

The lifecycle's claim is that verified means something. A local gate that cannot fail for a condition the remote gate blocks on makes verified weaker than it reads — the same class of problem as #698 (a requirement describing a gate the code does not have) and #694 (a check that cannot fail).

It also silently shifts the work: the author believes verification covered the change, and CI becomes the first place the truth appears.

What it needs

Add cargo clippy -- -D warnings to the verification commands so change check fails where CI would.

Two things to get right, neither optional:

  • Match CI exactly. CI runs bare cargo clippy, NOT --all-targets. The --all-targets form currently has 21 pre-existing failures in src/validator.rs test code, so adding that form would make every change unverifiable. This distinction has already cost time once.
  • Keep it in the same lane as the other commands — no network, no shell, bounded — which clippy satisfies.

Worth checking at the same time whether any other CI gate is absent from the local set. fmt --check appears to be in the same position.

Found during the independent review of #705, which noted: "This is exactly the hole that produced commit 2bd9795; the local gate still cannot catch it."

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

    area:ciRemote or local CI gate/workflow mismatcharea:test-coverageTests, verification, coverage, or lint coverage gapimpact:developer-experienceAffects authors, maintainers, or local workflowsimpact:maintainerPrimarily affects CI, release, or repository operatorspriority:p1Highest-impact or release-blocking riskscope:specsync-6Applies to current SpecSync 6 behavior or release contract

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions