Zum Inhalt

Static-Token-Code-Deployment auf Agent Runtime CT 259

Zweck und Grenze

agent_runtime_code_deploy.py deployt ausschließlich diese vier Python-Dateien:

  • rbac_governance.py
  • static_mcp_token_admin.py
  • lanstyle_openapi_facade.py
  • lanstyle_remote_mcp.py

Der Provider ist fest an root@10.0.0.220, Proxmox-CT 259, /opt/agent-runtime/tools und die Compose-Services lanstyle-tools-api sowie lanstyle-remote-mcp gebunden. Er akzeptiert keine frei wählbaren Hosts, VMIDs, Zielpfade, Services oder Remote-Kommandos. Die Compose-Datei wird nicht verändert.

Diese Capability provisioniert weder Secrets noch .env-Werte. Insbesondere bleibt LANSTYLE_STATIC_MCP_TOKEN_ADMIN_HMAC_KEY ein separates technisches Gate. Ein fehlender HMAC-Key wird im Receipt als separate-gate-not-ready ausgewiesen und niemals erfunden. Das Gate wird anschließend ausschließlich über den engen static-token-bootstrap.md-Provider geschlossen.

Manifest und Prestate

Das Manifest trennt Release und erwarteten Live-Prestate:

  • source_ref bleibt fest origin/main; alle vier gewünschten Dateien müssen bytegenau sowohl dem lokalen HEAD-Blob als auch dem origin/main-Blob entsprechen;
  • prestate_ref ist ein voller 40-hex Commit und liefert ausschließlich die erwarteten Prestate-Digests der vier Artefakte.

Ohne Option wird prestate_ref auf den aktuellen origin/main-Commit aufgelöst. Für ein Upgrade muss --prestate-ref explizit gesetzt werden. Der Wert muss vollständig sein, als Commit existieren und ein Ancestor von origin/main sein. Short-SHAs, Branches, Tags, unbekannte oder nicht im Release-Verlauf liegende Commits werden abgewiesen. docker-compose.yml bleibt an den Release-Stand von origin/main gebunden und wird nie verändert. Ein Live-Digest außerhalb des manifestierten Prestate stoppt vor dem ersten Write.

private_dir="$(mktemp -d)"
chmod 0700 "$private_dir"

python3 agent-runtime/tools/agent_runtime_code_deploy.py build-manifest \
  --output "$private_dir/ct259-static-token-code.json"

# Upgrade vom bereits validierten Stand 4a499fe auf Release origin/main:
python3 agent-runtime/tools/agent_runtime_code_deploy.py build-manifest \
  --prestate-ref '4a499fe8a224fb73f8e3ab298a60e8b565237a75' \
  --output "$private_dir/ct259-static-token-upgrade.json"

python3 agent-runtime/tools/agent_runtime_code_deploy.py preflight \
  --manifest "$private_dir/ct259-static-token-code.json"

preflight prüft ausschließlich lesend:

  1. CT 259 ist running;
  2. Toolverzeichnis, vier Zielzustände und Compose-Digest;
  3. beide fest gebundenen Compose-Services sind vorhanden und laufen;
  4. Tools-API-Health und authentifizierter API-Zugriff;
  5. anonymer Remote-MCP-Zugriff wird abgewiesen und ein vorhandener technischer Token authentifiziert erfolgreich.

Es werden keine Environment- oder Secretwerte ausgegeben.

Kontrollierte Ausführung

Ein Apply ist Medium Risk und benötigt eine eindeutige Benutzeranweisung für genau diesen Scope. Der Aufruf besitzt nur Manifest und Run-ID:

python3 agent-runtime/tools/agent_runtime_code_deploy.py apply \
  --manifest "$private_dir/ct259-static-token-code.json" \
  --run-id "run-code-deploy-YYYYMMDDHHMM"

Der feste Remote-Provider führt aus:

  1. erneuter Preflight;
  2. exklusiver rootverwalteter flock auf dem Proxmox-Host;
  3. Live-Prestate-Digestprüfung unter dem Lock;
  4. root-only Backups und initiales Receipt unter /var/lib/lanstyle-agent-runtime-code-deploy/runs/<runId>;
  5. pct push auf temporäre Dateien und digest-/CAS-gebundener atomarer Replace im CT;
  6. Read-after-write aller vier Dateien und unveränderte Compose-Prüfsumme;
  7. ausschließlich lanstyle-tools-api und lanstyle-remote-mcp mit --no-deps --force-recreate neu erstellen;
  8. Container-, HTTP-, API- und Auth-Verifikation;
  9. root-only Receipt ohne Secretwerte.

Fehler nach dem ersten Dateischreibvorgang lösen einen guarded Rollback aus. Bei Fremddrift wird kein fremder Stand überschrieben; der Lauf endet als failed-quarantine.

Expliziter Rollback

python3 agent-runtime/tools/agent_runtime_code_deploy.py rollback \
  --manifest "$private_dir/ct259-static-token-code.json" \
  --run-id "run-code-deploy-YYYYMMDDHHMM"

Rollback ist nur möglich, wenn Manifest-Digest, Receipt, Compose-Digest und alle vier aktuellen Poststate-Digests noch exakt zum eigenen erfolgreichen Lauf gehören. Ein im gebundenen prestate_ref nicht vorhandenes Ziel wird nur unter diesem Poststate-CAS entfernt; bestehende Dateien werden aus dem root-only Backup wiederhergestellt. Danach werden wiederum nur die beiden betroffenen Services neu erstellt und der frühere Health-/Auth-Pfad verifiziert.

Abnahme vor dem ersten Live-Write

python3 -m unittest -v agent-runtime.tests.test_agent_runtime_code_deploy
python3 -m unittest -v agent-runtime.tests.test_static_mcp_token_admin
python3 -m py_compile \
  agent-runtime/tools/agent_runtime_code_deploy.py \
  agent-runtime/tools/agent_runtime_code_deploy_remote.py

Zusätzliche Live-Gates:

  • hostgebundener SSH-Key und bekannter Hostkey für root@10.0.0.220;
  • exakter Live-Prestate entspricht dem frisch erzeugten Manifest;
  • CT 259 und beide Compose-Services sind gesund;
  • ausreichender Platz im root-only Backupverzeichnis;
  • HMAC-/Env-Provisionierung wird separat geplant und auditiert.