v0.3.0
Pre-release
Pre-release
What's Changed
- ci: gate workflows with zizmor at the auditor persona by @bojanrajkovic in #26
- chore: add CODEOWNERS backing the Protect Main ruleset by @bojanrajkovic in #27
- docs: add docs/security.md as the canonical security posture by @bojanrajkovic in #29
- ci: split App-token and signing trust domains into separate environments by @bojanrajkovic in #30
- ci: auto-regenerate MODULE.bazel.lock on Renovate PRs by @bojanrajkovic in #31
- ci: harden Renovate with best-practices preset, cooldown, and tiered automerge by @bojanrajkovic in #32
- chore(deps): update actions/create-github-app-token action to v3 by @renovate[bot] in #35
- chore(deps): pin dependencies by @renovate[bot] in #33
- fix: trigger lockfile regen on push instead of pull_request by @bojanrajkovic in #36
- ci(renovate): automerge pin and pinDigest conversions unconditionally by @bojanrajkovic in #37
- feat(sshx): publickey auth and host-key pinning by @bojanrajkovic in #40
- feat(sign): developer ID signing and notarization as Bazel targets by @bojanrajkovic in #43
- feat(runnyctl): show each slot's image in status and why by @bojanrajkovic in #48
- fix(runnyctl): strip pins in why and tidy image-display internals by @bojanrajkovic in #50
- feat(runnyd): graceful config reload via validated drain-and-respawn by @bojanrajkovic in #49
- ci(release): stop referencing secrets in step if: conditions by @bojanrajkovic in #54
- feat(runnyctl): on-demand guest SSH key injection with mid-job debug holds by @bojanrajkovic in #52
- feat(runnyctl): show runner tarball version in why and status -json by @bojanrajkovic in #59
- feat(runnyd): surface image digest as soon as it resolves, before pull by @bojanrajkovic in #60
- feat(app): the Runny menu-bar and main-window app by @bojanrajkovic in #61
- feat(timeline): stream in-flight cycle per-state timings via SlotStatus by @bojanrajkovic in #68
- feat(why): expose cycle artifact directory in CycleRecord by @bojanrajkovic in #69
- fix(drain): close Resume-vs-Start race window by @bojanrajkovic in #70
- feat: confirm pause/resume by echoed command id by @bojanrajkovic in #71
- fix(oci): document the pull progress concurrency contract and race-test CI by @bojanrajkovic in #72
- feat(reload): confirm config-reload convergence with -wait by @bojanrajkovic in #73
- docs: bundle the daemon+CLI in the app; app installs the daemon by @bojanrajkovic in #82
- feat(app): detect and surface app/daemon version skew by @bojanrajkovic in #83
- refactor: make ~/.runny a fixed, non-configurable runny home by @bojanrajkovic in #85
- feat(app): bundle runnyd/runnyctl in Runny.app and vend the CLI by @bojanrajkovic in #87
- feat(app): install and manage runnyd as a per-user LaunchAgent by @bojanrajkovic in #95
- feat: fixed-home follow-ups and per-user agent lifecycle polish by @bojanrajkovic in #98
- feat(app): detect-and-defer daemon ownership by @bojanrajkovic in #99
- feat(app): tell a stale socket from a live one for ownership detection by @bojanrajkovic in #103
- feat(app): surface and clean up every competing daemon owner by @bojanrajkovic in #104
- feat(app): detect-and-defer and reconcile the runnyctl CLI symlink by @bojanrajkovic in #105
- fix(runnyctl): honor -json after the subcommand and reject unknown flags by @bojanrajkovic in #106
- feat(config): generate a JSON Schema for config.yaml editor support by @bojanrajkovic in #107
- fix(runnyctl): align status columns by display width, not rune count by @bojanrajkovic in #108
- docs: correct the inverted Local Network launch-context premise by @bojanrajkovic in #110
- feat(runnyd): detect launch context to enforce the never-self-daemonize invariant by @bojanrajkovic in #111
- feat(home): resolve a shared control-socket path for the system daemon by @bojanrajkovic in #113
- feat(Runny): reach and defer to a system daemon by @bojanrajkovic in #114
- feat(home): deployment-resolve the home between system and per-user by @bojanrajkovic in #116
- feat(app): deployment-resolve the Swift client home by @bojanrajkovic in #117
- feat: install runnyd as a non-root system LaunchDaemon by @bojanrajkovic in #118
- feat(runnyctl): accept --operator on install-daemon by @bojanrajkovic in #122
- feat(app): install the runnyd system daemon via a brokered admin prompt by @bojanrajkovic in #123
- fix(app): move detail-pane title and actions into the window toolbar by @bojanrajkovic in #130
- fix(doctor): make disk-headroom image-size-aware by @bojanrajkovic in #133
- fix(statemachine): clear LastFailure when slot reaches LISTENING by @bojanrajkovic in #132
- fix(app): split recycle confirmation bound from pause/resume (30s vs 10s) by @bojanrajkovic in #131
- refactor(sysdaemon): use howett.net/plist to marshal the LaunchDaemon plist by @bojanrajkovic in #134
- feat(images): share one image pull and its outcome across concurrent slots by @bojanrajkovic in #136
- fix(sysdaemon): replace ValidateOperatorName regex with user.Lookup by @bojanrajkovic in #137
- feat(localnet): distinct grant state for a self-daemonized daemon by @bojanrajkovic in #138
- chore(deploy): remove the per-user shell installer by @bojanrajkovic in #139
- chore(deploy): make the tap formula scream the migration by @bojanrajkovic in #140
- refactor(lifecycle): rename foreignSystem to systemManaged by @bojanrajkovic in #143
- refactor(lifecycle): collapse to the five-verdict ownership model by @bojanrajkovic in #145
- feat(doctor): surface a leftover or duplicate runnyd registration by @bojanrajkovic in #147
- feat(runnyctl): guard install-daemon against a live per-user agent by @bojanrajkovic in #148
- docs: record the five-verdict ownership model and amend the ownership ADRs by @bojanrajkovic in #149
- test(guest): exercise stopRunnerScript shell logic directly by @bojanrajkovic in #150
- docs: define crash-only precisely and reconcile its loose usages by @bojanrajkovic in #152
- chore(deps): update jdx/mise-action action to v4.2.0 by @renovate[bot] in #155
- fix(statemachine): record a failed teardown cleanup as a warn, not silent ok by @bojanrajkovic in #154
- refactor(lifecycle): trim LaunchdProbe to system-only by @bojanrajkovic in #156
- test(sshx): widen WaitFor rejection-expiry budget so it can't straddle the deadline by @bojanrajkovic in #157
- docs(adr): app-driven runnyd updates with a config-compat gate by @bojanrajkovic in #172
- feat(home): add a non-fatal config warnings channel with two soft-validations by @bojanrajkovic in #173
- feat(app): add an atomic, update-only re-stage script for the system daemon by @bojanrajkovic in #174
- feat(runnyd): add -test-config, the local-only JSON config-compat gate by @bojanrajkovic in #175
- feat(app): add config-compat gate plumbing (exec bundled runnyd -test-config, parse verdict) by @bojanrajkovic in #176
- feat(runnyctl): add upgrade-daemon — gate on the new binary, then drain-gated reload by @bojanrajkovic in #177
- feat(runnyctl): name upgrade-daemon in the skew warning when the daemon lags the CLI by @bojanrajkovic in #181
- chore(deps): update actions/checkout action to v7 by @renovate[bot] in #153
- feat(app): gate the daemon update on the config-compat verdict (OK/Warn/Error) by @bojanrajkovic in #179
- feat(app): auto-apply daemon upgrades (default-on, surface-driven) by @bojanrajkovic in #182
- refactor(app): single-flight the auto-apply trigger, drop the race guards by @bojanrajkovic in #184
- ci: pin GitHub Action refs to exact versions by @bojanrajkovic in #188
- refactor(app): remove all privileged surface (non-privileged boundary) by @bojanrajkovic in #187
- refactor(app): centralize act-time ownership freshness in confirmedSelfManaged by @bojanrajkovic in #189
- feat(runnyd): log when the daemon lags its on-disk binary by @bojanrajkovic in #190
- feat: defer upgrade-daemon config-parse to the respawn target by @bojanrajkovic in #191
- feat(release): stamp real build date onto .app/.dmg bundle files by @bojanrajkovic in #192
- feat(deploy): homebrew cask for Runny.app by @bojanrajkovic in #193
- chore(deps): update zizmorcore/zizmor-action action to v0.5.7 by @renovate[bot] in #194
- feat(app): app-update notify (brew is the updater, no Sparkle) by @bojanrajkovic in #195
Full Changelog: v0.2.0-beta.57f3d402...v0.3.0