ceremony/changelog.d/215.md
clad2 6986deede7 fix(labels): the bootstrap keys on the BOOTSTRAP input, never the event name
The venue drill caught what no hermetic test had: with the workflow_call
bridge delivering "no" perfectly, drill runs 16/17 still bootstrapped. The
script gated on GITHUB_EVENT_NAME = workflow_dispatch and never read
$BOOTSTRAP at all; the wrapper's only coupling was exporting the event name
for yes. Correct while an operator's manual dispatch was the only dispatch
there was — inert from #209 on, when the trigger job made every machine wake
a workflow_dispatch event. Runs 459/523 bootstrapped for this reason, not
for the input-delivery defect, which is real but was never the operative
cause of the observed re-upserts.

The script now gates on ${BOOTSTRAP:-no} = yes; the wrapper passes the input
through untouched; the hermetic suite pins the exact regression pair (a
dispatch event with no/unset creates and deletes nothing) alongside the
yes path's full create+delete assertions.

Refs #215
2026-08-05 21:32:21 +00:00

2.1 KiB

Fixed

  • The sweep's bootstrap value crosses the workflow_call boundary as a declared input, explicitly passed by the caller — the one channel measured to work; the called workflow did not see the caller's event inputs as an implicit substitute on this instance (#215).

  • Before the bridge, github.event.inputs was empty inside the called workflow, so every dispatch-woken sweep bootstrapped: ~20 label upserts on each board event (#215).

  • The caller maps an empty top-level value to no explicitly, so a cron-woken sweep can never bootstrap; the declared input also defaults to no, so a consumer that passes nothing gets the safe path (#215).

  • The gate feeds the declared input to labels-reconcile unchanged, so an invalid value meets the action's own yes|no refusal instead of being silently coerced (#215).

  • docs/CONSUMERS.md's published sweep stub carries the same pass-through — without it every consumer inherits the defect ceremony fixed for itself (#215).

Added

  • test/labels-bootstrap.test.sh pins the bridge at every hop: the declared boundary, both gate sites as the identity, no expression reading github.event.inputs, and the caller and stub pass-throughs byte-exact (#215).

  • The same test drives the four value paths — schedule-empty, no, yes, invalid — through the shipped expressions into the action's real validator (#215).

  • The taxonomy bootstrap keys on the BOOTSTRAP input, never the event name. It tested GITHUB_EVENT_NAME = workflow_dispatch — correct while an operator's manual dispatch was the only dispatch there was, inert-by- construction from #209 on, when every machine wake became a dispatch event (#215).

  • The venue drill caught that: with the bridge delivering no perfectly, drill runs 16/17 still bootstrapped, because the script never read the input the whole chain existed to deliver (#215).

  • test/labels-reconcile.test.sh pins the regression pair exactly: a workflow_dispatch event with BOOTSTRAP=no (or unset) creates and deletes nothing; only BOOTSTRAP=yes bootstraps (#215).