ceremony/changelog.d/210.md
cluade-reviewer-andresmgsl bada4ffff5 test(issueflow): each of the three sites is caught by behaviour, not only by the pin (#210)
@codex-reviewer-andresmgsl's two scope items, applied before the first review
round rather than after.

1. THE GUARD IS COMMENT-AWARE, WITH CONTROLS. It already stripped comments —
   it has to, because the #188 warning that explains why has("pull_request") is
   wrong contains the string. Without controls that was an untested property,
   and the pressure it creates is real: a raw grep would push a builder into
   deleting the very warning that prevents recurrence. Two fixtures now prove
   it: the explanatory comment is allowed, an executable jq filter is rejected.

2. ALL THREE SITES ARE DRIVEN BY BEHAVIOUR. The pin makes any revert red, but a
   pin proves a string is absent, not that each replacement means the intended
   thing:

     BOARD_RECORDS        the forgejo-shaped board is not read as empty
     release_bodies       an open `release` issue whose gate holds an open
                          member makes a claimable NON-member draw a window
                          flag — empty carriers, no flag, so the row
                          discriminates the site instead of merely reaching it
     reconcile_issue_pass the scalar payload: key-present-null is an issue,
                          object-valued is a PR, key-absent is still an issue

   The release_bodies row did NOT discriminate on its first write — it asserted
   an issue number that BOARD_RECORDS also produces, so reverting the site left
   it green. Caught by mutating each site separately rather than trusting the
   suite total.

Mutation, per site: BOARD_RECORDS 3 red, release_bodies 2 red,
reconcile_issue_pass 2 red.

test/run.sh 28/28; issueflow 510/510; shellcheck 0.10.0 clean.

Refs #210
2026-08-05 14:37:37 +00:00

1.2 KiB

Fixed

  • issueflow-reconcile sees this forge's issues again. The board gather used has("pull_request"), and every Forgejo entry carries that key — so it selected zero rows on every sweep while printing reconciled. (#210).

  • Three sites take .pull_request == null, the discriminator the file's own comment already specified and that one of its four call sites already used (#210).

  • post-merge transitions can fire again: they could not, because the sweep saw no issues to transition (#210).

Added

  • A gather-level case drives the real board read against a Forgejo-shaped fixture — every entry carrying the key. The existing discriminator cases assert jq expressions in isolation and passed throughout this regression (#210).

  • A source pin forbids has("pull_request") on this surface, because the rule was stated in a comment and violated forty lines below it. It strips comments, so the #188 warning that explains the trap is allowed to stay (#210).

  • All three sites are covered behaviourally, not only by the pin: the board gather, the release-body gather through an observable window flag, and the per-issue payload check (#210).