Skip to content

[finding] The merge-queue triage comment's operative guidance prose is unpinned — its own gate suite reads only the excerpt and the aggregation #13967

Description

@claude

Found while adding a paragraph to the merge-queue triage guidance (PR #13966, card #13830). Not that card's defect class, so it was left alone and recorded here.

The reading

.github/workflows/merge-queue-triage.yml composes the triage comment it posts on every red merge_group build. Two of the lines in that body array are the operative guidance — the timeout-vs-assertion heuristic the triage checklist turns on, and (as of PR #13966) the named exception beside it.

scripts/check-merge-queue-triage-outcome.mjs is a serious pin suite for this workflow: it extracts the shipped script with a real YAML parser, drives it against real captured vitest logs under doubles, and its --self-test mutates that shipped script 17 ways and requires the battery to go red for each. It is not decoration.

But none of its 73 assertions read the guidance prose. They read:

  • the fenced excerpt lines, via a helper (excerptLines) that is deliberately scoped to code-fence content — its own docblock says why: "the comment's own explanatory prose names both FAIL and AssertionError, so a grep would let the static text satisfy assertions about the EXTRACTION." That scoping is correct for what it protects; the side effect is that no assertion can see the prose at all.
  • the anchor notes, the sighting markers, the anti-no-op announcements, the delivery/summary limbs.

Grepping the gate for the guidance text (判读的关键, 负载/时序, 行为改变) returns nothing.

Why it is worth a card

Delete both guidance lines from the body array and every gate in the derived family stays green — measured on the union for a change to this file: 19 families, all green, and the pin suite's own verdict line reports only assertion and scenario counts over extraction and aggregation.

That is the shape the repo already treats as a defect elsewhere: a surface whose correctness is asserted in prose that nothing reads back. The prose here is not commentary — the triage checklist is the whole point of the workflow (its header calls the comment "the machine-readable signal the PM dispatch loop can key on"), and the heuristic is the line that decides whether an author investigates or re-queues.

Shape of a remedy (not a decision, just the cheap end)

A prose assertion in the pin suite would have to read the whole posted body, not excerptLines — which is exactly the coupling that helper exists to prevent, so it needs its own accessor and a comment saying which question it answers. One assertion per operative claim (the rule; the named exception; the boundary sentence that the re-queue allowance is governed elsewhere) is probably the right granularity: enough that a silent deletion goes red, few enough that a rewording does not.

⚠️ Worth weighing against the opposite failure: a prose pin that quotes too much turns every wording improvement into a two-file edit, and that is how pins rot into copy-paste. The judgment call is which claims are load-bearing, and that is why this is a finding rather than a patch.

Evidence

  • .github/workflows/merge-queue-triage.yml — the guidance lines in the body array.
  • scripts/check-merge-queue-triage-outcome.mjsexcerptLines and its docblock; no assertion over postedBody prose.
  • .github/workflows/lint.yml — the Merge-queue triage outcome contract step, whose own comment enumerates what the suite holds: the excerpt naming the failure reason, and the cross-PR aggregation. Guidance prose is not on that list, so this is a gap in coverage rather than a claim the suite makes and misses.

Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions