Autonomous run dashboard

Run summary

Started
2026-04-29
Outcome
VERIFIED — 8 of 8 PASS
Total wall-clock
~150 min (initial run + halt + resumed run + hotfix + PLATFORM-37 + PLATFORM-38)
Tickets attempted
7 implementation + 1 dashboard + 1 hotfix (PLATFORM-25.1)
Passed
9 (PLATFORM-25 / 25.1 / 26 / 27 / 29 / 31 / 33 / 37 / 38)
Failed
0
Tests
329 → 529 (+200)

Per-ticket cards

PLATFORM-38 PASS
Status
Complete
Commit
c9de914
ACs
6 / 6 verified (real-VPS basicauth round-trip via mock harness; live-VPS path fits the existing PLATFORM-37 mock contract)
BasicAuth enforcement variant lights up end-to-end. New secret_put_bcrypt RPC bcrypt-hashes the plain password in-process at cost 14 (CF Access default), drops the SecretString before any further async work, stores the hash as Secret::BcryptHash { hash, cost }, and yields exactly BcryptStored { secret_key } on the event stream — plain password never serializes, never logs, never round-trips through describe/reveal. Caddy renderer's Enforcement::BasicAuth arm now emits basicauth { operator $2a$14$… } with optional realm; bcrypt hash comes from a BasicAuthSecrets map the orchestrator pre-resolves from the SecretStore (renderer stays sync). New [site.protect] TOML section parses into the existing Enforcement tagged enum. backend_add_from_repo for a BasicAuth-protected backend pre-flights the secret at config_load — wrong variant or missing surfaces BackendRollback with a clear secret_put_bcrypt --tenant {} --secret-key {} remediation hint, BEFORE any image build / DNS / Caddy work. CaddyDeployer::deploy trait widened to take the secret map; all three call sites (add, rollback strip, remove) updated. 4 new builder tests + 2 config tests + 2 hub tests + 3 integration tests in tests/backend_basic_auth.rs; render_basic_auth_never_contains_plain_password_substring + happy_path_renders_basic_auth_block_with_hash_and_never_plain pin the no-leak contract. 519 → 529 (+10), all green.
PLATFORM-37 PASS
Status
Complete
Commit
bf93648
ACs
7 / 7 in-scope (real-VPS reload deferred per HARD STOP — verified end-to-end via MockCaddyDeployer)
Backend deploys land behind Caddy. backend_add_from_repo's phase chain extends to ... -> UnitCreated -> CaddySiteAdded -> HealthCheckProbing -> BackendDeployed; backend_remove strips the Caddy site block FIRST, then stops the container, then drops DNS. Per-VPS tokio::sync::Mutex at the orchestrator level serializes concurrent backend adds against the same VPS so the read-modify-write of the persisted CaddyDeploymentRecord stays consistent. New BackendStatus::BehindCaddyOnVps { vps, hostname } variant; new LocalPlatform::{put,get,remove}_caddy_deployment accessors (state file schema bumped v5 -> v6); new BackendEvent variants CaddySiteAdded / CaddySiteRemoved / EnforcementVariantNotImplemented / RemoveStepFailed. Enforcement::None is the only V1 variant; BasicAuth/CfAccess/PomeriumOnVps emit a clear "not yet implemented in PLATFORM-37" event and refuse to add (PLATFORM-38/34/35 land them). 5 new integration tests in tests/backend_caddy_lifecycle.rs + 5 unit tests for status round-trip + caddy state persistence. 509 -> 519 (+10), all green.
PLATFORM-8 PASS
Status
Complete
Commit
03ad2ca + e8104c7
ACs
8 / 9 in-scope; real-apply path deferred to INFRA-5 per HARD STOP (no money spent)
vps_provision + vps_destroy streaming RPCs against the INFRA-2 hetzner-vps OpenTofu module: VpsProvisionInit -> TofuInitStarted -> SshKeyEnsured -> TofuPlanCompleted -> TofuApplyProgress* -> TofuApplyCompleted -> VpsRegistered -> VpsProvisioned. New TofuRunner trait + HetznerSshKeyBootstrap + typed VpsRecord persisted by LocalPlatform (schema bumped v4 -> v5). Apply-failure rolls back via reverse-LIFO: emits VpsProvisionRollback + drives a tofu destroy cleanup so we never leave paid-for cloud resources without state. Idempotent re-run short-circuits with VpsAlreadyExists. 7 integration tests + 35 unit tests, all green via MockTofuRunner + MockHetznerSshKey.
PLATFORM-43 PASS
Status
Complete
Commit
506dd0d
ACs
4 / 5 verified; AC1 (real-ghcr push) deferred per HARD STOP (no live registry pushes)
image_push streaming RPC ships local OCI images to a remote registry: ImagePushInit -> AuthCaptured -> TagApplied -> PushStarted -> PushProgress -> PushCompleted (or ImageAlreadyPushed when remote already carries the same digest). Sibling to OciBuildExecutor; new OciImagePusher trait + LocalPodmanImagePusher + MockImagePusher. Auth pre-flight reads X-OAuth-Scopes from api.github.com/user; missing write:packages raises typed error with gh auth refresh remediation. 19 new tests (14 unit + 5 integration), all green.
PLATFORM-42 PASS
Status
Complete
Commit
ddb71f4
ACs
5 / 6 in-scope; AC2 (real-VPS install) deferred to INFRA-5 dogfood per ticket constraint
nixos_install streaming RPC wraps nixos-anywhere: init -> preflight -> flake_build -> kexec -> partition -> copy -> install -> reboot -> reachable -> completed. Idempotent re-run on already-NixOS short-circuits with idempotent: true. --validate-only emits FlakeBuilt + NixosReachable, no destructive ops. 24 new tests (16 unit + 8 integration), all green via MockNixosAnywhereRunner / MockSshExecutor / MockReachabilityProbe.
PLATFORM-25 PASS (after hotfix)
Status
Complete
Commit
f9db273 + 4db6a61
ACs
10 / 10 verified
Originally failed Phase 4 on namecom credential shape. Unblocked by PLATFORM-25.1 hotfix; all three registrar calls now pass against real name.com.
PLATFORM-25.1 PASS
Status
Complete
Commit
4db6a61
ACs
6 / 6 verified
Sibling-file convention for namecom credentials. namecom-username + namecom-token as separate files, matching every other provider. Legacy combined-line still works.
PLATFORM-27 PASS
Status
Complete
Commit
815dae8
ACs
9 / 9 verified
Redacted-by-default serde for SecretString + secret_describe / secret_reveal RPCs. Adversarial probe confirmed wire never carries token bytes without --confirm-reveal.
PLATFORM-31 PASS
Status
Complete
Commit
88b3d81
ACs
7 / 7 in-scope; AC8 deferred to PLATFORM-29
site_remove now does full provider teardown (detach domain → delete project → delete DNS → mark Removed). End-to-end verified: deploy throwaway → remove → 200→530 → project 404 → DNS empty.
PLATFORM-29 PASS
Status
Complete
Commit
9efd527
ACs
9 / 9 verified
38 httpmock wire-shape tests for CF Pages + DNS providers. Three regression-killer pins (GET upload-token, missing zone_id, apex CNAME full-domain). Zero production impl changes.
PLATFORM-26 PASS
Status
Complete
Commit
f535d1b
ACs
10 / 10 verified
14 identifier newtypes validate at boundary. Live shell-injection probe — --tenant "foo; rm -rf /" — returns typed validation error, no shell exec. BackendName::new_unchecked deleted with Option<BackendName> widening.
PLATFORM-36 PASS
Status
Complete
Commit
4266fd1
ACs
5 / 7 verified; AC5 state-store integration picked up + landed in PLATFORM-37; AC7 deferred (inline module docs cover the shape)
Caddy reverse-proxy module — typed CaddyConfigBuilder + CaddyDeployer trait + LocalCaddyDeployer with SSH-driven upload, atomic swap, systemctl reload caddy, and .bak rollback on reload failure. Enforcement enum closed at definition (None renders today; BasicAuth/CfAccess/PomeriumOnVps error cleanly with EnforcementVariantNotImplemented for PLATFORM-34/35/38). 22 caddy tests + live caddy validate when on PATH. 412 → 436 tests.

Non-obvious wins from the run

Live-site canaries

Checked at build time (2026-04-29T20:15Z) via curl -s -o /dev/null -w "%{http_code}" <url>.

URLHTTP statusResult
https://hypermemetic.ai200OK
https://c2c.hypermemetic.ai200OK
https://www.hypermemetic.ai200OK
https://changelog.hypermemetic.ai200OK

Most-recent update

SHA
c9de914
Subject
PLATFORM-38: BasicAuth enforcement variant — secret_put_bcrypt + Caddy basicauth render
Author
Ben Haware
Timestamp
2026-04-29 22:00 -0400