hotfix(ci): never auto-merge Dependabot PRs into main (beta) - #59
Merged
Conversation
- Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi). - ci-required aggregates matrix results so branch protection can require a single stable check name. - promotion-guard enforces dev->beta and beta->main promotion paths (hotfix/* allowed direct into either).
* ci: add py3.13, ci-required aggregate, promotion-guard - Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi). - ci-required aggregates matrix results so branch protection can require a single stable check name. - promotion-guard enforces dev->beta and beta->main promotion paths (hotfix/* allowed direct into either). * Promote dev: upgrade-path tests (#9) * ci: add py3.13, ci-required aggregate, promotion-guard - Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi). - ci-required aggregates matrix results so branch protection can require a single stable check name. - promotion-guard enforces dev->beta and beta->main promotion paths (hotfix/* allowed direct into either). * feat(ui): graceful restart overlay during updates - New /api/health endpoint reports {ok, version}. - waitForRestartAndReload polls health every 1s up to 120s; reloads as soon as the server responds (and, for updates, as soon as the version changes). Replaces blind setTimeout reloads that hit chromium's can't-connect page mid-restart. - Restart overlay gets a CSS spinner and supports a sub-message line. - Both update-install and remote-toggle restart paths use the new helper. * feat(updates): dev-only Force reinstall button Reinstalls the current dev branch HEAD without requiring an update to be available. Useful for testing the restart/health-poll flow on the same commit. Visible only when channel == dev. * feat(updates): dev-only ref selector for force install - updater.perform_update gains target_ref override - updater.list_refs returns recent tags + last 20 dev commits - updater.is_valid_ref restricts user input to safe git ref characters - New GET /api/update/refs (dev-channel only) - POST /api/update/install accepts {ref}; gated to dev channel and validated with is_valid_ref before being passed to git - Settings UI: Updates section shows a dev-only panel with a populated select (Tags / recent dev commits) plus a free-form input for any arbitrary ref * fix(updates): replace native select with inline scrollable ref list Native select on kiosk Chromium opens a system overlay that doesn't respect our drag-scroll. The dev-only build picker is now an inline listbox with grouped sections (Tags, Recent dev commits), 44px touch targets, orange selected state, and data-drag-scroll so the existing pointer-event handler also works inside it. drag-scroll.js: refactored to a per-element attach() + MutationObserver so async-rendered scrollers (like the ref list) get hooked up. * fix(updates): wait for server-down-then-up before redirecting Previous logic accepted the very first /api/health 200 after kicking off the install, which was almost always served by the still-running old process. The dashboard would then load against a server that was about to shut down and immediately show 'Network error. Will retry.' waitForRestartAndReload now requires either: - reported version differs from snapshot (normal upgrade), or - at least one failed health check observed first (force reinstall of same version) before redirecting. * fix(updates): use git HEAD sha as restart fingerprint __version__ doesn't bump on every dev push, so version-based detection of 'new build is up' would never fire and the spinner sat forever. /api/health now returns {version, sha} (short git HEAD), and the JS restart watcher compares the combined fingerprint. Falls back to sawDown-then-up gating when no prior fingerprint is available. * test: cross-version upgrade-path coverage For each supported historical tag (v0.1.3 -> v0.4.0): - test_old_config_loads_and_revalidates: fetches that tag's config.example.yaml via 'git show', injects a valid child + location, then asserts current load_config + validate_config + save_config round-trip cleanly. Catches schema drift and channel-alias migration bugs. - test_app_boots_with_old_config: spins up the current Flask app against the migrated config and asserts /api/health and /api/settings respond and expose every current top-level section. CI checkout switched to fetch-depth: 0 so the tags are available.
Promote release infra to stable.
Hotfix: corrects the extra-files schema and adds the version marker so release-please can parse outfitpi/__init__.py.
🤖 I have created a release *beep* *boop* --- ## [0.4.1](v0.4.0...v0.4.1) (2026-05-08) ### Bug Fixes * **ci:** release-please extra-files config ([#17](#17)) ([b5a8748](b5a8748)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Promote security automation workflows to stable.
Promote to stable.
Lands docs infrastructure on main so the build-docs check exists. Pages will deploy on merge.
Lands versioned-docs infra on main.
🤖 I have created a release *beep* *boop* --- ## [0.4.2](v0.4.1...v0.4.2) (2026-05-08) ### Documentation * mkdocs site + screenshot capture ([#31](#31)) ([bfc9fd8](bfc9fd8)) * versioned (mike) + placeholder image macro ([#35](#35)) ([e648365](e648365)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Hotfix branch off main, picks the runtime + workflow changes from beta. Skips release-please artifacts (main has its own at 0.4.2).
Closes Dependabot alert #1; lands stack-trace scrubbing, ZIP validation, XSS DOM-construction fixes.
Hotfix promoting the auto-resolve workflow.
# Conflicts: # .github/copilot-instructions.md # .github/workflows/docs.yml # .github/workflows/release-please.yml # .gitignore # .release-please-manifest.json # CHANGELOG.md # app.py # outfitpi/__init__.py # outfitpi/weather.py # static/css/style.css # static/js/drag-scroll.js # static/js/settings.js # templates/settings.html
Add a base.ref guard so the Dependabot auto-merge workflow only fires for PRs targeting non-main branches. Anything landing on main (the production channel) goes through manual review even when it's a low-risk patch-level security bump. Hotfix targets main directly so the policy is in effect before the next dependabot PR opens.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Re-open of #57 with the source branch renamed
ci/...→hotfix/...so the promotion-guard workflow accepts it (PRs into beta must be fromdev,hotfix/*, orrelease-please--*).Cherry-pick of #56 (already merged to
main). Companion PR #58 coversdev.