Commit Graph
273 Commits
Author SHA1 Message Date
autonomic-bot d441c6caaf supervisor: fix 3-day progress-gate deadlock (2026-08-07 run)
Root cause chain, all confirmed on the live system:
1. _run_pids() substring-matched the WHOLE cmdline for the session name. An agent's
   kickoff PROMPT is an argv element, and the supervisor's prompt text contains the
   literal 'cc-ci-upgrader' — so the supervisor's OWN billing-hung agent matched as a
   live upgrader run. Now matches FLAG VALUES only (--title <SESSION> / -s <sid>).
2. The gate treated 'a live proc exists' as progress. A provider-walled run keeps its
   process alive and SPINNING while emitting nothing (verified: 3 days, zero session
   output, still burning CPU). Progress now REQUIRES the session tree to have advanced
   within STALL_MIN; a live-but-idle proc is explicitly logged as stalled.
Result was ~60 consecutive false 'run progressing — leaving it' no-ops while the weekly
run sat unfinished and unreported.

Billing-walled runs are REPORTED, never killed (operator policy 2026-08-10): they may
resume when the wall lifts and their context is the run's state. New _billing_blocked()
detects the wall from the log tail and the gate surfaces
'run BLOCKED on a provider billing/usage wall — NOT killing; operator action required'.

Verified live: _run_pids no longer matches the hung Aug-7 supervisor (1497561) while
still matching the real finisher; gate now reasons 'session advanced Nm ago'.
2026-08-10 15:17:02 +00:00
autonomic-bot d101147b93 upstream(plausible): note v3.2.1 ships with clickhouse 24.12-alpine 2026-08-07 05:14:27 +00:00
autonomic-bot fb1dc7af9c upstream(mattermost-lts): 2026-08-07 re-check (11.10.0 pre-release; ESR=11.7.8) 2026-08-07 04:47:40 +00:00
autonomic-bot 0347511a84 upstream(n8n): release-notes sources 2026-08-07 04:44:40 +00:00
autonomic-bot f8888b2082 upstream(lasuite-drive): fix collabora release-notes URL + note minio AIStor move 2026-08-07 04:21:19 +00:00
autonomic-bot a56734de0b upstream(immich): 2026-08-07 — upstream main at v3.1.0; runner clone-token stale 2026-08-07 03:51:02 +00:00
autonomic-bot 5424954b3f upstream(gitea): note 1.27.1 patch release 2026-08-07 03:15:22 +00:00
autonomic-bot 51b067770c upstream(discourse): re-confirm pg18 newest (2026-08-07) 2026-08-07 02:53:05 +00:00
autonomic-bot 34d62fa049 journal: three pending weekly-run PRs unblocked (keycloak/mailu re-verified, discourse basefloor fix merged) 2026-08-04 17:58:02 +00:00
autonomic-bot 995bcf82d7 journal: 2026-08-04 weekly-run completion + bridge/wordpress/watchdog/naming wrap-up 2026-08-04 17:04:08 +00:00
autonomic-bot 04a04e51ac session naming: archive- prefix convention + cc-ci-report unique-name invariant
- _archive_stale_titles default label is now 'archive-<title> —' (operator
  convention: all archived sessions start with archive- so they sort/filter
  together in the web UI).
- launch-report.py start() archives older cc-ci-report sessions before launch,
  same invariant as upgrader/supervisor (reuses the launch-upgrader helper).
- 33 sessions restyled/archived live; canonical names now unique:
  cc-ci-upgrader (idle finisher), cc-ci-report (generating), cc-ci-supervisor
  (none — only exists during a rescue).
2026-08-04 16:58:30 +00:00
autonomic-bot f750622e3d supervisor: unique cc-ci-supervisor web-UI name (same invariant as the upgrader)
_archive_stale_titles() generalized to (title, label); launch-supervisor's
spawn_supervisor() archives every older 'cc-ci-supervisor' session before
launching, so exactly one session carries the name. 11 historical supervisor
sessions archive-renamed live ('supervisor archive — <date> <time>').
2026-08-04 16:49:03 +00:00
autonomic-bot 0b6cc632d4 launch-upgrader: fix watchdog wrong-session resume + unique web-UI name invariant
Bug (2026-08-04 16:00): _session_id() sorted candidates on (s.time.created) which the
/session API rows DON'T carry — every key was 0, 'newest' degraded to server list
order, and the watchdog resumed the old giant unresumable session, kill_session()ing
the healthy fresh run mid-work.

Fixes:
- Pin the managed session id at launch/resume to LOG_DIR/.{SESSION}-session-id;
  _session_id() prefers the pin, validated via direct GET /session/<id> (the LIST is
  paginated ~100 rows, membership scans lie). Title lookup is only the fallback and
  now sorts on authoritative sqlite time_created.
- _archive_stale_titles() at start: every older top-level session titled
  cc-ci-upgrader is renamed 'upgrader archive — weekly <date>', so EXACTLY ONE
  session ever carries the canonical name in the opencode web UI (easy to find;
  finished runs stay browsable under archive names). 11 historical sessions
  renamed live today; the in-flight finisher pinned.
Verified live: _session_id() returns the pinned running session; tree-idle 0.0min
while subagents active. Full synthetic-stall watchdog confirmation queued post-run
(task #13).
2026-08-04 16:43:26 +00:00
autonomic-bot e8d7d09445 upstream(n8n): add 2.32.x / 2.33.x release-notes coverage
Covers the 2.32.4 -> 2.33.3 range for the 2026-08-03 /upgrade-all run:
2.33.0 minor features (admin-managed instance creds, workflow review
requests + publish/unpublish API, API deprecation of activate/deactivate
endpoints, optional N8N_SCHEDULER_MAX_ATTEMPTS env) and the 2.33.1-2.33.3
patches; notes 2.34.0 exists but is not this run's target.
2026-08-04 16:27:43 +00:00
autonomic-bot b2063b8235 upstream(mattermost-lts): 2026-08-04 re-check — 11.9.0 exists, operator-directed bump 2026-08-04 16:07:53 +00:00
autonomic-bot 15e4e75681 cctest: consolidate onto the existing references/recipe-maintainer submodule
The repo already vendored ARM as the references/recipe-maintainer submodule (old
repo name recipe-maintainers/recipe-maintainer, pinned 460eba0). Rather than carry
two copies, drop the just-added vendor/ duplicate and:
- retarget references/recipe-maintainer to
  ssh://git.autonomic.zone/recipe-maintainers/autonomic-recipe-maintainer.git
  (same lineage — 460eba0 is an ancestor) and bump to latest acd5cfb, which also
  refreshes the parity-test SOURCE reference the tests cite.
- gen-cctest-skills.py + all 30 cctest-* wrappers + /help now point at
  references/recipe-maintainer.
- JOURNAL.md: pending session entries (server-update policy addendum, tests-update,
  orchestrator-update, upgrade-run notes).
2026-08-04 01:37:32 +00:00
autonomic-bot 02cc2c29e2 upstream(lasuite-meet): release-notes sources 2026-08-04 01:21:43 +00:00
autonomic-bot 388e7f38c9 upstream(lasuite-docs): record v5.4.0 Bearer-auth removal + redis sidecar note 2026-08-04 00:13:50 +00:00
autonomic-bot 6b3a3b1934 upstream(discourse): 2026.1→2026.7 ESR jump notes 2026-08-03 22:35:36 +00:00
autonomic-bot 74a57d37b3 recipes: enroll wordpress as weekly-maintained
used-recipes.md: wordpress weekly row. upstream/wordpress.md: registry entry
(wordpress official image + mariadb; install-wizard/XML-RPC test notes).
Mirror recipe-maintainers/wordpress created + synced (adcd0e9f). Test suite +
bridge enrollment: cc-ci PR #14 (verify + bridge deploy deferred until the
in-flight /upgrade-all completes).
2026-08-03 21:06:20 +00:00
autonomic-bot d95afd934b skills: PR-merge policy + test-before-switch + new /cc-ci-orchestrator-update
- cc-ci-server-update / cc-ci-tests-update / cc-ci-update: operator policy change —
  open PRs for visibility/historical record and merge directly once verified
  (invocation = authorization); reports must list merged-PR links + change summaries.
  (tests-update still never merges the paired recipe upgrade PRs.)
- cc-ci-server-update: mandatory nixos-rebuild test step (5d) before switch, with
  detached-activation + transient-unit notes from the 2026-08-03 26.05 deploy.
- AGENTS.md: test-before-switch policy for orchestrator host rebuilds.
- NEW skill cc-ci-orchestrator-update (+ thin .claude wrapper): the /cc-ci-server-update
  analogue for this host (flake /srv/cc-ci-orch, .#cc-ci-orchestrator-hetzner, Hetzner
  server 134487234), with self-update caveats.
- JOURNAL.md: 2026-08-03 server-update incident/recovery handoff entry.
2026-08-03 20:35:51 +00:00
autonomic-bot 9ec705dd0e orchestrator: run on the opencode backend + auto-start on boot
Switch the cc-ci-orchestrator agent (cc-ci-plan/agents.toml) from the claude
backend to the opencode backend so it attaches to the shared opencode web
server (opencode-web.service, 127.0.0.1:4096) and is reachable for Remote
Control at https://oc.commoninternet.net under the /srv/cc-ci-orch project.
Model = opencode/glm-5.2 (same provider family as the weekly upgrader /
supervisor). resume=false — the opencode backend has no --resume equivalent
(a fresh session per launch, matching the existing launch-opencode.sh shape).

Add a cc-ci-orchestrator.service systemd unit so on boot it runs
'agents.py up orchestrator' after opencode-web.service is up — the same
reboot-resilience shape lichen-orchestrator / project-orchestrator already
have. KillMode=process so a rebuild that merely touches this unit does not
tear down the shared tmux server and every agent session with it.

No secrets: the diff is only config + comments (paths, model names, unit
definition).
2026-08-03 18:50:36 +00:00
autonomic-bot 865eb45966 upstream(immich): v3.1.0 sidecar pins (valkey 8e8d64b4…, postgres unchanged) 2026-07-31 03:26:34 +00:00
cc-ci-bot 39c7d08dbd upstream(mattermost-lts): re-check 2026-07-24, 11.7.7 latest ESR patch 2026-07-24 13:08:03 +00:00
autonomic-bot d53a80eed4 upstream(lasuite-meet): add v1.24.0 / livekit v1.13.2-4 / nginx 1.31.3 notes 2026-07-24 04:35:54 +00:00
cc-ci 095b1dc75f upstream(custom-html): add nginx 1.31.3 release notes 2026-07-24 03:40:00 +00:00
cc-ci-bot 117685343b upstream(immich): note v3.0.3 release + valkey pin rationale 2026-07-17 02:19:46 +00:00
autonomic-bot 9e8ddc132e upstream(n8n): docs.n8n.io release-notes 404 -> use GitHub Releases; confirm live 2.27.2->2.31.0 sqlite migration clean 2026-07-15 00:11:13 +00:00
autonomic-bot 3ee026c2af upstream(mattermost-lts): 2026-07-13 re-check — 11.7.6 still latest ESR, 11.9 is innovation 2026-07-13 23:26:24 +00:00
autonomic-bot 89af8e4ed3 upstream(matrix-synapse): document signalbridge calver tag-form gotcha (abra blind spot) 2026-07-13 23:20:33 +00:00
autonomic-bot 4f2dd96c85 upstream(lasuite-meet): release-notes for meet v1.22/v1.23 + livekit v1.13.2/v1.13.3 2026-07-13 23:04:49 +00:00
autonomic-bot 82ae406667 upstream(immich): v3.0.2 pins (valkey:9 digest refreshed, postgres pgvectors0.3.0 unchanged) 2026-07-13 20:08:45 +00:00
autonomic-bot c1695dcf72 upstream(gitea): note 1.26.3 regression + 1.27.0 breaking changes 2026-07-13 20:05:06 +00:00
autonomic-bot d45a55a65f upstream(discourse): update for official image + calver release notes 2026-07-13 17:45:04 +00:00
autonomic-bot 1ec1aa8f1d feat(upgrader): LOOP_TIER=go|zen config — switch weekly upgrade to OpenCode ZEN
GO subscription hit a monthly usage limit (resets in 9 days). Add LOOP_TIER
env (default 'zen') to launch-upgrader.py + launch-report.py so the opencode
backend can use either subscription: zen→opencode/glm-5.2, go→opencode-go/glm-5.2.
The tier selects the default model, the usage-limit probe endpoint, and the
auth.json key. The systemd timer reads LOOP_TIER from /srv/cc-ci/upgrader.env.
2026-07-13 17:11:26 +00:00
autonomic-bot 1e40d50181 boot: only cc-ci-orchestrator auto-starts (+RC) — builder/adversary enabled=false so they don't launch on boot (operator); start them manually when running a build 2026-07-10 17:44:02 +00:00
autonomic-botandClaude Opus 4.8 b6a95c423c supervisor: treat run as finished once the weekly summary is written
A run can finish the recipe work + summary + report yet never print a clean
sign-off marker (it may wedge afterwards, as on 2026-07-03). Without a second
completion signal the supervisor would try to 'resume' the already-finished run
every hour until the 96h window closed. Now the gate also treats the run as done
when a weekly summary file (upgrade-all-<date>.md, the Step-5 output) exists with
an mtime after the session began.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxbpH3DquKzoSTSwGvGuET
2026-07-04 10:11:49 +00:00
autonomic-botandClaude Opus 4.8 ddedea80cd watchdog: fix _completed() false-positive that abandoned the run
The 2026-07-03 finish run wedged because _completed() returned True while the run
was still mid-work — so the watchdog exited early and nothing recovered the wedge.
Cause: it scanned part.get('text') across ALL message parts, so DONE_MARKER inside
a TOOL part (a subagent `task` prompt / bash command that referenced 'print
UPGRADE RUN COMPLETE') matched. Now: require the marker in the LAST assistant
TEXT (prose) message — the genuine sign-off — ignoring tool-call args and any
mid-run echo of the instruction (work after the echo disqualifies it).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxbpH3DquKzoSTSwGvGuET
2026-07-04 10:08:33 +00:00
autonomic-botandClaude Opus 4.8 69dd17833a weekly-run: tree-aware idle signal + crash-proof watchdog
More fixes from live-running the finish of the 2026-07-03 run:
- _session_idle_min(): measure staleness across the whole session TREE (top-level
  run + all descendant subagents), via the opencode server time.updated, NOT the
  tmux log mtime (which freezes when a headless run doesn't stream to the pane).
  A per-recipe subagent deploy runs 20-40min during which the PARENT session's
  updated time is stale — reading the parent alone looked 'idle' and would false-
  resume, killing the productive run. Renamed from _log_idle_min (kept as alias).
- watchdog(): wrap each poll in try/except so a transient server blip/race can
  never kill the watchdog (a dead watchdog silently abandons the run).
- watchdog + supervisor now read the tree-aware session idle instead of log mtime.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxbpH3DquKzoSTSwGvGuET
2026-07-04 05:04:32 +00:00
autonomic-botandClaude Opus 4.8 399e999978 weekly-run: watchdog resumes on proc-death; supervisor defers to watchdog
Live-testing the resume path surfaced two gaps: (1) an `opencode run` proc
EXITS when the model ends its turn, so a long /upgrade-all run's process dies
repeatedly before the whole run completes — and the log mtime freezes on death,
so the watchdog's log-idle>15min signal is both too slow and unreliable. (2) A
resumed run had no watchdog, so nothing re-continued it.

- watchdog(): detect PROC-DEATH (no live `opencode run` proc for the session +
  not completed) and resume promptly, in addition to log-idle. Guarded by
  MAX_RESUMES (default 20) so a no-progress loop (e.g. disk-full) eventually hands
  off to the supervisor/operator instead of spinning forever.
- resume(): auto-spawn a watchdog if none is alive (skips when the watchdog itself
  called resume — it lives in {SESSION}-watchdog — so no duplicate).
- launch-supervisor.py gate: defer while the per-run watchdog is alive (it is the
  single writer for prompt-recovery). The supervisor only takes over once the
  watchdog gives up (MAX_RESUMES) — i.e. a wedge a bare resume can't fix. Removes
  the supervisor/watchdog double-resume race.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxbpH3DquKzoSTSwGvGuET
2026-07-04 04:39:40 +00:00
autonomic-botandClaude Opus 4.8 1bd156e7e6 weekly-run: pre-reclaim stale cc-ci images + hourly glm-5.2 supervisor
Root-cause fix for the 2026-07-03 run stalling: the cc-ci host disk filled to
100% (ENOSPC) mid-run (Wave 6, lasuite-drive), the agent stopped to reclaim
space, and nothing resumed it — the log-idle/429 watchdog only covers opencode-go
usage-limit stalls, not an environmental wedge.

- launch-upgrader.py: step-0 prereclaim_cc_ci() prunes STALE cc-ci docker images
  (unused AND older than a week, so this week's likely-reused images stay) before
  each weekly run. Best-effort; env-tunable (UPGRADER_PRERECLAIM*).
- launch-supervisor.py (new): hourly glm-5.2 orchestrator wake-up. Cheap
  deterministic gate — no-ops (zero tokens) when the run is complete or
  progressing; only when a run stalled/died before completing does it launch a
  short-lived glm-5.2 agent to diagnose + drive it to a clean DONE. Progress is
  judged by live run-proc + log mtime (session_busy() is claude-tuned and misreads
  a headless opencode run as idle).
- configuration.nix: cc-ci-upgrade-supervisor service + hourly timer (:07).
- upgrade-all SKILL §0: note the stale-image reclaim for manual runs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxbpH3DquKzoSTSwGvGuET
2026-07-04 04:33:05 +00:00
autonomic-bot 52e7c954a3 upstream(hedgedoc): fix pgautoupgrade source repo URL 2026-07-03 04:09:57 +00:00
autonomic-bot 00335d6261 upstream(mattermost-lts): refresh to 11.7.6 ESR; correct survey's 10.x-LTS misread 2026-06-29 01:27:51 +00:00
autonomic-botandClaude Opus 4.8 f94be45f9c watchdog: cover all parts of the weekly run + survive the systemd oneshot
Two gaps for the scheduled Thursday glm-5.2 run:
1. Survival: the watchdog was a Popen child of the Type=oneshot service, which
   systemd's cgroup cleanup kills on exit. Spawn it under the persistent tmux
   server instead (_spawn_watchdog), like the run sessions — survives the oneshot.
2. The report runs on glm-5.2 sharing the same opencode-go budget the upgrade run
   drains, so it can 429-stall with no recovery. launch-report.py now spawns the
   SAME watchdog pointed at the cc-ci-report session (generic via UPGRADER_SESSION/
   _MODEL/_DONE_MARKER/_RESUME_FILE), with a report-specific resume prompt.

Also: _run_pids() is now scoped to the managed session (title or -s <sid>) so the
report watchdog can't kill the idle upgrader process and vice-versa; resume() adds
--dir and honors a custom resume prompt file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 02:42:50 +00:00
autonomic-botandClaude Opus 4.8 5a6c62e36c launch-upgrader: fix false completion detection (prompt contains the marker)
_completed() grepped the log for UPGRADE RUN COMPLETE, but the kickoff/resume
PROMPT (a user message) contains that string verbatim, so it false-positived
'done' while the run was still going. Check the model's ASSISTANT message output
via the web server API instead (log grep only as an offline, prompt-excluding
fallback).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:42:06 +00:00
autonomic-botandClaude Opus 4.8 6f9cbc1a56 launch-upgrader: rename babysit -> watchdog (match agents.py convention)
Subcommand, function, env (UPGRADER_WATCHDOG), and log file renamed; behavior
unchanged. Only the opencode upgrader 'start' auto-spawns it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:33:07 +00:00
autonomic-bot 816985160d upstream(matrix-synapse): correct bridge/db notes (previous attempt did not ship) 2026-06-23 01:27:37 +00:00
autonomic-botandClaude Opus 4.8 28ef7e44ab launch-upgrader: add stall-detect + auto-resume watchdog (opencode-go limit)
The opencode-go subscription's rolling usage-limit (429) ends the 'opencode run'
agent loop mid-run; it does NOT self-resume. Add:
- resume: continue the SAME session (context preserved) via 'opencode run -s <id>
  --continue' — finds the session from the web server, kills the idle proc safely
  (via /proc scan, never pkill -f self-match), relaunches in the tmux session.
- babysit: poll the session log; on a stall (>15min idle) wait out any 429
  retry-after then auto-resume. Spawned automatically by an opencode 'start'.

So a usage-limit pause now self-heals instead of needing a manual nudge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:26:24 +00:00
autonomic-bot 3762efcce3 upstream(matrix-synapse): document bridge calver + telegram Go rewrite + PG13→15 2026-06-22 21:46:42 +00:00
autonomic-bot 438819a94a upstream(mattermost-lts): 2026-06-22 re-check — 11.7.5 still latest ESR 2026-06-22 21:44:13 +00:00