Commit Graph

676 Commits

Author SHA1 Message Date
d3af7ea80a journal(3): U2 generation wired; card embeds real screenshot (proven on u1-uk-shot); held behind U1 gate 2026-05-31 07:03:50 +00:00
afe5e51057 feat(3 U2-wiring): render summary card PNG + level badge SVG into run artifact dir (best-effort, R7; not yet served) 2026-05-31 07:03:10 +00:00
d7e812e96d claim(3 U1): app screenshot wired + captured — uptime-kuma working UI no-secrets, graceful degradation; gate CLAIMED 2026-05-31 07:01:45 +00:00
5fa15d4949 feat(3 U1): wire app screenshot capture into run_recipe_ci (best-effort, post-healthy, secret-safe; sets results.json screenshot) 2026-05-31 06:56:20 +00:00
18d2bd1443 review(3 U0): PASS — results.json schema + level ladder cold-verified
Cold/independent on the real cc-ci-run harness:
- 29 unit tests pass (test_level + test_results, PYTHONPATH=runner).
- Independent break-it probe EXIT 0, all 10 checks: compute_level 729 exhaustive vs own
  reference; no-inflation monotonicity; gap-cap; backup_restore_status; SSO gating
  (no-deps->L4, deps->L5, unverified->fail); derive_rungs no-pass-without-backing big fuzz;
  e2e custom-fail->L3 + upgrade-fail->L1; leak-clean; schema complete.
- Real artifacts match EXPECTED exactly: custom-html-tiny L2 (cap L3 backup N/A),
  uptime-kuma L4 (cap L5 integration N/A). 0 real secret leaks (only field name
  no_secret_leak matched). Clean teardown (only traefik_app live). Emission R7-wrapped
  (try/except; return overall) so cosmetics never change the verdict.
R1 (level ladder) cold-verified. Builder may proceed past U0. No VETO.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:53:34 +00:00
442741c0c8 journal(3): U2 render-path de-risked headless (pass+fail cards render correct, no inflation); parked at U0 gate 2026-05-31 06:49:51 +00:00
490813c3d1 docs(3 R8): results-ux.md — level ladder + rung-mapping reference (stable section)
R8 doc seeded with the SETTLED, Adversary-fuzzed level ladder + tier->rung translation + results.json
schema + invariant flags. Card/screenshot/PR-comment/badge sections stubbed (filled as U1-U5 wire +
serve their artifacts). Does not advance past the U0 gate; pure documentation of settled design.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:29:12 +00:00
8179d3f3f9 fix(3 U2): inline-SVG sunflower + font-safe cap line for headless card render
Headless chromium has no colour-emoji font, so 🌻/🏆/⚑ rendered as tofu boxes in the PNG card.
Replace with a self-contained inline-SVG sunflower + plain-text 'capped:'/'full clean climb' markers.
The U3 PR comment keeps the real 🌻 emoji (Gitea markdown renders it). Pure render change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:23:13 +00:00
7217e0c98c feat(3 U2-scaffold): summary card + level/status SVG badge renderers (offline; pure)
harness/card.py: render_badge_svg/level_badge_svg (shields-style SVG, colour-by-level, R6) +
render_card_html (recipe+version, level badge, per-stage/per-test ✔/✘ table, embedded screenshot,
invariant flags — REPORTS results.json verbatim, never recomputes; cardinal no-inflation guardrail)
+ render_card_png (best-effort Playwright HTML->PNG, R7). 8 pure unit tests. Orchestrator wiring +
stable-URL serving + live PNG demo come after U0 PASSes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:11:47 +00:00
daa7edd3a7 feat(3 U1-scaffold): app screenshot capture module (offline; not yet wired)
harness/screenshot.py: best-effort Playwright capture of the live app (reuses harness browser).
Default = landing page (credential-free, secret-safe R7); recipes needing post-login opt into a
recipe-meta SCREENSHOT hook responsible for avoiding secret pages. Every failure swallowed -> None
(cosmetics never block, R7). Pure helpers unit-tested. Orchestrator wiring + live demo come after U0
PASSes (avoid deploy contention with the Adversary's cold U0 re-runs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:05:39 +00:00
5b6b378ade claim(3 U0): results.json + level ladder — gate CLAIMED
U0 (R1) done: pure level() mapper (L0-L6 gap-caps) + per-test JUnit results + results.json, all
emitted best-effort (never changes verdict, R7). Two real runs bracket the gate:
custom-html-tiny=L2 (functional N/A, backup N/A caps at L2) and uptime-kuma=L4 (full climb, no SSO
surface caps at L5). 28 unit tests + Adversary fuzz-clean. Rung-mapping contract in DECISIONS.
Verify: STATUS-3.md HOW/EXPECTED. Awaiting Adversary cold-verify.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:03:49 +00:00
757511e4e7 decisions(3): settle level ladder + rung-mapping contract + artifact hosting (U0)
Records the exact tier+deps/SSO -> rung translation derive_rungs uses (the layer the level depends
on), gap-caps semantics (N/A caps like fail, conservative/never-inflate), the results.json schema,
flags (clean_teardown/no_secret_leak), and artifact dir ${CCCI_RUNS_DIR:-/var/lib/cc-ci-runs}/<run_id>/
(dashboard serves /runs/<id>/ in U2/U4). So the Adversary can verify the level against a documented contract.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 06:01:38 +00:00
52e5d210d8 feat(3 U0.2+U0.3): per-test results + results.json with computed level
harness/results.py: JUnit-XML parsing (stdlib) → per-stage/per-test rows; derive_rungs (documented
tier+deps/SSO → rung mapping); build_results assembles results.json {recipe,version,pr,ref,run_id,
stages[],level,level_cap_reason,rungs,flags{clean_teardown,no_secret_leak},screenshot,summary_card};
write_results (atomic). run_recipe_ci.py: tiers emit --junitxml + append {tier,source,file,rc,junit}
records; main() assembles+writes results.json wrapped so a failure NEVER changes the verdict (R7),
incl. a narrow leak-scan of the serialised artifact. 17 new unit tests (test_results.py).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 05:55:58 +00:00
df54693449 review(3): pre-claim recon (not a verdict) — U0.1 pure level() mapper fuzz-clean (729/729 no inflation); binding U0 risk = translation layer in run_recipe_ci.py 2026-05-31 05:53:25 +00:00
9773e3ff63 feat(3 U0.1): pure level() ladder mapper (L0-L6, gap-caps) + unit tests
Phase-3 R1 foundation. harness.level.compute_level(rungs)->(level,cap_reason) with YunoHost
gap-caps semantics: level = highest rung 1..L all clean PASS; first non-PASS (FAIL or N/A) caps,
recorded in cap_reason. N/A caps like fail but distinctly (L5 'no integration surface' example).
Helpers backup_restore_status + tier_to_rung. 16 unit tests incl U0 gate cases (L4-pass, L2-cap).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 05:46:23 +00:00
805fbba2ad chore(3): bootstrap Phase-3 loop state (STATUS/BACKLOG/JOURNAL-3); seed U0-U5 backlog
Phase 3 = beautiful YunoHost-style results UX (level ladder + image-forward PR comment + summary
card w/ app screenshot + polished dashboard + badges). Operator kicked off manually. Starting U0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 05:43:27 +00:00
2022c3a2bb review(3): Phase-3 Adversary loop live; ledger seeded; no gate yet (Builder not started U0); P2-VETO dependency flagged but not a P3 blocker 2026-05-31 05:41:56 +00:00
7123d8288e status(2b): ## DONE — B1-B4 all Adversary cold-PASS @05:38Z, no VETO
Per-recipe deploy budget confirmed minimal (1 base + N_cold_deps, upgrade shares
the base in place) and enforced (DG4.1); no redundant deploy existed. All four DoD
items PASS in REVIEW-2b (edf34e3). Phase 2b complete.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 05:38:52 +00:00
f7d336fff4 review(2b): PASS — deploy budget 1+N_cold_deps COLD-verified minimal+enforced (DG4.1 non-vacuous; doc-only claim so B3 holds by construction; mumble real run deploy-count=1 all-tiers-green + prior lasuite-docs=2 cold-dep verdict). doc complete incl WC5 caveat. No VETO. B1-B4 all PASS 2026-05-31 05:38:17 +00:00
edf34e3e53 claim(2b): deploy budget confirmed minimal+enforced (1+N_cold_deps); B1-B4 claimed
Phase 2b confirm-and-document outcome: per-recipe test-sequence deploy budget is
already minimal — `deploys == 1 (base, shared by all 5 tiers) + N_cold_deps` — and
tighter than plan B1's nominal `1+1(upgrade)+N` because the upgrade is an in-place
chaos redeploy of the prev-version base, not a separate deploy. Enforced as a hard
failure by DG4.1 (expected = 1 + deps_deployed_count, run_recipe_ci.py:1005-1010).
No redundant deploy found; none removed (none existed).

- docs/perf/deploys.md: the budget record (B4), names the out-of-budget WC5 reseed
- STATUS-2b.md: B1-B4 claim with WHAT/HOW/EXPECTED/WHERE for cold verify
- JOURNAL-2b.md / BACKLOG-2b.md / DECISIONS.md: reasoning + settled note
- consume machine-docs/BUILDER-INBOX.md (Adversary heads-up processed)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 05:35:46 +00:00
5f37de69e3 review(2b): Phase-2b Adversary loop live; pre-claim cold deploy-budget trace (budget = 1+N_deps, enforced by DG4.1, tighter than B1's 1+1+N_deps); WC5 green-cold reseed flagged as B1-doc completeness item; BUILDER-INBOX heads-up 2026-05-31 05:33:49 +00:00
b4a6c02dde journal(2): DONE-VETO checklist complete; plausible Q4.7b mirror+PR#1+run launched 2026-05-31 05:28:57 +00:00
04e4051bc3 status(2): all 3 DONE-VETO upgrade-to-latest items Adversary-PASSED (ghost/discourse/mumble); remaining = plausible Q4.7b + drone Q4.10 + Q5; executing plausible 2026-05-31 05:27:18 +00:00
0d5d5164f9 review(2:F2-14c): PASS — mumble full lifecycle incl real upgrade-to-latest 0.2.0->1.0.0 GREEN cold-verified (fork removed via UPGRADE_EXTRA_ENV, voice/web/config on latest, P2/P3/P4 real, clean teardown); LAST DONE-VETO checklist item. F2-15 CLOSED (discourse PARITY.md) 2026-05-31 05:26:17 +00:00
470afbff98 fix(discourse F2-15): add N/A PARITY.md (P2 §4.1) — parity genuinely N/A (no upstream corpus); documents functional tests + P4 integrity 2026-05-31 05:24:19 +00:00
7525478304 review(2:Q4.6): PASS — discourse full lifecycle incl upgrade-to-latest GREEN cold-verified (deploy-count=1, real 0.7.0->PR-head crossover, P3 create-topic, P4 non-vacuous, clean teardown); closes discourse VETO portion. P2 PARITY.md gap filed F2-15 2026-05-31 05:22:40 +00:00
7f15367d1f backlog(2): plausible Q4.7b scoped + ready (staged hardened entrypoint.clickhouse.sh; mirror+PR+run steps); queued behind Adversary Q4.6/F2-14c verifies 2026-05-31 05:21:23 +00:00
88ad05ac5c journal(2): mumble F2-14c green+claimed; DONE-VETO checklist complete; remaining plausible Q4.7b + drone Q4.10 2026-05-31 05:18:04 +00:00
1461e44da1 claim(2:F2-14c): mumble full lifecycle incl upgrade-to-latest GREEN, cc-ci host-ports fork removed (UPGRADE_EXTRA_ENV hook); deploy-count=1, voice/web/config on latest, P4 non-vacuous, clean teardown — LAST DONE-VETO item 2026-05-31 05:17:07 +00:00
7ee4c2b717 decisions+journal(2): mumble F2-14c disposition + UPGRADE_EXTRA_ENV hook; run launched 2026-05-31 05:08:46 +00:00
4bf9e1d43d feat(mumble F2-14c): drop cc-ci compose.host-ports.yml fork; deploy 0.2.0 base minimally, add native host-ports on upgrade-to-latest via new UPGRADE_EXTRA_ENV harness hook + COMPOSE_FILE-aware READY_PROBE/install skip 2026-05-31 05:07:55 +00:00
e3720bedf3 chore(adv): consume orchestrator migration heads-up (Hetzner cc-ci; DoD unchanged) 2026-05-31 04:59:57 +00:00
dabccebb02 claim(2:Q4.6): discourse full lifecycle incl upgrade-to-latest GREEN (full8 deploy-count=1, all 5 tiers pass, P4 non-vacuous, clean teardown) — closes discourse portion of DONE VETO 2026-05-31 04:58:12 +00:00
190247f3a1 journal(2): discourse full7 (category fix worked, title_prettify hit); fixed 588a087; full8 launched 2026-05-31 04:49:52 +00:00
588a08773b fix(discourse): send capitalised topic title so Discourse title_prettify is a no-op (was 'ccci'->'Ccci' mismatch) 2026-05-31 04:46:48 +00:00
0c31af1b50 journal(2): discourse full6 all-green except create-topic category bug; fixed (1f92776); full7 relaunched 2026-05-31 04:41:34 +00:00
1f92776052 fix(discourse): enable allow_uncategorized_topics in admin bootstrap so create-topic POST succeeds (Discourse 3.x 422 'Category cant be blank') 2026-05-31 04:41:03 +00:00
3dc8fdf507 journal(2): consumed orchestrator inbox + re-baseline (new Hetzner box 8GB/135GB free); launched discourse full6 2026-05-31 04:34:54 +00:00
c01225b841 inbox: consume orchestrator migration heads-up (re-baseline: new box 8GB/135GB free, authenticated pulls; drop stale OOM/disk caution) 2026-05-31 04:34:21 +00:00
1caba80bca inbox: orchestrator migration heads-up to Builder + Adversary
Explain the cc-ci server -> Hetzner migration (ssh cc-ci now 91.98.47.73, 135G free,
authed docker pulls), the orchestrator-authored a216395 eth0 fix + cc-ci-hetzner host
commits, that the old-box OOM/disk/rate-limit notes are stale, and that the DNS cutover
(in flight) explains any public-URL health-check flakes. Loops delete on consume.
2026-05-31 04:33:46 +00:00
87823b195b journal(2): RESUMED — cc-ci migrated to Hetzner node (still ~8GB); discourse full6 setup + memory-shed 2026-05-31 04:20:55 +00:00
a2163951e9 fix(cc-ci-hetzner): drop empty IPv6 gateway/route (network-addresses-eth0 failure)
nixos-infect emitted defaultGateway6.address="" and ipv6.routes=[{address="";
prefixLength=128}] for this v4-only Hetzner instance, so network-addresses-eth0.service
failed at boot ("ip route add  /128 ... any valid prefix is expected rather than /128").
The box has no real IPv6 (link-local only, kernel-managed), so remove the empty IPv6
gateway, address, and route. IPv4 unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 03:58:08 +00:00
4237cc03f5 nix: add cc-ci-hetzner host (cpx32, nixos-infect hardware, all root SSH keys)
Port from terraform-hetzner branch. Adds the Hetzner cc-ci flake host with
all 3 root authorized keys so nixos-rebuild doesn't lock out SSH access.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 03:00:36 +00:00
707752cd14 journal(2): cc-ci VM offline mid discourse full5 — likely OOM on 7-GiB node; polling recovery 2026-05-31 01:43:55 +00:00
3afd850eb0 status(2): discourse full5 in flight — warm image cache + 3600s timeout fix base-deploy timeout 2026-05-31 01:27:51 +00:00
cc952903df journal(2): discourse full4 timeout root-cause + full5 fixes (warm image cache + 3600s) 2026-05-31 01:26:41 +00:00
8dfd8ed3b3 fix(2): discourse — revert non-working depends_on override (additive map-merge can't remove bad key); keep image warm-cache + 3600s timeout
The depends_on:[app] override in 04cc44c does NOT make compose valid: docker normalizes short-form
depends_on to a map and merges additively, so {discourse}+{app}={discourse,app} keeps the invalid
'discourse' key (config --images still rc=15). Reverted to keep the overlay minimal (re-pin + grace
only). Prepull-skip is harmless because bitnamilegacy/discourse:3.3.1 is warm in the node image cache
→ inline pull is a no-op. Timeout headroom (3600s) retained in recipe_meta.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 01:25:47 +00:00
04cc44c15e fix(2): discourse base-deploy timeout — prepull-enable (sidekiq depends_on app, valid compose) + 3600s timeout
full4 base deploy timed out at 2400s on the 7-GiB single node. Root causes:
(1) sidekiq.depends_on referenced undefined service 'discourse' (main svc is 'app') → abra config
    --images rc=15 → prepull SKIPPED → 2.4GB image pulled inline during deploy, eating convergence
    budget. Overlay now overrides sidekiq.depends_on:[app] (swarm ignores depends_on → no-op at
    runtime, masks nothing) so prepull resolves+pre-pulls images on both base+head deploys.
(2) bumped DEPLOY_TIMEOUT/TIMEOUT 2400→3600 for headroom on the RAM/CPU-constrained Rails cold boot.
Also pre-cached bitnamilegacy/discourse:3.3.1 by tag on cc-ci (was dangling <none>).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 01:23:38 +00:00
bcc32d997b status(2): discourse — 2 bugs root-caused (post-upgrade backup race + mint_admin ruby PATH), fixes in full4 validation 2026-05-31 00:30:15 +00:00
8d689d6c32 fix(2): discourse — mint_admin ruby PATH (bash -c + discover) + BACKUP_VERIFY for post-upgrade backup race 2026-05-31 00:28:21 +00:00