A plain `git rebase` refuses to run when the checkout has unstaged changes, so
the retry path could fail instead of retrying. The beta workflow stages a scoped
subset on purpose (production's files must never ride along), which leaves the
rest of the checkout dirty and hits this exactly; keep all three flasher pushes
identical so it cannot resurface here either. Unstaged content stays unstaged,
so nothing extra gets published.
build-observer-firmwares.yml and sync-flasher-content.yml shared the
`flasher-publish` concurrency group. A mixed code+docs commit queues both, and
GitHub cancels any run left *pending* in an occupied group — cancel-in-progress:
false only shields runs already in progress. On 8fc96f68 the build lost that
race and was cancelled in 1s with zero jobs, so nothing was published.
Give each workflow its own group, and make the flasher push tolerate the
concurrent writes the shared group was guarding against: rebase onto the
sibling's commit and retry, up to 3 attempts. Both workflows generate
byte-identical docs and changelog content, so the loser's commit normally
rebases away to nothing and the push reports up-to-date.
The rename to observer-firmware is verified: the rename's own push event
ran both workflows on the new name (branch creation bypasses path
filters), sync-flasher-content pushed to the flasher repo, and the
production publish completed on observer-firmware. The transition dual
trigger is no longer needed.
Also update the MQTT_INTERNALS.md prose reference to the old branch name.
Workflow+docs-only commit: pushing this triggers no build.
Flip gen-slim-manifests.py to its new --bin-dir mode (flasher repo PR #1):
the slim OTA manifests are now generated from out/ — the assets actually
uploaded to the release — instead of the config.json entries, which the
/releases feed migration will convert to github release defs. STATIC_PATH
joins the workflow env; it must stay consistent with config.json's
staticPath.
Also add observer-firmware alongside mqtt-bridge-implementation-flex in
both push triggers, ahead of renaming the branch: GitHub does not rewrite
branch filters on rename, and a rename with only the old name in the
filter silently stops production publishing. The old name is dropped once
a publish is verified on the new one.
Workflow-only commit (.github/** is in paths-ignore): pushing this
triggers no build.