Repository navigation
fix(ci): keep draft-mode success from standing as a ready PR's proof - #2398
Merged
Merged
Conversation
3 tasks
schlessera
marked this pull request as draft
October 18, 2026 01:00
schlessera
marked this pull request as ready for review
October 18, 2026 01:02
This was referenced Oct 18, 2026
schlessera
marked this pull request as draft
October 18, 2026 03:18
schlessera
force-pushed
the
fix/2363-draft-proof-live-readiness
branch
2 times, most recently
from
October 18, 2026 08:03
0df8160 to
caca24b
Compare
schlessera
marked this pull request as ready for review
October 18, 2026 08:05
This was referenced Oct 18, 2026
schlessera
marked this pull request as draft
October 18, 2026 09:19
A draft push and a ready_for_review transition seconds apart can be queued out of order: the draft run cancels the confirmation run, then passes `proof` with every product job unselected, leaving a green draft check as the ready PR's latest proof. The draft cadence now reads the live PR and refuses when it is ready, closed or at another head, with the same confirmation-required action as ready feedback. Unreadable live state fails closed. Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oint Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The live readiness read is a snapshot: a PR marked ready between that read and the draft run's completion could still show a passing `proof` until its confirmation reported. Draft runs now report their aggregate as `draft gates`, so a `proof` row on a pull request only ever comes from feedback (which fails) or confirmation. The workflow guard pins the new name and rejects dropping the draft branch. The audited producer digest for ci.yml is refreshed for the one-line job-name change. Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cover a present token through the real API client, malformed live state, and the emitted aggregate refusing a draft run it cannot verify. State in the docs that the live read only fails when it observes readiness; the distinct check name covers a later transition. Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Planning the whole repository twice (fixture outputs, then the child's selection check) took 20 s locally and timed out at 30 s on a hosted unit shard. A cheap version needs the aggregate to validate the candidate before planning, which changes a pinned producer; #2400 tracks it. The present-token entry-point control remains. Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2388 binds generated-CSS positive fixtures to producer bytes frozen at the audited revision, and its ruling says legitimate drift requires fresh proof rather than redefining the audit. Refreshing the ci.yml digest here made six frozen fixtures fail. The job-name change now leaves the binding to fresh proof; #2408 asks how re-audits happen. Refs #2363 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
schlessera
force-pushed
the
fix/2363-draft-proof-live-readiness
branch
from
October 18, 2026 09:20
caca24b to
dbec504
Compare
schlessera
marked this pull request as ready for review
October 18, 2026 09:22
6 of 8 tasks
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 #2363
What changed
A ready PR could have a passing
proofcheck that came from a draft run with every product job skipped. Draft runs can no longer produce that check.draft gatesfor a draft payload,prooffor other pull-request payloads, andintegrated or exhaustive proofotherwise (.github/workflows/ci.yml). Aproofrow on a PR therefore only comes from ready feedback, which fails by design, or from confirmation. The workflow guard pins the new expression and rejects dropping the draft branch (scripts/check-ci-workflows.ts).requireLiveDraft,scripts/candidate-proof.ts).ci.ymlis a pinned generated-CSS producer. Under test(ci): freeze audited generated stylesheet fixtures #2388's ruling, legitimate drift requires fresh proof and does not redefine the audit, so its digest inscripts/generated-build-inputs.tsstays at the audited value. Generated-CSS binding falls back to fresh proof until a re-audit; #2408 asks how that should happen.docs/decisions/ci-utility.md(Scheduling and selection) and the work-issue merge reference describe both mechanisms, including that the live read only fails when it observes readiness.Why
In #2359, a draft push and
ready_for_reviewhappened 2 s apart. The draft run was queued second, cancelled the confirmation run through the per-PR concurrency group, and passedproofon a ready PR. The full reconstruction is in the issue. Under the 2026-10-14 cadence ruling, a ready PR'sproofmust not pass without confirmation.Either mechanism alone leaves a gap:
proof.proofrow at all, with no visible failure.Together:
proof.A cancelled confirmation still shows as a missing
proof, which the merge procedure already treats as not green.Validation
bun run check:pr --base origin/mainatdbec504b2onc4d31c6bd: 959 fast tests and 78 affected tests, all passing.bun run lintis clean;tsc --noEmitexits 0.tests/candidate-proof.test.tshas 5 passing tests; the producer-closure, workflow, hosted-proof and citation suites pass 196 with 0 failures;tests/inclusion-inputs.test.tspasses 11.Mutation receipts. Each mutation was applied alone, the named test failed, and the source was restored byte-identically (
cmp):validateCandidatetests/candidate-proof.test.ts:43, the live-ready rejection (receipt taken at2e0e1d140)synchronizetests/candidate-proof.test.ts:44tests/candidate-proof.test.ts:53requireCandidateno longer callsvalidateCandidatetests/candidate-proof.test.ts:55requireCandidatebuilds no API clienttests/candidate-proof.test.ts:87, the present-token read=== "closed"tests/candidate-proof.test.ts:53, malformed statedraft gatesbranch from the job nametests/ci-workflows.test.ts, "must not impersonate candidate confirmation"Independent review: two read-only gpt-6-astra passes.
proofCadence, found no other consumer of theproofdisplay name, and verified the digest. Its remaining mutation and doc findings are fixed in97a544351.Hosted proof: this PR's own ready run is the confirmation. A draft run of this branch would show
draft gates.Gaps
await requireCandidate(...)call survives. A spawned-aggregate control timed out on hosted unit (3) in run 39083242416, because it plans the repository twice. A cheap version needs the aggregate to validate the candidate first, which changes pinned producer bytes owned by ci: native diagram qualification self-test rejects legitimate source drift #2365's fixture; #2400 tracks it.No changeset: no shipped package files changed.
🤖 Generated with Claude Code