Commit Graph

203 Commits

Author SHA1 Message Date
4a6d6cf4bf review(1d): G4 PASS + FINAL sign-off — DG1-DG8 all Adversary cold-verified, NO VETO
DG6 cold-verified with my OWN !testme (build 154, not the Builder's #153): poller triggered <60s
(comment 13752), !testmexyz (13754) triggered nothing, all 4 tiers GENERIC e2e, per-op report
install/upgrade/backup/restore=pass custom=skip, deploy-count=1, clean teardown, PR comment  passed.
DG7 clean (no softened/skip/xfail; DRY shared harness; teardown always; F1d-1+F1d-2 resolved). DG8
docs/testing.md complete+accurate. Secret-leak grep (incl. wildcard PRIVATE KEY) on build 154 log +
dashboard = ZERO. Non-member rejection confirmed by code (no live account; Phase-1 carry-forward).

DG1-DG8 all PASS <24h, F1d-1+F1d-2 CLOSED, no VETO — Builder cleared to write ## DONE.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 02:25:02 +01:00
b10daddbef status(1d): DG6 GREEN (build #153 hedgedoc e2e); G4 CLAIMED — requesting Adversary cold-verify DG1-DG8
All checks were successful
continuous-integration/drone Build is passing
build #153: !testme on unconfigured hedgedoc PR#1 -> bridge <60s -> all tiers generic ->
per-op install/upgrade/backup/restore=pass custom=skip, deploy-count=1, clean teardown,
PR comment reflected. DG7 (afd75a4) + DG8 (b756e72) done.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 02:15:25 +01:00
7c0f0edcb8 status(1d): G4 — DG7 migration + DG8 docs done; DG6 !testme e2e in flight (build #153, hedgedoc)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 02:12:28 +01:00
8262912015 feat(1d): enroll hedgedoc in bridge POLL_REPOS (DG6 unconfigured-recipe target)
All checks were successful
continuous-integration/drone Build is passing
hedgedoc mirrored to recipe-maintainers/hedgedoc with probe PR #1; add it to the bridge poll list so
!testme triggers the full generic suite (no cc-ci/repo-local overlay -> pure generic). Rebuild pending.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 01:47:29 +01:00
b756e72cc2 docs(1d): DG8 — docs/testing.md (generic suite + overlay convention + install-steps hook); update enroll-recipe.md to the deploy-once contract; README pointer
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 01:35:16 +01:00
afd75a48db feat(1d): migrate keycloak/cryptpad/matrix-synapse/n8n/lasuite-docs overlays to deploy-once contract (DG7)
Mechanical port to the assertion-only contract (no softened/skipped assertions): install uses
live_app + generic.assert_serving (extend) + the recipe's http/playwright/api checks; upgrade seeds
its data marker then generic.do_upgrade + asserts survival; backup/restore split into test_backup.py
(seed->do_backup->mutate) + new test_restore.py (do_restore->assert original). Recipe-specifics
preserved verbatim (keycloak realm+admin-console+kc_admin, matrix/lasuite db-service psql markers,
cryptpad/n8n volume markers). No recipe now double-deploys under the deploy-once orchestrator.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 01:32:53 +01:00
9b5bcff92a review(1d): G3 PASS — install-steps hook + graceful-generic + DG3 N/A-skip
Cold my clone @ce3c0f8 (has G3 files), both directions: custom-html-tiny install FAILS gracefully
without install_steps.sh (404, per-op, deploy-count=1) and PASSES with it (hook seeds index.html).
DG3 N/A-skip confirmed: non-backup-capable => backup/restore skip while install/upgrade pass. Move
-assertion robust to image-identical version bump (1.0.0->1.0.1, same image 2.38.0, label moved).
Clean teardown. DG5 PASS. Only G4 (DG6/DG7/DG8) remains, not yet claimed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:26:18 +01:00
4425cc6429 status(1d): G2 Adversary PASS @2026-05-28 (DG4/DG4.1); .drone.yml STAGES -> full generic suite
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:23:27 +01:00
ce3c0f8e7f review(1d): G2 PASS — overlays override+extend, deploy-count=1, precedence proven
Cold my clone @c965f6c: unit tests 5/5 (precedence repo-local>cc-ci>generic + no-overlay=>generic);
full custom-html lifecycle shows all 4 TIER lines as (cc-ci: ...) overlays — override LIVE — all
green with data-continuity (upgrade-survives marker; backup original->mutate->restore->original);
deploy-count=1 (no redeploy); clean teardown. DG4+DG4.1 PASS. G3 (DG5) verification next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:22:09 +01:00
e0a0132360 status(1d): G1 Adversary PASS @2026-05-28 (DG2/DG3); F1d-1+F1d-2 closed
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:20:28 +01:00
44c513e83f feat(1d): G3 — custom install-steps hook + graceful-generic (DG5) + DG3 N/A-skip demo
tests/custom-html-tiny/install_steps.sh seeds content into the volume pre-deploy. Proof: install
FAILS without the hook (404, graceful-generic), PASSES with it. Same run shows backup/restore=skip
(custom-html-tiny non-backup-capable) — DG3 N/A-skip. deploy-count=1. recipe_meta shortens timeouts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:19:48 +01:00
b5c1faffea review(1d): G1 PASS (re-claim) — F1d-2 fixed, upgrade non-vacuous (verified both ways)
Cold my clone @c965f6c: genuine prev->target MOVES (deploy 3.0.9->image 1.10.7; upgrade->1.10.8;
version label changed) AND a no-op upgrade now RAISES 'did not move'. DG2 non-vacuous +
regression-locked; DG3 genuine. Closed F1d-2. G2 (custom-html overlays) verification in progress
(unit tests 5/5; full overlay lifecycle pending — Builder run in flight on the node, waiting).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:18:22 +01:00
c965f6cc9a status(1d): re-claim G1 (DG2 non-vacuous after F1d-2 fix) + claim G2 (DG4/DG4.1 overlay layering)
custom-html overlays override+extend the generic for all 4 ops, data-continuity round-trips,
deploy-count=1, clean teardown. Discovery precedence unit tests 5/5. hedgedoc generic lifecycle
green with genuine 1.10.7->1.10.8 upgrade (move-assertion).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:12:39 +01:00
b758767830 fix(1d): custom-html backup/restore overlay reads marker via exec (volume-direct)
http_fetch raced the serving layer right after backup-bot cycled the app container (served '' for a
moment). Backup/restore preserve the VOLUME, so read the marker in-container via exec_in_app — correct
and race-free. Serving is proven separately by install/upgrade assert_serving.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:10:35 +01:00
feb6f80d50 fix(1d): bounded retry in _app_container (backup briefly cycles the app container)
abra app backup create (backup-bot-two) stops/cycles the app container, so a mutate exec_in_app
right after backup hit an empty docker ps and raised. _app_container now polls (no bare sleep) for
the container to reappear within a timeout. Recipe-agnostic harness robustness.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:06:28 +01:00
81e26a1bdc fix(1d): F1d-2 — pinned base deploys the pinned version; upgrade is non-vacuous
- deploy_app: checkout the pinned tag + deploy NON-chaos when a version is pinned (chaos only for
  version=None / PR-head). Was always -C, which ignored the pin and deployed LATEST -> upgrade no-op.
- do_upgrade: assert the deployment actually MOVED (coop-cloud version label and/or image changed)
  via lifecycle.deployed_identity -> a vacuous no-op upgrade can no longer pass (DG2).
- G2: migrate custom-html overlays to the assertion-only contract (override + extend-by-composition
  + data-continuity; split backup/restore). tests/unit/test_discovery.py proves precedence (5/5).

Probe (Adversary's F1d-2 test): hedgedoc deploy-prev=1.10.7 -> upgrade=1.10.8, CHANGED=True.
hedgedoc full generic lifecycle green (install/upgrade/backup/restore, deploy-count=1).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:02:59 +01:00
1aea1541a7 review(1d): G1 FAIL — DG2 upgrade is a vacuous no-op (base deploys LATEST, not previous)
Cold-verified my own clone @9d771a1. Full lifecycle runs green + deploy-count=1 + clean
teardown, and DG3 backup/restore mechanism is genuine — BUT DG2 is vacuous:
deploy_app(version='3.0.9+1.10.7') runs hedgedoc:1.10.8 (LATEST), upgrade->newest is
latest->latest (CHANGED:False; upgrade tier finished in 1.97s). Root cause: abra app new
<version> positional does not check out the tag — recipe dir stays at HEAD 3.0.10+1.10.8.
The still-serving-only assertion can't catch it. Filed F1d-2 (HIGH, blocks G1); Builder must
pin the base version for real + assert the version actually changes prev->target, then re-claim.

Also closed F1d-1: cert-check reframe (6c5d8f2) verified honest. No global VETO (DONE far off).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:49:23 +01:00
9d771a125d status(1d): G1 CLAIMED — DG2+DG3 green on hedgedoc full lifecycle (deploy-count=1)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:41:11 +01:00
6c5d8f28ea fix(1d): G1 backup/restore + F1d-1 cert-check reframe
- backup artifact: read snapshot_id from 'abra app backup create' output (snapshots needs a TTY);
  generic.parse_snapshot_id + do_backup assert it
- restore serving race: lifecycle.http_fetch (one request -> status+body, never raises) +
  assert_serving is now a bounded poll (settles a post-op reconverge, no bare sleep); drop wait_serving
- F1d-1 (Adversary, low): reframe served_cert/assert_serving honestly as an INFRA TLS sanity check
  (catches a lapsed/mis-rotated wildcard cert), NOT app-vs-fallback (Traefik serves the wildcard
  zone-wide); the genuine serving proof is services_converged + non-404 status. Awaiting re-test.

DG1 Adversary PASS @ef44d46. G1 full-lifecycle re-verification in flight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:39:45 +01:00
a8f78b8673 review(1d): G0/DG1 PASS — generic install green on hedgedoc, cold-verified from my own clone @ef44d46
install:pass + deploy-count=1 + clean teardown (only 5 infra stacks remain, no orphans).
Serving assertion proven load-bearing: assert_serving RAISES on a non-deployed domain
(services not converged; 404 excluded from HEALTH_OK). Pure-generic confirmed (hedgedoc has
no cc-ci/repo-local tests). No VETO — Builder cleared past G0.

Filed F1d-1 [adversary] (low, DG7-scoped, NOT a DG1 blocker): served_cert is a near-no-op —
VERIFIED for any in-zone subdomain incl. non-deployed (Traefik serves the wildcard for the
whole zone), so it does NOT distinguish app-vs-fallback as journal/STATUS/code claim. Fix
wording/check before the DG7/G4 gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:36:42 +01:00
ef44d4658b feat(1d): G0 — generic install + deploy-once orchestrator (DG1 green on hedgedoc)
- harness/generic.py: recipe-agnostic assert_serving (converged + real HTTP, 404-excluded +
  not Traefik 404 body + CA-verified trusted wildcard cert), op helpers, backup_capable detect
- harness/discovery.py: per-op overlay resolution (repo-local > cc-ci > generic), custom + hook
- tests/_generic/: assertion-only tiers (install/upgrade/backup/restore) on the shared deployment
- run_recipe_ci.py: deploy-ONCE orchestrator, per-op summary, deploy-count guard (DG4.1)
- conftest live_app fixture; lifecycle deploy-count + install-steps hook + pin DOMAIN to run domain

DG1 cold-verified green on hedgedoc (pure generic, deploy-count=1, clean teardown). G0 CLAIMED.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:27:55 +01:00
a31095a087 status(1d): bootstrap Phase 1d — design recorded (tier model, override precedence, deploy-once), state files seeded
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:06:38 +01:00
6300cba503 review(1d): open Phase-1d Adversary ledger — cold access OK, IDLE awaiting first gate (G0/DG1)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:00:49 +01:00
82c8220434 ## DONE — Phase 1b complete: RL1-RL6 all Adversary-PASS <24h, no VETO (lint/format + nix/ + machine-docs/ refactor, D1-D10 re-verified cold, nothing weakened)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:57:44 +01:00
8e0f0cbc7d review(1b): RL6 PASS + Adversary FINAL SIGN-OFF — git mv my REVIEW*.md → machine-docs/ (lockstep; Builder moved theirs in 992d87c, README stays root). Watchdog survived (resolve_state prefers machine-docs/; it pinged me from machine-docs/STATUS-1b.md). Refs re-verified (README+install.md updated; no .drone/flake/scripts refs; closure byte-identical 8i3jcad9 unaffected). ALL RL1-RL6 Adversary-PASS, no VETO — Builder cleared to write ## DONE 2026-05-27 22:56:25 +01:00
7545bf20b3 status(1b): claim RL6 gate (CLAIMED, awaiting Adversary) so the watchdog pings — REVIEW* move + re-verify
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:53:03 +01:00
992d87cfcd refactor(1b): RL6 — move Builder protocol files into machine-docs/ (README stays root)
git mv STATUS*/BACKLOG*/JOURNAL*/DECISIONS.md -> machine-docs/. README.md kept at root (operator
decision). Updated in-repo refs: README (status line + lint section + Loop-state section) and
docs/install.md -> machine-docs/...

Safe to move now: launch.sh already has resolve_state() (prefers machine-docs/ else root) used by
every STATUS/REVIEW read, and the running watchdog (pid 133191) was restarted AFTER that update, so
it is location-agnostic. scripts/lint.sh -> lint: PASS post-move. Adversary moves its own REVIEW*.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:35:30 +01:00
ffb1c98225 status(1b): RL3 FULL D1-D10 PASS (no VETO); flag orchestrator — ready for RL6 coordinated machine-docs/ cutover
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:09:29 +01:00
53efd54983 review(1b): RL3 PASS — full cold D1-D10 re-verify on the byte-identical cleaned closure, NOTHING weakened. 2 fresh green e2e (custom-html #151 + keycloak #152 SSO/DB, all 3 stages, upgrade ran); D6 leak test clean (8/8 infra + wildcard cert/key + generated keycloak admin pw = 0 in logs/dashboard; white-box secret_generate captured-never-printed); teardown no orphans; byte-identical rebuild=D8. D10 2-fresh + Phase-1 6/6 carry-forward. RL1-RL5 all Adversary-PASS, no VETO — only RL6 (coordinated machine-docs/ move) before DONE; ready for lockstep cutover 2026-05-27 22:07:46 +01:00
e58b69d16f docs(1b): record the tests/_template deviation (enroll=copy-existing-recipe) per Adversary RL3/D5 advisory
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:43:15 +01:00
9bfd6f2ad3 review(1b): RL3 fresh e2e #1 (custom-html #151) — D1(20s trigger)/D2(install+upgrade+backup green, upgrade ACTUALLY RAN)/D3(playwright)/D7(PR comment+dashboard)/D6-infra(0 secret matches) all PASS on the byte-identical cleaned closure. D6 app-secret watch-item RESOLVED white-box (secret_generate output captured, never printed); keycloak e2e #2 in flight for behavioral confirm. D5/D8/D9 PASS; D10 breadth carry-forward + 2 fresh runs; D4 byte-identical carried 2026-05-27 21:42:26 +01:00
41c6571895 review(1b): RL3 live !testme e2e in flight — triggered custom-html PR#2 @20:33:16Z (comment 13743, bot=org-member); watching trigger latency (D1) + install/upgrade/backup stages (D2-D4) + run URL (D7) on the byte-identical cleaned closure; D6 leak test to follow on this run's logs/dashboard. Noted: push→Drone webhook flaky (no push build for 1b commits) — RL1 advisory
All checks were successful
continuous-integration/drone Build is passing
2026-05-27 21:34:24 +01:00
f033139aca review(1b): RL3 D8+RL5 byte-identical cold rebuild PASS — fresh recursive clone on cc-ci → nixos-rebuild build git+file://...?submodules=1#cc-ci → toplevel 8i3jcad9==running (build==running). Confirms reproducibility survived format+nix/ refactor; secrets genuinely from submodule (no-submodule build fails). RL3 remaining: live !testme e2e + D6 leak test + D5/D9/D10 refresh
All checks were successful
continuous-integration/drone Build is passing
2026-05-27 21:31:38 +01:00
aa120d10d0 review(1b): RL2 PASS (no blocking §3 findings) + RL5 structural PASS (nix/ layout, flake at root, #cc-ci unchanged, no dangling refs) + RL3 cardinal-rule PASS (tests NOT weakened — diff 6d2bc3d..HEAD is ruff line-wrapping only, all assertions/operators/values preserved, no skip/xfail added). cc-ci running==8i3jcad9, healthy, 5 stacks. RL3 byte-identical cold rebuild + e2e + leak test next 2026-05-27 21:28:04 +01:00
bbfa915925 journal(1b): push-webhook diagnostic — inbound gateway delivery not reaching Drone (operator/gateway, §9); recipe-CI polling unaffected
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:25:11 +01:00
c4b816683d status(1b): RL2 clean + RL5 done + canonical switched to cleaned closure (build==running 8i3jcad9); claim RL3 gate
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:23:16 +01:00
433ec9de30 refactor(1b): RL5 — consolidate Nix code under nix/ (modules->nix/modules, hosts->nix/hosts)
flake.nix/flake.lock STAY at root so the build ref #cc-ci is unchanged; only flake's internal
configuration.nix path updated. Root-relative refs inside moved modules re-based ../X -> ../../X
(secrets/bridge/dashboard); configuration.nix's ../../modules imports unchanged (both dirs under nix/).
Living docs (README, architecture/install/secrets/enroll) + .drone.yml comment updated to nix/...;
append-only history logs left as-is. DECISIONS.md records RL5 + the deferred-coordinated RL6.

Verified on cc-ci: nixos-rebuild build 'path:#cc-ci' -> toplevel 8i3jcad9 (BYTE-IDENTICAL to the
pre-move build — store derivations are content-addressed on file contents, module .nix not in the
runtime closure); scripts/lint.sh -> lint: PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:19:09 +01:00
5a811e4ae4 review(1b): acknowledge operator RL5+RL6 (plan §7) as new blocking items. RL5 (nix/ folder consolidation) verification folds into RL3 cold byte-identical rebuild; RL6 (machine-docs/ move) is coordinated near-end-of-1b — REVIEW*.md are my files, I keep writing at root until the lockstep watchdog cutover then git mv my own. DoD now RL1–RL6 2026-05-27 21:13:19 +01:00
12e1336d2a review(1b): white-box §3 pass #2 (RL2 input) — harness DRY PASS (no harness surgery), architecture-matches-plan PASS (poll-primary §4.1, real traefik recipe §4.2), Nix idempotent/no-sentinels PASS, log-redaction real for infra secrets. No blocking findings; 2 advisories (old_app copy-paste→IDEAS; generated-app-secret redaction→RL3/D6 watch-item) 2026-05-27 21:08:53 +01:00
938f312345 review(1b): W0/RL1 PASS logged; W1 Builder §3 self-review — all blocking invariants hold, no fixes; await Adversary RL2 pass #2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:06:57 +01:00
1237d29899 review(1b): W0 PASS (RL1) — lint/format tooling verified COLD on cc-ci over pristine archive of 233939a: nix develop .#lint → lint: PASS exit 0 (8 linters clean); stage wired in .drone.yml; break-it probe confirms FAIL exit 1 on injected violations (gate has teeth). Advisory: confirm push→Drone actually fires lint stage at RL3 (webhook flaky per §4.1) 2026-05-27 21:04:40 +01:00
8e1b9ee932 docs(1b): README — how to run lint/format locally + that CI enforces it (RL4)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:01:25 +01:00
233939a58b docs(1b): record W0 lint decisions (DECISIONS) + claim W0 gate (STATUS/JOURNAL)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:00:31 +01:00
4af427c01e ci(1b): add lint stage to .drone.yml push pipeline — enforces format/lint on every commit (RL1)
Some checks failed
continuous-integration/drone Build is failing
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 20:53:08 +01:00
2cede01ed7 style(1b): auto-format + lint-clean the whole codebase (RL1)
Mechanical, semantics-preserving cleanup so the codebase passes the new lint stage:
- ruff format: all 32 Python files (wraps long signatures, normalizes quotes/blank lines).
- nixpkgs-fmt: modules/drone-runner.nix.
- shfmt (-i 2 -ci): scripts/*.sh.

Lint fixes (reviewed, behavior-preserving — no test weakened):
- ruff SIM105: try/except-pass -> contextlib.suppress (abra.py app_config rm; lifecycle.py janitor).
- ruff SIM115: open().read() -> with open() (run_recipe_ci.py redaction-values + gitea-token).
- statix: merge repeated sops `secrets.*` keys into one `secrets = { ... }` (comments kept);
  empty fn pattern `{ ... }:` -> `_:` (packages.nix).
- deadnix: drop unused lambda args (flake `self`; configuration.nix `lib`; overlay `final` -> `_`).

Verified on cc-ci: `scripts/lint.sh` -> lint: PASS; nixosConfigurations.cc-ci evaluates;
all Python byte-compiles. The deployed bridge/dashboard/runner source changes hash (reformat),
so cc-ci will be rebuilt to the new closure in W2 before the cold D1-D10 re-verification.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 20:52:05 +01:00
a0ea2f0aa9 fix(1b): merge devShells.${system} into one attr (dynamic-attr collision) 2026-05-27 20:43:48 +01:00
07952c0383 fix(1b): remove duplicate nixosConfigurations.cc-ci in flake (broke eval) 2026-05-27 20:43:17 +01:00
f1438eb8c9 fix(1b): lint.sh excludes the secrets/ submodule (correct path) 2026-05-27 20:42:06 +01:00
a74925bf7d review(1b): phase-1b Adversary ledger seeded; white-box §3 prep pass #1 over post-1c baseline — tests real, no sentinels, no committed secrets, sleeps are poll intervals, teardown verified. Awaiting Builder to seed 1b state + claim W0 2026-05-27 20:41:30 +01:00
1de0885e2d feat(1b): add lint/format toolchain — lint devshell + scripts/lint.sh + ruff/yamllint config 2026-05-27 20:40:50 +01:00