Skip to content

test(devx): pin the merge-queue triage comment's operative guidance prose - #14550

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-13967-triage-guidance-pin
Sep 2, 2026
Merged

test(devx): pin the merge-queue triage comment's operative guidance prose#14550
baozhoutao merged 2 commits into
mainfrom
claude/issue-13967-triage-guidance-pin

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #13967

What

scripts/check-merge-queue-triage-outcome.mjs pinned the fenced excerpt and the
cross-PR aggregation, but nothing in its 73 assertions read the merge-queue triage
comment's operative guidance prose — the timeout-vs-assertion heuristic, its named
exception (PR #13966), and the boundary sentence saying the re-queue allowance is
governed elsewhere. Deleting all three from the workflow's body array left the
whole derived gate family green.

This adds:

  • guidanceProse(r) beside excerptLines(r), built on postedBody(r) (the whole
    posted comment) rather than through excerptLines — its docblock states why:
    excerptLines is deliberately scoped to code-fence content, and the guidance
    prose lives outside every fence, so going through it would leave the prose
    unreadable by design, not by omission.
  • Three assertions in scenario E1 (the timeout scenario — the body is composed
    once, so one scenario carrying all three is enough), one per operative claim.
  • Three MUTATIONS rows (M17-M19) so --self-test proves each new assertion
    can go RED, with A1 as the keepGreen control (it posts the same comment but
    never reads the prose, so it should not move).
  • The third "what it holds" row in lint.yml's step comment, and a correction of
    its mutation count (measured 20 after this change; it previously said "fourteen"
    against a measured 17 — both numbers are fixed in this edit).

.github/workflows/merge-queue-triage.yml is the SUBJECT being pinned and is
not touched by this PR.

Pinned sentences (mandatory per the triage)

One assertion per operative claim, each on the shortest substring that carries
the claim and would not survive a deletion — never the whole sentence:

Claim Pinned fragment(s) Why load-bearing
The rule 负载/时序 and 真实的行为改变 These are the two poles of the timeout-vs-assertion heuristic itself (timeout ⇒ load/timing noise; assertion ⇒ real behaviour change) — the line the triage checklist turns on.
The named exception (#13966) 实验自身的有效性前提 and 时长、一个时间戳、一个耗时计数 Names the exception's own object (an assertion about the experiment's validity premise) and the mechanical tell (duration/timestamp/elapsed-count) that separates it from a real regression.
The boundary sentence 后者由别处管 The sentence saying this guidance only changes how a red is read, not which tests may be re-queued — a real boundary claim, not commentary.

Deliberately NOT pinned: the wording around these fragments — the framing
prose, the two worked examples (AssertionError: SecurityPlugin.init()... /
...second-precision stamps could have differed too...), and markdown emphasis.
Quoting more than these fragments is exactly the failure mode the card names: "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."

Tests

  • node scripts/check-merge-queue-triage-outcome.mjs --self-test104 assertions, 20 mutations of the shipped script each driven to red.
  • node scripts/check-merge-queue-triage-outcome.mjsOK (76 assertions over 20 scenarios...) (73 + 3 new; 20 scenarios unchanged, confirmed with --list).
  • Counter-measurement (the card's own falsification test): in the worktree, on a
    committed baseline, blanked the rule pair and the boundary sentence directly in
    merge-queue-triage.yml (restored via git checkout HEAD -- .github/workflows/merge-queue-triage.yml under a trap ... EXIT INT TERM,
    confirmed clean by git diff HEAD after). The battery went RED naming exactly
    the two mutated assertions:
    check-merge-queue-triage-outcome: 2 failed assertion(s) over the SHIPPED script
      • [E1] the timeout-vs-assertion rule is present in the posted body: timeout -> load/timing, assertion -> real behaviour change
      • [E1] the boundary sentence is present in the posted body: this only changes how a red is read, not which tests may be re-queued
    
    (The named-exception assertion, untouched by that mutation, correctly stayed
    green — confirming the three assertions are independent.)
  • eslint scripts/check-merge-queue-triage-outcome.mjs --no-inline-config --format json: 1 file, 0 errors, 0 warnings. Repo uses one flat
    eslint.config.mjs with no parserOptions.project for any file (no type-aware
    linting anywhere in the repo), so this file-narrowed run is a measurement, not
    an assumption — it cannot move any unrelated file's verdict.
  • Re-ran self-test + main check after merging origin/main (no conflicts,
    unrelated files) — both green on the merged tree at 4e61df652.
  • Gate union: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-merge-queue-triage-outcome.mjs .github/workflows/lint.yml → 35 commands; all 35 run, reconciled with --ran
    (35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN). 33/35 passed; 2 exited
    PREREQUISITE-NOT-MET locally (not a red — check-test-completeness.mjs needs a
    saved turbo run test log CI produces; check:type-check-debt needs the full
    workspace dist/*.d.ts closure built) and are unaffected by this diff. See the
    os-dev-report comment on [finding] The merge-queue triage comment's operative guidance prose is unpinned — its own gate suite reads only the excerpt and the aggregation #13967 for the full per-command list.

Changeset

None. scripts/** + .github/** only, publishes nothing from any package —
skip-changeset label applied and confirmed by reading it back.


Generated by Claude Code

…rose

check-merge-queue-triage-outcome.mjs asserted only the fenced excerpt and
the cross-PR aggregation; the timeout-vs-assertion rule, its named
exception, and the boundary sentence that lives in the same posted body
were readable by nothing in the suite, so deleting them left every gate
green (#13967).

Adds a whole-body accessor (guidanceProse, built on postedBody, deliberately
not excerptLines -- see its docblock) plus one assertion per operative
claim in scenario E1, and three matching MUTATIONS rows (M17-M19) so
--self-test proves each new assertion can go red.
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:54
@baozhoutao
baozhoutao enabled auto-merge September 2, 2026 11:54
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 2, 2026
Merged via the queue into main with commit c53d8c2 Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13967-triage-guidance-pin branch September 2, 2026 12:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants