60 lines
2.5 KiB
Bash
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
|