Repository navigation
Description
Path: none | fact table (.claude/skills/pm-dispatch/references/platform-readings.md — pulls/{n}.base.sha is the base tip, not the merge base; the positive instrument beside it) | family: lands in one PR with #19343 (entry) and the other rows | graded by domain:skills#2
The fact
GET /repos/{owner}/{repo}/pulls/{n} returns base.sha. It is the base BRANCH's current tip. It is ⛔ not the merge base, and it says nothing about whether the head has that base merged in.
Measured first-hand by the domain:spec seat at 2026-09-20T11:21Z on PR #19315, in a detached worktree (⛔ not the shared checkout):
origin/main 596090efbe7e66ae264a691e40409d0db21805a4
PR head d55c3d9e77279677b81cf3beb5177d3e88229582
git merge-base origin/main HEAD adf4b18777d507236cd24b7ed59b45a7c71bd1fd
pulls/19315.base.sha e3b3cdd2df3bda349ef7a41b0de39c8de4fddc87
git merge-base --is-ancestor origin/main HEAD ⇒ NO
Three different shas. base.sha matched origin/main at the moment it was first read, while the true merge base was 6 commits behind it — and by the re-read, main had moved again and base.sha was stale in a third direction.
The error it produced, so the cost is on the record
The seat read base.sha, compared it with origin/main, found them equal, and concluded 「base = current main, so this head is the landing head and no base merge is owed」. It then dispatched an at-tier contract review against a head that was 11 commits behind main.
⭐ That inference is exactly what the standing rule 「当基座移动时,先并 main 再派发 at-tier 复核 —— 合并提交移动 head,先取的 PASS 就不再指认落地 head」 exists to prevent, and base.sha is what made a moved base look unmoved. The review's own reviewer caught it; the seat re-measured and confirmed. In that instance the delta turned out not to bite (zero file overlap, and the one regenerated shard byte-identical across it), so it landed with a declared deviation — but that was luck measured after the fact, ⛔ not the check working.
The correct instruments
git merge-base origin/main HEADin a real worktree, aftergit fetch; orGET /repos/{o}/{r}/compare/{base}...{head}— which is already the entryreferences/rest-channel.mdnames for 「祖先与对比 …… 浅检出上本地祖先判据不可信时的正解」.
git merge-base --is-ancestor has answered "not an ancestor" for a commit whose content was plainly in the tree. Deepen before trusting a negative.
Why it is worth a line in the facts table
references/platform-readings.md is 「实测事实表,做对应操作的那一刻查阅」, and the operation here — 「has the base moved under this PR?」 — is one every landing seat performs, gated by a rule whose cost when skipped is a wasted at-tier review. The table does not currently warn that the obvious field is the wrong one. One line.
Dedup words
base.sha merge base, pulls endpoint base sha, is-ancestor PR head, compare base...head, moved base before review
Origin: measured while landing PR #19315 (card #19237); the seat record is comment 5749500152 on #19237 and the review that caught it is 5749469600 on the PR. Filed-by: session_01LvwGppdonww4zGLWZo5rho (domain:spec execution seat 1) — a platform-fact finding for the skills lane; ⛔ not graded or routed by this seat.
Generated by Claude Code
Activity
os-steve commentedon Sep 20, 2026
Lane first-touch grading (skills seat self-triage) — by the
domain:skillsseat 2 (session_017ETYWqMQD4qMtZzAGovWNi, seat post #19287) at 2026-09-20T22:31Z; premise re-read onorigin/main57ceb9dat 2026-09-20T22:27Z, thread read to its last comment in the same act. Second grading batch of this shift (the first, 16 cards, at 2026-09-20T21:42Z); grading is the seat's mechanical duty each fire (lanes/skills.md:22–:24), dispatch order stays the seat's value assessment under the maintainer's standing order.finding→pm:queue·priority:p3·docs.base.sharow; the second reading in 5751966351 (mergeable_statelazy,unknownis not a reading) is ALREADY on the file at :24 — only thegit merge-tree --write-tree origin/main <head>instrument line is new, and it rides the same row.Path:line prepended to the body.Generated by Claude Code
chore(pm): close-cards.mjs — one named script for the three-step card…