trading-system-docs/red-queen-architecture/control-plane/cp2a2_2b/worker-tick.sh

60 lines
2.5 KiB
Bash

#!/bin/sh
# CP2A2.2B — L1 Red Queen Worker: Tick-Wrapper (DEFINIERT, NICHT AUTOMATISCH AUSGEFUEHRT)
# STRICTLY NON-AUTONOMOUS / NON-PRODUCTIVE.
#
# Dieser Wrapper fuehrt EINEN einzelnen `hermes -z` oneshot aus.
# Er wird in CP2A2.2B NICHT automatisch gestartet (kein Scheduler, kein Loop).
# Er dient als technische Foundation fuer spaetere Read-only-Autonomie:
# externer Scheduler -> Gate-Evaluator /check -> ALLOW -> worker-tick.sh
#
# WICHTIG: In CP2A2.2B wird dieser Wrapper NUR als Datei bereitgestellt.
# Er wird NICHT vom Entrypoint, NICHT von cron, NICHT von einem Loop aufgerufen.
# Kein autonomer Tick darf in dieser Phase laufen.
set -eu
# --- Gate-Evaluator /check (read-only, keine Mutation) ---
# Der Gate-Evaluator (CP2A1) entscheidet fail-closed. Aktuell:
# GLOBAL_AUTONOMY=OFF, PRODUCTIVE_MUTATIONS=OFF, SAVE=OFF, DELETE=OFF,
# EMERGENCY_STOP=ON -> AUTONOMOUS_TICK_START = DENY
# Daher muss jeder produktive Tick-Start weiterhin DENY ergeben.
# KEIN State aendern, um ALLOW zu testen.
GATE_URL="${GATE_EVALUATOR_URL:-http://gate-evaluator:8080}"
ACTION_CLASS="AUTONOMOUS_TICK_START"
echo "[l1-worker] Gate-Check (read-only): ${GATE_URL}/check action_class=${ACTION_CLASS}"
# Read-only HTTP-Check via Python (kein curl im Image noetig, kein Shell-Egress).
# Der Worker hat KEINE mutierenden Credentials; der Check ist rein lesend.
GATE_RESPONSE=$(python3 - <<PYEOF
import json, urllib.request
try:
req = urllib.request.Request(
"${GATE_URL}/check",
data=json.dumps({"action_class": "${ACTION_CLASS}"}).encode(),
headers={"Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(req, timeout=10) as resp:
body = resp.read().decode()
print(body)
except Exception as exc:
print(json.dumps({"error": str(exc), "decision": "DENY"}))
PYEOF
)
echo "[l1-worker] Gate-Response: ${GATE_RESPONSE}"
# Fail-closed: Nur bei explizitem ALLOW wuerde ein Tick laufen.
# In CP2A2.2B ist das Gate DENY (EMERGENCY_STOP=ON), daher KEIN Tick.
DECISION=$(echo "${GATE_RESPONSE}" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('decision','DENY'))" 2>/dev/null || echo "DENY")
if [ "${DECISION}" = "ALLOW" ]; then
echo "[l1-worker] WARNUNG: Gate ALLOW — aber CP2A2.2B ist NON-AUTONOMOUS. Tick wird NICHT ausgefuehrt."
echo "[l1-worker] Autonome Mission Execution ist in dieser Phase verboten (HARD STOP)."
exit 0
fi
echo "[l1-worker] Gate-DECISION=${DECISION} (fail-closed). Kein autonomer Tick in CP2A2.2B."
exit 0