Commit Graph
100 Commits
Author SHA1 Message Date
autonomic-bot 8cd72fd78d feat(harness): P2 — delete legacy customization keys & paths (rcust)
continuous-integration/drone/push Build is passing
a) compose.ccci.yml is FIRST-CLASS: the harness auto-copies tests/<recipe>/
   compose.ccci.yml into the run's recipe checkout (ABRA_DIR-aware, lifecycle.
   provide_ccci_overlay) and auto-chaoses the pinned base deploy on its presence
   (kills the R7 implicit coupling). ghost/discourse install_steps.sh (copy-only
   boilerplate) deleted; CHAOS_BASE_DEPLOY removed from both metas + the registry.

b) install-time deps wiring is the ONLY mode: deps with DEPS provision BEFORE the
   single deploy; legacy post-deploy provisioning + the setup_custom_tests.sh
   invocation machinery deleted. lasuite-docs migrated to install_steps.sh OIDC
   wiring (same env names/values as the old hook — only the timing moved);
   lasuite-drive's remaining post-deploy MinIO bucket one-shot moved to ops.py
   pre_install; both setup_custom_tests.sh files deleted; OIDC_AT_INSTALL removed
   from drive/meet metas + the registry.

c) SKIP_GENERIC meta key deleted (zero users). Env form CCCI_SKIP_GENERIC* stays
   as the documented dev-only escape hatch; when active in a drone CI run the
   orchestrator prints a loud !! warning (manifest embedding lands in P5).

d) conftest cleanup: dead pre-deploy-once fixtures deployed/deployed_app deleted
   (zero users), app_domain + _short + _wait_healthy dropped (only users were the
   deleted fixtures); deps_apps+deps_creds consolidated into ONE deps fixture
   (entries expose .domain etc. as attributes; dict access intact); the 6 lasuite
   test files renamed deps_creds->deps (fixture name only — assertions and flows
   byte-identical). requires_deps marker + F2-11 skip-report plumbing unchanged.

Registry is now exactly the 14 final keys; docs §4 table regenerated. Stale
setup_custom_tests/OIDC_AT_INSTALL prose in docstrings/comments/assert MESSAGES
updated (no assert logic or expected value touched).

Verified on cc-ci: cc-ci-run -m pytest tests/unit -q -> 175 passed; scripts/lint.sh -> PASS.
2026-06-10 17:01:33 +00:00
autonomic-bot 472a68b32c feat(harness): P1 — single registry-backed meta loader (rcust)
continuous-integration/drone/push Build is passing
One loader: runner/harness/meta.py::load(recipe) -> RecipeMeta (frozen dataclass,
attribute access), backed by the declarative KEYS registry (14 final keys + 3
P2-deprecated). The ONLY exec() of tests/<recipe>/recipe_meta.py. Validation per
the locked decision: unknown ALL-CAPS top-level name or type mismatch = MetaError
(hard error at load); underscore-prefixed names recipe-private; callables only on
hook-typed keys.

Migrated all six legacy loaders (spec §4 L1–L6):
- run_recipe_ci.py::_load_meta deleted; orchestrator loads once, passes meta down
- tests/conftest.py::_recipe_meta deleted; meta fixture returns full RecipeMeta (R3)
- lifecycle.py::_recipe_extra_env/_recipe_meta_flag deleted; deploy_app takes meta
- deps.py::declared_deps deleted; callers read meta.DEPS
- canonical.py::is_enrolled reads through meta.load()
- screenshot.py now actually receives SCREENSHOT through the orchestrator path (R2
  fix; proven by unit test through the real load path)

Mumble private constants underscore-prefixed (_WELCOME_TEXT_MARKER/_MAX_USERS) +
importers fixed. New tests/unit/test_meta.py (all-recipes-load-clean typo gate,
MetaError cases, spec §2 baseline defaults, underscore exemption, doc sync). Docs
§4 key table now GENERATED from the registry (scripts/gen-meta-docs.py); drift
fails CI.

Verified on cc-ci: cc-ci-run -m pytest tests/unit -q -> 175 passed; scripts/lint.sh -> PASS.
2026-06-10 16:46:58 +00:00
autonomic-bot 49fb818c60 status(rcust): bootstrap phase state files — P1 starting on branch restructure/recipe-custom
continuous-integration/drone/push Build is passing
2026-06-10 16:29:44 +00:00
autonomic-bot 12318582aa review(rcust): seed Adversary ledger — phase start, awaiting M1 claim
continuous-integration/drone/push Build is passing
2026-06-10 16:29:26 +00:00
autonomic-bot 6060086c01 status(conc): ## DONE — M1+M2 both Adversary-PASS, no open veto; phase complete
continuous-integration/drone/push Build is passing
2026-06-10 08:56:02 +00:00
autonomic-botandClaude Opus 4.8 9987fba4b6 review(conc): M2 PASS — merged + live-verified (a)-(d) on final main 139e319; M1+M2 both fresh PASS, no open veto — DONE unblocked
continuous-integration/drone/push Build is passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:55:19 +00:00
autonomic-bot 74ed24053d claim(conc): M2 — merged + live-verified (a)-(d) on final main 139e319; (a) re-run build 295 clean; awaiting Adversary
continuous-integration/drone/push Build is passing
2026-06-10 08:52:48 +00:00
autonomic-botandClaude Opus 4.8 2894778810 review(conc): M2(c) PASS — double-!testme both GREEN on CONC-A1-fixed harness; VETO LIFTED, CONC-A1 closed
continuous-integration/drone/push Build is passing
Builds 290+291 (same immich domain) both success: 291 logged block line + acquired,
both deploy-count=1 (290 no false-2, 291 no FileNotFoundError), zero leakage.
Serialization also observed live in lslocks. CONC-A1 conditions 1-3 met; veto lifted.
Remaining for full M2: (a) cancel-mid-run re-run on fixed harness + Builder M2 claim.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:51:46 +00:00
autonomic-bot 536a3595b9 journal(conc): M2(c) PASS round 2 — 290+291 both green, block line visible, zero leakage; (a) re-run triggered
continuous-integration/drone/push Build is passing
2026-06-10 08:50:26 +00:00
autonomic-bot 0684576d74 chore(conc): consume BUILDER-INBOX (ML-flake context on (c) round-2; concur — will re-trigger (c) clean after 290/291 terminal)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build was killed
2026-06-10 08:45:14 +00:00
autonomic-botandClaude Opus 4.8 fa9a89bcf8 review(conc): live (c) round-2 — serialization confirmed via lslocks; delay is immich-ML healthcheck flake, not the restructure; veto unchanged
continuous-integration/drone/push Build is passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:44:30 +00:00
autonomic-bot 374371966f journal(conc): (b)+(d) PASS on CONC-A1-fixed main (287/288 parallel green, zero leakage); (c) round 2 triggered
continuous-integration/drone/push Build is passing
2026-06-10 08:22:40 +00:00
autonomic-botandClaude Opus 4.8 b1bca1a745 chore(conc): CONC-A1 fix code-verified (veto conditions 1+2 met, mutation-proven); 3+4 pending live (c) re-run
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:19:37 +00:00
autonomic-botandClaude Opus 4.8 4f6c9554b7 inbox(adversary): consumed CONC-A1-fixed message from Builder
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:17:16 +00:00
autonomic-bot 96ba67a63f inbox(adversary): CONC-A1 fixed b6e12ef/139e319 — run-keyed state files + regression test; re-running M2 live checks
continuous-integration/drone/push Build is passing
2026-06-10 08:16:43 +00:00
autonomic-bot 139e319d7e Merge branch 'restructure/concurrency': fix(harness) CONC-A1 run-keyed state files (M2(c) live-verify finding)
continuous-integration/drone/push Build is passing
2026-06-10 08:16:18 +00:00
autonomic-bot b6e12ef428 fix(harness): run-keyed run-scoped state files — CONC-A1 (same-domain runs corrupted shared deploy-count)
continuous-integration/drone/push Build is passing
The four CCCI state files (deploys countfile, opstate, deps, depskip) were keyed
by app domain in shared /tmp. A second run of the same domain executes its main()
preamble + deploy_app's pre-lock _record_deploy BEFORE blocking at the app lock,
so it reset/polluted the live first run's counter (false DG4.1 deploy-count=2,
build 279) and the first run's end-of-run os.remove crashed the second
(FileNotFoundError, build 281). Masked pre-restructure by the end-to-end recipe
flock. Now keyed by run id + harness pid via _run_state_path(); children receive
exact paths via the CCCI_*_FILE env vars, so domain keying was never load-bearing.

tests/concurrency/test_run_state.py: path-invariant cases + a real-process
regression (helpers.py deploy-count-run) reproducing the live interleaving —
verified to FAIL under simulated shared keying. docs/concurrency.md §3 updated.
2026-06-10 08:16:09 +00:00
autonomic-botandClaude Opus 4.8 2173894f07 review(conc): M2(c) FAIL — double-!testme same domain corrupts shared deploy-count file (CONC-A1) + VETO
continuous-integration/drone/push Build is passing
Builds 279+281 (immich#2, same domain immi-ad3e33) both RED: 279 false DG4.1
'deploy-count 2!=1' from 281's pre-lock _record_deploy polluting the shared
/tmp/ccci-deploys-<domain> counter; 281 FileNotFoundError after 279 os.remove'd it.
Lock serialisation works (281 logged block+acquire); per-run isolation of the
deploy-count file does not (P3 missed it; _record_deploy at lifecycle:250 fires
before acquire_app_lock at :254). Control build 275 (isolated) green.
Veto DONE until counter keyed per-run + same-domain test + live (c) both-green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:07 +00:00
autonomic-bot e392c73cbc journal(conc): M2(b)+(d) PASS evidence; (c) double-!testme triggered
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
2026-06-10 05:04:14 +00:00
autonomic-bot 3180ae1355 review(conc): wrapper exit-code fix verified safe (red still propagates) + correct my set -e pre-review miss; inbox consumed
continuous-integration/drone/push Build is passing
2026-06-10 04:58:27 +00:00
autonomic-bot 9d82a02026 journal(conc): M2(b) round-1 evidence + wrapper fix verification
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-10 04:56:22 +00:00
autonomic-bot bbc2bafbcb inbox(adversary): M2 wrapper exit-code fix e1c4198/b7a009c — context for M2 review
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
2026-06-10 04:55:07 +00:00
autonomic-bot b7a009c1fc Merge branch 'restructure/concurrency': fix(ci) wrapper exit-code poisoning on green runs (M2 live-verify finding)
continuous-integration/drone/push Build is passing
2026-06-10 04:54:51 +00:00
autonomic-bot e1c4198c08 fix(ci): recipe-ci wrapper — capture harness rc, clear traps before exit (green runs no longer exit 1)
continuous-integration/drone/push Build is passing
The drone exec runner's step shell is set -e. On a NORMAL harness exit the EXIT trap still
fired and its kill of the already-exited process group failed with ESRCH, poisoning the
script's exit status: build 269 (plausible#3) ran fully GREEN (all tiers pass, level=4) but
the step exited 1. Reproduced minimally with sh -e and bash -e on the host; the fixed wrapper
verified for all three paths: green rc=0, red rc=7 (propagated), TERM-to-shell -> child gets
TERM and wrapper exits 143. Cancel forwarding semantics unchanged.
2026-06-10 04:54:40 +00:00
autonomic-bot 56723ae0ec chore(conc): M2 merge-integrity pre-check — merged main == M1-verified tree (not a verdict)
continuous-integration/drone/push Build is passing
2026-06-10 04:49:55 +00:00
autonomic-bot dfa5c8b9ee journal(conc): M2(a) cancel-mid-run PASS evidence; (b) parallel runs triggered
continuous-integration/drone/push Build is passing
2026-06-10 04:47:19 +00:00
autonomic-bot bb5eb3d3aa Merge branch 'restructure/concurrency': concurrency restructure (P1-P5 + tests/concurrency)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
M1 Adversary-verified PASS (REVIEW-conc.md @83a6c6e): lock-lifetime hardening (PDEATHSIG +
signal funnels + 60-min deadline + setsid/trap cancel forwarding), flock-probe janitor
(registry deleted), per-run ABRA_DIR (recipe flock deleted), single concurrency knob,
tests/concurrency real-kernel suite, docs/concurrency.md rewrite.
2026-06-10 04:40:00 +00:00
autonomic-bot 83a6c6e157 review(M1): PASS — branch @d3fe9e2 cold-verified (unit 138, conc 20, lint, 0 dangling refs, gate-integrity, independent flock probe)
continuous-integration/drone/push Build is passing
2026-06-10 04:39:16 +00:00
autonomic-bot 8b9033f3d6 journal(conc): tests suite + P5 evidence, M1 claim context
continuous-integration/drone/push Build is passing
2026-06-10 04:34:19 +00:00
autonomic-bot e8e52cf4c6 claim(conc): M1 CLAIMED — branch restructure/concurrency complete (P1-P5 + tests, tip d3fe9e2), awaiting Adversary
continuous-integration/drone/push Build is passing
2026-06-10 04:33:59 +00:00
autonomic-bot d3fe9e26bb docs: P5 concurrency spec rewrite — one lock, one structural isolation, the invariant chain
continuous-integration/drone/push Build is passing
Rewritten to the restructured model: lifetime-hardening guards (PDEATHSIG/SIGTERM/SIGALRM +
setsid/trap), per-run ABRA_DIR isolation (same-recipe runs now parallel), per-app-domain flock
(double-!testme serialisation), flock-probe janitor decision table (incl. the inode-identity
race rows), updated failure-mode table (cancel now tears down via the harness's own funnel;
reboot reaps immediately; 60-min deadline bounds everything), single-knob config table, how to
run tests/concurrency, fresh file/symbol index + deleted-symbol list for grep verification.
Also drops the last stale concurrency.limit mention from the .drone.yml header comment.
2026-06-10 04:32:54 +00:00
autonomic-bot 84d90fb655 test(concurrency): real-kernel suite for the restructured model — 20 tests, 19 plan cases
continuous-integration/drone/push Build is passing
tests/concurrency/ — NOT in the default `pytest tests/unit` gate; run explicitly with
`pytest tests/concurrency -q`. flock/prctl/alarm are never mocked: helper subprocesses
(helpers.py) hold real locks and install the real lifetime guards; locks live in a per-test
tmp dir via CCCI_APP_LOCK_DIR; every helper (and recorded grandchild) is reaped by fixture
cleanup.

- test_locks.py (cases 1-4): SIGKILL auto-release; LOCK_NB held/unheld semantics; PEP 446
  fd-not-inherited (holder's child survives, lock still releases); same-domain second acquire
  blocks until first holder exits.
- test_janitor.py (cases 5-12): orphan reaped once + lockfile unlinked; live holder never
  reaped + logged; new-run acquire blocks until a slow reap completes (reap-under-probe-lock);
  two overlapping janitors -> exactly one reaps (flock arbitration); reboot sim (no lockfile)
  reaps immediately with no age wait; >120min-held lock flagged 'possible leaked run' and NOT
  stolen; warm/canonical names never probed (no lockfile even created); directory-as-lockfile
  and missing lock dir degrade to skip+log, never crash.
- test_lifetime.py (cases 13-16): PDEATHSIG (wrapper parent SIGKILL'd -> guarded child TERM'd,
  teardown marker, lock released); already-orphaned helper REFUSES to run (ppid race); 2s
  deadline alarm -> teardown + exit 142 + lock released; SIGTERM -> teardown + exit 143 +
  lock released.
- test_abra_dir.py (cases 17-19 + 18b): per-run dir built + $ABRA_DIR exported before the
  first abra call (recording stub abra on PATH); two CONCURRENT same-recipe fetch+checkout
  flows into different ABRA_DIRs -> divergent correct trees, canonical staged clone untouched;
  .env written through the servers/ symlink lands in the canonical path (env_get/env_set
  agree); manual runs get pid-suffixed dirs.

On cc-ci: pytest tests/concurrency -q -> 20 passed; tests/unit -> 138 passed; lint PASS.
2026-06-10 04:29:36 +00:00
autonomic-bot c51692b57e chore(conc): pre-review P3+P4 — zero dangling refs, ABRA_DIR ordering clean (not a verdict)
continuous-integration/drone/push Build is passing
2026-06-10 04:28:41 +00:00
autonomic-bot ffcf441364 journal(conc): P1-P4 evidence (live smokes on cc-ci) + pre-existing abra app ls FATA observation
continuous-integration/drone/push Build is passing
2026-06-10 04:21:17 +00:00
autonomic-bot 2080d734d3 status(conc): P1-P4 on branch (b492f99..91d3cc7), tests/concurrency next
continuous-integration/drone/push Build is passing
2026-06-10 04:20:20 +00:00
autonomic-bot 91d3cc7e99 chore(ci): P4 config cleanup — DRONE_RUNNER_CAPACITY is the single concurrency knob
continuous-integration/drone/push Build is passing
Remove concurrency.limit from the recipe-ci pipeline (.drone.yml): it duplicated
DRONE_RUNNER_CAPACITY (nix/modules/drone-runner.nix maxTests) and the two had to be kept in
step by hand (docs/concurrency.md §8.6). maxTests comment updated to state it is the single
knob and to describe the new safety model.
2026-06-10 04:19:35 +00:00
autonomic-bot f98b444559 decisions(conc): record P3 install_steps.sh ABRA_DIR path fix (guardrail justification)
continuous-integration/drone/push Build is passing
2026-06-10 04:18:45 +00:00
autonomic-bot 17ebdf39ac feat(harness): P3 per-run ABRA_DIR — structural recipe-tree isolation, recipe flock deleted
continuous-integration/drone/push Build is passing
- run_recipe_ci.setup_run_abra_dir(): builds <runs_dir>/<run-id>/abra with servers/ and
  catalogue/ symlinked to the canonical ~/.abra (app .env files keep landing in the shared
  canonical path, so janitor discovery and env-based teardown are unchanged; per-domain
  filenames + the P2 app-domain lock prevent write conflicts) and a FRESH empty recipes/ —
  each run clones + checkouts its own recipe trees. Exported as $ABRA_DIR (honored by the
  abra CLI, verified on-host) before ANY abra call. Manual runs get manual-<pid> isolation.
- fetch_recipe(): plain clone into $ABRA_DIR/recipes/<recipe> — no shared-tree rm-rf, no lock.
  CCCI_SKIP_FETCH=1 now copies the canonically-staged clone into the per-run tree (same staging
  workflow, run reads staged state).
- abra.abra_dir()/recipe_dir(): single resolution rule ($ABRA_DIR else ~/.abra), used by
  recipe_checkout, has_lightweight_version_tags, recipe_head_commit, recipe_versions,
  generic._recipe_dir, lifecycle.prepull_images, snapshot_recipe_tests, and
  warm_reconcile._recipe_dir (which keeps the canonical default for its own systemd runs but
  follows the per-run tree when imported by promote_canonical inside a run).
- deleted: lifecycle.acquire_recipe_lock, RECIPE_LOCK_DIR, the main() call site and the
  must-lock-before-fetch ordering rule.
- tests/{ghost,discourse}/install_steps.sh: RECIPE_DIR resolves ${ABRA_DIR:-$HOME/.abra} so the
  compose.ccci.yml overlay lands in the tree the run actually deploys from (mechanical path fix
  required by per-run trees; no assertion/gate touched — see DECISIONS.md).
- .drone.yml comments updated (HOME=/root rationale now via the servers symlink).
2026-06-10 04:18:33 +00:00
autonomic-bot 08b629f52a chore(conc): pre-review P1+P2 — 4 break-it concerns tested + refuted (not a verdict)
continuous-integration/drone/push Build is passing
2026-06-10 04:16:41 +00:00
autonomic-bot b302f3ab63 feat(harness): P2 flock-probe janitor — the kernel flock IS the liveness oracle
continuous-integration/drone/push Build is passing
- acquire_app_lock(domain): exclusive flock on /run/lock/cc-ci-app-<domain>.lock, taken in
  deploy_app exactly where register_run_app was (BEFORE app creation); blocks with a log line
  when another run of the same domain is in flight (double-!testme serialisation). The file
  object is retained in module-level _held_app_locks so GC can never close the fd and silently
  release the lock. mtime is touched at acquisition (lock age for the long-held flag).
- janitor(): probes each candidate's lock (discovery unchanged: abra app ls + docker-service
  sweep vs RUN_APP_RE). Acquirable -> orphan -> teardown_app(verify=False) WHILE HOLDING the
  probe lock (a new same-domain run blocks until the reap finishes), then unlink before release.
  Held -> live run -> leave it; held >120min (2x hard deadline) -> warn, never steal. Stale
  unheld lockfiles with no app are unlinked on sight. Unreadable lockfile -> skip + log.
- unlink/recreate race guard (both sides): after ANY acquisition, verify the locked fd still is
  the inode the path names (fstat vs stat); a waiter that won a just-unlinked inode retries on
  the live path, and a probe that won one skips (unlinking now would hit a newer run's file).
- deleted: register_run_app, unregister_run_app, _run_owner_state, _registry_path,
  ACTIVE_RUN_DIR, CCCI_JANITOR_MAX_AGE + age fallback, _stack_age_seconds, pid-reuse guard.
  teardown_app no longer unregisters (release is process exit). janitor() takes no args now.
- post-reboot: /run/lock is tmpfs -> lockfiles gone -> probe trivially acquires -> immediate
  reap (improvement over the old 2h age fallback).
2026-06-10 04:11:31 +00:00
autonomic-bot b492f995bd feat(harness): P1 lock-lifetime hardening — PDEATHSIG + SIGTERM/SIGALRM teardown funnel + 60-min hard deadline
continuous-integration/drone/push Build is passing
- new harness/lifetime.py: install_lifetime_guards() arms PR_SET_PDEATHSIG(SIGTERM) (with
  post-prctl ppid==1 orphan refusal), a SIGTERM handler raising SystemExit through the run's
  finally: teardown funnel (exit 143), and signal.alarm(3600) funnelling SIGALRM the same way
  with a distinct deadline log line (exit 142). Re-entrant signals during teardown are logged
  and ignored (begin_teardown guard) so a second signal can't abort the running cleanup.
- run_recipe_ci.main(): guards installed first thing, before any abra call/lock; both teardown
  finally: blocks (cold + quick) mark begin_teardown().
- .drone.yml recipe-ci step: harness runs under setsid in its own process group; a trap forwards
  the step shell's TERM/EXIT to the whole group so drone cancel reaches the harness instead of
  leaking it (docs/concurrency.md §8.1).
- PEP 446 note on the recipe-lock open(): the fd is non-inheritable, children never carry it.
2026-06-10 04:04:28 +00:00
autonomic-bot e350c94c3f chore(conc): record cold-verify environment (cc-ci-run pytest env, M1 plan)
continuous-integration/drone/push Build is passing
2026-06-10 04:03:23 +00:00
autonomic-bot 45afccbef5 status(conc): bootstrap phase state files — P1 in flight on branch restructure/concurrency
continuous-integration/drone/push Build is passing
2026-06-10 04:00:12 +00:00
autonomic-bot 48d03d8405 chore(conc): seed REVIEW-conc.md — adversary online, baseline pre-read (no verdict)
continuous-integration/drone/push Build is passing
2026-06-10 03:56:26 +00:00
autonomic-botandClaude Opus 4.8 f5a6f7196f feat(reports): static site at report.ci.commoninternet.net for the weekly Recipe Report
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing
nginx:alpine swarm service serving /var/lib/cc-ci-reports behind traefik
(Host(report.ci.commoninternet.net) + wildcard TLS), deployed by a reconcile
oneshot mirroring dashboard.nix. The /recipe-report skill writes the weekly
HTML pages there; nginx serves them live. report.ci.* already resolves
(wildcard *.ci DNS) and is covered by the wildcard cert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 22:56:21 +00:00
autonomic-botandClaude Opus 4.8 a78ec2de12 feat(bridge): post a NEW comment per !testme (not edit-in-place)
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing
Operator preference: each !testme should get its own comment response so a
re-run is visible in the PR timeline. process_testme now always posts a fresh
 placeholder comment; watch_and_reflect edits THAT comment to the result.
(Was: reuse/edit a single marker comment in place — which made re-runs on an
unchanged head invisible, only updating commit status.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:25:39 +00:00
autonomic-botandClaude Sonnet 4.6 ef65d898ed status(regression): ## DONE — D-final PASS @03:36Z; all 7 canaries verified; phase complete
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing
Adversary verdict: D-final PASS @2026-06-02T03:36Z. All 6 DoD items Adversary-verified:
DoD#1 suite committed, DoD#2 good-simple+good-significant GREEN, DoD#3 false-green caught,
DoD#4 4 per-tier RED canaries, DoD#5 README, DoD#6 PR#5 open for operator review.

PR#5: #5 — do not merge.
Builder loop stopped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 03:38:24 +00:00
autonomic-bot 0dea3410ee review(regression): D-final PASS — all 7 canaries cold-verified; PR#5 open; DoD complete
continuous-integration/drone/push Build is failing
Cold-verified from cc-ci artifact dirs + PR branch collect:
- DoD#1: 7 tests collect from regression-canaries branch ✓
- DoD#2: good-simple (install/upgrade=pass, test_serving) ✓; good-significant run-2 (all tiers pass, test_serving_and_frontend) ✓
- DoD#3: bad-false-green RED, rc!=0 false-green guard has teeth ✓
- DoD#4: all 4 per-tier RED canaries at correct tiers (install/upgrade/backup/restore) ✓
- DoD#5: README cadence+canaries+add-instructions ✓
- DoD#6: PR#5 state=open, merged=False ✓

Inbox consumed; no vetoes; phase DONE pending operator PR review.
2026-06-02 03:37:18 +00:00
autonomic-bot 117028ff0a inbox(adversary): final gate — good-significant GREEN, PR#5 open
continuous-integration/drone/push Build is failing
2026-06-02 03:35:08 +00:00
autonomic-botandClaude Sonnet 4.6 c90cf1e1d0 claim(D-final): all 7 canaries verified + PR#5 opened — FINAL gate claim
continuous-integration/drone/push Build is failing
good-significant re-run (regression-good-significant-2) completed GREEN:
- install=pass, upgrade=pass, backup=pass, restore=pass, custom=pass
- clean_teardown=true, no_secret_leak=true
- All semantic assertions executed (test_serving_and_frontend, test_upgrade_reconverges,
  test_upgrade_preserves_data, test_backup_captures_state, test_restore_returns_state, OIDC)

PR#5 opened: #5
Branch regression-canaries→main, 10 files, 704 insertions. Do not merge.

All DoD items: D1 (suite committed) D2 (good canaries GREEN) D3 (false-green caught)
D4 (4 per-tier RED) D5 (README) D6 (PR open). Awaiting Adversary final PASS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 03:34:51 +00:00
autonomic-bot 49a56e873e review(regression): A-reg-2+A-reg-3 CLOSED; 6/7 canaries cold-verified; good-significant+PR still pending
continuous-integration/drone/push Build is failing
2026-06-02 02:18:40 +00:00
autonomic-bot f2fa38df6f status(regression): D-final CLAIMED — all 7 canaries verified; PR pending
continuous-integration/drone/push Build is failing
2026-06-02 02:18:35 +00:00
autonomic-bot 31b71f9949 fix(regression): correct bad-backup SHA to b6fe99de (has .env.sample)
continuous-integration/drone/push Build is failing
2026-06-02 02:15:58 +00:00
autonomic-botandClaude Sonnet 4.6 9449b22f24 fix(regression): separate recipe for bad-restore (custom-html-rst-bad)
continuous-integration/drone/push Build is failing
Having test_backup.py in custom-html-bkp-bad caused both bad-backup and bad-restore
to fail at the backup tier. Create custom-html-rst-bad with its own cc-ci test dir
that has ops.py+test_restore.py but NO test_backup.py, so:
- backup: only generic test_backup_artifact → PASS (snapshot exists)
- restore: pre_restore writes 'mutated', marker stays 'mutated' after restore → FAIL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 02:15:03 +00:00
autonomic-botandClaude Sonnet 4.6 74364d0a46 fix(regression): bad-restore uses custom-html-bkp-bad + ops.py+test_restore.py
continuous-integration/drone/push Build is failing
backup-bot-two ignores backupbot.backup.path labels and always backs up
the full volume, making path-based restore-RED infeasible.

New approach: custom-html-bkp-bad has no pre_backup → marker never seeded
→ backup snapshot has no ci-marker.txt. pre_restore writes 'mutated'.
After restore: marker is MISSING or 'mutated' → test_restore_returns_state FAILS.
upgrade=skip (no version tags) is acceptable since passing_tiers_before=[install,backup].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 02:12:28 +00:00
autonomic-botandClaude Sonnet 4.6 c7ede9cfbb fix(regression): add test_backup.py for bad-backup canary — assertion-level failure
continuous-integration/drone/push Build is failing
No ops.py::pre_backup for custom-html-bkp-bad → ci-marker.txt never seeded.
test_backup_captures_state asserts marker=='original' → MISSING → FAIL → backup=RED.
This works regardless of backupbot label behavior.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 02:09:29 +00:00
autonomic-botandClaude Sonnet 4.6 3b7267cbee fix(regression): use custom-html-bkp-bad recipe for bad-backup canary
continuous-integration/drone/push Build is failing
backupbot-two ignores nonexistent backup paths and backs up the whole
volume, making the bad-path approach unreliable. New approach:
- Create recipe-maintainers/custom-html-bkp-bad on Gitea (custom-html
  without backupbot.backup=true label) — SHA 4e584063a99a
- Add tests/custom-html-bkp-bad/recipe_meta.py with BACKUP_CAPABLE=True
  so the harness runs the backup tier despite auto-detect returning False
- Without a labeled container, backup-bot-two produces no snapshot →
  parse_snapshot_id=None → test_backup_artifact fails → backup=RED ✓

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 02:07:06 +00:00
autonomic-botandClaude Sonnet 4.6 090724ec80 fix(regression): correct SHAs for bad-backup/bad-restore (A-reg-3) + consume inbox
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing
Both compose.yml uploads had empty files due to a bash encoding bug.
Fixed via Python API upload; new SHAs:
- regression-bad-backup: cd52b3a (backupbot.backup.path=/nonexistent-path-cc-ci-canary-bad)
- regression-bad-restore: 7e03499 (backup targets .backup-data subdir + command creates it)

Adversary confirmed bad-install ✓ and bad-upgrade ✓ from run artifacts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 02:00:51 +00:00
autonomic-bot 3859cd7f40 review(regression): A-reg-3 — bad-backup/bad-restore compose.yml empty (wrong tier fails); bad-install/bad-upgrade PASS cold-verified
continuous-integration/drone/push Build is failing
2026-06-02 01:59:50 +00:00
autonomic-botandClaude Sonnet 4.6 cf405b4195 feat(regression): add 4 per-tier RED canaries (DoD#4) + canary_fast marker
continuous-integration/drone/push Build is failing
Four new per-tier RED canaries prove the server catches failure at every
lifecycle tier:

- bad-install: custom-html-tiny @ regression-bad-image (4ae88661)
  nonexistent image → prepull fails → install=fail
  STAGES=install → no prev-version lookup → chaos deploy of HEAD

- bad-upgrade: same branch + SHA, STAGES=install,upgrade
  install uses prev-version (good image) → PASS
  upgrade chaos checks out HEAD (bad image) → prepull fails → FAIL

- bad-backup: custom-html @ regression-bad-backup (e1e3c5fc)
  backupbot.backup.path=/nonexistent-path-cc-ci-canary-bad
  abra app backup create fails → backup=fail

- bad-restore: custom-html @ regression-bad-restore (5a481cc1)
  backup targets .backup-data/ subdir (not where ci-marker.txt lives)
  backup succeeds; restore puts .backup-data back but NOT the marker
  marker stays "mutated" → test_restore_returns_state FAILS → restore=fail

Each test asserts: rc!=0, failing_tier="fail", prior tiers="pass".
Adds @pytest.mark.canary_fast for the fast subset.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 01:49:28 +00:00
autonomic-bot 3dd06ef0ce review(regression): A-reg-1 CLOSED (import fix verified); good-simple+bad canary artifacts cold-verified; A-reg-2 still open
continuous-integration/drone/push Build is failing
2026-06-02 01:44:42 +00:00
autonomic-bot b268a14cad status(regression): good-significant upgrade flaky (convergence race); next: 4 RED canaries
continuous-integration/drone/push Build is failing
2026-06-02 01:38:52 +00:00
autonomic-botandClaude Sonnet 4.6 a2a6eea757 fix(regression): fix relative import (A-reg-1) + consume inbox
continuous-integration/drone/push Build is failing
- tests/regression/test_canaries.py: replace `from .conftest import ...`
  (relative import fails when not a package) with sys.path + direct import,
  matching the pattern used by all other tests in this repo.
- Delete machine-docs/BUILDER-INBOX.md (Adversary inbox consumed).
- Update STATUS-regression.md + JOURNAL-regression.md with first two
  canary run results (bad-false-green RED confirmed, good-simple GREEN confirmed).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 01:37:31 +00:00
autonomic-bot 464760ebb7 review(regression): D-initial FAIL — A-reg-1 relative import (suite won't collect), A-reg-2 plan gap (4 per-tier RED canaries missing)
continuous-integration/drone/push Build is failing
2026-06-02 01:34:56 +00:00
autonomic-botandClaude Sonnet 4.6 fd3db37c49 feat(regression): add tests/regression/ E2E canary suite
continuous-integration/drone/push Build is failing
Three canaries (@pytest.mark.canary) drive the real cold CI lifecycle:
- good-simple: custom-html-tiny @ main (435df8fc) — fast signal, expects GREEN
- good-significant: lasuite-docs @ main (290a8ad7) — multi-service, expects GREEN
- bad-false-green: custom-html @ v5-stale-docroot (71e7326a) — expects RED

Semantic teeth: beyond exit-code, each test asserts that specific named tests
ran in results.json stages (test_serving, test_serving_and_frontend, test_content_type).
If an assertion is removed, the named test disappears → regression test fails.

Includes conftest (run_recipe_ci helper + stage_has_{passing,failing}_test),
README (cadence policy, how to run, how to add), and phase state files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 01:25:55 +00:00
autonomic-bot 91a7088f56 review(regression): pre-orientation — known-bad fixture #81 RED confirmed, infra healthy
continuous-integration/drone/push Build is failing
2026-06-02 01:19:37 +00:00
autonomic-bot f202c5aa7f review(regression): Adversary phase files initialized — watching for Builder gate claims
continuous-integration/drone/push Build is failing
2026-06-02 01:15:43 +00:00
autonomic-bot baf5a21bdc status(mirror): ## DONE — Ph0-Ph5 all Adversary-verified PASS @01:16Z
continuous-integration/drone/push Build is failing
Ph0 pre-flight ✓ | Ph1 3 mirrors created ✓ | Ph2 hedgedoc tests + !testme #113 PASS ✓
Ph3 9 recipes enrolled (POLL_REPOS 11→20) ✓ | Ph4 nixos-rebuild switch deployed ✓
Ph5 ghost/immich/plausible triggered ≤16s, built, reported back ✓

Phase 6 deferred: ghost/immich restore bugs + plausible ClickHouse (pre-existing, not regressions).
All: clean_teardown=true, no_secret_leak=true. Loop stopped.
2026-06-02 01:14:05 +00:00
autonomic-bot bdbbcda849 review(mirror): Ph4+Ph5 PASS @01:16Z — deploy verified, 3 new recipes triggered <60s
continuous-integration/drone/push Build is failing
Ph4: bridge task 2y4celpytdav3qax56jszaokv watching all 20 repos confirmed cold.
Ph5: ghost #120 (15s) + immich #121 (~16s) + plausible #122 (~16s) all triggered.
D1 met. Ghost+immich reported back; restore failures are pre-existing Ph6 issues
(ci_marker table missing — not enrollment regressions). clean_teardown+no_secret_leak OK.
Plausible still running; verdict does not depend on its result.
2026-06-02 01:11:45 +00:00
autonomic-bot 5fd95a6b84 status(mirror): immich #121 fail (restore PG bug); plausible #122 running
continuous-integration/drone/push Build is failing
2026-06-02 01:05:49 +00:00
autonomic-bot 80359aaa8f status(mirror): ghost #120 failure — pre-existing backup bug; immich/plausible running
continuous-integration/drone/push Build is failing
2026-06-02 00:59:19 +00:00
autonomic-bot cdd11a542b review(mirror): Ph4 PASS + Ph5 trigger PASS (16s) — builds 120/121/122 in progress @01:02Z
continuous-integration/drone/push Build is failing
Ph4: new bridge task watching all 20 repos confirmed cold.
Ph5: all 3 !testme triggers within 16s (D1 met). Build results pending.
2026-06-02 00:51:22 +00:00
autonomic-bot 876ea373d4 status(mirror): Ph5 builds triggered — #120 ghost running, #121/#122 queued
continuous-integration/drone/push Build is failing
2026-06-02 00:49:30 +00:00
autonomic-bot b6c70ef09b claim(mirror): Ph4 deploy complete + Ph5 !testme posted on ghost/immich/plausible
continuous-integration/drone/push Build is failing
2026-06-02 00:48:57 +00:00
autonomic-bot 19747bf10a review(mirror): note operator update — Ph4 gate change, Builder does nixos-rebuild
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
Operator confirmed Phase 4 gate no longer operator-gated; Builder runs nixos-rebuild.
Adversary will verify deploy + Ph5 !testme after Builder claims Phase 4.
2026-06-02 00:46:29 +00:00
autonomic-bot 2f31131d8a status(mirror): Ph1+Ph2+Ph3 full PASS @00:50Z — Ph4 gate awaiting operator nixos-rebuild
continuous-integration/drone/push Build is failing
2026-06-02 00:42:33 +00:00
autonomic-bot 96070fdc92 review(mirror): A-mirror-1 CLOSED — Ph1+Ph2+Ph3 FULL PASS @00:50Z
continuous-integration/drone/push Build is failing
A-mirror-1 resolved: build #113 hedgedoc@441c411c SUCCESS @2026-06-02T00:30Z.
test_hedgedoc_has_branding (cc-ci): pass + test_hedgedoc_root_serves (cc-ci): pass.
clean_teardown=true, no_secret_leak=true.

Ph1+Ph2+Ph3 all verified PASS. Phase 4 operator deploy: CLEARED (Adversary done).
2026-06-02 00:41:39 +00:00
autonomic-bot ac85b0853e status(mirror): A-mirror-1 RESOLVED — hedgedoc build #113 SUCCESS (00:32:07Z, 81s)
continuous-integration/drone/push Build is failing
2026-06-02 00:37:43 +00:00
autonomic-botandClaude Opus 4.8 a9b0cbf468 docs(agents): add AGENTS.md with the server testing cadence
continuous-integration/drone/push Build is failing
Server regression canaries (tests/regression/, pytest -m canary) are
expensive — run them at milestones (polish/review/release), NOT every
commit. Per-recipe lifecycle tests keep their normal per-PR !testme
trigger. Plus the standing 'never weaken a test to pass' guardrail.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:35:12 +00:00
autonomic-bot 9a8ee53c7a status(mirror): A-mirror-1 in progress — build #113 running for hedgedoc !testme
continuous-integration/drone/push Build is failing
2026-06-02 00:31:45 +00:00
autonomic-bot 81d933cac3 review(mirror): Ph1 PASS, Ph3 PASS, Ph2 PARTIAL FAIL (A-mirror-1 OPEN) @00:40Z
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing
Ph1: 3 mirrors cold-verified — lasuite-drive/mailu/mumble all HTTP 200,
empty=false, default_branch=main, HEAD SHAs match upstream exactly.

Ph3: POLL_REPOS has 20 repos; all 9 new recipes present + all have tests/.

Ph2: tests authored (recipe_meta.py, test_health_check, test_branding, PARITY.md)
but builds #153/#154 predate authoring (2026-05-28 vs 2026-06-02). Plan requires
!testme green AFTER authoring. Filing A-mirror-1. Phase 4 deploy NOT blocked.

Ph4 operator deploy: OK to proceed. A-mirror-1 must close before Phase 5 DONE.
2026-06-02 00:29:28 +00:00
autonomic-bot 242d56b56e claim(mirror): Ph1+Ph2+Ph3 complete — mirrors created, hedgedoc tests, 9 recipes enrolled
continuous-integration/drone/push Build is failing
Phase 1: Create 3 missing Gitea mirrors (lasuite-drive, mailu, mumble) via API + force-sync
  upstream main (f4135d78, 23309a1a, 9fa5e949). All 3 return 200/empty=false from Gitea API.

Phase 2: Author tests/hedgedoc/ (uptime-kuma template) — recipe_meta.py, functional/
  test_health_check.py (GET / → 200/302), functional/test_branding.py (brand markers),
  PARITY.md. Generic tiers cover install/upgrade/backup baseline.

Phase 3: Enroll 9 unenrolled recipes in nix/modules/bridge.nix POLL_REPOS:
  bluesky-pds, discourse, ghost, immich, lasuite-drive, mailu, mattermost-lts, mumble, plausible.
  Final POLL_REPOS: 20 entries (cc-ci + 19 recipes).

Gate Ph4 CLAIMED: operator must run `nixos-rebuild switch --flake .#cc-ci` on cc-ci after
Adversary-verifies Ph1+Ph2+Ph3. See STATUS-mirror.md for exact repro.
2026-06-02 00:25:12 +00:00
autonomic-bot 9ad1b6eaf7 review(mirror): break-it probes BP-mirror-1..5 — all PASS @00:25Z
continuous-integration/drone/push Build is failing
BP-1: auth rejection working; BP-2: live bridge POLL_REPOS correct;
BP-3: box clean (5 legit stacks, 25% disk); BP-4: hedgedoc PR#1 open (noted);
BP-5: all 3 upstream mirrors reachable. Ready for Builder Phase 0-3 work.
2026-06-02 00:20:41 +00:00
autonomic-bot bcce8bd56d status(mirror): bootstrap phase state files — Phase 0 complete, Phase 1 in progress
continuous-integration/drone/push Build is failing
2026-06-02 00:20:19 +00:00
autonomic-bot 4e4e9c3c1f review(mirror): init phase-namespaced files + pre-flight snapshot @00:18Z
continuous-integration/drone/push Build is failing
Cold-verified mirror state, live bridge POLL_REPOS, tests/ dirs.
Matches plan survey: 3 mirrors missing (lasuite-drive, mailu, mumble),
9 recipes unenrolled, hedgedoc has no tests/. Awaiting Builder claims.
2026-06-02 00:18:42 +00:00
autonomic-botandClaude Opus 4.8 5cda830644 docs(decisions): §4 weekly cron migrated to NixOS systemd timer (Sun 02:00 UTC)
continuous-integration/drone/push Build is failing
Supersede the CronCreate/busybox notes: the weekly /upgrade-all now runs
via the reboot-safe cc-ci-upgrade-all systemd timer in the orchestrator
flake. Records the T0 PASS and the schedule move (Mon 23:04 -> Sun 02:00 UTC).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:07:18 +00:00
autonomic-bot 5355500ea4 status(5): ## DONE — all V1-V9 + §4 cron Adversary-verified PASS; cc-ci build complete
continuous-integration/drone/push Build is failing
2026-06-01 23:22:24 +00:00
autonomic-bot fd48daefc6 review(5): A5-7 CLOSED + §4 cron PASS + full gate M5 PASS @23:20Z
continuous-integration/drone/push Build is failing
CronCreate mechanism cold-verified: upgrader-cron.log created at 23:18:21Z with
correct content; upgrader was started by cron fire; DECISIONS.md updated.
busybox crond correctly replaced with CronCreate (plan §4 "Claude scheduled task").

All V1-V9 + §4 cron now PASS within 24h. No open findings, no VETOs.
Builder may write ## DONE to STATUS-5.md.
2026-06-01 23:21:45 +00:00
autonomic-bot 5972ee1033 claim(5): A5-7 fix — CronCreate mechanism verified (T0-refire 23:18Z, upgrader-cron.log created)
continuous-integration/drone/push Build is failing
2026-06-01 23:19:32 +00:00
autonomic-bot b1cfa50340 inbox(5): consume A5-7 — switching cron to CronCreate (busybox crond non-functional as non-root)
continuous-integration/drone/push Build is failing
2026-06-01 23:13:47 +00:00
autonomic-bot dc12153f1b review(5): §4 cron T0 MISS — busybox crond non-functional as non-root (A5-7 OPEN)
continuous-integration/drone/push Build is failing
Cold-verified at 23:11Z: T0 (23:04Z) was missed; no upgrader-cron.log created.
busybox crond with -c dir requires root for setuid; silently skips all jobs as
non-root 'loops' user. Confirmed by both T0 miss and a * * * * * control probe
(waited through 23:09+23:10, nothing fired).

V9 PASS stands. Gate M5 remains open pending a working cron mechanism + re-fire.
A5-7 filed in BACKLOG-5. BUILDER-INBOX sent.
2026-06-01 23:13:01 +00:00
autonomic-bot 4ff208d0b6 review(5): V2 full PASS + V4 explicit PASS — cold-verified @22:42Z, awaiting §4 T0 fire 23:04Z
continuous-integration/drone/push Build is failing
2026-06-01 22:41:25 +00:00
autonomic-bot 7ea7ef59ca review(5): V9 PASS (cold) + §4 cron PARTIAL (install OK, T0 fire pending 23:04Z)
continuous-integration/drone/push Build is failing
2026-06-01 22:14:26 +00:00
autonomic-bot a431d3ea7a claim(5): V9 done + cron installed; all V1-V9 evidence in STATUS-5.md
continuous-integration/drone/push Build is failing
2026-06-01 22:12:31 +00:00
autonomic-bot 0884d04d01 inbox(5): summary to Builder — V1-V8a all PASS, V9+cron remaining
continuous-integration/drone/push Build is failing
2026-06-01 22:10:07 +00:00
autonomic-bot 6785007f86 review(5): V7 full PASS — merged-upstream + superseded cases + mirror main cold-verified
continuous-integration/drone/push Build is failing
2026-06-01 22:09:38 +00:00
autonomic-bot 62f8096331 review(5): close A5-6 — bridge fix verified, build #91 GREEN
continuous-integration/drone/push Build is failing
2026-06-01 22:08:44 +00:00
autonomic-bot 1f5e76ae41 review(5): V8 PASS + V8a PASS (with noted self-term gap) — build #91 uptime-kuma GREEN
continuous-integration/drone/push Build is failing
2026-06-01 22:08:34 +00:00
autonomic-bot 04441d416e review(5): V1 full PASS — consolidate evidence (trigger+result+auth+no-fire)
continuous-integration/drone/push Build is failing
2026-06-01 22:00:15 +00:00
autonomic-bot 6440873f66 status(5): V8 build #91 in progress for uptime-kuma
continuous-integration/drone/push Build is failing
2026-06-01 21:59:09 +00:00