Repository navigation
fix(fleet-write): re-run once the failed jobs of a read-only check workflow, check-links.yml first - #31620
Conversation
…rkflow, check-links.yml first RERUN_FAILED_WORKFLOWS becomes a reviewed allowlist: ci.yml plus read-only check workflows (no secret but GITHUB_TOKEN, no environment, read-only token for every job). check-links.yml is the first such entry. Every fence stays. validate.mjs pins the list exactly and checks each entry after ci.yml against the read-only definition read from the file; rerun-failed.mjs drives a run of each listed workflow through the seat-side fences. platform-readings.md states the seat's log-first duty and the three-step order for an infra-red check. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTEjfqGjVA7q5WXAGd
…-fla9sj Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTEjfqGjVA7q5WXAGd
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH Contract-review-claim: session_01QsR2jULfPnqQFGcZUtKDFH · head 381f43d · 2026-11-08T17:20Z The lane seat's isolated Fable reviewer runs the |
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH Contract reviewServed-tier: Inputs read: card #31582 (body, triage 6723815984, claim 6724095715, os-dev report 6724587735), PR #31620 (body, 4-file list, ① Derived judgments
② Semver level
③ Boundary flagsDev flags (os-dev report
Escalated as a follow-up, not a block: the card asked for the three-step rule in ④ Design judgment
Findings, graded:
No must-fix, no should-fix. Nits alone end the round. Gate verdicts on the head at the time of this record (last read 2026-11-08, four polls): 45 check-runs — 24 Implemented-by: VERDICT: PASS |
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH ACCEPT · 2026-11-08T17:30Z — Tier S, on contract-review PASS 6724702446 for this head. Landing waits for the last running check-run. 席位核对Head-sha:
|
Requested by Steedos · project thread
Fixes #31582
Clause-②: no
Metadata-protocol: none
维护者速读
ci.yml改为审过的只读检查白名单,首个新成员是check-links.yml(Check Documentation Links);pm-dispatch 读数表写明先读日志、按三步清基础设施红。scripts/pm/fleet-write/ops.mjs(名单与只读定义)、scripts/pm/fleet-write/validate.mjs(名单与只读自测)、platform-readings.md第 285–291 行。node scripts/pm/fleet-write/validate.mjs --self-test,应见 364 cases pass;node scripts/pm/rerun-failed.mjs --self-test,应见 32 cases pass。What changes
scripts/pm/fleet-write/ops.mjs:RERUN_FAILED_WORKFLOWSis a reviewed allowlist,['.github/workflows/ci.yml', '.github/workflows/check-links.yml']. The docblock states the read-only definition every entry afterci.ymlmeets (nosecrets.*butGITHUB_TOKEN, noenvironment:, apermissions:block covering every job, no write scope) and the reading that admitted each entry. The header's workflow and head fence text no longer says the list isci.ymlalone. Every fence (workflow, event, once, failed, head, alone, grant) is unchanged.scripts/pm/fleet-write/validate.mjsself-test: the list is pinned exactly; the existing "file on disk that runs onpull_request" case is kept; a new case reads each entry afterci.ymlfrom its own file and requires zero read-only breaches; a control case shows the definition fails onci.yml,validate-deps.ymlandrelease.yml; a run of each listed workflow passes all five fences. The battery floor goes 33 to 36.scripts/pm/rerun-failed.mjsself-test: a run of each listed workflow passes the seat-side fences and is dispatched once, withcheck-links.ymllisted andlint.ymlnot (floor 11 to 12). The wiring case now refuses any workflow-path array literal in this file, not only the old one-entry spelling. The header and usage say "a listed workflow" instead ofci.yml..claude/skills/pm-dispatch/references/platform-readings.md: the re-run lines now state the seat's duty to read the log first. A red whose own log says it measured nothing is the seat's to clear and never the maintainer's click. The order is (1) one relay re-run, (2) when it is refused, the base lacks a landed fix, or the PR is conflicted,pr_update_branchor the dev merges main, (3) only a second red that measured something is real. The landing note names the step taken. The file stays at 458 lines (ceiling 458) with every line at or under 120 bytes.Tests
Self-tests, green at the final head
Red with a deliberately wrong entry, through ablation-replace (restore proved: blob equals HEAD, git diff HEAD empty)
Acceptance notes
pull_requestworkflow on158cc2aa, read by the self-test's own predicate). These meet it:check-links.yml(added), plusgoverned-surface-guard.yml,pr-body-guards.yml,os-create-smoke.yml,scaffold-e2e.yml,pack-smoke-optin.yml,upgrade-harness-optin.ymlandspec-liveness-check.yml(not added). The two guards judge live PR state (reviews, body), so a re-run re-judges governance; it does not recover a check that measured nothing. The four smokes and the liveness check have no measured infra-red incident behind them, and the order adds an entry only with a reading. A later PR adds one with its reading. Every otherpull_requestworkflow breaches the definition (a write scope, or a secret other thanGITHUB_TOKEN).ci.ymlstays the first entry by the ruling that made the op; it reads the turbo remote-cache secrets, so the read-only definition is checked on the entries after it.platform-readings.mdL88, which says being behind alone is no queue veto and never a reason to sendpr_update_branch.rerun-failed.mjs --run RUN_IDon a check-links run dispatches once, a second attempt is refused) is the seat's after landing; this PR dispatches no live re-run.Verification
Derived gates for this diff (
dispatch-gates.mjs --commands), each run at the final head with its exit code and reconciled with--ran: see the os-dev report on the card.Generated by Claude Code