diff --git a/loop.sh b/loop.sh
index 07e73aa..9b6a396 100755
--- a/loop.sh
+++ b/loop.sh
@@ -348,13 +348,17 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do
exit 0
fi
- GENERATOR_OUTPUT=$(run_agent "$GENERATOR_PROMPT" "generator")
-
- # In interactive mode, generator output is empty (displayed in terminal, not captured).
- # State is tracked via prd.json — the generator updates it directly.
- if [ "${LOOP_HEADLESS:-false}" = "true" ] && [ -z "$GENERATOR_OUTPUT" ]; then
- log "WARNING: Generator produced empty output (timeout or crash). Skipping to next iteration."
- continue
+ if [ "${LOOP_HEADLESS:-false}" != "true" ]; then
+ # Interactive: run directly, no capture. User sees full CC UI.
+ run_agent "$GENERATOR_PROMPT" "generator"
+ GENERATOR_OUTPUT=""
+ else
+ # Headless: capture output for parsing.
+ GENERATOR_OUTPUT=$(run_agent "$GENERATOR_PROMPT" "generator")
+ if [ -z "$GENERATOR_OUTPUT" ]; then
+ log "WARNING: Generator produced empty output (timeout or crash). Skipping to next iteration."
+ continue
+ fi
fi
# --- Scope budget check ---
@@ -377,8 +381,14 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do
export SCOPE_FILES_MODIFIED SCOPE_LINES_WRITTEN
fi
- # Check for completion sentinel
- if echo "$GENERATOR_OUTPUT" | grep -q "COMPLETE"; then
+ # Check for completion — in interactive mode, check prd.json directly
+ if all_stories_pass 2>/dev/null; then
+ log_header "All Stories Complete! ($(story_counts))"
+ snapshot_for_archive
+ exit 0
+ fi
+ # Headless mode: also check output sentinel
+ if [ -n "$GENERATOR_OUTPUT" ] && echo "$GENERATOR_OUTPUT" | grep -q "COMPLETE"; then
log_header "Generator signaled COMPLETE ($(story_counts))"
snapshot_for_archive
exit 0
@@ -394,14 +404,21 @@ while [ "$ITERATION" -lt "$MAX_ITERATIONS" ]; do
fi
EVAL_PROMPT=$(build_prompt "evaluator" "$MODE")
- EVAL_OUTPUT=$(run_agent "$EVAL_PROMPT" "evaluator")
- if [ -z "$EVAL_OUTPUT" ]; then
- # In interactive mode, check the verdict file
+ if [ "${LOOP_HEADLESS:-false}" != "true" ]; then
+ # Interactive: run directly, read verdict from file.
+ run_agent "$EVAL_PROMPT" "evaluator"
if [ -f "$LOOP_DIR/.verdict" ]; then
EVAL_OUTPUT=$(cat "$LOOP_DIR/.verdict")
else
- log "WARNING: Evaluator produced no output and no verdict file. Treating as REJECT."
+ log "WARNING: No verdict file found. Treating as REJECT."
+ EVAL_OUTPUT="REJECTEvaluator produced no verdict file"
+ fi
+ else
+ # Headless: capture output for parsing.
+ EVAL_OUTPUT=$(run_agent "$EVAL_PROMPT" "evaluator")
+ if [ -z "$EVAL_OUTPUT" ]; then
+ log "WARNING: Evaluator produced empty output. Treating as REJECT."
EVAL_OUTPUT="REJECTEvaluator produced no output"
fi
fi