Skip to content

Controller: a pull request that moved while a pass read it is deferred once with no alert, and the record keeps why (#658) - #661

Merged
don-petry merged 5 commits into
mainfrom
controller/moved-grace-658
Nov 9, 2026
Merged

don-petry merged 5 commits into
mainfrom
controller/moved-grace-658

Conversation

@don-petry

@don-petry don-petry commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Closes #658, "Controller: a pull request that changes while a pass reads it raises facts_unreadable and reconciliation_unreadable, though Moved means read it again". It follows the Factory Builder's ruling of 2026-11-08 and its five conditions. It holds decision record 0172.

What changes

Condition Now
1. The cause is visible pass/1 keeps left_out: each item left out, with its code (pull_moved, facts_unanswered, not_facts or listed_twice) and its item, or null. The entry tells Moved apart from any other Unanswered by its type. A read whose updated_at cannot be read is now a plain Unanswered, never a Moved
2. Derived, never stored pass_.moved_once reads the last pass record at each pass. A last record that cannot be read, is not there, or holds no left_out counts the move as a second
3. A deferral, its writes owed A pull request moved once gets no facts, no Decision and no act, and raises no alert. writes_seen does not read it: it is owed to the next pass, and this reconciliation stays whole
4. Only Moved earns the grace Any other code, a second move in a row, or an issue left out as moved, raises facts_unreadable on the first pass, as before
5. Boundary tests and mutants Moved once, no alert. Moved twice in a row, alerted. Moved then read clean, decided. A non-Moved read, alerted at once. The previous record unreadable, alerted. A last record that left the item out for another reason, or left another item out as moved, makes the move a first. Each rule has a mutant

Decision 0056 is unchanged. Decision 0172 states the grace pass and amends nothing else.

Not here: adapters/checks.py still raises a plain Unanswered when the head moves while the checks are read. That read shows as facts_unanswered and alerts at once. Making it a Moved would change how the approving act classes it too. The new codes will show whether it happens.

Checks

  • tests/test_controller.py::test_a_pull_request_that_moved_while_read_is_deferred_once_with_no_alert, ::test_a_snapshot_that_moved_is_kept_by_its_code_and_its_writes_are_owed_once, and tests/test_adapters.py::test_a_pull_request_whose_updated_at_cannot_be_read_has_not_moved.
  • Decision 0172's two boundary rows name 14 mutants. Three older mutants follow the code. examples/invalid/pass.a-left-out-code-in-words.json holds the new field's codes.
  • At a0454f5, with main merged: make verify passes and check_decisions is clean. All 33 mutants of controller/pass_.py, controller/reads.py, controller/__main__.py and adapters/pull.py are killed.

Reviews

All read the first head, cf9351b. The fixes are in 3d8a447 and 268d255.

Reader Findings Disposition
Argon (gemini-4-argon-high) None, in two parts —
Muse (muse-wonder-full-1.0) 1 minor: an issue left out as pull_moved was graced too Fixed, with a test and a mutant
Claude review No major. Minors: an unreadable updated_at read as a move; untested boundaries of the last record; no counter-example Each fixed, with tests and mutants. Overlapping passes and clock skew fail closed (an alert), and are left as they are
Claude security pass No high or medium. 1 low: a malformed answer classed as moved; the record's wording on which pass reads again Both fixed

🤖 Generated with Claude Code

don-petry and others added 3 commits November 8, 2026 19:57
…d once with no alert, and the record keeps why (#658)

A snapshot that moved while it was read raised Moved, and the entry took it as any read GitHub did not answer: the
pass raised facts_unreadable, and the item's writes, never read, left reconciliation short. Seven Factory alerts
since 2026-11-08 05:38Z were each one pull request merging, pushing or taking a comment during the read.

pass/1 now keeps left_out: each item left out with its code, pull_moved, facts_unanswered, not_facts or
listed_twice. A pull request that moved, and that the last pass record did not leave out as moved, is deferred with
no alert, and its writes are owed to the next pass, so this reconciliation is whole. A second move in a row, any
other code, or a last record that cannot say, is the alert. Whether a move is a first is derived from the last
record at each pass (moved_once), never kept.

Decision NNNN records it, with two boundary rows naming 11 mutants; two older mutants follow the code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…move, and the last record's boundaries are tested (#658, after the reads)

An issue left out as pull_moved was graced too, though the grace is a pull request's (Muse). A read whose
updated_at could not be read made adapters/pull.py's unchanged false, so a malformed answer was a Moved and earned
the grace; it is now a read GitHub did not answer (the security pass, the Claude review). The tests now hold what
the last record left out for another reason, another item it left out as moved, and one it could not name (the
Claude review). The record says the next pass, scheduled or started by a run's end, reads a moved pull request
again, since a comment starts none. A counter-example holds the new field's codes; one older mutant follows the code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…controller/AGENTS.md stays at 40 lines (#658)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@don-petry
don-petry requested a review from a team as a code owner November 9, 2026 02:46
@coderabbitai

coderabbitai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@chatgpt-codex-connector

Copy link
Copy Markdown
Codex Review Summary: ❌ Failed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ❌ Failed 2026-11-09T02:46:25.878656Z
We couldn’t complete this review. Comment @codex review to try again.
268d255 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@sonarqubecloud

sonarqubecloud Bot commented Nov 9, 2026

Copy link
Copy Markdown

@don-petry
don-petry added this pull request to the merge queue Nov 9, 2026
Merged via the queue into main with commit b6ce7b3 Nov 9, 2026
26 checks passed
@don-petry
don-petry deleted the controller/moved-grace-658 branch November 9, 2026 04:35
don-petry added a commit that referenced this pull request Nov 9, 2026
…y Builder gave 0173

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

Controller: a pull request that changes while a pass reads it raises facts_unreadable and reconciliation_unreadable, though Moved means read it again

1 participant