Problem
Ladon repeatedly completes primary review analysis successfully with zero findings, persists needs_finalization, then invokes its bounded finalization-only retry. The retry returns success with num_turns: 0, makes no MCP finalize_review call, leaves state unchanged, and correctly fails closed before the arbiter.
Reproduction
Consumer PR: adcontextprotocol/adcp-client-python#1217
Exact head: c5b5826d6caea2eb267ead5c288c4068438ed0cf
- Run
36270719842, attempts 1 and 2: identical failure.
- Fresh
ready_for_review run 36271793703: identical failure with new workflow state; primary reviewer success, 34 turns, zero findings, needs_finalization; retry success, zero turns; arbiter skipped.
- The consumer workflow uses
adcontextprotocol/actions/ladon/review@48c0dfef96594f74f9606d68597c0f7062a5a337; nested floating tags currently resolve ladon/review/v1 to ab7c8394702d... and ladon/reviewer/v1 to a64a17ba3691....
The log text mentioning Internal error: directory mismatch .../tsconfig.json is a source comment explaining why --tsconfig-override is omitted; no such runtime error is emitted in these runs. The observable failure is the resumed Claude session exiting successfully in about 100 ms with zero turns and zero usage.
Expected
The finalization retry must either execute the allowed mcp__ladon_findings__finalize_review call and produce a complete deterministic review record, or fail with an actionable retry error. A zero-turn successful resume must not masquerade as a usable retry. Preserve the existing fail-closed behavior.
Please add a regression covering primary success + needs_finalization followed by a zero-turn resume, and ensure the recovery path can finalize or reports the underlying resume failure explicitly.
Problem
Ladon repeatedly completes primary review analysis successfully with zero findings, persists
needs_finalization, then invokes its bounded finalization-only retry. The retry returnssuccesswithnum_turns: 0, makes no MCPfinalize_reviewcall, leaves state unchanged, and correctly fails closed before the arbiter.Reproduction
Consumer PR: adcontextprotocol/adcp-client-python#1217
Exact head:
c5b5826d6caea2eb267ead5c288c4068438ed0cf36270719842, attempts 1 and 2: identical failure.ready_for_reviewrun36271793703: identical failure with new workflow state; primary reviewersuccess, 34 turns, zero findings,needs_finalization; retrysuccess, zero turns; arbiter skipped.adcontextprotocol/actions/ladon/review@48c0dfef96594f74f9606d68597c0f7062a5a337; nested floating tags currently resolveladon/review/v1toab7c8394702d...andladon/reviewer/v1toa64a17ba3691....The log text mentioning
Internal error: directory mismatch .../tsconfig.jsonis a source comment explaining why--tsconfig-overrideis omitted; no such runtime error is emitted in these runs. The observable failure is the resumed Claude session exiting successfully in about 100 ms with zero turns and zero usage.Expected
The finalization retry must either execute the allowed
mcp__ladon_findings__finalize_reviewcall and produce a complete deterministic review record, or fail with an actionable retry error. A zero-turn successful resume must not masquerade as a usable retry. Preserve the existing fail-closed behavior.Please add a regression covering primary
success+needs_finalizationfollowed by a zero-turn resume, and ensure the recovery path can finalize or reports the underlying resume failure explicitly.