diff --git a/hooks/session-start.sh b/hooks/session-start.sh index 3ab0237..90ba97c 100644 --- a/hooks/session-start.sh +++ b/hooks/session-start.sh @@ -107,6 +107,12 @@ fi REPO_DIR="${_repo_dir:-}" unset _claude_real _repo_dir +# Effort tiering (BDR-NEXT): this env var beats every skill/agent `effort:` pin. +EFFORT_WARN="" +if [ -n "${CLAUDE_CODE_EFFORT_LEVEL:-}" ]; then + EFFORT_WARN="⚠️ CLAUDE_CODE_EFFORT_LEVEL=${CLAUDE_CODE_EFFORT_LEVEL} set: skill/agent effort pins ignored" +fi + # Detect plan and set passive token budget PLAN=$(detect_plan 2>/dev/null || echo "pro") case "$PLAN" in @@ -253,5 +259,6 @@ unset _remote_ver REPO_DIR echo "│ 💡 /plugin-check before starting a new project │" echo "│ 🩺 make doctor full diagnostic │" echo "└───────────────────────────────────────────────────┘" +[ -n "$EFFORT_WARN" ] && printf '%s\n' "$EFFORT_WARN" echo "" unset TOKEN_WARN diff --git a/hooks/statusline.sh b/hooks/statusline.sh index 5e76c84..c9e2332 100755 --- a/hooks/statusline.sh +++ b/hooks/statusline.sh @@ -33,13 +33,14 @@ if [ -z "$PROFILE" ] || [ "$PROFILE" = "none" ]; then PROFILE="$DEFAULT_PROFILE" fi -# Effort level from settings.json (.effortLevel — set by /effort or manual edit). -# settings.json is the source-of-truth, symlinked into ~/.claude/settings.json. -EFFORT="?" -if [ -f "$REPO/settings.json" ]; then +# Effort level: the live value when the harness exports it (skill/agent +# `effort:` shifts included, BDR-NEXT), else the persisted settings.json key +# (.effortLevel — set by /effort or manual edit; symlinked into ~/.claude). +EFFORT="${CLAUDE_EFFORT:-}" +if [ -z "$EFFORT" ] && [ -f "$REPO/settings.json" ]; then EFFORT=$(jq -r '.effortLevel // "?"' "$REPO/settings.json" 2>/dev/null) - [ -z "$EFFORT" ] && EFFORT="?" fi +[ -z "$EFFORT" ] && EFFORT="?" # Session duration (from total_duration_ms) DURATION_MS=$(echo "$INPUT" | jq -r \ diff --git a/lib/tests/effort-routing.test.sh b/lib/tests/effort-routing.test.sh index f3f5504..1de335f 100755 --- a/lib/tests/effort-routing.test.sh +++ b/lib/tests/effort-routing.test.sh @@ -29,6 +29,10 @@ printf -- '---\nname: bad\neffort: turbo\n---\n' > "$FIX/bad.md" # ── 1) session default (spec D1) has "settings.json" '"effortLevel": "high"' +# ── 2) hooks: env-var warning + live effort in the statusline (spec D1, D5) +has "hooks/session-start.sh" 'CLAUDE_CODE_EFFORT_LEVEL' +has "hooks/statusline.sh" 'CLAUDE_EFFORT' + # ── summary (later tasks insert their locks ABOVE this line) printf 'effort-routing census: %d pass, %d fail\n' "$pass" "$fail" [ "$fail" -eq 0 ] diff --git a/settings.json b/settings.json index d34217e..a008190 100644 --- a/settings.json +++ b/settings.json @@ -444,7 +444,7 @@ } }, "feedbackDrafts": "off", - "effortLevel": "xhigh", + "effortLevel": "high", "remoteControlAtStartup": true, "inputNeededNotifEnabled": true, "skipAutoPermissionPrompt": true,