Skip to content

Triage the 60 unguarded broad-catch sites the #674 gate records in cancellation-catch-backlog.tsv #722

Description

@monkopedia-coder

The #674 gate (PR #720) discovers 60 broad catch clauses in production source sets with no preceding cancellation clause, recorded in scripts/cancellation-catch-backlog.tsv. This issue is their tracking home.

Why this issue exists

#720's backlog rows originally cited #667, which was closed COMPLETED on 2026-09-02 — and was scoped to its own six app/src/main sites, never to this list. #674 itself closes when #720 merges. Without this issue the entire backlog would cite two closed issues on the day it landed, invisible to any open-state triage filter, in a file whose own header says its purpose is not to become "the place things go to be forgotten."

(My error: I told #720's author that #667 was the natural consumer for these findings. It was already closed when I said it.)

The work

Each row needs triage, and the triage is not "add a cancellation clause to all 60."

Reachability first, severity second. A try whose guarded call never suspends cannot take delivery of a CancellationException at all — such a site is latent, not live, and a mechanical fix adds noise without removing risk. This distinction has already produced one false finding in this repo: #667's own sweep tabulated what each catch body does without a column for whether the exception can be delivered, and two separate readers independently read that as a list of live defects. It was not.

So for each row establish, and record:

  1. Can the guarded call actually deliver cancellation? Does anything inside the try suspend? Is the enclosing scope ever cancelled?
  2. If yes — live. Add the cancellation clause before the broad one and fix the ordering.
  3. If no — latent. Say why in the row's reason, and it stays as documented debt rather than becoming a churn PR.

Useful discriminators in this codebase: does the scope ever get cancelled; does the guarded call actually suspend; is the state written observable after teardown. All three produced "latent, not live" verdicts on #667.

Notes

Related: #619, #661, #674, #720, #721.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-workableClear, scoped, no user-judgment needed; triage dispatches work_on_issuebugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions