Skip to content

FPFNFIXAPEX recognize async native interval effect callbacks - #2106

Open
aidenybai wants to merge 2 commits into
mainfrom
codex/fpfn-native-inline-interval-async-effect-84ad
Open

aidenybai wants to merge 2 commits into
mainfrom
codex/fpfn-native-inline-interval-async-effect-84ad

Conversation

@aidenybai

@aidenybai aidenybai commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Async callbacks registered directly with native setInterval inside an effect can continue after cleanup and write stale state. This route recognizes a finite owned registration/cleanup shape, then applies the existing post-await cancellation analysis. It requires actual React hook bindings, a readonly native timer handle and a closed source-visible provider boundary.

Review corrected two false positives: React.__defineGetter__ and React.__defineSetter__ could replace the selected provider while still passing the module proof. These explicit descriptor mutations now decline the new route. Immutable Program/provider facts and dispatcher-reference eligibility are reused; each current protected-name intersection, declaration owner, callback, registration and cleanup check remains fresh. The shared semantic resolver is unchanged, with no canonical donor dependency.

Required strict fuzzing first found two verdict drops under equivalent syntax: an inert literal-void prologue and a block cleanup returning the owned native clear call. The finite proof now supports those forms. Opaque void calls, nonnative cleanup returns, and a shadowed or TDZ undefined expression remain declined. The failed run and its already-passing whole graphs are preserved separately; all required gates were rerun on the repaired final tree.

Ordinary React, native timer and module behavior is assumed. Custom timers, escaped handles, unsupported module shapes, mount-only effects and the existing stable-dependency exclusions remain outside this route. Clearing an interval alone does not cancel an already suspended callback. This is a finite extension with no family-wide completeness claim.

Validation on tested tree 4ef82ae8c2e1ba5726b0af2119d2987448e06862:

  • All 173 focused assertions pass, including four cold work cases and both protected-name/dispatcher-owner contexts in both orders, with two analyses of the same Program and reverse warmup.
  • Uncached whole graphs: 34,133 tests pass and 1,118 skip; all 12 test tasks, all 10 typecheck tasks and all 5 build tasks pass with zero cache hits. Lint, formatting, generated registry and built JSON smoke pass.
  • Strict fuzzing on the repaired revision passes 500 iterations with seed 42 and FUZZ_REQUIRE_FIRE=1; the failed first-revision attempt remains recorded. Numeric wrapper counters are unavailable; require-fire proves positive liveness but does not independently establish coverage of the new certificate.
  • All 35 authored cases and the two original corpus files are native parser-valid and preserve complete target objects, locations, order and multiplicity. Their seven target findings and 37 default unrelated objects are unchanged.
  • The 76-file native/API/CLI union changes from 261 to 268 target objects through 11 approved additions (equivalent-syntax controls, exact fuzz reproducers and actual corpus bytes) and four provider-case/corpus removals. Every retained target object and all 834 default unrelated objects are unchanged; targeted profiles retain no unrelated findings. Both actual default and target-only profiles use customRulesOnly: false.
  • All six actual final synthetic corpus files are recognized by the real loader and directly replayed, alongside paired generator entries.

Construction-inclusive 20/100 work probes preserve actual warning and custom-timer controls. Program proof construction falls from 20/100 walks to one. Shared-provider reference visits fall from 420/10,100 to 21/101; distinct providers from 800/20,000 to 40/200. Dispatcher visits become 20/100 in both shapes. These are deterministic work counts, not timing measurements.

The author-reported inherited membership advisory belongs to the unchanged legacy cleanup collector. The new interval route supplies its cleanup explicitly and bypasses that collector; no improvement to the inherited lookup is claimed. Actual staged scan and normal hook results are recorded separately with their repository/framework gating.

Fresh full sandbox/corpus parity is unavailable without credentials. Bounded synthetic comparisons do not establish full-corpus parity. Patch Changesets are included; no merge or release is requested.

The local built staged scanner exited 0 and completed 11 files with 0 diagnostics. Its repository profile reports framework unknown and reactDetected: false; active React behavior is established separately by the declared profiles. Normal commit hooks retain their actual outcome; scanner details suppressed by the repository hook are preserved in the separate staged JSON.

Normal commit hooks exited 0 with vp check --fix and vp fmt; the committed tree remains identical to the tested tree. Hook scanner details are suppressed by the repository script and separately captured above.

@pkg-pr-new

pkg-pr-new Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/eslint-plugin-react-doctor@2106
npm i https://pkg.pr.new/oxlint-plugin-react-doctor@2106
npm i https://pkg.pr.new/react-doctor@2106

commit: aa66edc

@github-actions

github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Interactive terminal E2E

Terminal Control verified the built CLI at aa66edc in a real PTY:

  • selected a project interactively and observed Scanning... before the three-second Git delay completed
  • waited for the clean result and exercised the compact report
  • opened copy context and the GitHub Actions confirmation, then cancelled safely

Download the edited MP4 and PNG evidence

@aidenybai
aidenybai marked this pull request as ready for review October 17, 2026 23:36

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant