Make the ship queue fetch the latest main before it checks a pull request (GST-2232) (#4256)

* Make ship-queue ready fetch the base before it checks the receipt (GST-2232)

ready read origin/<base> as the clone last fetched it, so a lane a few landings behind measured the PR from an older merge base and refused a good receipt with a false RECEIPT_INVALID field=review_exclude. ready now fetches the base first and refuses QUEUE_BASE_UNFETCHED when it cannot; the stamp path of land refuses the same way instead of ignoring a failed fetch.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* Regenerate the doctor component list for the new queue refusal code (GST-2232)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* Keep the new ready test off the Windows-safe set and say which land path uses the new refusal (GST-2232)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
Garry Tanandcapy-ai[bot] authored and GitHub committed 2026-11-10 01:03:46 +00:00
1 parent dfdaea2efd
commit 00cb80cce8
10 files changed
+162 -3

No files matched your search

+10 -2
View File
@@ -732,7 +732,13 @@ slot. The queue enforces this at every step from the PR body alone:
`REVIEW_TARGETED:` line) when a targeted class the head needs has no done
targeted pass in the receipt, and `QUEUE_RECEIPT_EXCEPTION_INVALID` when an
owner exception it records does not stand ([the ship receipt](#ship-receipt)).
There is no flag around it.
There is no flag around it. Before any of these checks, `ready` fetches
`origin/<base>` and reads the policy and every receipt field against that
fresh ref, so a lane clone whose base is behind the remote never turns a good
receipt into `RECEIPT_INVALID` (GST-2232); a failed fetch refuses with
`QUEUE_BASE_UNFETCHED` before anything is compared. The stamp path of `land`
refuses the same way; `land --pin` (`merge: direct`) refuses a failed fetch
with `QUEUE_NOT_READY`, as it already did.
- `train build` refuses a pin whose PR has no current receipt with the same
codes, naming the PR, before anything is written, pushed or dispatched,
`--dry-run` included.
@@ -1546,7 +1552,9 @@ same one (a mixed set makes it `VERIFY: dirty`). `gstack-ship-receipt write
--review-exclude <d>`, with that digest, records `review_exclude` (source, patterns, counts, the gate-tagged kept
paths and three hashes). The `digest` hashes the declared patterns and the
excluded and kept lists; `source` is provenance only. Write, carry and the queue
each recompute the digest at the current base and compare it, so a base merge
each recompute the digest at the current base and compare it (the queue fetches
that base first), over the PR's own files: the diff from the head's merge base
with that base, never a two-dot diff against the base tip, so a base merge
or a moved base that leaves the patterns and the lists unchanged still carries
and binds. A different digest means the digest write was given (or the receipt recorded) names another selection than the head has now:
write refuses with `RECEIPT_INVALID field=review_exclude`, carry with
+14
View File
@@ -5490,6 +5490,20 @@ the same `train land` command; it adopts its own journaled stamp commit. For an
unreadable land lock, rerun the same `land` command once origin answers; it
resumes its own lock.
<a id="queue-base-unfetched"></a>
### `QUEUE_BASE_UNFETCHED`
**Meaning.** `gstack-ship-queue ready` (or the stamp path of `land`) could not
fetch `origin/<base>`, so it stopped before reading the policy or comparing
any receipt field. Both compare the receipt's recorded selection, depth and
targeted classes with what the current base gives the head; a local
`origin/<base>` a few landings old measures the PR from an older merge base,
pulls in files of PRs that already landed, and reports a false
`RECEIPT_INVALID field=review_exclude` (GST-2232). Nothing was written.
**Fix.** Make `git fetch origin <base>` work in this clone (network, remote
URL, credentials), then rerun the same command.
<a id="queue-proof-missing"></a>
### `QUEUE_PROOF_MISSING`