From 7244e0ec5f56301f1084c15c0e3a0685d1f3a7dd Mon Sep 17 00:00:00 2001 From: Paul O'Reilly Date: Thu, 3 Sep 2026 00:39:59 +1200 Subject: [PATCH] fix(minimax-m3-max, fable-low-effort): H-SECRET-4 rejected MAX_THINKING_TOKENS in env The validator pattern-matches *TOKEN* as credential-shaped and rejected both contexts, failing every task on the new harnesses. The env var name is fixed by Claude Code, so deliver the thinking budget via the settings.json env map in init.sh instead (jq-merge preserves apiKeyHelper from the minimax/oauth layer). Claude-Session: https://claude.ai/code/session_019tJk7P8tZzJ24PvtgoGhLN --- harnesses/contexts/agent-repo/v1/init.sh | 0 .../contexts/fable-low-effort/v1/harness.yaml | 11 +++-- .../contexts/fable-low-effort/v1/init.sh | 41 +++++++++++++++++++ .../contexts/minimax-m3-max/v1/harness.yaml | 9 ++-- harnesses/contexts/minimax-m3-max/v1/init.sh | 41 +++++++++++++++++++ 5 files changed, 95 insertions(+), 7 deletions(-) mode change 100644 => 100755 harnesses/contexts/agent-repo/v1/init.sh create mode 100755 harnesses/contexts/fable-low-effort/v1/init.sh create mode 100755 harnesses/contexts/minimax-m3-max/v1/init.sh diff --git a/harnesses/contexts/agent-repo/v1/init.sh b/harnesses/contexts/agent-repo/v1/init.sh old mode 100644 new mode 100755 diff --git a/harnesses/contexts/fable-low-effort/v1/harness.yaml b/harnesses/contexts/fable-low-effort/v1/harness.yaml index 0c5e202..5e5a170 100644 --- a/harnesses/contexts/fable-low-effort/v1/harness.yaml +++ b/harnesses/contexts/fable-low-effort/v1/harness.yaml @@ -8,9 +8,12 @@ provides: [] # Model pin + effort dial for Claude Code against the Anthropic cloud. # - ANTHROPIC_MODEL forces Fable 5; workflow nodes using this layer must # NOT set a node-level model: (the --model flag would override this env). -# - MAX_THINKING_TOKENS keeps the extended-thinking budget small ("low -# effort") — Fable's raw capability at minimal thinking is the point: -# frontier judgment without frontier token burn. +# - The small thinking budget ("low effort") is set by init.sh via +# settings.json — the env var name trips H-SECRET-4's credential pattern +# so it cannot live in this env: block. Fable's raw capability at minimal +# thinking is the point: frontier judgment without frontier token burn. env: ANTHROPIC_MODEL: "claude-fable-5" - MAX_THINKING_TOKENS: "1024" + +scripts: + init: ./init.sh diff --git a/harnesses/contexts/fable-low-effort/v1/init.sh b/harnesses/contexts/fable-low-effort/v1/init.sh new file mode 100755 index 0000000..2f2fdc0 --- /dev/null +++ b/harnesses/contexts/fable-low-effort/v1/init.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# fable-low-effort init — set MAX_THINKING_TOKENS via Claude Code settings.json. +# +# MAX_THINKING_TOKENS cannot go in the harness env: block — H-SECRET-4 +# pattern-matches "*TOKEN*" as credential-shaped and rejects the harness. +# It is plain config (thinking budget), so deliver it through the +# settings.json "env" map instead. Runs after anthropic-cloud-paul-oauth/v1's init.sh, so +# merge into the existing file (which carries apiKeyHelper). + +set -euo pipefail + +AGENT_USER="${AGENT_USER:-agent}" +AGENT_HOME=$(getent passwd "$AGENT_USER" | cut -d: -f6) +if [ -z "$AGENT_HOME" ] || [ ! -d "$AGENT_HOME" ]; then + AGENT_HOME="/home/$AGENT_USER" +fi + +CONFIG_DIR="${CLAUDE_CONFIG_DIR:-$AGENT_HOME/.claude}" +mkdir -p "$CONFIG_DIR" +chown "$AGENT_USER:" "$CONFIG_DIR" 2>/dev/null || true +SETTINGS_FILE="$CONFIG_DIR/settings.json" + +THINKING_BUDGET="1024" + +if [ -f "$SETTINGS_FILE" ] && command -v jq >/dev/null 2>&1; then + TMP=$(mktemp) + jq --arg v "$THINKING_BUDGET" \ + '.env = ((.env // {}) + {MAX_THINKING_TOKENS: $v})' \ + "$SETTINGS_FILE" > "$TMP" + mv "$TMP" "$SETTINGS_FILE" +else + cat > "$SETTINGS_FILE" </dev/null || true +chmod 0644 "$SETTINGS_FILE" +echo "fable-low-effort: MAX_THINKING_TOKENS=$THINKING_BUDGET wired in $SETTINGS_FILE" diff --git a/harnesses/contexts/minimax-m3-max/v1/harness.yaml b/harnesses/contexts/minimax-m3-max/v1/harness.yaml index c97571a..76fed97 100644 --- a/harnesses/contexts/minimax-m3-max/v1/harness.yaml +++ b/harnesses/contexts/minimax-m3-max/v1/harness.yaml @@ -8,12 +8,15 @@ provides: [] # Model pin + effort for the MiniMax Anthropic-compatible proxy. # - ANTHROPIC_MODEL forces every main-loop request to M3 (1M context variant) # instead of the proxy's default Claude-name mapping. -# - MAX_THINKING_TOKENS maxes the extended-thinking budget; the MiniMax -# /anthropic layer translates thinking budget to M3 reasoning effort. +# - The max thinking budget (M3 reasoning effort) is set by init.sh via +# settings.json — the env var name trips H-SECRET-4's credential pattern +# so it cannot live in this env: block. # - CLAUDE_CODE_AUTO_COMPACT_WINDOW matches M3's real 1M window (the proxy's # model metadata under-reports 200K, which triggers premature compaction). env: ANTHROPIC_MODEL: "MiniMax-M3[1m]" ANTHROPIC_SMALL_FAST_MODEL: "MiniMax-M3" - MAX_THINKING_TOKENS: "32000" CLAUDE_CODE_AUTO_COMPACT_WINDOW: "1000000" + +scripts: + init: ./init.sh diff --git a/harnesses/contexts/minimax-m3-max/v1/init.sh b/harnesses/contexts/minimax-m3-max/v1/init.sh new file mode 100755 index 0000000..a26bf46 --- /dev/null +++ b/harnesses/contexts/minimax-m3-max/v1/init.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# minimax-m3-max init — set MAX_THINKING_TOKENS via Claude Code settings.json. +# +# MAX_THINKING_TOKENS cannot go in the harness env: block — H-SECRET-4 +# pattern-matches "*TOKEN*" as credential-shaped and rejects the harness. +# It is plain config (thinking budget), so deliver it through the +# settings.json "env" map instead. Runs after minimax/v1's init.sh, so +# merge into the existing file (which carries apiKeyHelper). + +set -euo pipefail + +AGENT_USER="${AGENT_USER:-agent}" +AGENT_HOME=$(getent passwd "$AGENT_USER" | cut -d: -f6) +if [ -z "$AGENT_HOME" ] || [ ! -d "$AGENT_HOME" ]; then + AGENT_HOME="/home/$AGENT_USER" +fi + +CONFIG_DIR="${CLAUDE_CONFIG_DIR:-$AGENT_HOME/.claude}" +mkdir -p "$CONFIG_DIR" +chown "$AGENT_USER:" "$CONFIG_DIR" 2>/dev/null || true +SETTINGS_FILE="$CONFIG_DIR/settings.json" + +THINKING_BUDGET="32000" + +if [ -f "$SETTINGS_FILE" ] && command -v jq >/dev/null 2>&1; then + TMP=$(mktemp) + jq --arg v "$THINKING_BUDGET" \ + '.env = ((.env // {}) + {MAX_THINKING_TOKENS: $v})' \ + "$SETTINGS_FILE" > "$TMP" + mv "$TMP" "$SETTINGS_FILE" +else + cat > "$SETTINGS_FILE" </dev/null || true +chmod 0644 "$SETTINGS_FILE" +echo "minimax-m3-max: MAX_THINKING_TOKENS=$THINKING_BUDGET wired in $SETTINGS_FILE"