Skip to content

docs(evidence): class miner Phase 0 — GO-CANDIDATE N3 (scoped object in detached work) - #414

Merged
PhysShell merged 1 commit into
mainfrom
research/class-miner-phase0
Oct 20, 2026
Merged

PhysShell merged 1 commit into
mainfrom
research/class-miner-phase0

Conversation

@PhysShell

Copy link
Copy Markdown
Owner

Summary

This PR records Phase 0 of the class miner, run under owner decision GO-CLASS-MINER-PHASE-0. It went after
KILL-DICTIONARY-REF-PILOT (#413).

Result: GO-CANDIDATE for N3. In N3, an object owned by a request or DI scope reaches deliberately detached
work, _ = …, Task.Run or QueueBackgroundWorkItem, and is used after the scope ends. The objects seen are an
HttpContext, a scoped service, or an IServiceProvider or HttpClient provided by the scope. This is a
recommendation for the owner. It does not authorise an implementation.

Evidence only, under docs/evidence/class-miner-phase0-2026-10/. Production code, OwnIR, CI and goldens are not
touched.

How

  • The rules were pre-registered before any record was read: 00-preregistration.md.
  • No new miner was written. The input is the existing fix ledger of the direction research, which is private. After
    the confirmed-defect filter, 101 product-code fixes from 81 owners remain (data/eligible.tsv). The filter
    requires a merged fix, a mechanism established by the diff, and evidence of an observable effect.
  • 10 of the 12 allowed deep-check PRs were used, chosen by title before reading.

Classes

Class Independent owners Own.NET today Verdict
N3: a scoped object escapes into detached work 8 (3 from the corpus + 5 of 6 deep-check PRs) no rule; DI001–005 cover constructor and locator capture only GO-CANDIDATE
N1: acquire, a step throws before ownership is handed over, no dispose 4 missed: returned and factory-acquired locals are not tracked runner-up
N6: a long-lived collection that is only added to 4 (corpus only) no rule high FP risk
N7, N4: cross-thread 3, 2 no rule the direction research ruled these need new architecture
N1b, N2 2 each partial N2 is already caught by runtime scope validation

Every N3 instance had production or staging ObjectDisposedExceptions. One example is 39 events in about
7 months. No analyzer package or CodeQL has a rule for this, and runtime scope validation cannot catch it.

Caveats

  • Prevalence is not measured. The deep check used keyword searches aimed at the class.
  • Mature-code yield is unknown. 7 of the 8 repos have 0–4 stars.
  • The DI graph's false positives must be fixed first. It merges test and product registrations.
  • Any design needs its own pre-registered precision gate.

Not committed

The texts and diffs of third-party PRs are not committed. Every PR is referenced by number.

🤖 Generated with Claude Code

Owner decision GO-CLASS-MINER-PHASE-0. Reusing the direction-research
fix ledger (101 confirmed product-code fixes, 81 owners) and 10 of 12
allowed deep-check PRs, one narrow class clears the pre-registered bar
with margin: N3, a request-scoped object (HttpContext, scoped service,
scope-provided IServiceProvider/HttpClient) escaping into detached work
(`_ = ...`, Task.Run, QueueBackgroundWorkItem). 8 independent owners,
production/staging ObjectDisposedExceptions, no Own.NET or competitor
rule. Recommendation only: prevalence, mature-code yield and precision
are unmeasured.

Evidence only: report, pre-registration, filtered ledger, class
membership, deep-check selection and search outputs. No third-party PR
texts or diffs, no production, OwnIR, CI or golden change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PhysShell
PhysShell merged commit 76bc422 into main Oct 20, 2026
76 checks passed
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