Repository navigation
docs(pm-dispatch): rest-channel records the measured relay automerge_disable and pr_draft strokes - #28514
Conversation
…disable and pr_draft strokes The reverse-ops clause said the two ops were never called. They have been: one relay stroke sent automerge_disable then pr_draft on an armed, unqueued pull and read back autoMergeRequest null and isDraft true, with the approval untouched; on a queued pull a pr_draft answered no pullRequest (row FAILED, exit 5) while the conversion landed and the pull kept its queue place. No dequeue was measured, so platform-readings.md is left as it is. The three new lines are paid by folding the git zero-quota pointer section into the queue-reading pointer line. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibzn9YkeT93GTT2Z3tD
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix Contract reviewServed-tier: Inputs read: card #27848 (body and all three comments, incl. os-dev-report 6553363697); PR #28514 body, file list (one file, +5/−6) and Gate verdicts on this head: every check-run is now ① Derived judgmentsEach rule a seat or dev follows differently because of this text, judged against the logs, timelines and relay code:
② Semver level
③ Boundary flags
The four dev notes, each answered:
④ Design judgmentJudged on the tree, against the relay code and the platform's own records; the PR body's account was checked but never relied on. Must-fix (FAIL):
Should-fix:
Holds:
Implemented-by: VERDICT: FAIL |
…pull too; a no-pullRequest pr_draft answer is a non-landing The contract review found the 2026-10-24 reading misattributed: the conversion of the queued pull was landed by a stroke that sent automerge_disable then pr_draft and read back "in the merge queue" then "draft"; a second sender's pr_draft on the already-draft pull answered no pullRequest and was recorded 5 without landing anything. The lines now teach the reverse F as measured on both an unqueued and a queued pull, the queued pull keeping its place and merging from the queue, and the exit-5 row as a non-landing never to retry. platform-readings gains the 10-24 observation on its both-ops-no-kick line, paid inside the line's width. The queue-section pointer returns to the queue-reading line. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibzn9YkeT93GTT2Z3tD
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix Contract reviewServed-tier: This record supersedes the FAIL record 6553465577 on head Gate verdicts on this head: every check-run is ① Derived judgmentsRules a seat or dev now follows differently, judged on the new tree against the logs, timelines and relay code:
② Semver level
③ Boundary flags
Disposition of the first record's findings:
The two notes carried into the delta report's
Platform-readings edit authority: the card's Wanted section and the claim's file surface allowed platform-readings only on a measured dequeue, and none occurred. The dev states the seat authorised this one line after the first record escalated it; that authorisation is not on the card thread. Since the seat posts this record, adopting it is the seat's word that the one-line widening of the file surface was its own — the landing record should say so in one line, so the post-merge audit does not read a two-file governed diff against a one-file order. The live PR body. It is the first head's account: 「出队未实测」 and 「80 → 79 行」 in 维护者速读, "One file … 80 → 79 lines", the 10-24 block that attributes the conversion to the exit-5 run, "the 2026-10-25 run is the only one found that sends it", " ④ Design judgmentJudged on the new tree against the relay code and the platform's records; the delta report and the proposed body were read as inputs, not relied on. Holds (every measured claim in the new text):
Fold and layout: rest-channel is 80 lines (ceiling 80), max width 120; touched lines 110 / 109 / 112 / 108 / 105 bytes. Only L58, L60, L61 and L75 differ from the first head; no other line moved or re-wrapped in either file (platform-readings: one line, byte-for-byte otherwise). The 「第三桶」 fold still loses no rule: the pointer survives on L75 with its sections named. Should-fix (none blocking):
Must-fix: none. Implemented-by: VERDICT: PASS |
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix 维护者速读
席位意见:第一轮复审 FAIL:dev 把 10-24 那次转 draft 归到了一个记 5 的 run 上,会让人以为失败的写入也可能已落地。dev 按日志改正后复审 PASS。可以落地。 席位核对ACCEPT · seat
|
Requested by Tesla · project thread
Fixes #27848
Clause-②: no
Metadata-protocol: none
维护者速读
rest-channel.md反向两 op 那句「未实调」换成三行实测读数(反向 F 实调通过、行即回读、出队未实测),并把只剩一个指针的「第三桶」小节折进队列读法的指针行;80 → 79 行,每行 ≤120 字节。automerge_disable/pr_draft已是席位的强制动作,席位读到「未实调」无法判断它要发的 op 是否可靠;中继日志里两 op 已于 2026-10-25 在一张已挂臂未入队的 PR 上走通。.claude/skills/pm-dispatch/references/rest-channel.md第 57–60 行(改句 + 三行新读数),再看第 72 行(折并的指针)。pnpm check:pm-skill-ratchet绿;打开 fleet-write run 40164374680 的日志,对照✓ action 1 automerge_disable … auto-merge off · not in the merge queue与✓ action 2 pr_draft … draft两行。.claude/**),席位契约复审 PASS 后请 os-zhuang 批准,席位落地。What changes
One file:
.claude/skills/pm-dispatch/references/rest-channel.md(80 → 79 lines, ceiling 80; every touched line ≤ 120 bytes).✓ 反向 F = automerge_disable 再 pr_draft— measured on an armed, unqueued pull; both ops answered HTTP 200; the approval on the pull was not dismissed.autoMergeRequestnull andisDrafttrue are the landed states; an answer still armed or still ready is a FAILED action (exit 5) that stops the stroke.pr_draftsent to a queued pull answered nopullRequest(row FAILED, exit 5) while the conversion landed and the pull kept its queue place; queue membership is read from the timeline, not from the row.第三桶 —— git 零配额等价物section (heading, blank line, one pointer line) and carrying its pointer into the existing queue-reading pointer line (「①② 与 git 零配额四条的拼写与边界住 platform-readings.md」). The four readings it pointed at live inplatform-readings.md(quota-starvation section ①–④), so no rule is lost.platform-readings.mdis NOT touched: the order allows that edit only on a measured dequeue, and none was observed.The rules-only convention of this file (no provenance dates, no incident narrative) keeps the run ids out of the rule text; they are recorded here.
Why
PR #27845 made
automerge_disableandpr_draftthe mandatory disarm on a contract-review FAIL. A seat reading 「未实调」 could not tell whether the ops it must send are known to work.Tests
No code changed; the gates below are the test surface.
Measured strokes (evidence for the three lines)
The clean stroke, both ops — 2026-10-25. fleet-write run 40164374680 (job 121082282055, request
fw-20261025T050717Z-17ca1b, head f9a1e93) sent[{"op":"automerge_disable","pull":25745},{"op":"pr_draft","pull":25745}]. Log rows:Those rows are the mutation answers judged by
PR_LANDED_STATE(ops.mjs):autoMergeRequest: null,isInMergeQueue: false,isMergeQueueEnabled: true, thenisDraft: true. PR #25745's timeline (GET /issues/25745/timeline, 105 events) confirms the stored state:auto_merge_enabledby os-zhuang at 05:06:41Z, thenauto_merge_disabled(05:07:45Z) andconvert_to_draft(05:07:48Z), both byobjectstack-fleet[bot]; the approving review 5641652106 carries noreview_dismissedevent; the PR has noadded_to_merge_queueevent at any point (it was armed on a red battery, never queued), so a dequeue is not measured here.A
pr_drafton a queued pull — 2026-10-24. Run 40042854158 (job 120717690554, requestfw-20261024T000127Z-f103d0):[{"op":"pr_draft","pull":25550}]→PR #25550's timeline:
added_to_merge_queue2026-10-23T23:55:28Z;convert_to_draftbyobjectstack-fleet[bot]2026-10-24T00:01:34Z (so the conversion landed although the row read FAILED);ready_for_review00:09:55Z; the onlyremoved_from_merge_queueis 00:27:36Z bygithub-merge-queue[bot], followed one second later bymerged. No dequeue: the queued pull kept its place through draft and re-ready and merged from the queue. This is the third observation of the reading already onplatform-readings.mdline 42 (2026-08-08, 09-29); not added there, see Acceptance notes.A
pr_draftafter a queue ejection — 2026-10-27. Run 40434252633 (job 121959027306, requestfw-20261027T014328Z-71eed1):pr_drafton #26343 answeredHTTP 200 · #26343 · draftafter the queue had already ejected the pull (removed_from_merge_queue01:43:37Z bygithub-merge-queue[bot],convert_to_draft01:44:07Z). Not a dequeue either; cited as the newerpr_draftreading.Search method. PR timelines of the three pulls named in the seat's records, and
GET /actions/workflows/fleet-write.yml/runs?created=…on the minute windows around each timeline event (12, 3 and 4 runs respectively), each candidate's job log read in full. Not an exhaustive scan of every fleet-write run since 2026-10-24 (hundreds per hour), so a later stroke carryingautomerge_disablemay exist unrecorded; the 2026-10-25 run is the only one found that sends it.Acceptance notes
platform-readings.mdline 42 (「已入队者 2026-08-08、09-29 照合」) gained a third observation on 2026-10-24 (PR feat(lint)!: membership key declarations, and the row policies that read them, are judged when authored #25550). Not added: the dispatch order limitsplatform-readings.mdedits to a measured dequeue. Carrier: skills seat 1.node scripts/pm/dispatch-gates.mjs --tier .claude/skills/pm-dispatch/references/rest-channel.mdprints "no path-derived mandate: the surface hits none of the 4 declared glob(s)", while the FRAME and the Claim call the tier MANDATORY for this surface. The run was on claude-fable-5-1 either way; noted for the seat, not filed (gate-vocabulary observation, no wrong answer to a public door).check-skill-line-ratchet.mjsrow for this file stays at 80 with the file at 79 lines. The convention lowers the row to the landed count, butscripts/pm/is outside this card's declared file surface; the seat may fold the lowering into its next touch of the ratchet table..claude/skills/pm-dispatch/has noevals/directory, so there is no skill evals check to run for this surface.Verification
Run at head f194f8f in a fresh linked worktree of this repository after
pnpm install --frozen-lockfileandpnpm --filter '@objectstack/lint...' build(underos-verify-lock.sh, VERDICT command-exit 0, 75 s).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack→ 17 families for the one changed path. Every line run with stdin from /dev/null, exit code captured before any pipe:17 derived gates, all exit 0
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran gates-ran.list→✓ 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED; changed lines 11 (+5 / −6), under the 3000 threshold.awk 'length($0) > 120'over the file prints nothing; touched lines are 114 / 113 / 109 / 113 / 120 bytes..claude/**publishes nothing (fast-track class) →skip-changeset, declared on thepr_createstroke.pr_create, this PR) + 1 (os-dev-reportcomment on pm-dispatch(rest-channel): record the first measured automerge_disable / pr_draft stroke in place of 「反向两 op 未实调」, now that the disarm rule mandates both ops #27848). MCP GitHub write calls: 0.Human Minimum
packages/specholds no runtime logic. (n/a — docs only)pnpm lintis CI's run (repo-wide scan owned by CI).main, one pull request.skip-changeset); both declaration lines are filled in above.packages/spectouched: no.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code