ci(dd045): run the DD-043 PR-3 verification harness in CI — item 0 - #104
Conversation
… fail scripts/verify-dd043-pr3.sh certifies the Maven injector, and until now nothing ran it but a developer's shell. That is why three of its own assertions stayed broken across multiple approver rounds: jar:baked-version could not pass on a CRLF checkout, the jar stage graded a stale build because the compile's exit code was discarded, and jvm:zero-edits passed on a directory it never examined. All three are the same defect — a check that cannot fail — and none of them needed a reviewer to find, only an execution. Adds a verify-dd043-pr3 job running `unit jar guards`. jvm and native stay out: they need docker and 15+ minutes, and a comment on the job says so rather than leaving the scope limit implicit. On failure the job uploads bench-results/verify-*/ so a red run is diagnosable from the Actions UI instead of only by reproducing it. A CI job wired to a script that always exits 0 would be a fresh instance of the very defect this closes, so the job's ability to go red was measured, not argued: unmodified 13 passed, 0 failed, exit 0 Sisu index naming a nonexistent class 9 passed, 2 failed, exit 1 restored 13 passed, 0 failed, exit 0 The middle run is the load-bearing one. Pointing basquin-maven-injector/src/main/resources/META-INF/sisu/javax.inject.Named at a class that does not exist is the exact silent-non-discovery shape the jar stage exists to catch — Maven finds core extensions through that index, so a stale one means the participant never loads while the build stays green. unit failed via verifyInjectorIsDiscoverable (gradle rc=1) and jar refused to grade at all, reporting UNMEASURED: the jar build FAILED rather than certifying the previous build's artifact. The final exit=0 was captured live off the invocation. No path filter changed: both lists already carried every path this invocation reads. TODO.md item 0 and the ROADMAP entry are marked delivered rather than left as open debt, and the trailing ROADMAP note that said no job invokes the harness is corrected in the same commit — a fix that leaves its own deferral record standing has produced false debt on this repo twice. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LHBLwqfM1acog2bHRS8WCb
Approver review — APPROVEIndependent review of What I verified directly (not from the PR's prose):
Not verified (and not claimed by the PR): whether Decision: 0 blocking findings, 1 non-blocking note (above). Posting as a comment rather than a review event since basquin-bot authored the PR. |
|
@claude please review this PR. Context on what to weigh: the entire claim of this change is that it adds a CI job that can actually fail. The repo has a recurring defect class of checks that cannot fail — Specifically worth your attention:
Do not take the PR description at face value — I wrote it, and it argues for the change rather than evidencing it. |
|
Claude finished @basquin-bot[bot]'s task in 2m 21s —— View job Review complete
Verdict: no blocking findings. I independently traced the code rather than trusting the PR's prose, per the ask. Findings below are what I checked myself, plus one nuance the approver's review didn't spell out. 1. Exit propagation — confirmed, with a nuance the description glosses over. The nuance: your question asked about propagation "under every stage outcome including a skipped stage." I grepped every 2. Reachability on both triggers — confirmed by direct diff, not by reading the description. 3. Figures — code-traced, and the documents are honest about provenance.
4. No stale "manual-only" claims. Grepped the whole tree for Not checked (out of scope for this review, flagged by the PR itself): whether |
|
Thanks — the SKIP nuance is a real correction and I have applied it to the PR description. Verified it independently before changing anything: all ten That is a claim wider than its check — the defect class this repo has hit most often — so it is worth being precise about rather than waving through. The The claim existed only in the PR description, not in the commit message or any committed file ( |
DD-045 item 0 — the highest-priority item in the verification-integrity thread, and the only one that changes when defects are caught rather than merely detecting them afterward.
scripts/verify-dd043-pr3.shis the harness that certifies the DD-043 Maven injector. Until this commit no CI job invoked it — it ran only when someone remembered to. That is the root cause behind three of its own assertions staying broken across multiple PR #103 approver rounds:jar:baked-versioncould not pass on a CRLF checkout, thejarstage graded a stale build because the compile's exit code was discarded, andjvm:zero-editspassed on a directory it never examined. All three are one defect — a check that cannot fail — and none needed a reviewer to find, only an execution.The job
verify-dd043-pr3(.github/workflows/ci.yml:109) runsbash scripts/verify-dd043-pr3.sh unit jar guardson the existingpush/pull_requestpath filters.jvmandnativeare deliberately excluded — docker, 15+ minutes — and a comment on the job states that scope limit rather than leaving it implicit. On failure it uploadsbench-results/verify-*/so a red run is diagnosable from the Actions UI instead of only by reproducing it locally.No path filter changed. Both lists already carried every path this invocation reads (
basquin-maven-injector/**,build.gradle,basquin-init.gradle,gradle/**,gradlew,scripts/**).Proven able to fail, not argued
Wiring CI to a script that always exits 0 would be a fresh instance of the exact defect this closes, so the job's ability to go red was measured:
The middle run is the load-bearing one. Pointing
basquin-maven-injector/src/main/resources/META-INF/sisu/javax.inject.Namedat a class that does not exist is the precise silent-non-discovery shape thejarstage exists to catch: Maven discovers core extensions through that index, so a stale one means the participant never loads while the build stays green.unitfailed viaverifyInjectorIsDiscoverable(gradle rc=1), andjarrefused to grade at all —UNMEASURED: the jar build FAILED— rather than certifying the previous build's artifact. That refusal is round 8's stale-jar fix working under a real failure instead of a hypothetical.The final
exit=0was captured live off the invocation. The first two exit codes are derived from each run's tally plus the script's last line,[ "$FAIL" -eq 0 ] && [ "$SKIP" -eq 0 ].Correction, from the
@claudereview: an earlier version of this line added "a SKIP fails the exit status too, so a stage that silently doesn't run cannot report green." That is true of the script but not a live protection for this job, and stating it here implied otherwise. All tenskip()call sites are inrun_jvm(six) andrun_native(four); none are inunit,jarorguards. Since this job names only those three stages and the runner only invokesrun_$sfor stages named on the command line,SKIPis structurally always0here. That gate half protects the manualjvm/nativeinvocations, and stands ready if a futureunit/jar/guardsstage ever gains a skip path — it is not something this job exercises. TheFAILhalf is what does the work here, and that half was measured above.Scope
All three runs were ad hoc and are not committed as run-of-record evidence; the CI job produces those going forward.
TODO.mditem 0 and thedocs/ROADMAP.mdentry are marked delivered, and the trailing ROADMAP note that still said no job invokes the harness is corrected in the same commit — a fix that leaves its own deferral record standing has produced false debt on this repo twice.What this does not establish
guardsstage still mutates tracked source in place and restores it, asserting restoration viaguards:restored. Safe on an ephemeral CI checkout, unsafe if a commit lands mid-run locally. That is DD-045 item 3 and is untouched here.jvmandnativeremain manual-only, so the §5.2 acceptance halves are still not exercised by CI.🤖 Generated with Claude Code
https://claude.ai/code/session_01LHBLwqfM1acog2bHRS8WCb