8120486109
gitea_merge_pr ran cleanup_in_progress_for_pr inside the same try as the post-merge read-back GET; a read-back failure silently skipped tracker cleanup, leaving only merge_commit=null and no cleanup_status at all, so status:in-progress could stay stuck while the merge read as full success. Split the block: read-back failure now returns an explicit cleanup_status='skipped (merge read-back failed)', and an unexpected cleanup exception returns 'skipped (cleanup error: <redacted>)' instead of masking merge_commit. Cleanup still never blocks a performed merge, the happy-path API call sequence is unchanged, and _redact keeps credentials out of surfaced errors. Add regression tests: read-back failure => merge still performed, explicit skip status, no tracker DELETE traffic; cleanup exception => surfaced and redacted. Fixes #98. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>