[Bug Report] Stop hook (goal condition) loops with no user input when the condition is subjective/unverifiable

Resolved 💬 1 comment Opened May 29, 2026 by choiHkk Closed Jul 2, 2026

## Title
subjective/unverifiable

## Summary
A session-scoped goal with a subjective condition "make it perfect"
caused the Stop hook to block turn-end and re-inject near-identical feedback every turn.
The user gave no input — the assistant and hook ping-ponged on their own for 9 consecutive
turns until the runtime force-ended it ("A hook blocked the turn from ending 9 consecutive
times — overriding and ending turn"). /goal clear correctly stopped it afterward.

## Environment

  • Claude Code, model: Opus 4.8 (1M context)
  • Feature: session-scoped goal / Stop hook (/goal <condition>)

## Steps to reproduce

  1. Set a goal with a subjective/unverifiable condition: /goal make it perfect.
  2. Complete the in-scope work; the hook judges the (subjective) condition unmet.
  3. Observe the hook block turn-end and re-inject feedback repeatedly with no user input.

## Expected
A subjective condition the model cannot objectively satisfy should not produce an
unbounded assistant↔hook loop with no user in the loop.

## Actual
Hook fired ~9x with no user turns in between, then the runtime force-ended the turn.

## Impact

  • Burns turns/tokens on machine-vs-machine repetition.
  • The hook's interpretation pressured actions that contradicted explicit user

instructions (the assistant refused correctly, but a worse-behaved agent could be
pushed into unwanted changes).

## Notes / possible fixes

  • For Stop hooks, honor stop_hook_active and return success while true.
  • Lower the default block cap, and/or warn that subjective goal conditions can loop.

---
## Evidence (verbatim, repetition)

The Stop hook re-injected the same feedback every turn with no user input in between.
Abbreviated transcript:

``
[goal: 완벽하게 해줘]
⏺ (assistant) Waiting on your decision: "canonical 적용해" or /goal clear.
◯ Goal not yet met… continuing
⏺ (assistant) Holding. No further action without explicit go-ahead.
◯ Goal not yet met… continuing
⏺ (assistant) Awaiting your instruction...
◯ Goal not yet met… continuing
... (repeats) ...
⏺ A hook blocked the turn from ending 9 consecutive times — overriding and ending turn.
``

Each Stop hook feedback: payload was byte-for-byte near-identical:
"Canonical bugs C1–C5 ... remain unfixed ... condition '완벽하게 해줘' ... objectively
unsatisfied." — repeated ~9× back-to-back with zero user turns.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗