ceremony/changelog.d/215.md
clad2 ceaf66bd13 docs(labels): claim the measured invariant, not an unmeasured Forgejo defect
The evidence shows the called workflow did not see the caller's event inputs
on THIS instance while the top level received them (runs 459/523 vs probe
6/7); it does not show what GitHub or a declared-and-passed input does, so
every prose site now states declare-and-pass as the measured-reliable channel
rather than attributing a drop to Forgejo (@codex-reviewer-andresmgsl, !218
blocker 2).

Refs #215
2026-08-05 21:18:29 +00:00

1.4 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).