Repository navigation
Kernel: what each check conclusion means - #86
Conversation
The facts carry GitHub's own conclusion for a required check, and the new configuration map `check_conclusions` says what each means: `success` passing; `failure` and `timed_out` failing; queued, in progress, pending and absent pending; `neutral`, `skipped`, `cancelled`, `stale`, `action_required`, `startup_failure`, `error` and any word the map does not name unreadable. An unreadable required check defers, reason `check_unreadable`, in `verifying`, and is read before a failed or a waiting one. No Run is admitted and no act made. The configuration's schema refuses a map that reads anything but `success` as passing. Closes #35 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Following the review's ruling on #35: - A failed required check is read before an unreadable one, then a waiting one. A failure is readable and decisive, so I-13 holds, and GitHub's fail-fast (a failure beside cancelled siblings) or a skipped dependent job no longer holds an ordinary failure. - `check_unreadable` is in NEEDS_YOU_REASONS: almost every check with no verdict needs an approval, a change to the required set, or a re-run. - `waiting`, `requested` and `expected` are normal waits, mapped to pending. - The simulator's invariant is narrowed to no review and no act while a check has no verdict, and a deferral on one must show as needing a person. - Design §3.3 says the port lowercases GraphQL's conclusion and does nothing else; "reported" becomes "passed" in §0, the Lifecycle diagram and decision 0012. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 16 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|



Closes the story "Kernel: what each check conclusion means" from the epic "Epic: nine gaps in the Kernel, found in review" (#29). Until now, any conclusion other than
successorpendingcounted ascheck_failed. So a required Lens that came backneutraladmitted a fix Run with nothing to fix. Earlier in the proof of concept,neutralcounted as passing (L-07).Based on
main, rebased after "Lifecycle check: bounds in the data for every cycle with no person in it" (#85).What changes
This follows the architect's working ruling on the issue (option 1), and the review's ruling on order and attention:
The facts carry GitHub's own conclusion, and the port maps nothing. It only lowercases what GraphQL returns (
SUCCESS,IN_PROGRESS).schemas/facts.schema.json,checks[].conclusionused to be a list of four allowed values. It is now any code matching^[a-z_]+$.examples/invalid/facts.a-conclusion-in-words.jsonkeeps sentences out.What each conclusion means is data.
config/defaults.jsongainscheck_conclusions, andschemas/config.schema.jsondescribes it:successis passing.failureandtimed_outare failing.queued,in_progress,pending,waiting,requested,expected, and a required check that has not reported.neutral,skipped,cancelled,stale,action_required,startup_failureanderrorare unreadable. So is any value the map does not name.The configuration cannot make
neutralpass. The schema requires"success": "passing"and allows every other key onlyfailing,pendingorunreadable. Both new counter-examples are rejected:examples/invalid/config.conclusion-mapped-to-nothing.json(neutralmapped to null) andexamples/invalid/config.a-neutral-check-passes.json. As a second guard, the Kernel treats any value other than these four readings as unreadable.kernel/derive.py. A new function,check_reading(), reads each required check through the map.verifyingwith reasoncheck_unreadable, before any waiting check is considered.kernel/decide.py.check_unreadabledefers: no Run is admitted and no act is made. It is inNEEDS_YOU_REASONS, so the item shows as needing the Maintainer. Almost every check with no verdict needs a person: an approval, a change to the required set, or a re-run.tests/test_decide.pygains six tests:test_a_neutral_required_check_defers:neutral,skipped,cancelled,stale,action_required,startup_failure,errorand an unknown value, on each required Lens. Each is tried unreviewed, reviewed, and reviewed with a standing approval. Each givesdefer, reasoncheck_unreadable, attentionneeds_you, with no admission and no act. The other side: with every check green, the review is admitted, then the approval issued, then the item enqueued.test_a_timed_out_required_check_goes_back_to_the_authortest_a_queued_running_or_absent_required_check_is_waited_for, includingwaiting,requestedandexpectedtest_a_failed_check_is_read_before_an_unreadable_or_waiting_one, which pins the ordertest_a_failure_with_cancelled_or_skipped_siblings_goes_back_to_the_author:check_failedandadmit, on each Lenstest_a_reading_the_kernel_does_not_know_is_unreadable, the fail-closed reading of a map the schema would refusetest_a_neutral_check_does_not_pass_a_dependency_update, from "Kernel: a dependency update needs no model review" (Kernel: a dependency update needs no model review #70), still passes.tests/test_tools.pygainstest_only_success_can_pass_a_check. It shows the schema refuses every conclusion other thansuccessmapped topassing, an unknown name mapped topassing, and any map wheresuccessdoes not pass.sim/world.py.a_check_can_time_out_or_give_no_verdict, is listed insim/grounding.py.review-changeis admitted and no act is made while a required check has no verdict; an author's fix Run may still be admitted for a failure or a conflict. A deferral oncheck_unreadableshows asneeds_you.settle()still has a person run again every check that did not pass.tests/test_simulator.pyaccepts an item resting oncheck_unreadableonly if its attention isneeds_you.tools/mutants.pygains eleven mutants and replaces "a neutral deterministic check passes", whose line is gone. 63 of 63 are killed.Documents:
checksrow, and a paragraph on the map, the order, the port's lowercasing and the Maintainer's attention.Acceptance criteria (from "Kernel: what each check conclusion means")
check_conclusionsis in the defaults and the schema. A value missing from the map is unreadable. Counter-example:examples/invalid/config.conclusion-mapped-to-nothing.json. The schema also refuses any map that reads anything butsuccessas passing.test_a_neutral_required_check_defersandtest_a_timed_out_required_check_goes_back_to_the_author.neutralread as passing,neutralread as failing, and an unmapped value read as passing.checksand §4.2 item 1; L-07.Left open, on purpose
fail-fastreports one failure besidecancelledsiblings, and a job thatneeds:the failed one isskipped. Both cases are boundary tests, and the reversed order is a mutant.verifyingand shows it as needing the Maintainer. The other unreadable reasons (mergeable_unreadable,facts_incomplete) still give no State.adapters/.a_check_can_time_out_or_give_no_verdictnames no trial in section 6, so it is listed as unverified.Checks and reviews
make verifyandpython3 -m tools.mutantspass on agit archivecopy: 245 tests, OK (3 expected failures); 63 of 63 mutants killed.test_a_timed_out_required_check_goes_back_to_the_authorpassed throughout, because every conclusion exceptsuccessalready failed. Its mutant shows the test now holds that.Closes #35
🤖 Generated with Claude Code