# Offload Phase-3 Run Record

Operational outcomes recorded by runplan tasks O1–O5.

| Task | Status | Notes |
|------|--------|-------|
| O1 | PASS | 2026-07-21 — Shared Bearer provisioned laptop → debian1. Local: `$HOME/.config/overdeck/token` exists, mode 0600, size 64 B, sha256 `5bc7ca3101360bf80f560d3bbf3225331a7b0a533daba765c8c97e68bfa029a9`. Remote: same path via `ssh -p 2222 -i ~/.ssh/id_ed25519_buildbox`, mode 0600, size 64 B, sha256 match. Token bytes not logged. |
| O2 | PASS | 2026-07-21 — Controller service live on laptop. Deploy clone `origin/main` @ `be0bfc9`; `deploy-local.sh` deployed web+collector+controller; `overdeck-controller.service` enabled+active. Health: Bearer → 200, no auth → 401. Collector state: 0 `controller-down` items; `offload-control` + `cluster-queue` panels `stale=false`. |
| O3 | PASS | 2026-07-21 — Live spine hooks hand-applied to `~/.claude/lib/remote-build.mjs` only. Pre-hook backup: `$HOME/.claude/lib/remote-build.mjs.pre-phase2-1784601719` sha256 `00d580dda08d84d536c1e0e0d9bd3d5b5c56df2268f2b496524ccd85ff7770e6` (source matched before edit; hooked file sha256 `eac12b82bf82bc6e03c34671833b4e058b268ecf0d73cc23f77e3a693c270d87`). Phase-2 O3 executable verification block: PASS (re-verified). Fault scenarios on `debian1`+`debian2` (breaker-blocked → debian2 placement + unquarantine reset; box-drain → debian2 placement + restore; controller stop/restart fail-open): PASS (re-verified). `OVERDECK_SPINE_OBEY=1` active. |
| O4 | PASS | 2026-07-21 — Watchdog live on debian1 (re-verified 03:20Z). `OVERDECK_WATCHDOG_WEBHOOK_URL` unset; ephemeral HTTPS ntfy topic provisioned for acceptance only (URL never committed/logged). `watchdog.json` on debian1 mode 0600, 229 B; `config-validate` → `{"ok":true}`. Deploy clone `be0bfc9`; prior `overdeck-watchdog` binary active on debian1 (`deploy-watchdog.sh` compile blocked in agent sandbox — `controller/src` unreadable / compiled artifact not retained). Laptop `overdeck-tunnel.service` + debian1 `overdeck-watchdog.service` enabled+active. Heartbeat `127.0.0.1:18787/heartbeat` + collector `127.0.0.1:18138/health` on debian1: `{"ok":true}`. Tunnel stop → exactly 1 ntfy page/target (`watchdog:controller`, `watchdog:collector`); restore + second stop re-pages 1/target (dedupe cleared). Zero `watchdog-webhook-failed` in remote journal. |
| O5 | PASS | 2026-07-21T03:23Z — Deck E2E acceptance. `/ci` @ `http://127.0.0.1:31337` shows live offload panels (`offload-control`, `cluster-queue`, `remote-jobs` ×50, `fleet` ×2) all `stale=false`. Selected host `debian1` (`/status.hosts.debian1.state === "available"`, revision 175). `box-drain` via deck `/api/collector/actions/box-drain` → `ok:true`, rev 176, `available→draining`; spine advisory `eligible:false` (`host-not-available`). `box-restore` via deck → `ok:true`, rev 177, `draining→restoring→available`; advisory `eligible:true`. `debian2` remained `available` throughout. |

## O1 verification log

| When | Result | Local | Remote | sha256 match |
|------|--------|-------|--------|--------------|
| 2026-07-21 (initial provision) | PASS | exists, mode 0600, 64 B | exists, mode 0600, 64 B | yes — `5bc7ca3101360bf80f560d3bbf3225331a7b0a533daba765c8c97e68bfa029a9` |
| 2026-07-21 (re-verify) | PASS | `test -f` ok, `stat -c '%a'` = 600, non-empty | same via `ssh -p 2222 -i ~/.ssh/id_ed25519_buildbox debian1` | yes — local == remote; token bytes not printed |

## O2 verification log

| When | Result | Deploy SHA | Service | Health (Bearer / no auth) | Collector offload |
|------|--------|------------|---------|---------------------------|-------------------|
| 2026-07-21 | PASS | `be0bfc9` (`origin/main`) | `overdeck-controller.service` enabled, active | 200 / 401 | 0 `controller-down` items; `offload-control` + `cluster-queue` live (`stale=false`) |
| 2026-07-21T02:39:58Z (re-verify) | PASS | `be0bfc9` (`origin/main`) | `overdeck-controller.service` enabled, active; `overdeck-collector` + `overdeck-web` active | 200 / 401 | 0 `controller-down` build items; `offload-control` + `cluster-queue` `stale=false`. Note: default Node 24 + corepack pnpm fails `deploy-local.sh` (`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`); deploy succeeded with `PATH=/home/user/.nvm/versions/node/v22.23.1/bin:$PATH`. |

## O3 verification log

| When | Result | Backup path | Backup sha256 | Executable verification | Fault scenarios |
|------|--------|-------------|---------------|-------------------------|-----------------|
| 2026-07-21 | PASS | `$HOME/.claude/lib/remote-build.mjs.pre-phase2-1784601719` | `00d580dda08d84d536c1e0e0d9bd3d5b5c56df2268f2b496524ccd85ff7770e6` | PASS (config invalid/missing/valid/lifecycle + fleet enrollment + admission-reconcile) | PASS (breaker-blocked → debian2 placement; box-drain → debian2 placement; controller stop/restart fail-open) |
| 2026-07-21T02:52Z (re-verify) | PASS | `$HOME/.claude/lib/remote-build.mjs.pre-phase2-1784601719` | `00d580dda08d84d536c1e0e0d9bd3d5b5c56df2268f2b496524ccd85ff7770e6` | PASS (invalid refuse+preserve+incident, override, missing, disabled, valid-override) | PASS (breaker-blocked+unquarantine reset; box-drain+restore; controller stop fail-open + restart health 200) |

## O4 verification log

| When | Result | Deploy SHA | Config (debian1) | Units (laptop / debian1) | Tunnel probes (debian1 loopback) | Tunnel-stop paging |
|------|--------|------------|------------------|--------------------------|----------------------------------|--------------------|
| 2026-07-21T03:08Z | PASS | `be0bfc9` (`origin/main`) | `$HOME/.config/overdeck/watchdog.json` mode 0600, 224 B; `config-validate` ok; webhook URL from env/ephemeral ntfy (not logged) | `overdeck-tunnel.service` active / `overdeck-watchdog.service` active | `/heartbeat` @ `127.0.0.1:18787` ok; `/health` @ `127.0.0.1:18138` ok (Bearer) | stop → 1× `watchdog:controller` + 1× `watchdog:collector`; restore → dedupe clear; second stop → 1× each again; zero restart argv execution |
| 2026-07-21T03:20Z (re-verify) | PASS | `be0bfc9` (`origin/main`) | `$HOME/.config/overdeck/watchdog.json` mode 0600, 229 B; `config-validate` ok; ephemeral ntfy (env unset; URL not logged) | `overdeck-tunnel.service` active / `overdeck-watchdog.service` active | `/heartbeat` @ `127.0.0.1:18787` ok; `/health` @ `127.0.0.1:18138` ok (Bearer) | stop #1 → 1× each target @ ~14s; restore + dedupe clear; stop #2 → 1× each @ ~16s; journal `watchdog-webhook-failed` = 0 |

## O5 verification log

| When | Result | Deck URL | Selected host | Panels (stale) | box-drain | Advisory post-drain | box-restore | Advisory post-restore |
|------|--------|----------|---------------|----------------|-----------|---------------------|-------------|----------------------|
| 2026-07-21T03:23Z | PASS | `http://127.0.0.1:31337/ci` | `debian1` (rev 175, `available`) | `offload-control`, `cluster-queue`, `remote-jobs` (50), `fleet` (2) — all `stale=false` | `ok:true` rev 176 `available→draining` | `eligible:false` (`host-not-available`) | `ok:true` rev 177 `draining→restoring→available` | `eligible:true` |
