KB-1109

03 - Contabo Preflight & Deploy Plan (O6B)

4 min read Revision 1
dot-iu-cutterv0.6O6BG3contabopreflightdeploy-plan

03 - Contabo Preflight & Deploy Plan

O6B · doc 3 of 8 · 2026-05-21 · Gate G3 — Contabo preflight + locked deploy plan. Read-only survey; no host mutation in this gate.

1. Transfer channel (resolved — the O6 blocker is gone)

O6 was blocked because it ran on Contabo with no channel back to the Mac. O6B runs on the Mac, which has a direct outbound SSH channel:

ssh_alias:   contabo  ->  38.242.240.89   (user root, key ~/.ssh/contabo_vps)
reachable:   YES — verified read-only (hostname/uname/python)
transfer:    scp Mac -> Contabo  (artifact push)

2. Contabo host facts (read-only survey)

host:        vmi3080463   (38.242.240.89)
os:          Linux 6.8.0-90-generic x86_64
python:      3.12.3   (system)
disk /opt:   96G total, 25G available, 75% used   ✓ ample for a 176KB artifact
pytest:      ABSENT  (ModuleNotFoundError)  -- see deploy-plan test note
psycopg2:    2.9.11  present
psycopg3:    absent

3. v0.4 pre-state anchor (must be unchanged after deploy)

v0.4_path:        /opt/incomex/dot/iu-cutter
v0.4_version:     "0.4.0-dryrun-skeleton"
v0.4_tree_sha256: be65de80f6632edbe51f13c59975376c936b2ac12cb8e86577a4c15c0ea173b3
  (sha256 of: find iu-cutter -type f | sort | xargs sha256sum | sha256sum)
dot_repo_HEAD:    e93424b   (/opt/incomex/dot is a git repo)
dot_repo_status:  clean for iu-cutter/ (0 changed lines)

4. Target path — confirmed clean

target:                  /opt/incomex/dot/iu-cutter-v0.6
target_pre_exists:       NO  ("ls: cannot access ... No such file or directory")
conflicting_v0.6_paths:  NONE (find /opt /tmp -name '*iu-cutter-v0.6*' -> empty)
/opt/incomex/dot writable: YES
/tmp writable (staging):   YES

5. Locked deploy plan (executed in G4)

strategy:     side-by-side, non-destructive (per O6 doc 03 decision)
staging:      scp artifact -> /tmp/iu-cutter-v0.6-6625f76.tar.gz
              extract -> /tmp/o6b-stage/iu-cutter-v0.6/
promote:      mv /tmp/o6b-stage/iu-cutter-v0.6 -> /opt/incomex/dot/iu-cutter-v0.6
              (same filesystem /dev/sda1 -> atomic rename)
manifest:     write DEPLOY-MANIFEST.txt inside the target dir
v0.4:         left in place, untouched
service:      none installed, none started, none restarted
kill_switch:  execution_enabled stays False

6. Test-strategy decision (pytest absent on Contabo)

finding:   Contabo system python has no pytest module.
decision:  do NOT install pytest (would be a host mutation outside the
           deploy dir). All 21 test files are unittest.TestCase-based, so
           the stdlib runner covers the full suite:
               python3 -m unittest discover -s tests -p 'test_*.py'
           Verified on the dev Mac: "Ran 366 tests / OK".
           This is the G5 test path on Contabo — no new dependency needed.

7. Rollback plan (defined BEFORE any host write)

# removes ONLY what O6B creates; v0.4 is never touched:
rm -rf /opt/incomex/dot/iu-cutter-v0.6
rm -f  /tmp/iu-cutter-v0.6-6625f76.tar.gz
# no service to stop; no DB change; no .env change; no git change

8. Result

G3_verdict:  PASS — preflight clean, deploy plan locked, rollback pre-defined
proceed_to:  G4 transfer + deploy side-by-side
Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-o6b-devhost-deploy-postdeploy-smoke/03-contabo-preflight-and-deploy-plan-2026-05-21.md