Commit Graph
100 Commits
Author SHA1 Message Date
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
autonomic-bot 543b98d030 upstream(ghost): document MySQL 9.x is NOT supported by Ghost (do not bump past 8.x) 2026-06-22 21:19:31 +00:00
autonomic-bot 25ef098581 upstream(discourse): bitnamilegacy frozen at 3.5.0; 9.x are Helm chart OCI artifacts 2026-06-22 20:56:17 +00:00
autonomic-bot 8887c1089e upstream(custom-html-tiny): fix alpine/git source repo URL 2026-06-22 20:52:55 +00:00
autonomic-bot 2a682b1fe5 upstream(custom-html): fix alpine/git source repo URL + add 1.31.2 notes 2026-06-22 20:43:38 +00:00
autonomic-botandClaude Opus 4.8 9e91d47205 recipe-report: harden spec-in/page-out determinism contract
Make explicit that ALL formatting/HTML is owned by recipe-report.py render() and
the model's only artifact is the spec JSON — never hand-write/edit HTML. Matters
now that glm-5.2 drives the report. Also fix stale 'default opus' refs (report
now defaults to opencode-go/glm-5.2, overridable via REPORT_BACKEND/REPORT_MODEL).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:34:14 +00:00
autonomic-botandClaude Opus 4.8 165eb62070 launch-report: default to opencode-go/glm-5.2 + fix opencode run invocation
Report launcher now defaults backend=opencode, model=opencode-go/glm-5.2 (claude
override → opus). Replaced the broken opencode 'attach + send-keys' path with the
same 'opencode run -m … --share --attach --title' pattern as the upgrader (the
old path passed no model and injected the prompt via keystrokes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:28:55 +00:00
autonomic-botandClaude Opus 4.8 5351ec2e40 launch-upgrader: default to opencode-go/glm-5.2 when unset
Weekly upgrade run now defaults backend=opencode, model=opencode-go/glm-5.2 with
no env set. Model default tracks backend (claude override → sonnet). Override via
LOOP_BACKEND/LOOP_MODEL or /srv/cc-ci/upgrader.env.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:23:26 +00:00
autonomic-botandClaude Opus 4.8 1443ccaea5 weekly upgrade: optional backend/model via /srv/cc-ci/upgrader.env
cc-ci-upgrade-all now reads an optional EnvironmentFile so the weekly run can
switch backend/model (e.g. LOOP_BACKEND=opencode LOOP_MODEL=opencode-go/glm-5.2)
without a rebuild. Absent file → claude/sonnet (unchanged). Built+switched on
cc-ci-orchestrator-hetzner, host verified healthy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:21:16 +00:00
autonomic-botandClaude Opus 4.8 ec18c98af6 launch-upgrader: fix opencode --model placement + add web-attach/--share
The opencode backend emitted 'opencode --model X run ...' but -m/--model is a
flag on the run subcommand, so the model was being ignored. Move it after run.
Add OPENCODE_SHARE (default on): attach the session to the shared opencode web
server (oc.commoninternet.net) AND create a public --share link for monitoring.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:14:27 +00:00
autonomic-botandClaude Opus 4.8 f29aacc29a point recipe-maintainer submodule at public repo (recipe-maintainers/recipe-maintainer)
Use the public mirror from now on; ignore the private notplants repo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 13:45:28 +00:00
autonomic-botandClaude Opus 4.8 388e5ec7d0 bump recipe-maintainer: opencode readme + skill mirror
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 01:08:36 +00:00
autonomic-bot 02f13ab35f recipe-upgrade: scope upstream cross-check to abra-unparseable tags only
Trust abra fully for any image whose tag it can read — a normal semver/calver
tag with no newer version is genuinely up-to-date. Only cross-check upstream for
images abra physically can't parse (tag+digest pins, digest-only pins), which is
the actual immich blind spot. Avoids redundant upstream checks on every recipe.
2026-06-19 11:54:21 +00:00
autonomic-bot ce5d2e22cf recipe-upgrade: cross-check upstream when abra is blind (immich tag+digest skip)
abra recipe upgrade is the first approach, but it silently contributes no
candidate for tag+digest pins (FATA: tag and digest not supported), digest-only
pins, and non-semver tags. immich kept getting skipped this way. Before
concluding SKIPPED — up-to-date, do a direct upstream tag check for every image
abra could not cleanly evaluate; only skip when BOTH agree nothing is newer.
2026-06-19 11:51:37 +00:00
autonomic-botandClaude Sonnet 4.6 68bbfc72f2 upstream(mattermost-lts): update to 11.7 ESR; note restore fix, schemeid gotcha
- Mattermost now on 11.7 ESR (EOL 2027-05-15); 10.11 ESR expires 2026-08-15
- Latest patch: 11.7.5 (2026-06-18)
- Note: avoid 11.7.0–11.7.2 (schemeid bug upgrading from 10.11.17+)
- Backup/restore now uses pg_backup.sh (proper restore hook; PR #2/PR #1 fix)
- Next ESR expected ~Feb 2027

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mbq9p2eCzZH59qfw9WsgKZ
2026-06-19 03:53:48 +00:00
autonomic-bot 15e88eaca2 upstream(hedgedoc): add release-notes sources registry 2026-06-19 02:49:42 +00:00
autonomic-bot f195dfc828 upstream(gitea): release-notes sources 2026-06-19 02:45:01 +00:00
autonomic-bot 0ccd98fa8e upstream(drone): release-notes sources 2026-06-19 02:21:11 +00:00
autonomic-bot e844ae3909 upstream(bluesky-pds): update registry — 0.4.5001 is new versioning scheme, not a mis-tag 2026-06-19 02:12:41 +00:00
autonomic-bot 6acad7b35b recipe-upgrade: abra recipe release for version bump + upstream release-notes links in PR body
cc-ci recipe-upgrade skill now computes the version via 'abra recipe release --dry-run'
(not a hand-edit) and requires the PR body to link upstream release notes per service.
Bumps the recipe-maintainer submodule pointer to the matching change.
2026-06-15 18:09:41 +00:00
autonomic-bot 6a2464469f upgrade-all: skip 'external' recipes (uptime-kuma) + add used-recipes.md inventory
Operator: uptime-kuma is maintained elsewhere — drop it from the weekly upgrade
but keep it in the used-recipes inventory. New cc-ci-plan/used-recipes.md is the
canonical list of every recipe cc-ci deploys/tests, with a weekly|external tier;
upgrade-all §1 now excludes 'external' rows from the candidate list (explicit
--args still override). uptime-kuma = external; all others weekly.
2026-06-15 17:00:28 +00:00
autonomic-bot 489f6670da journal: pxgate cold-boot proof passed (real reboot, deploy-proxy active before dashboard) 2026-06-13 13:52:56 +00:00
autonomic-bot 6005a212d6 memory+journal: cc-ci host rebuild procedure; pxgate M2 deployed + verified on live host 2026-06-13 13:46:19 +00:00
autonomic-bot 1aee81b4f3 plan: queue pxgate — fix deploy-proxy/dashboard health-gate circular dependency (D8)
Re-target the traefik health gate off ci.commoninternet.net (the dashboard,
which is After=deploy-proxy) onto a traefik-self endpoint, breaking the
fresh-boot deadlock while keeping health-gated rollback. M1 controlled repro by
the loops; M2 from-scratch cold-boot proof owned by the orchestrator.
2026-06-13 12:38:40 +00:00
autonomic-bot 97303abc25 watchdog: suppress scheduled wakes once the build sequence is complete
The unified agents.py watchdog kept firing the hourly orchestrator supervision
ping even after SEQUENCE-COMPLETE (the old launch.py watchdog exited on
completion, which stopped them). Gate the wake loop on the SEQUENCE-COMPLETE
marker so a finished build stays fully at rest — no pings. Resumes
automatically when new work is queued (that clears the marker, line 631).
2026-06-13 12:04:49 +00:00
autonomic-botandClaude Sonnet 4.6 84e13a7f23 fix(pvcheck/A2): update upgrade-all SKILL.md guard description
The durable /16 proxy fix landed in phase pvfix (2026-06-13).
Update the guard description from "safety net until that lands"
to "belt-and-suspenders even after the /16 fix" — guard logic
unchanged, description now accurate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 05:58:27 +00:00
autonomic-bot 1e9337ce89 agents.toml: re-add cf48 (opus cfold review) dropped during the launch-system migration
The unification transcribed phases from .phases-spec before cf48 was added,
so the operator's just-requested opus 4.8 cfold review got dropped. Re-append
it after ghost (system is past cf55/on pvfix, so can't insert before pvfix
without shifting the live phase index). agents.py re-reads config each tick.
2026-06-13 05:32:47 +00:00
autonomic-bot b4a6aaea7e plan: queue cf48 — Opus 4.8 post-cfold coverage-loss review (cross-check of cf55 GPT-5.5)
Second independent review of the cfold custom-folder collapse, by Opus 4.8
instead of GPT-5.5, inserted after cf55 (queue ...cfold;cf55;cf48;pvfix;...).
Per-phase overrides .loop-model[-adv]-cf48=claude-opus-4-8 on the claude backend.
2026-06-13 05:15:05 +00:00
autonomic-bot 2c64cd69f0 fix(watchdog): detect idle opencode turns 2026-06-12 21:47:06 +00:00
autonomic-bot 85498931d1 plan: add gpt55 cfold review phase 2026-06-12 16:07:48 +00:00
autonomic-bot dea6359bcd plan: queue proxy and ghost follow-up phases 2026-06-12 15:56:03 +00:00
autonomic-bot a186f23b37 orchestrator: restore opencode web launcher 2026-06-12 15:45:09 +00:00
autonomic-bot 03343ed3cf plan(ghost-pr): fold in upgrader's diagnosis — mysql 8.0->8.4 data-dir upgrade race (update_config.monitor too tight); PR#4 open 2026-06-12 13:45:52 +00:00
autonomic-bot 5141335fb3 upstream(mattermost-lts): update ESR notes — 10.11 ESR (Aug 2026), 10.12 expired, 11.7 next ESR; backup format notes 2026-06-12 04:14:04 +00:00
autonomic-bot e89884beba upstream(n8n): update standing notes for 2.26.3 upgrade 2026-06-12 04:12:32 +00:00
autonomic-bot c7fae6cbee upstream(matrix-synapse): update notes for 7.3.0+v1.154.0 PR#2 2026-06-12 04:00:59 +00:00
autonomic-bot 4f31abc0c7 upstream(mailu): update Redis standing note — operator approved 8.8.x jump 2026-06-12 03:48:52 +00:00
autonomic-bot d3a9455eb3 upstream(lasuite-meet): document livekit v1.13.1 TURN-auth note + redis 8.8.0 2026-06-12 03:43:29 +00:00
autonomic-bot ca02a0dd6f upgrade-all: proxy VIP-exhaustion guard in Step 0; runbooks for proxy /16 enlarge + ghost PR debug
Root-caused (empirically, dockerd logs) the discourse/ghost deploy wedges:
the shared proxy overlay (/24=254 VIPs) exhausts as concurrent stack rm leaks
endpoints over many days -> tasks stuck in Swarm 'New'. Add a per-run safety
net to Step 0 (network prune + docker restart when VIP-allocation failures are
logged). Plans + memory for the durable fix (enlarge proxy to /16 in swarm.nix,
maintenance window) and for debugging/fixing the ghost PR afterward.
2026-06-12 03:30:00 +00:00
autonomic-bot 7ce898e0e4 upstream(immich): document concurrent app+db restart update_config fix 2026-06-12 03:26:37 +00:00
autonomic-bot 28b9431035 upstream(immich): note pgvectors0.3.0 bump in PR #2 + new digest (2026-06-12) 2026-06-12 02:50:45 +00:00
autonomic-bot 2c5e08f78c upgrade-all: simplify to a rolling pool, alphabetical (drop waves + heavy/light)
Per operator: just work through recipes alphabetically keeping CAP (=
DRONE_RUNNER_CAPACITY=2) subagents running at once, starting the next the moment
one finishes (rolling pool via run_in_background). Removes the wave-barrier and
the heavy/light classification entirely — simpler and no slot ever idles.
2026-06-12 01:58:22 +00:00
autonomic-bot 894d829313 upgrade-all: at the tail, fill slots with two heavies rather than serialize
Per operator: always fill all CAP slots. Heavy/light alternation only spreads
heavies across waves while a light is available; once only heavies remain, run
two-per-wave (capacity is the tuned ceiling) instead of one-per-wave.
2026-06-12 01:55:29 +00:00
autonomic-bot f744c79e2d upgrade-all: alternate heavy/light per wave (not heaviest-first)
Host memory is the binding limit, so never schedule two HEAVY recipes in the
same capacity wave — pair each heavy (discourse/immich/matrix-synapse/
lasuite-drive/mattermost-lts/ghost) with a light one to bound peak memory while
keeping both slots busy. Heaviest-first could co-schedule two heavies and OOM/
wedge the box (the disc-50cc8a 'New'-state wedge). For CAP>2 cap heavies at
~CAP/2; if only heavies remain, run one-per-wave.
2026-06-12 01:47:22 +00:00
autonomic-bot a45517b432 upgrade-all: default to concurrency-bounded (DRONE_RUNNER_CAPACITY) subagents
Now that the 2026-06-10 concurrency restructure makes concurrent recipe runs
safe (per-run trees, app-domain locks, isolation), default /upgrade-all to run
up to DRONE_RUNNER_CAPACITY (the drone runner's slots, currently 2) recipe
subagents at a time instead of strictly sequential — using all available
concurrency without oversubscribing. Query the live capacity from
'systemctl show drone-runner-exec' (fallback 2); process recipes in waves of
CAP (emit CAP Agent calls per message, await, next wave). Flags: --capacity N,
--sequential (CAP=1, old default — use when the build loops share the box),
--parallel (unbounded). Applies to the NEXT run; the in-flight run is unaffected.
2026-06-12 01:39:44 +00:00
autonomic-bot 1eb720e95a journal: unstuck weekly upgrade wedged on discourse Swarm scheduling hiccup 2026-06-12 00:31:29 +00:00
autonomic-bot a1cceef3d4 ops: pause cfold until /upgrade-all finishes (serialize — they conflict on CI); journal+memory 2026-06-11 22:56:27 +00:00
autonomic-bot af2b2e8156 plan: phase 'cfold' — collapse functional/+playwright/ into custom/ + full !testme recipe sweep (queued after drone)
The functional/playwright split is purely organizational (discovery globs both
with no branching; same custom tier -> L4 rung, same fixtures, same failure
semantics). Migrate all custom tests to one custom/ folder; M1 proves coverage
identical before/after (no silent drops), M2 is a full real-CI !testme sweep
across all recipes confirming levels unchanged. cfold becomes the last phase so
the queued /upgrade-all fires after it (folder change verified before upgrade).
2026-06-11 22:52:45 +00:00
autonomic-bot 79134a94e8 memory: drop drone P0 host-deploy note — /etc/timezone present on cc-ci, prerequisite satisfied (drone phase deploying gitea fine) 2026-06-11 21:55:16 +00:00
autonomic-bot 34fc68d4b8 journal: coordination files moved to machine-docs/; memory committed 2026-06-11 20:57:57 +00:00
autonomic-bot c33b21fe8d memory: commit session notes (drone P0, weekly-upgrade-queued, mailu/index updates)
Per AGENTS.md 'Agent memory lives in memory/ (in this repo)' — memory notes
must be committed + pushed like any repo change, not left only in the local
~/.claude symlink target.
2026-06-11 20:56:24 +00:00
autonomic-bot e144354668 loops: mandate machine-docs/ for ALL coordination files (kickoff/prompts/plan/AGENTS)
Recent phases wrote STATUS/BACKLOG/REVIEW/JOURNAL to the repo ROOT because
build_kickoff + plan.md's tree used bare filenames, even though the loops'
AGENTS.md + INBOX/DECISIONS/DEFERRED conventions already said machine-docs/.
Make machine-docs/ the single mandated home everywhere: build_kickoff now
emits machine-docs/ paths + an explicit FILE-LOCATION RULE; both loop prompts
and plan.md (tree + seed step) updated; orchestrator AGENTS.md documents +
enforces it. resolve_state/INBOX handoff already read machine-docs/ first.
2026-06-11 20:56:24 +00:00
autonomic-bot 23b5fc4753 journal: weekly upgrade skipped tonight, queued after phase queue via watchdog hook 2026-06-11 20:50:25 +00:00
autonomic-bot 3fa3178546 watchdog: one-shot /upgrade-all trigger on phase-sequence completion
When LOG_DIR/.run-upgrade-on-complete exists, the watchdog launches
launch-upgrader.py start the moment the last phase reaches ## DONE (then
consumes the flag). Lets the operator replace a scheduled weekly cron run with
'run as soon as the current phase queue finishes' — used tonight: the
cc-ci-upgrade-all.timer was stopped (stamp forwarded past tonight's slot) and
this flag set instead.
2026-06-11 20:49:54 +00:00
autonomic-bot 0005ce81af journal: mailu false-completion incident + fix + re-queue 2026-06-11 18:20:54 +00:00
autonomic-bot 4275adc4a5 watchdog: phase_done ignores placeholder '## DONE' sections (skipped mailu)
A Builder scaffolded 'STATUS-mailu.md' with a '## DONE / Not yet. Written
here only when ...' placeholder section; phase_done's startswith('## DONE')
matched it and auto-advanced past mailu without any of its work being done
(no recipe PR, no claim, no review). Harden phase_done: a '## DONE' heading
counts only when its first non-empty body line is not a placeholder/negation
(Not yet / pending / TBD / when all / <...> etc). Verified against all shipped
STATUS files (real DONEs still detected; mailu placeholder rejected).
2026-06-11 18:20:21 +00:00
autonomic-bot 211b4e231c launch: per-phase model override (.loop-model[-adv]-<pid>)
Lets a single phase pin a different model, read fresh each role_model call so
a phase transition flips it automatically with no watchdog bounce. Operator
wants builder on opus for the complex dstamp phase, reverting to sonnet from
mailu on: .loop-model-dstamp=opus while base .loop-model stays sonnet.
2026-06-11 16:15:18 +00:00
autonomic-bot 5c260d225c launch-orchestrator: persisted .orch-model file (ORCH_MODEL > LOOP_MODEL > file)
Operator switching models near weekly limits: loops -> sonnet, orchestrator
-> opus. Dotfiles updated (.loop-model/.loop-model-adv=sonnet,
.orch-model=opus) so watchdog restarts keep the choice.
2026-06-11 16:03:29 +00:00
autonomic-bot 327b9f4efe plan: phases dstamp, mailu, kuma, drone (queued after bsky) + journal
- dstamp: attribute + fix the discourse abra-stamp drift (env change 06-05→
  06-10, harness-neutral, currently pinning discourse at L1); blast-radius
  sweep; HC1 keeps its teeth
- mailu: backupbot v2 labels recipe PR, restore proven on real seeded mail,
  backup rung earned instead of skipped (operator approved re-entry)
- kuma: uptime-kuma first-run wizard + create-a-monitor functional test
  (Socket.IO or Playwright, real probe evidence, flake-checked)
- drone: gitea-dep enrollment, maximal subset per Phase-2 scoping;
  P0 /etc/timezone host deploy is orchestrator-owned (3bde76f committed)
2026-06-11 11:43:03 +00:00
autonomic-bot c89cd6366b plan: phase 'bsky' — fix bluesky-pds recipe + its screenshot (queued after lvl5)
Root-cause the upstream image breakage (Cannot find module /app/index.js,
Node v24 under the pinned tag — proven harness/ref-neutral in rcust M2),
research upstream releases (persist to cc-ci-plan/upstream/bluesky-pds.md),
fix via recipe-mirror PR (NEVER merge — operator does), prove full lifecycle
green incl. the new L5 lint rung via !testme at PR head, then verify a real
credential-free screenshot on those runs (hook only if needed). Close both
DEFERRED bluesky entries; crisp operator handoff in STATUS-bsky.md.
2026-06-11 11:30:49 +00:00
autonomic-bot 0900c439d4 wake prompt: remove temporary limit-system night-watch line (condition met)
The 2026-06-11 night watch is over: the limit-wait system was verified
end-to-end on a real monthly-spend-limit window (hit -> hold without reboots
-> flat probes -> prompt resume on lift), and the three bugs it surfaced are
fixed (5ea17fc, 969eb60). Standing supervision continues without the extra
check.
2026-06-11 06:55:08 +00:00
autonomic-bot 969eb60df1 watchdog: probe-resumed tick returns True — don't evaluate stale pane after resume
The tick whose probe resumed a session was continuing into stall logic with
its pre-resume pane capture; a 4h-old WAITING-UNTIL in that stale data got
the freshly-resumed adversary kill+rebooted (05:52). Treat probe-resume as
handled-this-tick; the next 30s tick sees the live session.
2026-06-11 05:53:44 +00:00
autonomic-bot 5ea17fca21 watchdog: fix limit-probe self-match + scrollback dedupe wedge; plan(lvl5): badge shows level only
Night-watch findings (monthly-spend-limit window, ~01:49-04:45):
- probe text said 'usage limit' which matches LIMIT_RE, so a submitted probe
  kept limited_now true forever -> reworded to 'quota window' with a CAUTION
  note (nudge text must never match LIMIT_RE)
- dedupe scanned all 40 captured lines, so once a probe scrolled into the
  conversation no further probe ever fired (builder/adv frozen at nudges=1,
  orchestrator probes degraded to hourly riding the wake scroll) -> dedupe
  now only checks the bottom 8 lines (input area)
Core invariant HELD: zero kill+reboots during the limit window.

plan(lvl5): operator addition - the top-corner level badge (card, dashboard
pill, badge SVG) shows only the level number+color, zero capping info; the
inline per-rung table keeps intentional-skip/unverified detail.
2026-06-11 05:52:26 +00:00
autonomic-bot 76aa104dbd plan(lvl5): N/A split — intentional skip climbs, unintentional (unverified) blocks
Operator refinement: only declared/structural skips (not backup-capable, no
previous version) let the climb continue; a rung that should have run but
didn't (infra error, abra missing, tier abort, timeout) blocks the level at
the last verified rung. Every N/A source in derive_rungs gets an explicit
classification (DECISIONS.md, adversary-reviewed); unclassifiable defaults to
unverified. Unit tests + one synthesized tier-abort run prove the rule.
2026-06-11 01:47:26 +00:00
autonomic-bot 1f7fc7eb39 plan(lvl5): fold in de-capping — level = highest passed rung, N/A skips, fail blocks
Operator decision (explicit Q&A 2026-06-11): remove cap/cap_reason/capped
entirely. New formula: level = max i with rung_i==pass and all j<i in
{pass,na}. N/A no longer stops the climb (the confusing part — e.g.
non-backup-capable recipes were stuck at L2); a real FAIL still blocks.
Per-rung table + verdict carry the completeness story. Added: de-cap
implementation reqs, both-schema rendering, before/after level table for all
recipes, N/A-skip proof run, bad-canary designed-levels re-derivation under
the new formula.
2026-06-11 01:45:54 +00:00
autonomic-bot 0aab78d3a2 plan: phase 'lvl5' — L5 level rung: abra recipe lint passes on the PR (queued after shot)
New top rung after install/upgrade/backup-restore/functional: lint the exact
recipe ref under test; gap-caps per ladder semantics; verdict-neutral and
time-bounded; mirror-origin R014 plumbing must not pollute recipe lint results
(abra.py:109-114); all consumers (results/card/dashboard/badge/docs/tests)
updated; old artifacts still render. M1 = adversary-cold-verified implementation
pre-merge; M2 = real-CI proof incl. a genuine L5, a genuine lint-capped L4, and
2 drone-path runs. Recipe lint failures -> mirror PRs or DEFERRED, never merged.
2026-06-11 01:39:27 +00:00
autonomic-bot 7c042c2f2a plan: phase 'shot' — recipe screenshot audit & repair (queued after rcust)
Audit every enrolled recipe's CI badge/card screenshot, diagnose defects
(plausible null-every-run; ~4.8KB blank-frame SPAs: immich/lasuite-meet/
cryptpad/flaky n8n), fix via harness default-wait improvement first, per-recipe
SCREENSHOT hooks second; M1 audit matrix + M2 visually-verified PNGs on fresh
real-CI runs (>=2 !testme). Cosmetics-never-block and secret-safety guardrails
binding. Also: temporary hourly-wake instruction to verify the new limit-wait
system tonight; journal entry.
2026-06-11 01:17:32 +00:00
autonomic-bot 2e1ab8d384 watchdog: hourly orchestrator wake fires even during a limit window
Operator request: the hourly supervision prompt should land regardless of
limit state, as a fallback that keeps things on track if the limit-state
machinery ever breaks. If the limit is genuinely still in force the wake is
harmless (the banner just re-prints and limit_tick re-arms); once it lifts,
the queued wake doubles as a resume nudge.
2026-06-11 01:00:29 +00:00
autonomic-bot d6e1a704da watchdog: parse limit-reset time, never reboot limit-stalled sessions; rename orch session
Replace the blind every-300s 'limit appears lifted' nudge (claude) and the
opencode-only _maybe_nudge_limit with one unified limit_tick state machine:

- parse the reset time from the limit banner (last match wins; stale banners
  whose time already passed fall back rather than waiting ~a day)
- arm a quiet window until reset+45s; parse failure -> flat 5-minute probe
  loop (operator-specified; not exponential backoff)
- while armed, suppress ALL healing: a limit-stalled session is NEVER
  kill+rebooted (this was the conc-phase churn: claude limit stalls fell
  through to the generic idle reboot, losing the banner and re-hitting
  the limit fresh)
- at window end send ONE nudge as a self-verifying probe: spinner clears
  the state; a re-printed banner re-arms from the fresh reset time
- dedupe: never stack a probe while our own text is visible in the pane
- state persisted per session in LOG_DIR (.limited-<session>) so watchdog
  restarts keep the window
- orchestrator gets the same treatment: limit_tick in heal_orchestrator,
  a per-signal-tick orch_limit_check, and hourly wakes deferred during
  limit windows
- loud WARNING at 3 probes, then continue flat probes forever

Also rename the orchestrator session default cc-ci-orchestrator-vm ->
cc-ci-orchestrator (launch.py ORCH_SESSION, launch-orchestrator.py SESSION,
docs/scripts references).
2026-06-11 00:55:07 +00:00
autonomic-bot aefaf17757 plan: recipe-customization restructure — full builder/adversary plan (P1-P6 + real-CI regression sweep gate) 2026-06-10 16:28:09 +00:00
autonomic-bot a6e177e286 journal: phase conc DONE — concurrency restructure landed, M1+M2 adversary-verified 2026-06-10 13:58:25 +00:00
autonomic-bot e0c9f23391 feat(launch): ADV_MODEL — per-role model override for the Adversary loop 2026-06-10 04:03:35 +00:00
autonomic-bot a1b4943da1 plan: adapt concurrency restructure to builder/adversary loop protocol (gates M1/M2, phase-namespaced state) 2026-06-10 03:54:31 +00:00
autonomic-bot 520fb18461 plan: full concurrency restructure implementation plan (builder/adversary handoff) 2026-06-10 03:48:14 +00:00
autonomic-bot 0d169c2a20 plan: concurrency restructure — flock-probe janitor, per-run ABRA_DIR, lock-lifetime chain 2026-06-10 03:41:05 +00:00
autonomic-bot 335ea1d7c1 journal: session wrap — concurrent CI fixed, immich (245) + plausible (247) both GREEN 2026-06-09 23:18:32 +00:00
autonomic-bot 08706c665e memory: swarm UpdateStatus convergence gotchas (builds 238/241) 2026-06-09 23:14:18 +00:00
autonomic-bot 926e4553b7 journal: immich PR #2 GREEN (build 245, level=4); cc-ci PR #9 merged; plausible unblocked 2026-06-09 23:13:56 +00:00
autonomic-bot e3e0a9ee80 journal: two harness convergence fixes (UpdateStatus settle + paused-is-settled); immich build 245 in flight 2026-06-09 23:08:59 +00:00
autonomic-bot 1580738c97 journal: concurrent-CI fixes landed on cc-ci main (build 236 green) 2026-06-09 22:02:08 +00:00
autonomic-bot ec3e0c35dd journal: orchestrator handover — concurrent-CI fixes + immich/plausible drive 2026-06-09 19:45:21 +00:00
autonomic-bot 542ed0afe3 memory: move agent memory into repo (memory/), note in AGENTS.md
Persistent agent memories now live in memory/ in this repo; the Claude
auto-memory path is symlinked here so future memories land in the repo
and get committed like any other change.
2026-06-09 19:25:20 +00:00
autonomic-botandClaude Opus 4.8 330378d30d ideas: fail-fast on crash-looping deploy + don't let one wedged run starve the CI queue
After a live incident: plausible build 220 (ClickHouse exit-1 crash-loop) held the
single serial runner for its full 1200s DEPLOY_TIMEOUT, starving immich PR-2's
queued builds for ~12min until manually torn down. Logs the two fixes (fail-fast
on crash-loop; head-of-line blocking on the serial runner) + the interim
mitigations (step-2b dev loop for debugging; SIGINT to free a wedged run).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:29:30 +00:00
autonomic-bot a2c1cb550a upstream(immich): release-notes sources + DB-pin & VectorChord backup/restore notes 2026-06-09 15:49:20 +00:00
autonomic-botandClaude Opus 4.8 c60fc6d056 change(cleanup): reap dev deploys at start+end of /upgrade-all instead of a timer
Per operator: drop the hourly cc-ci-reap-dev-deploys systemd timer; instead run the
dev-* reaper at the START (Step 0, alongside the orphan sweep) and END (new step 4b)
of each /upgrade-all run, with THRESHOLD=0 (the run is quiescent then, so clear all
dev-* unconditionally). The reaper keeps its safe default (4h) for ad-hoc use.
Step-2b mandatory teardown is unchanged (primary mechanism); this is the backstop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:47:16 +00:00
autonomic-botandClaude Opus 4.8 23bba98be4 feat(cleanup): guarantee step-2b dev deploys get reaped
- /recipe-upgrade step 2b: teardown is now MANDATORY on every exit path (finally),
  with a verify-no-leak check; tear down even on failure before reporting.
- reap-dev-deploys.sh: safe, age-gated backstop that removes only idle dev-* stacks
  (never CI per-run stacks, warm-*, infra; an active dev loop stays fresh).
- orchestrator: hourly cc-ci-reap-dev-deploys systemd timer runs it against cc-ci,
  bounding any leaked dev deploy from a crashed/abandoned loop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:42:23 +00:00
autonomic-botandClaude Opus 4.8 77ba7ee075 guardrail: upgrader never modifies cc-ci tests/harness unless --with-tests
Absolute, mode-gated rule reinforced in /recipe-upgrade (Guardrails + the new
step-2b direct-deploy loop where the upgrader has cc-ci host access) and noted as
the interim safeguard in IDEAS.md until the deploy loop moves to isolated infra.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:32:50 +00:00
autonomic-botandClaude Opus 4.8 98276124e5 ideas: isolate the upgrader's direct deploy onto separate infra (can't tamper with tests)
The step-2b direct deploy-and-inspect runs on the cc-ci server's own swarm today, so
the upgrader holds write access to the host that owns the tests + CI verdict — a
trust hole (could hack the tests). Parked idea: a dedicated throwaway test server
with scoped creds, so the upgrader can deploy+inspect but not modify the gate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:31:20 +00:00
autonomic-botandClaude Opus 4.8 de0baa00b1 feat(upgrade): add direct deploy-and-inspect dev loop (recipe-maintainer style) before CI
The upgrader now deploys the WIP recipe directly on cc-ci (abra app deploy --chaos
under a dev-<recipe> domain on the local swarm) and inspects live logs
(docker service logs) to SEE what the upgrade does, before/alongside the !testme
CI gate. ADDITIONAL to — not a replacement for — the 3-attempt !testme verification;
it front-loads diagnosis so fewer CI attempts are spent on basics. Always torn down
(orphan-sweep is the backstop). /upgrade-all dispatch references the new step 2b.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:28:06 +00:00
autonomic-botandClaude Opus 4.8 f1c63f1ca0 feat(survey): don't skip recipes on abra tag+digest FATA — check upstream directly
abra hard-FATAs on image refs with both a tag and a digest (immich:
postgres:14-vectorchord...@sha256:..., valkey:9@sha256:...), aborting the whole
recipe survey so immich was silently dropped. Per operator: don't normalize the
recipe; catch the failure and check the upstream registry directly.

- /upgrade-all box item 4: a tag+digest parse FATA is NOT not-fetchable. Use abra
  for the images it parses; for the rest, list upstream tags (Docker Hub / ghcr /
  buildx imagetools) and judge availability (match the variant the app supports,
  not blindly the max). Upgradeable if abra OR the direct check finds a newer tag.
- /recipe-upgrade implement: hand-bump tag+digest pins (abra can't), and re-resolve
  + re-append the digest for the new tag so the pin is preserved (never drop it).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 15:21:36 +00:00
autonomic-botandClaude Opus 4.8 f687174b53 feat(recipe-report): TESTS rename + live binary STATUS column
Rename the table's Status column -> TESTS (the CI/test verdict, unchanged
content). Add a new STATUS column showing the PR's LIVE state, fetched
client-side: 'open' vs a ✓ for any not-open state (merged or closed). The cell
is a JS hook (data-repo/data-pr) derived from existing recipe+pr fields; an
inline, dependency-free, CSP-safe script GETs the same-origin /pr/<recipe>/<n>
proxy (cc-ci nix/modules/reports.nix) on load and every 30s, and degrades to a
muted '?' if the proxy/repo is unreachable. Blank cell when a row has no PR.
Doc + SKILL updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 13:15:02 +00:00
autonomic-botandClaude Opus 4.8 eb1439324e plan: finalize report PR-STATUS column (binary open/✓; proxy in reports.nix; decisions locked)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 12:59:41 +00:00
autonomic-botandClaude Opus 4.8 a76aca80e2 plan: Recipe Report TESTS rename + live PR-STATUS column (public mirrors + same-origin proxy)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 12:52:59 +00:00
autonomic-botandClaude Opus 4.8 1f52795534 skill(ci-dev-workflow): capture the cc-ci feature-dev flow + adversary plan template
Documents the end-to-end workflow used to land the intentional-skips/4-rung-ladder
feature: explore harness → branch a local cc-ci clone → implement + unit-verify
cold on cc-ci → live full-stage check → open PR (never push main) → independent
adversary verdict → squash-merge on PASS → deploy via /root/builder-clone rebuild.
Includes the adversary-verify-pr6.md plan as a reusable template.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 03:16:47 +00:00
autonomic-botandClaude Opus 4.8 dbafcddb62 feat(upgrade-all): sweep orphans from previous runs at the start of each weekly run
Adds sweep-orphans.sh (safe-by-allowlist: removes orphan test stacks, standalone
debug containers >30m old, leaked dangling volumes, and reparented docker-run
wrappers; spares infra + warm-* canonicals and their retained volumes) and wires
it as Step 0 of /upgrade-all so a prior run's leaked stack/container/process can't
contend for the shared Swarm or skew the survey. Idempotent; no-op when clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 02:39:43 +00:00
autonomic-botandClaude Opus 4.8 d31378b180 feat(recipe-report): restructure page — priority-sorted wire table w/ CVE column, addendum, per-recipe changes
New page order: short lead -> the full wire table (sorted by priority-to-address,
CVE recipes first, new CVEs count column) -> Addendum (bullets of real special
issues, omitted if clean) -> Security Bulletin -> per-recipe "What changed".

- recipe-report.py: _table() gains a CVEs column + recipe-name linking; new
  _changes() helper; render() reordered; docstring SPEC SHAPE updated
  (cve/addendum/changes added, needs_attention/routine removed).
- recipe-report/SKILL.md + example-spec.json: new procedure, spec shape, and
  gold-standard template (2026-06-05, new format).
- launch-report.py: kickoff text reflects the new priority-ordered structure.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 17:06:43 +00:00
autonomic-botandClaude Opus 4.8 49491fcb90 fix(recipe-report): weekly trigger uses launch-report.py 'fresh'; start kills idle/leftover session
A stale cc-ci-report session (from a prior week's run, gone idle) caused this week's
launch-report.py 'start' (use-or-create) to leave it and never run a fresh report.
Fix: upgrade-all step 6 now calls 'fresh', and start only leaves a session that's
actively busy producing a report — an idle/leftover session is killed + restarted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 12:06:46 +00:00
autonomic-bot f397968f47 upstream(uptime-kuma): release-notes sources 2026-06-05 06:18:33 +00:00