Skip to content

Runner-less skips name their exit - #256

Merged
qwerfunch merged 1 commit into
developfrom
feature/skip-exit-guidance
Aug 26, 2026
Merged

Runner-less skips name their exit#256
qwerfunch merged 1 commit into
developfrom
feature/skip-exit-guidance

Conversation

@qwerfunch

Copy link
Copy Markdown
Owner

2026-08-26 · feature/skip-exit-guidance → develop

A project whose language cladding cannot drive passed the gate with six of nine stages skipped and zero mention of the way out — the check now names the skipped stages once and shows the one declaration that turns them on.

Heads-up: additive only. Every skip message, exit code, and skip semantic is byte-identical; skips stay non-blocking. The change is a structured skipReason on the existing skip lane plus one rendered line.

Added

Runner-less skips carry a reason and name their exit. Command-stage skips are tagged no-runner (no runner registered for the language) or tool-missing (the resolved tool is absent); by-design skips — missing spec-conformance oracles, no declared deliverable — stay untagged, because prescribing gate.commands there would be a false cure. When at least one no-runner skip occurred, the check prints one trailing line listing those stages with the inline declaration (.cladding/config.yamlgate:commands:), noting the file is committable so CI runs the same gate. The JSON report carries skipReason additively for MCP and CI consumers.

Why now, and why this shape

The exit existed but was invisible. Across every adopter-reachable surface — gate output, both READMEs, the managed AGENTS.md block, clad doctor, the MCP tool descriptions — gate.commands was mentioned once, in a CHANGELOG line. The gate.language external E2E already proved that exact configuration strands a fully-capable agent when the one line is missing.

The remedy was proven true before the line was written. Declaring gate.commands flips all four stages from skip to run through the shipped binary — measured before implementation, so the guidance cannot lie.

Discrimination was measured necessary. On a runner-less adopter the six skips split 4/2: four curable by the declaration, two by-design where that advice would be wrong. The guidance attaches only to the four.

Verification

▸ Pre-implementation simulations (skip census, remedy truth, four-environment false-positive guard 4/0/0/0) promoted to regression tests; 16-test impl-blind oracle authored from the contract before landing, passing on first contact; golden gate matrix untouched.

▸ External E2E on the packed tarball in an isolated prefix (dist SHA-256 identical to the repo build): 15/15 criteria — guidance appears exactly once with all four labels, vanishes when commands are declared, never fires on a known-toolchain project, JSON stays pure with the exact 4/2 tag split. Plus two adversarial probes: a deliberately failing declared command turns the stage ✗ (the checkmarks are real executions), and a partial declaration drops exactly that stage from the guidance list (the enumeration is computed, not a fixed string).

▸ Full suite 2981/2981 · strict pre-push gate GREEN · completed through clad done.

🤖 Generated with Claude Code

A project whose language cladding cannot drive passed the gate with six
of nine stages skipped and zero mention of the way out — measured across
every adopter-reachable surface, gate.commands appeared once, in a
CHANGELOG line, and the gate.language E2E already proved that exact
configuration strands a fully-capable agent. Skips were honest but mute.

Command-stage skips now carry a structured reason: 'no-runner' when no
runner is registered for the language, 'tool-missing' when the resolved
tool is absent — by-design skips (missing oracles, no declared
deliverable) stay untagged, because prescribing gate.commands there
would be a false cure. When at least one no-runner skip occurred, the
check prints one trailing line naming those stages and the inline
declaration that turns them on, noting the file is committable so CI
runs the same gate. The remedy was proven true before the line was
written: declaring gate.commands flips all four stages from skip to run
through the shipped binary. JSON carries skipReason additively; every
skip message, exit code, and skip semantic is byte-identical.

Verified: 16-test impl-blind oracle passing on first contact, 12 unit
tests, golden matrix untouched, four-environment guard on the built
binary (guidance 1/0/0/0: runner-less shows it, declared / self /
known-toolchain do not), JSON purity, full suite 2981/2981.

F-c17e1edc · clad done under a GREEN strict pre-push gate

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@qwerfunch
qwerfunch merged commit 21f5c92 into develop Aug 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants