v0.5.0: the nightly gated release — oo-appserver-release.timer and release --only-if-loaded #9

Merged
claude merged 3 commits from oss-oo/nightly-release into main 2026-10-28 01:32:10 +00:00
Member

v0.5.0 — the nightly gated release

Owner's word (2026-10-28, "lessegooo"): a nightly gated oo-appserver release as memory and lock hygiene, and the launcher runs the same gated release before a fallback launch (OO_APPSERVER=0, dotfiles — separate commit after this ships).

What ships

  • --only-if-loaded (with --heal-only --release): the release becomes a no-op (not-needed, reason: nothing-loaded) when the shared server holds no thread, and never opens a stopped server (door-closed-nothing-loaded); when a thread is loaded the usual gate decides (app not attached, no connected client, no busy thread) and restarts. The loaded list is read strictly with one short connection — an error reply, a reply of the wrong shape, a dead connection, or a closed door while the unit is still active (a hung server keeps its loaded threads and their locks) hand over to the normal gate, exactly as a plain release would.
  • systemd/oo-appserver-release.service (oneshot, --from nightly-release --json; SuccessExitStatus=1, because a skipped release — app attached, client connected, busy thread — is a normal night, not a failure; a restart that left the door shut exits 5 and shows as a failed unit) and oo-appserver-release.timer (OnCalendar 04:30, RandomizedDelaySec 20min, Persistent=true). The installer installs both and enables the timer only; CI verifies both units.
  • Helper: nightly status line (timer state incl. "not-installed", next and last run), doctor info when the timer is not enabled; --dry-run with --only-if-loaded says what the night would do; README: Parts, the release section, exit codes, the known-gaps memory backlog closed.
  • Tests: eight legs — nothing loaded → no-op and no systemctl call; loaded → restart; stopped server stays stopped and is not asked; attached app still never touched (exit 1); an error reply steps aside for the gate; a hung server goes to the gate; the dry run; heal-failed exit 5. Suite 111/111; read 23 and bridge 14 unchanged and green; systemd-analyze verify --user on all four units exit 0; dry install shows both files and the timer enable.

Review

Fresh read-only subagent on 5360298 (suite, unit verify, dry install, throwaway probes with error/non-list replies and a missing timer): 1 should-fix (an error reply from the loaded list read as "nothing loaded" → the launcher's lock-out cure silently skipped), 2 low (a hung server with a closed door was a no-op instead of the gate; exit 1 shared by skip and heal-failed), 2 nits (dry run ignored the flag; "?" for a missing timer) — all folded in 98bc7aa. Re-check of the delta: "mergeable as is" (suite 111 run by the reviewer, all four units verify, dry install); its README nit (exit-code wording) folded in cc975bf. CI green on every commit (runs 41–43). Review texts: v050-review/ in the evidence folder.

🤖 Generated with Claude Code

## v0.5.0 — the nightly gated release **Owner's word (2026-10-28, "lessegooo"):** a nightly gated `oo-appserver release` as memory and lock hygiene, and the launcher runs the same gated release before a fallback launch (`OO_APPSERVER=0`, dotfiles — separate commit after this ships). ### What ships - **`--only-if-loaded`** (with `--heal-only --release`): the release becomes a no-op (`not-needed`, `reason: nothing-loaded`) when the shared server holds no thread, and **never opens a stopped server** (`door-closed-nothing-loaded`); when a thread is loaded the usual gate decides (app not attached, no connected client, no busy thread) and restarts. The loaded list is read strictly with one short connection — an error reply, a reply of the wrong shape, a dead connection, or a closed door while the unit is still active (a hung server keeps its loaded threads and their locks) hand over to the normal gate, exactly as a plain `release` would. - **`systemd/oo-appserver-release.service`** (oneshot, `--from nightly-release --json`; `SuccessExitStatus=1`, because a skipped release — app attached, client connected, busy thread — is a normal night, not a failure; a restart that left the door shut exits **5** and shows as a failed unit) and **`oo-appserver-release.timer`** (`OnCalendar 04:30`, `RandomizedDelaySec 20min`, `Persistent=true`). The installer installs both and enables the timer only; CI verifies both units. - Helper: `nightly` status line (timer state incl. "not-installed", next and last run), doctor info when the timer is not enabled; `--dry-run` with `--only-if-loaded` says what the night would do; README: Parts, the release section, exit codes, the known-gaps memory backlog closed. - Tests: eight legs — nothing loaded → no-op and no systemctl call; loaded → restart; stopped server stays stopped and is not asked; attached app still never touched (exit 1); an error reply steps aside for the gate; a hung server goes to the gate; the dry run; heal-failed exit 5. Suite 111/111; read 23 and bridge 14 unchanged and green; `systemd-analyze verify --user` on all four units exit 0; dry install shows both files and the timer enable. ### Review Fresh read-only subagent on `5360298` (suite, unit verify, dry install, throwaway probes with error/non-list replies and a missing timer): 1 should-fix (an error reply from the loaded list read as "nothing loaded" → the launcher's lock-out cure silently skipped), 2 low (a hung server with a closed door was a no-op instead of the gate; exit 1 shared by skip and heal-failed), 2 nits (dry run ignored the flag; "?" for a missing timer) — all folded in `98bc7aa`. **Re-check of the delta: "mergeable as is"** (suite 111 run by the reviewer, all four units verify, dry install); its README nit (exit-code wording) folded in `cc975bf`. CI green on every commit (runs 41–43). Review texts: `v050-review/` in the evidence folder. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude agent added 1 commit 2026-10-28 01:16:48 +00:00
Owner's word (2026-10-28, "lessegooo"): a nightly gated `oo-appserver release` returns the memory
and the writer locks of loaded threads, and the launcher runs the same gated release before a
fallback launch. New: `--only-if-loaded` (with --release) makes the release a no-op (`not-needed`,
reason nothing-loaded) when no thread is loaded and never opens a closed door
(door-closed-nothing-loaded) — the gate (app not attached, no client, no busy thread) stays as it
is. Units: oo-appserver-release.service (oneshot, --from nightly-release, a skipped release's exit 1
counts as success) and oo-appserver-release.timer (04:30 + up to 20 min, Persistent); the installer
installs both and enables the timer; CI verifies them. Helper: a `nightly` status line (next and
last run) and a doctor info when the timer is not enabled. Tests: four legs (nothing loaded → no-op;
loaded → restart; closed door stays closed; attached app still never touched); suite 107.
README: Parts, the release section, known gaps (memory backlog closed).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent added 1 commit 2026-10-28 01:27:13 +00:00
- `loaded_now()` reads `thread/loaded/list` itself: an error reply, a non-object result or a non-list
  `data` return None (the gate decides) instead of [] (which read as "nothing loaded" and skipped the
  release). A closed door with the unit still active (a hung server keeps its loaded threads and
  writer locks) returns None too; only a stopped unit is a no-op.
- `--heal-only` exits 5 on heal-failed (the restart ran, the door stayed shut) so the nightly oneshot
  shows a real failure; exit 1 stays the gated skip (SuccessExitStatus=1).
- `--dry-run` with --only-if-loaded says what the night would do (loaded list, would).
- `oo-appserver status`: a timer that is not installed reads "not-installed", not "?".
- Tests: the error reply steps aside for the gate; the hung server goes to the gate; the dry run;
  heal-failed exit 5 (suite 111). Fake: `loaded_list_error` knob. README: the stop rules.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent added 1 commit 2026-10-28 01:30:04 +00:00
README: heal exit codes — 1 skipped for a gate, 5 when the restart failed
All checks were successful
ci / check (pull_request) Successful in 1m32s
cc975bf48e
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent merged commit dc343e6469 into main 2026-10-28 01:32:10 +00:00
claude agent deleted branch oss-oo/nightly-release 2026-10-28 01:32:10 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
OSS-OO/oo-appserver!9
No description provided.