mirror of
https://github.com/garrytan/gstack.git
synced 2026-08-09 07:46:08 +02:00
feat: codex/autoplan hardening + Apple Silicon coreutils auto-install
Hardens /codex and /autoplan against silent failures surfaced by the #972 stdin fix and #1003 Apple Silicon codesign. Six-layer defense: 1. **Multi-signal auth probe** (new Step 0.5 / Phase 0.5): env-based auth ($CODEX_API_KEY, $OPENAI_API_KEY) OR file-based auth (${CODEX_HOME:-~/.codex}/auth.json). Rejects false negatives that the old file-only check produced for CI / platform-engineer users. 2. **Timeout wrapper** around every codex exec / codex review invocation: gtimeout → timeout → unwrapped fallback chain. On exit 124, surfaces common causes + actionable next step. Guards against model-API stalls not covered by the #972 stdin fix. 3. **Stderr capture in Challenge mode** (codex/SKILL.md.tmpl:208): 2>/dev/null → 2>$TMPERR. Post-invocation grep for auth/login/unauthorized surfaces errors that were previously dropped silently. 4. **Completeness check** in the Python JSON parser: tracks turn.completed events and warns on zero (possible mid-stream disconnect). 5. **Version warning** for known-bad Codex CLI (0.120.0-0.120.2, the range that introduced the stdin deadlock #972 fixes). Anchored regex `(^|[^0-9.])0\.120\.(0|1|2)([^0-9.]|$)` prevents 0.120.10 / 0.120.20 false positives. 6. **Failure telemetry + operational learnings**: codex_timeout, codex_auth_failed, codex_cli_missing, codex_version_warning events land in ~/.gstack/analytics/skill-usage.jsonl behind the existing telemetry opt-in. On timeout (exit 124), auto-logs an operational learning via gstack-learnings-log so future /investigate sessions surface prior hang patterns automatically. **Shared helper** (bin/gstack-codex-probe): consolidates all four pieces (auth probe, version check, timeout wrapper, telemetry logger) into one bash file that /codex and /autoplan source. Namespace-prefixed (_gstack_codex_*) with a unit test that verifies sourcing does not leak shell options into the caller. pathRewrites in host configs rewrite ~/.claude/skills/gstack → $GSTACK_ROOT for Codex, $GSTACK_BIN for Factory/Cursor/etc. **Apple Silicon coreutils auto-install** (setup:264): macOS lacks GNU timeout by default; Homebrew's coreutils installs it as gtimeout to avoid shadowing BSD utilities. ./setup now auto-installs coreutils on Darwin (arch-agnostic — applies to Intel + Apple Silicon) when neither gtimeout nor timeout is present. Opt-out via GSTACK_SKIP_COREUTILS=1 for CI, managed machines, or offline envs. **25 deterministic unit tests** (test/codex-hardening.test.ts): - 8 auth probe combinations (env precedence, whitespace, alternate $CODEX_HOME, corrupt file paths) - 10 version regex cases including 0.120.10 false-positive guards and v-prefixed / multiline output - 4 timeout wrapper + namespace hygiene (bash -n, gtimeout preference, set-option leak check) - 3 telemetry payload schema checks (confirms env values + auth tokens never leak into emitted events) **1 periodic-tier E2E** (test/skill-e2e-autoplan-dual-voice.test.ts): gates the /autoplan dual-voice path — asserts both Claude subagent and Codex voices produce output in Phase 1, OR that [codex-unavailable] is logged when Codex is absent. ~\$1/run, not a CI gate. Golden baseline + gen-skill-docs exclusion list updated for the new codex path references and the 16 < /dev/null redirects from #972. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
0a11064334
commit
4bf5ae12c0
+69
-12
@@ -871,6 +871,39 @@ Loaded review skills from disk. Starting full review pipeline with auto-decision
|
||||
|
||||
---
|
||||
|
||||
## Phase 0.5: Codex auth + version preflight
|
||||
|
||||
Before invoking any Codex voice, preflight the CLI: verify auth (multi-signal) and
|
||||
warn on known-bad CLI versions. This is infrastructure for all 4 phases below —
|
||||
source it once here and the helper functions stay in scope for the rest of the
|
||||
workflow.
|
||||
|
||||
```bash
|
||||
_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || echo off)
|
||||
source ~/.claude/skills/gstack/bin/gstack-codex-probe
|
||||
|
||||
# Check Codex binary. If missing, tag the degradation matrix and continue
|
||||
# with Claude subagent only (autoplan's existing degradation fallback).
|
||||
if ! command -v codex >/dev/null 2>&1; then
|
||||
_gstack_codex_log_event "codex_cli_missing"
|
||||
echo "[codex-unavailable: binary not found] — proceeding with Claude subagent only"
|
||||
_CODEX_AVAILABLE=false
|
||||
elif ! _gstack_codex_auth_probe >/dev/null; then
|
||||
_gstack_codex_log_event "codex_auth_failed"
|
||||
echo "[codex-unavailable: auth missing] — proceeding with Claude subagent only. Run \`codex login\` or set \$CODEX_API_KEY to enable dual-voice review."
|
||||
_CODEX_AVAILABLE=false
|
||||
else
|
||||
_gstack_codex_version_check # non-blocking warn if known-bad
|
||||
_CODEX_AVAILABLE=true
|
||||
fi
|
||||
```
|
||||
|
||||
If `_CODEX_AVAILABLE=false`, all Phase 1-3.5 Codex voices below degrade to
|
||||
`[codex-unavailable]` in the degradation matrix. /autoplan completes with
|
||||
Claude subagent only — saves token spend on Codex prompts we can't use.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: CEO Review (Strategy & Scope)
|
||||
|
||||
Follow plan-ceo-review/SKILL.md — all sections, full depth.
|
||||
@@ -894,7 +927,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex CEO voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
You are a CEO/founder advisor reviewing a development plan.
|
||||
Challenge the strategic foundations: Are the premises valid or assumed? Is this the
|
||||
@@ -902,9 +935,15 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
What alternatives were dismissed too quickly? What competitive or market risks are
|
||||
unaddressed? What scope decisions will look foolish in 6 months? Be adversarial.
|
||||
No compliments. Just the strategic blind spots.
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude CEO subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent CEO/strategist
|
||||
@@ -1005,7 +1044,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex design voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Read the plan file at <plan_path>. Evaluate this plan's
|
||||
UI/UX design decisions.
|
||||
@@ -1019,9 +1058,15 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
accessibility requirements (keyboard nav, contrast, touch targets) specified or
|
||||
aspirational? Does the plan describe specific UI decisions or generic patterns?
|
||||
What design decisions will haunt the implementer if left ambiguous?
|
||||
Be opinionated. No hedging." -C "$_REPO_ROOT" -s read-only --enable web_search_cached
|
||||
Be opinionated. No hedging." -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude design subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent senior product designer
|
||||
@@ -1080,7 +1125,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex eng voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Review this plan for architectural issues, missing edge cases,
|
||||
and hidden complexity. Be adversarial.
|
||||
@@ -1089,9 +1134,15 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
CEO: <insert CEO consensus table summary — key concerns, DISAGREEs>
|
||||
Design: <insert Design consensus table summary, or 'skipped, no UI scope'>
|
||||
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude eng subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent senior engineer
|
||||
@@ -1195,7 +1246,7 @@ Log: "Phase 3.5 skipped — no developer-facing scope detected."
|
||||
**Codex DX voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Read the plan file at <plan_path>. Evaluate this plan's developer experience.
|
||||
|
||||
@@ -1209,9 +1260,15 @@ Log: "Phase 3.5 skipped — no developer-facing scope detected."
|
||||
3. API/CLI design: are names guessable? Are defaults sensible? Is it consistent?
|
||||
4. Docs: can a dev find what they need in under 2 minutes? Are examples copy-paste-complete?
|
||||
5. Upgrade path: can devs upgrade without fear? Migration guides? Deprecation warnings?
|
||||
Be adversarial. Think like a developer who is evaluating this against 3 competitors." -C "$_REPO_ROOT" -s read-only --enable web_search_cached
|
||||
Be adversarial. Think like a developer who is evaluating this against 3 competitors." -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude DX subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent DX engineer
|
||||
|
||||
+65
-8
@@ -234,6 +234,39 @@ Loaded review skills from disk. Starting full review pipeline with auto-decision
|
||||
|
||||
---
|
||||
|
||||
## Phase 0.5: Codex auth + version preflight
|
||||
|
||||
Before invoking any Codex voice, preflight the CLI: verify auth (multi-signal) and
|
||||
warn on known-bad CLI versions. This is infrastructure for all 4 phases below —
|
||||
source it once here and the helper functions stay in scope for the rest of the
|
||||
workflow.
|
||||
|
||||
```bash
|
||||
_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || echo off)
|
||||
source ~/.claude/skills/gstack/bin/gstack-codex-probe
|
||||
|
||||
# Check Codex binary. If missing, tag the degradation matrix and continue
|
||||
# with Claude subagent only (autoplan's existing degradation fallback).
|
||||
if ! command -v codex >/dev/null 2>&1; then
|
||||
_gstack_codex_log_event "codex_cli_missing"
|
||||
echo "[codex-unavailable: binary not found] — proceeding with Claude subagent only"
|
||||
_CODEX_AVAILABLE=false
|
||||
elif ! _gstack_codex_auth_probe >/dev/null; then
|
||||
_gstack_codex_log_event "codex_auth_failed"
|
||||
echo "[codex-unavailable: auth missing] — proceeding with Claude subagent only. Run \`codex login\` or set \$CODEX_API_KEY to enable dual-voice review."
|
||||
_CODEX_AVAILABLE=false
|
||||
else
|
||||
_gstack_codex_version_check # non-blocking warn if known-bad
|
||||
_CODEX_AVAILABLE=true
|
||||
fi
|
||||
```
|
||||
|
||||
If `_CODEX_AVAILABLE=false`, all Phase 1-3.5 Codex voices below degrade to
|
||||
`[codex-unavailable]` in the degradation matrix. /autoplan completes with
|
||||
Claude subagent only — saves token spend on Codex prompts we can't use.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: CEO Review (Strategy & Scope)
|
||||
|
||||
Follow plan-ceo-review/SKILL.md — all sections, full depth.
|
||||
@@ -257,7 +290,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex CEO voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
You are a CEO/founder advisor reviewing a development plan.
|
||||
Challenge the strategic foundations: Are the premises valid or assumed? Is this the
|
||||
@@ -266,8 +299,14 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
unaddressed? What scope decisions will look foolish in 6 months? Be adversarial.
|
||||
No compliments. Just the strategic blind spots.
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude CEO subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent CEO/strategist
|
||||
@@ -368,7 +407,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex design voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Read the plan file at <plan_path>. Evaluate this plan's
|
||||
UI/UX design decisions.
|
||||
@@ -383,8 +422,14 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
aspirational? Does the plan describe specific UI decisions or generic patterns?
|
||||
What design decisions will haunt the implementer if left ambiguous?
|
||||
Be opinionated. No hedging." -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude design subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent senior product designer
|
||||
@@ -443,7 +488,7 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
**Codex eng voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Review this plan for architectural issues, missing edge cases,
|
||||
and hidden complexity. Be adversarial.
|
||||
@@ -453,8 +498,14 @@ Override: every AskUserQuestion → auto-decide using the 6 principles.
|
||||
Design: <insert Design consensus table summary, or 'skipped, no UI scope'>
|
||||
|
||||
File: <plan_path>" -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude eng subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent senior engineer
|
||||
@@ -558,7 +609,7 @@ Log: "Phase 3.5 skipped — no developer-facing scope detected."
|
||||
**Codex DX voice** (via Bash):
|
||||
```bash
|
||||
_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo "ERROR: not in a git repo" >&2; exit 1; }
|
||||
codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
_gstack_codex_timeout_wrapper 600 codex exec "IMPORTANT: Do NOT read or execute any SKILL.md files or files in skill definition directories (paths containing skills/gstack). These are AI assistant skill definitions meant for a different system. Stay focused on repository code only.
|
||||
|
||||
Read the plan file at <plan_path>. Evaluate this plan's developer experience.
|
||||
|
||||
@@ -573,8 +624,14 @@ Log: "Phase 3.5 skipped — no developer-facing scope detected."
|
||||
4. Docs: can a dev find what they need in under 2 minutes? Are examples copy-paste-complete?
|
||||
5. Upgrade path: can devs upgrade without fear? Migration guides? Deprecation warnings?
|
||||
Be adversarial. Think like a developer who is evaluating this against 3 competitors." -C "$_REPO_ROOT" -s read-only --enable web_search_cached < /dev/null
|
||||
_CODEX_EXIT=$?
|
||||
if [ "$_CODEX_EXIT" = "124" ]; then
|
||||
_gstack_codex_log_event "codex_timeout" "600"
|
||||
_gstack_codex_log_hang "autoplan" "0"
|
||||
echo "[codex stalled past 10 minutes — tagging as [codex-unavailable] for this phase and proceeding with Claude subagent only]"
|
||||
fi
|
||||
```
|
||||
Timeout: 10 minutes
|
||||
Timeout: 10 minutes (shell-wrapper) + 12 minutes (Bash outer gate). On hang, auto-degrades this phase's Codex voice.
|
||||
|
||||
**Claude DX subagent** (via Agent tool):
|
||||
"Read the plan file at <plan_path>. You are an independent DX engineer
|
||||
|
||||
Reference in New Issue
Block a user