[object Object]

← back to Ticket System

Enforce zero-cost DTD in overnight runner

2dd811a25d69ba05b80cefc6f4feacc2ad7d34df · 2026-09-02 23:34:31 -0700 · Steve Abrams

Files touched

Diff

commit 2dd811a25d69ba05b80cefc6f4feacc2ad7d34df
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 2 23:34:31 2026 -0700

    Enforce zero-cost DTD in overnight runner
---
 scripts/codex-yoloforever-prompt.md |  2 +
 scripts/codex-yoloforever.sh        |  2 +-
 test/yoloforever-zero-cost-dtd.sh   | 85 +++++++++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/scripts/codex-yoloforever-prompt.md b/scripts/codex-yoloforever-prompt.md
index 5935ca71..61c34bc2 100644
--- a/scripts/codex-yoloforever-prompt.md
+++ b/scripts/codex-yoloforever-prompt.md
@@ -1,5 +1,7 @@
 You are one bounded cycle of Steve's unattended `/yoloforever` open-ticket loop. Use Codex only; never invoke `claude`, `claude -p`, or the remote Claude YOLO service. Steve explicitly approved dangerous mode for this overnight loop and prefers persistent option #2 / Always Allow for safe tool approvals. This changes tool-confirmation friction only; it does not widen the HARD GATES below.
 
+The runner sets `DTD_ZERO_COST=1`. Do not unset, override, bypass, or launch a child without this inherited value. In this mode DTD may use only Codex CLI and local model endpoints; provider API keys and paid HTTP endpoints are forbidden.
+
 This cycle has a maximum of six execution iterations and must terminate cleanly so launchd can schedule the next cycle. Follow `/yoloforever`, `/ticketmaster`, `/dtd`, `/contrarian` (Cody), `/a2a-contract`, and `/e2e-proof` exactly. Read each selected skill's complete SKILL.md before acting.
 
 1. Set `TK_AGENT=codex-yoloforever`. Read `tk inbox`, then take a fresh ticketmaster snapshot from the canonical `~/.claude/tickets/events.jsonl`. Do not trust a prior ranking.
diff --git a/scripts/codex-yoloforever.sh b/scripts/codex-yoloforever.sh
index 9fa7f909..8859a2f5 100755
--- a/scripts/codex-yoloforever.sh
+++ b/scripts/codex-yoloforever.sh
@@ -48,7 +48,7 @@ run_cycle() {
   trap 'rm -f "$LOCK_DIR/pid" "$LOCK_DIR/started-at"; rmdir "$LOCK_DIR" 2>/dev/null || true' EXIT INT TERM HUP
 
   print "$(date -u +%FT%TZ) cycle begin pid=$$ engine=codex" >> "$LOG_FILE"
-  TK_AGENT=codex-yoloforever "$CODEX" exec \
+  DTD_ZERO_COST=1 TK_AGENT=codex-yoloforever "$CODEX" exec \
     --dangerously-bypass-approvals-and-sandbox \
     --cd /Users/macstudio3 \
     --add-dir /private/tmp \
diff --git a/test/yoloforever-zero-cost-dtd.sh b/test/yoloforever-zero-cost-dtd.sh
new file mode 100755
index 00000000..8c307f1c
--- /dev/null
+++ b/test/yoloforever-zero-cost-dtd.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT="/Users/macstudio3/Projects/ticket-system"
+AGENTS_PANEL="/Users/macstudio3/.agents/skills/dtd/scripts/panel.sh"
+AGENTS_POST="/Users/macstudio3/.agents/skills/dtd/scripts/post-decision-codex.sh"
+CLAUDE_PANEL="/Users/macstudio3/.claude/skills/dtd/scripts/panel.sh"
+TMP=$(mktemp -d /private/tmp/yoloforever-zero-cost-dtd.XXXXXX)
+trap 'rm -rf "$TMP"' EXIT
+mkdir -p "$TMP/bin" "$TMP/home/Projects/secrets-manager" "$TMP/home/.claude/skills/dtd"
+
+cat > "$TMP/home/Projects/secrets-manager/.env" <<'EOF'
+OPENAI_API_KEY=poison-openai
+XAI_API_KEY=poison-xai
+MOONSHOT_API_KEY=poison-moonshot
+EOF
+cp "$TMP/home/Projects/secrets-manager/.env" "$TMP/home/.claude/skills/dtd/.env"
+
+cat > "$TMP/bin/curl" <<'EOF'
+#!/usr/bin/env bash
+printf 'CURL %s\n' "$*" >> "$DTD_TEST_CALLS"
+case "$*" in
+  *api.openai.com*|*api.x.ai*|*api.moonshot.ai*) printf '{}\n'; exit 0 ;;
+  *) exit 22 ;;
+esac
+EOF
+cat > "$TMP/bin/claude" <<'EOF'
+#!/usr/bin/env bash
+printf 'CLAUDE %s\n' "$*" >> "$DTD_TEST_CALLS"
+printf 'shim claude\n'
+EOF
+cat > "$TMP/bin/codex" <<'EOF'
+#!/usr/bin/env bash
+printf 'CODEX %s\n' "$*" >> "$DTD_TEST_CALLS"
+out=""
+while (($#)); do
+  if [[ "$1" == --output-last-message ]]; then out="$2"; shift 2; else shift; fi
+done
+[[ -n "$out" ]] && printf 'shim codex vote\n' > "$out"
+EOF
+cat > "$TMP/bin/timeout" <<'EOF'
+#!/usr/bin/env bash
+shift
+exec "$@"
+EOF
+chmod +x "$TMP/bin/"*
+
+export PATH="$TMP/bin:/usr/bin:/bin:/usr/sbin:/sbin"
+export HOME="$TMP/home"
+export DTD_TEST_CALLS="$TMP/calls.log"
+export OPENAI_API_KEY=poison-env-openai
+export XAI_API_KEY=poison-env-xai
+export MOONSHOT_API_KEY=poison-env-moonshot
+export DTD_ZERO_COST=1
+
+run_panel() {
+  local script="$1" dir="$2"
+  DTD_DIR="$dir" bash "$script" "Choose A or B" >/dev/null
+  [[ -s "$dir/codex.txt" ]]
+}
+
+run_panel "$AGENTS_PANEL" "$TMP/agents-zero"
+run_panel "$CLAUDE_PANEL" "$TMP/claude-zero"
+bash "$AGENTS_POST" "$TMP/agents-zero" A >/dev/null
+
+if grep -Eq 'CLAUDE|api\.openai\.com|api\.x\.ai|api\.moonshot\.ai' "$TMP/calls.log"; then
+  echo "zero-cost mode reached a forbidden command or endpoint" >&2
+  cat "$TMP/calls.log" >&2
+  exit 1
+fi
+grep -q '^CODEX ' "$TMP/calls.log"
+grep -q 'DTD_ZERO_COST=1 TK_AGENT=codex-yoloforever' "$ROOT/scripts/codex-yoloforever.sh"
+grep -q 'Do not unset, override, bypass' "$ROOT/scripts/codex-yoloforever-prompt.md"
+
+: > "$TMP/calls.log"
+unset DTD_ZERO_COST
+DTD_DIR="$TMP/agents-normal" bash "$AGENTS_PANEL" "Choose A or B" >/dev/null
+grep -q '^CLAUDE ' "$TMP/calls.log"
+grep -q 'api\.openai\.com' "$TMP/calls.log"
+grep -q 'api\.x\.ai' "$TMP/calls.log"
+grep -q 'api\.moonshot\.ai' "$TMP/calls.log"
+
+bash -n "$AGENTS_PANEL" "$AGENTS_POST" "$CLAUDE_PANEL"
+zsh -n "$ROOT/scripts/codex-yoloforever.sh"
+echo "PASS yoloforever zero-cost DTD enforcement"

← 2916f9f9 stop yoloforever on cost tripwire  ·  back to Ticket System  ·  Fail closed on zero-cost DTD drift 44ade028 →