Three separate reasons the escape hatch added in #9 would not have worked.
Declare FORCE_REBUILD as a top-level variable so the UI offers it as a
dropdown on a manual run, rather than requiring a hand-typed key.
Accept the value from either trigger path. `crow pipeline start -p` injects
into the step environment, while the UI and `crow pipeline create --var`
pass a substitution variable, and a fresh run of main is a create. Reading
only the bare shell variable would have ignored the flag in exactly the case
it exists for.
Test the value rather than emptiness. A declared variable substitutes its
default, so the previous `[ -n ... ]` check would have seen the literal
string "false" and rebuilt everything on every cron run.
Set overwrite: true on the upload. plugin-s3 skips an object that already
exists when overwrite is false, logging "File already exists, skipping
upload" and still exiting green, so a forced rebuild would have recompiled
every package and published none of them. Normal runs are unaffected, since
dedup means only not-yet-published versions are ever built.
Also drop the Net debug step, the commented-out Pull upstream step and a
stray `# docker info`. The MTU workaround the debug step was diagnosing
stays, as does the commented-out alpine-320 matrix entry, which records a
deliberately disabled platform rather than dead scaffolding.
The escape hatch added in #9 only read a bare $FORCE_REBUILD, which covers
`crow pipeline start -p FORCE_REBUILD=1`, where the parameter is injected
into the step environment. It does not cover
`crow pipeline create --branch main --var FORCE_REBUILD=1`, which passes a
crow substitution variable instead.
Triggering a fresh run of main is a `create`, so the flag would have been
silently ignored in exactly the case it is needed, and the run would skip
every Alpine version it was meant to rebuild.
Read the substituted ${FORCE_REBUILD} into FORCE_REBUILD_VAR and accept
either source. Crow blanks an unsupplied substitution variable rather than
failing, as recorded in 8eacc0a, so a plain cron run still takes the dedup
path.