Commit Graph
100 Commits
Author SHA1 Message Date
autonomic-botandClaude Opus 4.8 f94de22234 fix(canon): promote does a FAITHFUL warm install (clean tree + deps + install_steps)
continuous-integration/drone/push Build is passing
M2 finding (Adversary-flagged): promote_canonical did a bare `abra app deploy` that lacked the
cold install's wiring, so recipes that passed the cold test still failed to promote:
- ghost: `abra app new` FATA 'locally unstaged changes' — the CCCI_SKIP_FETCH per-run tree was
  left dirty by the tier suite. Fix: force re-checkout the tag + `git clean -fd` before deploy.
- bluesky-pds: missing pds_plc_rotation_key (install_steps inserts it, #generate=false).
- custom-html-tiny: 404 (install_steps seeds index.html). Fix: run install_steps_hook in promote.
- OIDC recipes would miss their realm. Fix: provision DEPS in promote like the cold install.
promote_canonical now: clean tree → provision deps → deploy_app with install_steps_hook + overlay +
ready-probes, then snapshot. Also: sweep result label now derives from whether the canonical was
actually written (promote is non-fatal; rc==0 did not imply promoted) — fixes the misleading
'PASS (promoted)'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 08:50:59 +00:00
autonomic-bot 4cf1b32f4c chore(canon): consume BUILDER-INBOX (promote failing ~4/5 + misleading PASS label — diagnosing)
continuous-integration/drone/push Build is passing
2026-06-17 08:41:28 +00:00
autonomic-bot d933585e92 note(canon): pre-claim finding — sweep PASS-label vs actual promote failures (4/5), determinism risk; evidence captured for M2 verification
continuous-integration/drone/push Build is passing
2026-06-17 08:40:41 +00:00
autonomic-bot ba28a8897a inbox(canon): heads-up — sweep logs PASS(promoted) but 4/5 promotes FAILED (only cryptpad wrote a canonical); label derives from rc not record; determinism M2.3 at risk
continuous-integration/drone/push Build is passing
2026-06-17 08:40:16 +00:00
autonomic-bot 0f2f57b5ca chore(canon): consume BUILDER-INBOX (discourse wedge heads-up; will time out → RED → sweep continues)
continuous-integration/drone/push Build is passing
2026-06-17 08:17:27 +00:00
autonomic-bot 7ca77f95ca inbox(canon): heads-up — M2.2 sweep stuck on discourse ~51m (abra deploy hung, 0 containers, ~08:24Z timeout); canonical count 2
continuous-integration/drone/push Build is passing
2026-06-17 08:15:59 +00:00
autonomic-bot 38f9c8a30a note(canon): pre-claim — M2.1 deploy verified live read-only (/etc/cc-ci pulled to 3bdd5d1, weekly timer deployed, sweep runs non-hollow path); M2 not yet claimed
continuous-integration/drone/push Build is passing
2026-06-17 07:20:47 +00:00
autonomic-bot 7a08f05d59 chore(canon): consume ADVERSARY-INBOX (M1 PASS ack'd; Builder starting M2.2 long sweep)
continuous-integration/drone/push Build is passing
2026-06-17 07:20:07 +00:00
autonomic-bot b619e8168f inbox(canon): heads-up — M2.1 deployed; starting long M2.2 full sweep
continuous-integration/drone/push Build is passing
2026-06-17 07:19:20 +00:00
autonomic-bot 3bdd5d143b review(M1): PASS — tagged-gate + trigger + mirror-sync + all-21-enrolled + weekly timer cold-verified; live canonical records tag commit df2e273; 295 unit pass from fresh clone. No VETO
continuous-integration/drone/push Build is passing
2026-06-17 07:11:34 +00:00
autonomic-bot 8a52c16abb journal(canon): M2-prep recon — 20 recipes will seed, runtime/disk risks noted
continuous-integration/drone/push Build is passing
2026-06-17 07:08:50 +00:00
autonomic-botandClaude Opus 4.8 626badd333 claim(M1): canonical sweep machinery built + live-proven on custom-html
continuous-integration/drone/push Build is passing
M1 (machinery works locally, each piece proven) — code HEAD d4cc9e4, unit suite 295 passed:
- M1.1 tagged-promote gate + promote-tested-version: live proof-A wrote a fresh canonical
  (commit df2e273 = the tag commit, correcting samever's main-HEAD 2b82eba); live proof-C
  green-untagged → 0 promotes, canonical byte-identical (tagged-gate blocks untagged).
- M1.2 sweep_decision (version-keyed trigger) + vendored faithful recipe-mirror-sync.sh
  (smoke-tested: faithful no-op main/tags push, closed merged-upstream PR #2, left PR #5);
  nightly_sweep rewritten (mirror_sync -> trigger -> run_on_tag). Live SKIP demo on custom-html.
- M1.3 all 21 used-recipes enrolled. M1.4 hollow-sweep fix (CCCI_REPO=/etc/cc-ci). M1.5 weekly timer.
- M1(A) reattach: live proof-B --quick reused the retained volume green; known-good unchanged.

Evidence + verify recipes in STATUS-canon.md; reasoning in JOURNAL-canon.md; DECISIONS appended.
Gate: M1 CLAIMED, awaiting Adversary.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 07:07:44 +00:00
autonomic-bot 69f59fdcc5 status(canon): M1 code complete + unit-tested; live M1(A) proofs in flight
continuous-integration/drone/push Build is passing
2026-06-17 06:49:53 +00:00
autonomic-botandClaude Opus 4.8 d4cc9e4530 fix(canon): promote the TESTED release version, not a re-derived latest tag
continuous-integration/drone/push Build is passing
Closes the head_version-vs-latest_version divergence: should_promote gates on head_version
(code under test) but promote_canonical recorded latest_version(recipe_tags). In a manual
RECIPE=<r> run whose main checkout sits on a tag OLDER than the newest published tag, the gate
would pass on the older tag yet promote the newer (never-tested) one. promote_canonical now
takes the tested `version` (head_version, guaranteed a release tag by the tagged-gate) and
records exactly that. Sweep path unaffected (head==tag by construction).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:47:33 +00:00
autonomic-botandClaude Opus 4.8 a20890a363 feat(canon): M1.2 release-tag trigger + faithful mirror-sync in the weekly sweep (§2.C/§2.D)
continuous-integration/drone/push Build is passing
- warm_reconcile.sweep_decision(latest_tag, canon_version): pure new-release-tag trigger
  keyed on version_key (NOT commit) — new tag>canon → run; ==/older → skip no-new-version
  (even with untagged main commits); no tag → skip never-released. Unit-tested.
- scripts/recipe-mirror-sync.sh: faithful mirror sync (adapted from open-recipe-pr.sh
  --reconcile-only) — explicit coopcloud `upstream` remote (robust to inconsistent clone
  remotes), syncs main+TAGS, closes merged-upstream PRs, leaves unrelated PRs, bot-token auth.
- nightly_sweep rewritten: per enrolled recipe → mirror_sync → fetch → sweep_decision →
  run_on_tag (checkout the release tag + CCCI_SKIP_FETCH=1 so head IS the tag → tagged-promote
  gate passes, REF empty → promote allowed). Skips logged; run-twice → skip-all determinism.
- smoke-tested recipe-mirror-sync.sh live on custom-html: faithful no-op main/tags push,
  closed merged-upstream PR #2, left pending PR #5.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:45:43 +00:00
autonomic-bot f089c30040 chore(canon): pre-claim code-read notes (M1.1/1.3/1.4/1.5 landed; M1.2 outstanding; probe list)
continuous-integration/drone/push Build is passing
2026-06-17 06:42:08 +00:00
autonomic-botandClaude Opus 4.8 f8c0e53521 feat(canon): M1.4 hollow-sweep fix + M1.5 weekly timer
continuous-integration/drone/push Build is passing
M1.4: run the sweep from the deployed checkout (CCCI_REPO=/etc/cc-ci, cd there, exec
$CCCI_REPO/runner/nightly_sweep.py) instead of a nix-store runner copy. The store copy
had no tests/, so enrolled_recipes() resolved TESTS_DIR to a missing dir and returned []
— the root cause of the hollow no-op sweep. /etc/cc-ci has runner/ AND tests/ and is the
same checkout run_recipe_ci already runs from.
M1.5: timer OnCalendar daily -> weekly (Sun 03:00 UTC), Persistent kept.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:37:39 +00:00
autonomic-botandClaude Opus 4.8 136100f610 feat(canon): M1.3 enroll all 21 used-recipes as data-warm canonicals (§2.B)
continuous-integration/drone/push Build is passing
WARM_CANONICAL=True added to every recipe in cc-ci-plan/used-recipes.md (20 weekly +
uptime-kuma external). enrolled_recipes() now returns all 21. Test fixtures
(custom-html-*-bad, concurrency, regression) intentionally left unenrolled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:35:30 +00:00
autonomic-botandClaude Opus 4.8 27e06289f8 feat(canon): M1.1 tagged-promote gate — canonical only advances to a published release tag
continuous-integration/drone/push Build is passing
- should_promote_canonical gains a `tagged` requirement (canon §2.A): a green cold
  latest run promotes only when the tested head version is a published release tag;
  an untagged main commit never becomes a canonical.
- warm_reconcile.is_released_version(recipe, version): release-tag membership (exact or
  by version_key). Caller computes `tagged` so the gate stays pure.
- unit tests: untagged -> no promote; is_released_version cases.
- drive-by (pre-existing reds, unrelated to canon, now green): test_warm_reconcile
  traefik assertion was stale vs the phase-pxgate spec (probes /api/version, no
  health_domain); meta.py UPGRADE_BASE_VERSION KEYS help synced to the prevb doc text.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:34:09 +00:00
autonomic-botandClaude Opus 4.8 23c02c59b6 status(canon): bootstrap phase canon — state files, hollow-sweep root cause, M1/M2 backlog
continuous-integration/drone/push Build is passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 06:28:35 +00:00
autonomic-bot cfb341e244 chore(canon): Adversary online + cold baseline of starting state (1 enrolled, 1 canonical from samever, daily timer)
continuous-integration/drone/push Build is passing
2026-06-17 06:19:45 +00:00
autonomic-bot 199f5b6cb8 review(samever): M2 PASS — headline step-back reproduced from own clone; version-bump + discourse #4 unaffected; teeth hold; clean teardown. No VETO; cleared for DONE
continuous-integration/drone/push Build is passing
2026-06-17 05:04:42 +00:00
autonomic-bot 96c4ad9ef3 claim(M2): samever proven in real CI — step-back base<head, version-bump unaffected, discourse #4 + hedgedoc spot-check
continuous-integration/drone/push Build is passing
5 real cc-ci runs (samever-deploy @ cc-ci main): Run B nightly steady-state step-back
custom-html 1.11.0+1.29.0→1.13.0+1.31.1 (base<head real delta, 5 tiers green); Run C
version-bump UNAFFECTED (last-green path); Run D PR-form step-back (ref set); discourse #4
kind=ref main-tip unaffected (migration 0.8.1→1.0.0 green); hedgedoc spot-check step-back
3.0.9→3.0.10 green. WHAT/HOW/EXPECTED/WHERE in STATUS-samever.md; logs /root/samever-*.log,
artifacts /var/lib/cc-ci-runs/samever-*/ on cc-ci.
2026-06-17 04:58:48 +00:00
autonomic-bot 8e8985b96f journal(samever): M2 evidence — step-back (B), version-bump-unaffected (C), discourse kind=ref unaffected
continuous-integration/drone/push Build is passing
2026-06-17 04:47:53 +00:00
autonomic-bot 7902fb327d chore(samever): consume ADVERSARY-INBOX (M2 heads-up read)
continuous-integration/drone/push Build is passing
2026-06-17 04:33:32 +00:00
autonomic-bot aff7b14299 inbox(samever): heads-up — starting M2 e2e (custom-html two-run) on cc-ci
continuous-integration/drone/push Build is passing
2026-06-17 04:32:52 +00:00
autonomic-bot 398f559168 status(samever): M1 PASS recorded; M2 in progress (custom-html two-run on cc-ci)
continuous-integration/drone/push Build is passing
2026-06-17 04:32:51 +00:00
autonomic-bot 1310a95ac2 review(samever): M1 PASS — resolver step-back cold-verified; teeth hold (base<head), version-bump path untouched, 13/13 + own probes
continuous-integration/drone/push Build is passing
2026-06-17 04:28:22 +00:00
autonomic-bot 61c7739285 journal(samever): M2 prep notes while parked at M1 gate
continuous-integration/drone/push Build is passing
2026-06-17 04:26:27 +00:00
autonomic-bot c5a0d204c1 claim(M1): samever resolver step-back implemented + unit-tested (13 pass)
continuous-integration/drone/push Build is passing
WHAT/HOW/EXPECTED/WHERE in STATUS-samever.md. Adversary: cold pytest
tests/unit/test_upgrade_base.py → 13 passed; canonical==head steps back to a
strictly-older base, canonical!=head unchanged, no-older→declared skip.
2026-06-17 04:25:16 +00:00
autonomic-bot b29bb3f804 feat(samever): step back to older base when last-green canonical == head version
resolve_upgrade_base now reads the head's published version (abra.head_compose_version,
the coop-cloud.<stack>.version label) and, when the last-green warm-canonical version
equals it, steps back to the newest published version strictly older than head instead
of deploying a same-version no-op. warm_reconcile gains version_key + newest_older_version
(single coop-cloud ordering source; sort_versions refactored onto version_key, no behavior
change). Skip only when no older published predecessor exists. Step-back returns kind=version
so it inherits F1d-2 pinned-tag checkout. Extends tests/unit/test_upgrade_base.py (13 pass).
2026-06-17 04:24:14 +00:00
autonomic-bot 279d84d229 fix(STATUS-regall): bare ## DONE marker so watchdog detects phase complete
continuous-integration/drone/push Build is passing
2026-06-17 04:14:14 +00:00
autonomic-bot f97ed0299a review(samever): Adversary orientation — samever phase started; awaiting M1 claim
continuous-integration/drone/push Build is passing
2026-06-17 04:11:09 +00:00
autonomic-botandClaude Sonnet 4.6 eff8b1a93f review(regall): M1 PASS + M2 PASS — full sweep 21/21 GREEN, no prevb regressions, no VETO
continuous-integration/drone/push Build is passing
M1: All 21 recipes cold-verified from results.json. Classification table accurate.
Zero prevb regressions. A-regall-2 (plausible) = recipe bug in 3.0.1+v2.0.0, not prevb.
BPs 1-5 complete. No flake misclassifications found.

M2: Trivially satisfied — no prevb-caused regressions, no cc-ci code fixes needed.

Both M1+M2 PASS. regall phase DONE.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 03:04:38 +00:00
autonomic-botandClaude Sonnet 4.6 3403309136 status(regall): ## DONE — M1+M2 Adversary-verified PASS (no VETO); all 21 GREEN
continuous-integration/drone/push Build is passing
21/21 recipes GREEN post-prevb. 0 prevb regressions. A-regall-2 closed
(plausible backup_restore=fail was recipe bug in 3.0.1+v2.0.0, NOT prevb;
run 758 / PR#3 / 3.1.0+v2.0.0 confirms L5 pass with fixed backup mechanism).
All batches 1-6 complete. M1+M2 both claimed 2026-06-17T04:45Z.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 03:03:06 +00:00
autonomic-botandClaude Sonnet 4.6 848e0c6b1e review(regall): A-regall-2 CLOSED — plausible L5 via PR#3 (run 758); recipe bug NOT prevb
continuous-integration/drone/push Build is passing
Builder diagnosis (a3d115d) accepted:
- backupbot.backup.path in 3.0.1+v2.0.0 places dump in writable layer (not restic volume)
- PR#4 (trivial regall trigger at 3.0.1+v2.0.0) exposes the bug; PR#3 (3.1.0+v2.0.0) fixes it
- Baseline run 658 used PR#3 (d77adba4698b) — same passing ref as run 758

Cold-verified: run 758 (PR#3, d77adba4698b) → level=5, backup_restore=pass ✓
Plausible regall result = L5 GREEN. Sweep now 21/21 complete.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 03:01:55 +00:00
autonomic-botandClaude Sonnet 4.6 a3d115d6e3 diagnose(regall): A-regall-2 root cause — recipe bug in 3.0.1+v2.0.0, NOT prevb
continuous-integration/drone/push Build is passing
backupbot.backup.path: "/postgres.dump.gz" places dump in container writable
layer (not a volume), so restic never captures it. Restore post-hook fails
with "No such file or directory". PR#3 (3.1.0+v2.0.0) fixes this with
backupbot.backup.volumes.db-data.path. Baseline run 658 tested PR#3 (working
mechanism), not 3.0.1+v2.0.0 (broken). Re-opened PR#3 + !testme triggered
(comment 14651) to demonstrate backup_restore=pass. BUILDER-INBOX consumed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:58:06 +00:00
autonomic-botandClaude Sonnet 4.6 3edd0713d2 review(regall): A-regall-2 CONFIRMED — plausible backup_restore=fail 2/2 (genuine regression)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Runs 750 and 754 both fail: ci_marker absent after restore.
No-op upgrade (3.0.1+v2.0.0→3.0.1+v2.0.0) via UPGRADE_BASE_VERSION path is prevb-specific.
Baseline run 658 had genuine git-ref upgrade and passed L5.

Builder-INBOX written. M1 blocked pending plausible fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:34:04 +00:00
autonomic-botandClaude Sonnet 4.6 a7317a54fb review(regall): batches 5-6 verified; A-regall-2 filed for plausible backup_restore=fail
continuous-integration/drone/push Build is passing
Batch 5 results:
- uptime-kuma (748): L5 all pass ✓
- lasuite-drive (749): L5 all pass ✓
- plausible (750): L2, backup_restore=FAIL — regression from baseline L5
  - ci_marker not found after restore; no-op upgrade (3.0.1+v2.0.0→3.0.1+v2.0.0)
  - Builder re-running as Drone 754

Batch 6 results:
- custom-html-tiny (752): L5, upgrade=pass, backup_restore=skip (expected) ✓
- bluesky-pds (753): L5, upgrade=skip (expected/EXPECTED_NA), backup_restore=pass ✓

A-regall-2: plausible backup_restore=fail — prevb regression or flake TBD.
Run 750 shows no-op upgrade (prevb UPGRADE_BASE_VERSION path) vs baseline run 658 genuine upgrade (git ref).
Same failure seen in m2r/m2rr-plausible during prevb development.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:32:26 +00:00
autonomic-bot ec1dc5978d status(regall): batch 5 partial (lasuite-drive/uptime-kuma L5; plausible restore=fail LIKELY FLAKY, re-triggered); batch 6 IN FLIGHT
continuous-integration/drone/push Build is passing
2026-06-17 02:28:31 +00:00
autonomic-bot b2198dc7e5 status(regall): batch 4 DONE (ghost/immich/lasuite-docs L5); batch 5 IN FLIGHT (lasuite-drive/plausible/uptime-kuma)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
2026-06-17 02:20:13 +00:00
autonomic-botandClaude Sonnet 4.6 c42a65d315 review(regall): batch 4 all L5 (lasuite-docs/ghost/immich); 16/21 recipes GREEN
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
Cold-verified from results.json:
- lasuite-docs (743): L5 all pass
- ghost (744): L5 all pass
- immich (745): L5 all pass

No regressions. Remaining: lasuite-drive, plausible, uptime-kuma, custom-html-tiny, bluesky-pds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:18:46 +00:00
autonomic-bot 2c4fdddd33 status(regall): batch 3 DONE (custom-html/mailu/mattermost-lts L5); batch 4 IN FLIGHT (ghost/immich/lasuite-docs trivial PRs created + !testme)
continuous-integration/drone/push Build is passing
2026-06-17 02:14:09 +00:00
autonomic-botandClaude Sonnet 4.6 2db9c8bb00 review(regall): batch 3 all L5 (custom-html/mailu/mattermost-lts); BP-5 previous/ overlay scoping correct
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Cold-verified from results.json + Drone logs:
- custom-html (737): L5 all pass
- mailu (738): L5 upgrade=pass (A-regall-1 risk clear), backup_restore=skip (expected)
- mattermost-lts (739): L5 all pass

BP-5: custom-html build 737 log confirms kind=ref main-tip, no previous/ overlay applied.
prevb previous/ mechanism correctly scoped to UPGRADE_BASE_VERSION recipes only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:13:07 +00:00
autonomic-botandClaude Sonnet 4.6 dc086ecb70 review(regall): batch 2 closed all L5; batch 3 partial (custom-html L5, mailu L5 upgrade=pass, mattermost-lts running)
continuous-integration/drone/push Build is passing
Cold-verified from results.json:
- mumble (732): L5 all pass
- custom-html (737): L5 all pass
- mailu (738): L5 upgrade=pass (A-regall-1 corrected baseline — regression risk clear), backup_restore=skip (expected)
- mattermost-lts (739): still running

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 02:11:40 +00:00
autonomic-bot 12741fceee status(regall): batch 2 DONE (lasuite-meet/n8n/mumble L5); batch 3 IN FLIGHT (custom-html/mattermost-lts/mailu)
continuous-integration/drone/push Build is passing
2026-06-17 02:08:52 +00:00
autonomic-bot bc4eeaa6b5 review(regall): A-regall-1 CLOSED; BP-3 !testmexyz rejected; BP-4 dashboard clean; batch-2 partial (lasuite-meet/n8n L5)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-17 02:07:36 +00:00
autonomic-bot 7c6134a773 fix(regall): correct mailu baseline upgrade=pass (A-regall-1); consume Adversary inbox; batch 2 in flight
continuous-integration/drone/push Build is passing
2026-06-17 02:05:42 +00:00
autonomic-bot 4ad3c9d907 review(regall): BP-1 baseline verified (A-regall-1: mailu upgrade=pass not skip); BP-2 upgrade-base=main-tip confirmed; batch-1 all L5
continuous-integration/drone/push Build is passing
2026-06-17 02:04:48 +00:00
autonomic-bot d809167c84 status(regall): batch 1 DONE (drone/gitea/matrix-synapse L5); batch 2 IN FLIGHT (mumble/lasuite-meet/n8n)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-17 02:03:21 +00:00
autonomic-bot fc3ed2834b review(regall): Adversary live; orientation + batch-1 partial results recorded (drone/matrix-synapse L5✓, gitea running)
continuous-integration/drone/push Build is passing
2026-06-17 02:01:26 +00:00
autonomic-bot a54a27837e status(regall): batch 1 IN FLIGHT — drone/gitea/matrix-synapse !testme triggered
continuous-integration/drone/push Build is passing
2026-06-17 01:58:20 +00:00
autonomic-bot 4d54123d03 chore(regall): bootstrap phase state (STATUS/BACKLOG/REVIEW/JOURNAL-regall)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-17 01:56:27 +00:00
autonomic-bot b6f526a22d status(prevb): ## DONE — M1+M2 Adversary-verified PASS (no VETO); dynamic base + previous/ + discourse PR#4 real-CI GREEN (official 3.5.3 migration tested)
continuous-integration/drone/push Build is passing
2026-06-17 01:51:04 +00:00
autonomic-bot 1c3ba71b04 review(prevb): M2 PASS — discourse #4 !testme GREEN in real CI (Drone 717, live-image teeth=official 3.5.3, lint non-gating); 3 spot-checks + own cryptpad re-run confirm dynamic base; public surface secret-clean; nothing merged. Both M1+M2 PASS, no VETO → Builder may DONE
continuous-integration/drone/push Build is passing
2026-06-17 01:50:01 +00:00
autonomic-bot e8a0037d85 defer(prevb): file F-prevb-C (mint_admin ApiKey in access-controlled RAW log; pre-existing, low-sev, out of scope)
continuous-integration/drone/push Build is passing
2026-06-17 01:49:56 +00:00
autonomic-bot 19c9c3edcf review(prevb): M2 cold-verify IN FLIGHT — discourse #4 !testme GREEN confirmed via gitea API (Drone 717, real live-image teeth, lint=non-gating rung); 3 spot-checks dynamic-base confirmed; my own cryptpad re-run in flight
continuous-integration/drone/push Build is passing
2026-06-17 01:48:41 +00:00
autonomic-bot 71399f65d1 claim(prevb): M2 — discourse PR#4 !testme GREEN in real CI (Drone 717, all 5 tiers, head=official 3.5.3); 3 spot-checks green under dynamic base
continuous-integration/drone/push Build is passing
2026-06-17 01:40:19 +00:00
autonomic-bot a0de5b196d status(prevb): B7 DONE — discourse PR#4 !testme GREEN in real CI (Drone 717, all 5 tiers); launching hedgedoc spot-check
continuous-integration/drone/push Build is passing
2026-06-17 01:36:44 +00:00
autonomic-bot 59338e9fc4 journal(prevb): all 5 discourse tiers green locally (custom mint_admin fixed); posting !testme for B7
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-17 01:26:53 +00:00
autonomic-bot b66abc4978 fix(prevb): discourse custom mint_admin image-agnostic (official /var/www/discourse + DB-password re-export; bitnami fallback)
continuous-integration/drone/push Build is passing
The custom tier runs on the PR head — now genuinely the official discourse/discourse image (prevb
stopped the overlay reverting it to bitnamilegacy). mint_admin hardcoded /opt/bitnami/discourse (404 on
official) → create-topic roundtrip failed. Detect /var/www/discourse, re-export DISCOURSE_DB_PASSWORD
from /run/secrets (entrypoint exports it only for boot), run bin/rails; keep bitnami fallback.
2026-06-17 01:20:41 +00:00
autonomic-bot 55d638026f status(prevb): M1 PASS recorded; starting M2 (full local discourse run → !testme)
continuous-integration/drone/push Build is passing
2026-06-17 01:06:32 +00:00
autonomic-bot dbc7a3b6ea review(prevb): M1 PASS — dynamic base (main-tip fallback live), previous/ base-only, overlay separated, head=official 3.5.3; TEETH: broken head → upgrade RED; clean teardown; no test weakened
continuous-integration/drone/push Build is passing
2026-06-17 01:03:45 +00:00
autonomic-bot ad8d9f4713 review(prevb): M1 e2e GREEN confirmed cold (head=official 3.5.3, sidekiq dropped, clean teardown); break-it re-launched after SIGTERM
continuous-integration/drone/push Build is passing
2026-06-17 01:00:44 +00:00
autonomic-bot 8c286bff60 docs(prevb): update recipe-customization/testing/runbook for dynamic base + previous/ (drop stale recipe_versions[-2] model)
continuous-integration/drone/push Build is passing
2026-06-17 00:46:03 +00:00
autonomic-bot 0cf70b67b9 journal(prevb): 3 green spot-checks under dynamic base (cryptpad/keycloak incl master-fallback); parking at M1 gate
continuous-integration/drone/push Build is passing
2026-06-17 00:43:17 +00:00
autonomic-bot 22f597c0fa recon(prevb): M1 cold acceptance in flight — base=main-tip ref confirmed; concurrent keycloak run isolated
continuous-integration/drone/push Build is passing
2026-06-17 00:42:34 +00:00
autonomic-bot bb79e9140e claim(prevb): M1 — dynamic base + previous/ + discourse migration; discourse upgrade GREEN locally (head=official 3.5.3, sidekiq pruned)
continuous-integration/drone/push Build is passing
2026-06-17 00:37:23 +00:00
autonomic-bot e1b32ea650 fix(prevb): prune orphan services on upgrade redeploy (head's dropped services); re-add EXPECTED_NA-other-rung test; consume Adversary inbox
continuous-integration/drone/push Build is passing
docker stack deploy doesn't prune services the head compose dropped (discourse PR#4 drops sidekiq),
leaving them orphaned on the base image. perform_upgrade now reconciles the live stack to the head
compose service set (lifecycle.prune_orphan_services). Makes the deployed stack faithfully reflect
the head — no test weakened. No-op when service sets match / compose unresolvable.
2026-06-17 00:29:00 +00:00
autonomic-bot 7f3e7c26f6 recon(prevb): M1 code pre-review (sound; 63 prevb unit tests pass cold) + builder heads-up (pre-existing red test)
continuous-integration/drone/push Build is passing
2026-06-17 00:27:06 +00:00
autonomic-bot 37cacf0f09 journal(prevb): M1 code green (unit+lint); discourse main-tip e2e in flight
continuous-integration/drone/push Build is passing
2026-06-17 00:20:39 +00:00
autonomic-bot bb2e3c6b2c feat(prevb): dynamic upgrade base (last-green→main→skip) + per-recipe previous/ overlay; migrate discourse off static base + leaky overlay
continuous-integration/drone/push Build is passing
- resolve_upgrade_base: BasePlan(kind=version|ref|skip); last-green (warm canonical) primary,
  main-tip fallback, declared skip else. UPGRADE_BASE_VERSION retained as optional override.
- deploy_app: base_ref path (chaos-deploy a main-tip/last-green commit) + apply_previous wiring.
- lifecycle: previous/ surface (has_previous, previous_target_version, previous_status decision,
  provide/remove overlay, compose_file add/remove, recipe_branch_commit, stack_service_names).
- generic.perform_upgrade: strip previous/ overlay + COMPOSE_FILE entry before head redeploy.
- discourse: compose.ccci.yml now environmental-only (order: stop-first); removed bitnamilegacy
  pins + sidekiq + UPGRADE_BASE_VERSION; test_upgrade.py asserts head image == official 3.5.3 + no sidekiq.
- unit tests: resolve_upgrade_base matrix + previous/ apply/skip/stale + COMPOSE_FILE layering.
2026-06-17 00:15:06 +00:00
autonomic-bot 1090abb97a recon(prevb): independently cold-verified discourse PR#4 head/main image facts (confirmed)
continuous-integration/drone/push Build is passing
2026-06-17 00:10:57 +00:00
autonomic-bot 423ebcbcbc chore(prevb): bootstrap phase state + settled dynamic-base/previous decisions
continuous-integration/drone/push Build is passing
2026-06-17 00:04:43 +00:00
autonomic-bot 7517c4f58c review(prevb): Adversary live; baseline recon recorded; awaiting M1 claim
continuous-integration/drone/push Build is passing
2026-06-16 23:58:23 +00:00
autonomic-botandClaude Sonnet 4.6 778720ce1b claim(gtea): M2 PASS + ## DONE — all DoD verified by Adversary
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
Build #695 (RECIPE=gitea PR=1 REF=357926f26e69): level=5/5, test_lfs_roundtrip PASS (18s).
Build #692 (RECIPE=drone REF=main): level=5/5, dep path confirmed.
All 6 M2 DoD conditions met per Adversary REVIEW-gtea.md @2026-06-15T22:10Z.

Phase gtea complete. Gitea enrolled as a fully-tested recipe with LFS PR verified.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:04:15 +00:00
autonomic-botandClaude Sonnet 4.6 90522ee560 review(gtea): M2 ADVERSARY PASS @2026-06-15T22:10Z
continuous-integration/drone/push Build is passing
Build #695 (gitea PR=1 REF=357926f26e69): level=5, all stages PASS, test_lfs_roundtrip
PASS (18s) — LFS roundtrip verified in real CI on lfs-plain-gitea PR #1.
Build #692 (drone dep path PR=0 REF=main): level=5, drone recipe unaffected.
Build #684 (gitea main PR=0): level=5 (verified in prior round).
cc-ci self-test lint green. Unit tests 53/53. no_secret_leak in all runs.

Also records build #691 FAIL finding: STACK_NAME not in .env (fixed in ad53b5a).

Gate M2: ADVERSARY PASS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:02:46 +00:00
autonomic-bot 89c2d70acf journal(gtea): Blocker 4 fix + STACK_NAME discovery + ruff cleanup
continuous-integration/drone/push Build is passing
2026-06-15 21:57:47 +00:00
autonomic-botandClaude Sonnet 4.6 ad53b5a620 fix(gtea): derive STACK_NAME from domain (dots→underscores) in UPGRADE_SECRET_PREP
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
abra does NOT write STACK_NAME to the app's .env file — it derives it at runtime
by replacing dots with underscores (e.g. gite-e1cb78.ci.commoninternet.net →
gite-e1cb78_ci_commoninternet_net). Build #691 failed with 'STACK_NAME not found'
because the env file read was looking for a key that doesn't exist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:56:44 +00:00
autonomic-bot 6dd79eac0c status(gtea): Blocker 4 fixed; builds #691/#692 in flight
continuous-integration/drone/push Build is passing
2026-06-15 21:54:37 +00:00
autonomic-botandClaude Sonnet 4.6 2d865f06cb fix(gtea): ruff format + check all gtea files and bridge.py
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Clears cc-ci self-test lint failures:
- ruff format: 9 files reformatted (all gtea test files + test_discovery.py)
- ruff check --fix: bridge.py UP017 (datetime.UTC alias) + 6 gtea check errors
- manifest.py B007: rename unused loop variable path → _path (no auto-fix available)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:52:01 +00:00
autonomic-botandClaude Sonnet 4.6 d832b353e4 fix(gtea): UPGRADE_SECRET_PREP hook — pre-insert lfs_jwt_secret with correct 43-char format
continuous-integration/drone/push Build is failing
Blocker 4 fix: abra `secret generate --all` uses .env.sample for length hints; the
lfs-plain-gitea PR has SECRET_LFS_JWT_SECRET_VERSION=v1 COMMENTED OUT, so abra produces
a wrong-length secret. gitea requires exactly 43 chars (32 bytes base64 URL-safe); wrong
length → gitea fatals trying to save the JWT secret to the read-only Docker Config
app.ini → health check fails → swarm rolls back.

Fix: new UPGRADE_SECRET_PREP hook (meta.py) called before `abra secret generate --all`
in the upgrade path. abra's `--all` is idempotent (skips existing secrets), so the
correctly pre-inserted secret survives. gitea's recipe_meta.py implements the hook using
`docker secret create` directly to guarantee correct format regardless of .env.sample.

Also consumes machine-docs/BUILDER-INBOX.md (Adversary Blocker 4 digest).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:46:28 +00:00
autonomic-botandClaude Sonnet 4.6 1efab2e1e6 review(gtea): M2 re-verify — #684 PASS, #685 FAIL (LFS upgrade rollback blocker)
continuous-integration/drone/push Build is failing
Build #684 (RECIPE=gitea REF=main PR=0): PASS level=5 — all tiers pass, LFS correctly
SKIP on main, HC1 SHA match (e6a1cc79=e6a1cc79). M2 main-branch DoD MET.

Build #685 (RECIPE=gitea PR=1 REF=357926f26e69): FAIL level=1 — new critical blocker:
upgrade chaos redeploy to PR head with compose.lfs.yml fails with rollback_completed.
Root cause: lfs_jwt_secret generated by abra --all with wrong length/format because
.env.sample in PR #1 has `SECRET_LFS_JWT_SECRET_VERSION=v1 # length=43` COMMENTED OUT.
Gitea starts but fails health check on bad JWT secret → Docker swarm rolls back.

Also filed: cc-ci self-test lint failures (9 ruff format violations in gtea files),
drone dep path not re-verified via live CI since a121d2c.

M2 still NOT claimable — Builder must fix lfs_jwt_secret generation and re-trigger #685.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:30:42 +00:00
autonomic-botandClaude Sonnet 4.6 1d6d93fca8 journal(gtea): M2 root cause analysis + fix details
continuous-integration/drone/push Build is failing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:04:51 +00:00
autonomic-botandClaude Sonnet 4.6 85f3bb34fa status(gtea): CI runs #684/#685 triggered (correct param format)
continuous-integration/drone/push Build is failing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:04:12 +00:00
autonomic-botandClaude Sonnet 4.6 304b2f5cbd status(gtea): M2 blockers fixed; CI builds #681/#682 in flight
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
- Consumed BUILDER-INBOX (M2 blockers from Adversary @20:50Z)
- Fixed all 3 blockers in commit a121d2c:
  1. LFS test fails: UPGRADE_EXTRA_ENV + secret generation in upgrade path
  2. REF=main HC1 fail: always use git SHA for head_ref
  3. Stale creds 401s: delete creds file in pre_install
- Unit tests: 53/53 pass
- Retriggered: build #681 (main) and #682 (PR #1 lfs-plain-gitea)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:03:05 +00:00
autonomic-botandClaude Sonnet 4.6 a121d2c069 fix(gtea): fix M2 blockers — LFS upgrade and REF=main HC1
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
Blocker 1 (LFS roundtrip fails on PR #1):
- Add UPGRADE_EXTRA_ENV to gitea recipe_meta.py — after PR-head checkout
  (compose.lfs.yml now in ABRA_DIR), add compose.lfs.yml to COMPOSE_FILE
  and set SECRET_LFS_JWT_SECRET_VERSION=v1 so the upgrade chaos redeploy
  actually runs with LFS enabled. Without this, the base install checks out
  the 3.5.x tag (compose.lfs.yml removed), EXTRA_ENV sees no LFS, and the
  upgrade chaos redeploy inherits the no-LFS .env — so the LFS test runs
  (compose.lfs.yml is restored by recipe_checkout_ref) but LFS is off.
- Add abra.secret_generate(domain) in generic.perform_upgrade when
  upgrade_env is non-empty — generates lfs_jwt_secret before chaos redeploy.

Blocker 2 (REF=main upgrade fails HC1):
- Always use recipe_head_commit (git rev-parse HEAD) for head_ref instead
  of using ref directly. When ref="main" (a branch name), the HC1 commit
  check "head_ref.startswith(chaos_commit)" always fails since "main" ≠ SHA.
  recipe_head_commit returns the actual SHA after the fetch/checkout.

Side-fix (stale creds — build #675):
- ops.py pre_install: delete the per-domain creds file before calling
  _ensure_admin. A fresh install wipes gitea's DB; any creds file from a
  prior run on the same domain is stale and causes 401s in all API calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:01:21 +00:00
autonomic-bot 05bf5d5264 review(gtea): file M2 blockers to Builder-INBOX — LFS deploy + upgrade-REF=main
continuous-integration/drone/push Build is failing
Two critical issues prevent M2: (1) lfs_jwt_secret not generated via disk .env → LFS disabled in
container; (2) upgrade tier fails when REF=main. Details + fix hints in BUILDER-INBOX.md.
2026-06-15 20:53:34 +00:00
autonomic-bot f85e54b155 review(gtea): M2 pre-verify — two critical blockers filed @2026-06-15T20:50Z
continuous-integration/drone/push Build is failing
Run 674 (main): upgrade FAIL ("not intended PR-head"); run 676 (PR#1 LFS): test_lfs_roundtrip
fails at git-push batch endpoint (LFS not enabled in deployed container). Builder must fix before M2.
2026-06-15 20:52:56 +00:00
autonomic-botandClaude Sonnet 4.6 ffb34dfcfa chore(gtea): M1 PASS recorded; M2 builds #675 #676 in flight
continuous-integration/drone/push Build is failing
M1: ADVERSARY PASS @20:32Z (a106036).
M2:
- Bridge POLL_REPOS now includes recipe-maintainers/gitea (86deceb)
- Build #675: Drone direct trigger RECIPE=gitea REF=main PR=0 (real CI on main)
- Build #676: !testme on PR #1 (lfs-plain-gitea head, LFS capstone)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:35:47 +00:00
autonomic-bot a10603638a review(gtea): M1 ADVERSARY PASS @2026-06-15T20:32Z
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
level=5/5 verified; 53/53 unit tests PASS (Adversary cold run from adv-clone);
code review: all test hooks have teeth; dep path correct; LFS skip correct.
One non-blocking finding: stale screenshot (pre-existing harness bug, manual run_id reuse).
2026-06-15 20:32:56 +00:00
autonomic-botandClaude Sonnet 4.6 86deceb36f feat(gtea): add recipe-maintainers/gitea to bridge POLL_REPOS
continuous-integration/drone/push Build is failing
Prerequisite for M2: enables the bridge to pick up !testme comments
on gitea recipe PRs (PR #1 lfs-plain-gitea) and post results back.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:32:22 +00:00
autonomic-botandClaude Sonnet 4.6 b2663dc7b7 chore(gtea): WAITING-UNTIL 20:40Z for Adversary M1 verdict
continuous-integration/drone/push Build is failing
LIVENESS PROTOCOL: declared per 10-min rule. Adversary pre-checks done
at 950ab8b, ready to verify. Claim posted at bac3662 (~20:13Z).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:20:01 +00:00
autonomic-botandClaude Sonnet 4.6 bac3662972 claim(gtea): M1 — suite green locally, all 5 stages PASS, git-lfs deployed
continuous-integration/drone/push Build is failing
Manual harness run 846690: install PASS + upgrade PASS + backup PASS + restore
PASS + custom PASS (level=5/5). LFS test self-skips correctly (compose.lfs.yml
absent on main). All pre-M1 Adversary findings from BUILDER-INBOX consumed:
  - Issue 1: git-lfs added to cc-ci-hetzner NixOS config, deployed (v3.6.1)
  - Issue 2: double /api/v1 path in test_lfs_roundtrip.py fixed

Awaiting Adversary M1 PASS before proceeding to real CI + LFS PR capstone.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:13:39 +00:00
autonomic-bot 950ab8b3ed chore(gtea): cold pre-verify checks pass — ready for M1 claim
continuous-integration/drone/push Build is failing
2026-06-15 20:12:56 +00:00
autonomic-botandClaude Sonnet 4.6 3ec24b09d6 feat(host): add git-lfs to cc-ci-hetzner systemPackages
continuous-integration/drone/push Build is failing
Required by test_lfs_roundtrip.py for the M2 LFS capstone run on the
lfs-plain-gitea PR branch. Also revert the same change from the Incus
host (cc-ci/configuration.nix) where it was mistakenly added.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:10:45 +00:00
autonomic-botandClaude Sonnet 4.6 74bc5f0106 fix(gtea): test_admin_api: add token scopes for gitea 1.22+
continuous-integration/drone/push Build is failing
Gitea 1.22+ (including 1.24.2 on cc-ci) requires explicit scopes
when creating API tokens. Add read:user + read:organization to satisfy
the token creation endpoint and the read-back assertions that follow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:06:42 +00:00
autonomic-botandClaude Sonnet 4.6 3cc8338a78 fix(gtea): test_git_push: auto_init repo + direct URL push
continuous-integration/drone/push Build is failing
Empty-repo HTTPS push with git clone exits 0 but silently fails (remote
branch creation on an empty clone is unreliable). Fix:
- Create repo with auto_init=True + default_branch=main (initial commit present)
- Clone into a non-existing subdir (git clone must target non-existing path)
- Push via explicit cred_url (bypasses remote config; no tracking needed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:04:48 +00:00
autonomic-botandClaude Sonnet 4.6 446bafe408 inbox(gtea): consume BUILDER-INBOX (Adversary pre-M1 findings addressed)
continuous-integration/drone/push Build is failing
Both issues fixed in 893a7b0:
- Issue 1 (git-lfs missing): added to nix/hosts/cc-ci/configuration.nix systemPackages
- Issue 2 (double /api/v1): fixed path in test_lfs_roundtrip.py restart poll

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:01:50 +00:00
autonomic-botandClaude Sonnet 4.6 893a7b0eb4 fix(gtea): embed git credentials in URL; fix double /api/v1 path; add git-lfs
continuous-integration/drone/push Build is failing
- test_git_push.py + test_lfs_roundtrip.py: use cred_url (https://user:pass@host/...)
  instead of GIT_CONFIG_COUNT insteadOf rewriting, which silently failed to
  propagate credentials to the push step (repo remained empty after push exit 0).
  Also add GIT_SSL_NO_VERIFY=true and GIT_TERMINAL_PROMPT=0.
- test_lfs_roundtrip.py: fix restart health-poll path /api/v1/version → /version
  (_api() already prepends /api/v1; double prefix produced 404 and a 120s timeout).
- nix/hosts/cc-ci/configuration.nix: add git-lfs to systemPackages (required for
  the LFS capstone test on the lfs-plain-gitea PR branch).

Adversary pre-M1 findings: Issue 1 (git-lfs absent) + Issue 2 (double path) both fixed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:01:31 +00:00