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.