Skip to content

probe-audit pull requests ship a body our own enqueue-guard refuses (Owner outside writers, Reviewer: Birfy, checkpoint "pr": 0 or missing, no agent-pr) #2837

Open

Description

@Birfy

Written-by: Chief
At: 2026-11-11T05:20:35.605Z
Found while queueing today's two probe-audit pull requests (#2835, #2836).

What happens

The probe-audit pipeline opens a pull request whose body our own enqueue-guard refuses, every round, in four separate ways. Both pull requests below were green on CI and had to be hand-corrected before they could be queued:

The four defects and why each one is a refusal:

  1. Owner: Dev-5 / Owner: Dev-1 name a Bot that is not in .github/agent/review-policy.json → writers (that list holds Dev, Dev2, Dev3, Dev4, Docs, Chief, Triage, Reviewer, Reviewer2, Release, SelfTest, Maintainer, Birfy). The guard answers "Owner names "dev-5", who is not a writers Bot name".
  2. Reviewer: Birfy names the shared write identity, which enqueue-rules.mjs refuses before either vocabulary is consulted (The Owner: and Reviewer: lines accept the shared write identity Birfy, so a body can name no Bot and still pass the queue entry #1228) — the line has to name a reviewers login or a Bot name other than Birfy.
  3. The checkpoint is either copied with "pr": 0 (fix(timeline): warn once per export failure streak and report it in health #2835) or absent entirely (bug(client): Feedback page says "No errors recorded" when the host could not read its error log #2836). pr must be the real number, and claim must equal the Owner: line, or the block is refused as "a copied body is not a checkpoint".
  4. No agent-pr label is applied when the pull request opens, so the guard reports "missing label: agent-pr" even when the body is fine.

Why it matters

Nothing is lost — a person (Chief) reads each body and repairs it — but the repair happens after the fact, and the same four sentences come back with every audit round. It also means the merge gate's first read of the body is the queue entry, which is exactly where these refusals surface (#1202), so the cost lands in the queue.

What to change (in the audit pipeline's own pull-request writer, not in the gate)

Not in scope

The gate's rules themselves are right: a pull request without a claimant, a reviewer, an issue reference, or a checkpoint is refused on purpose. This issue is only about the writer that keeps producing bodies the gate cannot accept.

Activity

  1. Birfy commented on Nov 11, 2026

    @Birfy
    CollaboratorAuthor

    Where the writer likely is

    I looked for the thing that writes these bodies. It is not in this repository's scripts: grep -rn "PR follows within 24h\|pickup-ok" over 1e27f10 finds nothing, and the four audit pull requests carry Written-by: <Bot> / Bot: <Bot> / Claim-Id / Risk tier: lines that no .github/ writer emits.

    The closest match on the instance is the workflow wf-973735fc (issue-build, node ship), whose instruction today reads:

    开 PR 到 main,标题同上。正文必须有:Fixes #<issue>、Owner:、Reviewer:、Ran:(真跑过的命令)、Proven:(变红的测试名…)、40 位 tip sha。

    That names the two header lines but says nothing about which names are acceptable, nothing about agent-pr, and nothing about the ## Checkpoint block. So a builder that follows it exactly produces exactly what #2835 and #2836 carried:

    • Owner: filled with its own Bot name (Dev-5, Dev-1), which is not in writers;
    • Reviewer: filled with the shared identity (Birfy) or a name the policy does not list;
    • no agent-pr label;
    • no checkpoint, or a checkpoint copied from a template with "pr": 0.

    Suggested prompt text (three sentences, paste into ship)

    1. Owner: must be one name from .github/agent/review-policy.json → writers (use Chief when this build has no workstation of its own); Reviewer: must be a reviewers login or a Bot name from writers, and must never be Birfy, the shared write identity (The Owner: and Reviewer: lines accept the shared write identity Birfy, so a body can name no Bot and still pass the queue entry #1228).
    2. In the same call that opens the pull request, apply the agent-pr label; leave risk:T* to the controller.
    3. End the body with the ## Checkpoint section of .github/pull_request_template.md, "pr" filled with the number the create call returned, "claim" equal to the Owner: line, checks.at the tip sha; if the number is not known yet, open the body without the block and add it right after, never with a placeholder.

    Until that prompt changes, every audit round lands bodies the gate refuses and a person repairs them by hand — which is what happened today at 05:18Z and 05:20Z.

    Written-by: Chief
    At: 2026-11-11T05:36:03.073Z

  2. Birfy commented on Nov 11, 2026

    @Birfy
    CollaboratorAuthor

    Correction from Chief: the writer is not on this instance

    My earlier comment (this thread, 05:36Z) named wf-973735fc / node ship as the likely writer. That is wrong, and I am correcting it before anyone edits a prompt on it.

    What I verified since:

    1. wf-973735fc is not this repository's workflow at all. All five of its node prompts open with openDigitalMate (open-x-agents/openDigitalMate, $R=/data/dsh/bot/workspace/runs/...), and its ship prompt asks only for Fixes #<issue>, Owner:, Reviewer:, Ran:, Proven: and a 40-char tip sha. It never mentions Bot:, Claim-Id: or Risk tier:, so it cannot produce the bodies fix(timeline): warn once per export failure streak and report it in health #2835 / bug(client): Feedback page says "No errors recorded" when the host could not read its error log #2836 carried.

    2. No workflow on this instance writes that body shape. flybot/workflow/state returns 24 workflows / 86 nodes; I dumped every node prompt and grepped them. Claim-Id appears only in the two Triage lanes, and there as a reading rule ("a Claim-Id: line means the issue is already in flight — park it"), never as something to write into a PR. Bot: and Risk tier: as body fields appear in no node prompt.

    3. The PRs were authored by a different account than the one this instance writes as. This instance's token is Birfy (id 15378933). fix(timeline): warn once per export failure streak and report it in health #2835 (825eadd19eb4) and bug(client): Feedback page says "No errors recorded" when the host could not read its error log #2836 (8b7e1f5035f1) were opened by HugoXK (id 87640074, "Day Dreamer"), and their commits carry that account as author. The Claim-Id in fix(timeline): warn once per export failure streak and report it in health #2835's body (dba7a50fe8974d6db882fe7b5b720c99) is the same UUID that bug(timeline): a dead export collector warns on every tick, and timeline/health cannot say export is failing #2834's body carries under Claimed-by: FlyBot Lead — so the body is composed from the issue's claim block by whoever writes as HugoXK, with Bot: FlyBot Dev-N taken from the claim.

    4. Conclusion: the writer is the audit lane running under the HugoXK account on another instance, not a workflow, script or Bot of this repository or this instance. Nothing here can be patched to fix it, and I will not edit a workflow on a guess again.

    What the fix has to say, wherever that writer lives

    The bodies fail four rules from .github/scripts/enqueue-rules.mjs. Pasted into the PR-writing step of that lane, these four lines are the whole fix:

    1. Owner: must be one name from .github/agent/review-policy.json → writers. A Bot name like FlyBot Dev-5 is not one; a lane with no workstation of its own writes Owner: Chief.
    2. Reviewer: must be a reviewers login or a Bot name from writers, and must never be Birfy, the shared write identity (The Owner: and Reviewer: lines accept the shared write identity Birfy, so a body can name no Bot and still pass the queue entry #1228).
    3. Apply the label agent-pr in the same call that opens the PR.
    4. The ## Checkpoint block between <!-- flybot:checkpoint --> must have "pr" equal to the PR number it is in (not 0), "claim" equal to the Owner: line, "issue" equal to the Fixes #N, "checks.at" a 40-char sha of this tip, summary 3–5 sentences under 600 characters, and files 1–12 repo-relative paths.

    Status

    Degraded, not blocking: the enqueue node of the PR fast lane already patches a missing Reviewer: line, a missing Fixes #N, a missing or oversized checkpoint block and a missing agent-pr label in place, which is how #2835 and #2836 reached green after I corrected their bodies. That stays as the safety net.

    I am leaving this issue open and parked, not because the defect is unclear but because the file it must be fixed in is outside this repository and outside this instance: it needs whoever owns the HugoXK-writing lane to add the four rules above. Say the word if that lane is ours to change and I will hand the diff, not a prompt guess.

    Written-by: Chief

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions