From 14be6c33e073ca3c5348ecc0b51e16ad6165abec Mon Sep 17 00:00:00 2001 From: PhysShell <45852143+PhysShell@users.noreply.github.com> Date: Tue, 20 Oct 2026 20:02:12 +0500 Subject: [PATCH 1/2] docs(evidence): N3 pilot G0 pre-registration (scope identity) Rules fixed before the G0 filter is written or run: test-project classification from .csproj, drop test registrations, walk from the registration's own implementation, proven lifetime only. Target: the 7/7 OrchardCore DI001 FPs of D11; controls: DiCaptiveSample and rrr-pi-rate#60; new-finding check over 27 saved holdout/sweep facts. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01TFkNAFFQz9KoTzpPws8vYG --- .../n3-pilot-2026-10/00-preregistration-g0.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 docs/evidence/n3-pilot-2026-10/00-preregistration-g0.md diff --git a/docs/evidence/n3-pilot-2026-10/00-preregistration-g0.md b/docs/evidence/n3-pilot-2026-10/00-preregistration-g0.md new file mode 100644 index 00000000..265cb44f --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/00-preregistration-g0.md @@ -0,0 +1,92 @@ +# N3 bounded pilot, gate G0 (scope identity) — pre-registration + +Written 2026-10-20, before the G0 filter was written or run. What had been read before this file: + +- the D11 triage of the 7 holdout DI001 findings (`evidence/holdout/ownnet/di_sample.tsv` of the direction + research, private), which names the cause of each FP; +- `ownlang/di.py` (`find_captive_dependencies`); +- the field names of one `services` fact in the OrchardCore holdout facts. No DI001 result was recomputed. + +Authority: owner decision `ACCEPT-PHASE0 / GO-N3-BOUNDED-PILOT / NO-PRODUCTION`, given on PR #414. G0 budget: +0.25 agent-day. G1–G4 start only after a G0 PASS, and get one agent-day in total. The first failed mandatory gate +stops the pilot (`KILL-N3-PILOT`). The budget is not extended. + +## Question + +Can product registrations be told apart from test registrations, and can each registration be resolved through its +own implementation, using only the facts the extractor already emits and the repository's project files? The DI +graph must not be rebuilt. + +N3 needs this because its warning must rest on a proven scoped lifetime of a concrete object. If the registration +graph cannot say "scoped" without the 7/7 FP of D11, a detached-work rule built on it inherits them. + +## Known failure (the target) + +7 of 7 product DI001 findings on OrchardCore (holdout, target `5ddc4594`, Own.NET `e7d33e33`) are FP. The D11 triage +gives two causes: + +- **test registrations merged in (6).** `IExtensionManager` (5 findings) and `IMediaTokenService` (1) are + `AddSingleton` in product code. The `scoped` lifetime comes from test registrations (`StubExtensionManager`, + `MediaTokenTests.cs`). The core keys the graph by service name, and the last registration wins. +- **implementations merged by service name (1).** `IDeploymentTargetProvider`: the singleton implementation + `FileDownloadDeploymentTargetProvider` takes only `IStringLocalizer`. The scoped dependency belongs to another + implementation of the same interface. The core starts each walk from `by_name[s.name]`, not from the registration + `s` itself. + +## Method (fixed now) + +A research script outside the product tree reads saved `facts.json` files and the repository sources. Production +code, OwnIR, CI and goldens are not changed. The script applies four rules: + +1. **Test project.** A registration belongs to the project whose `.csproj` is in the nearest ancestor directory of + its `file`. The project is a test project when its `.csproj` sets `true` or + references one of `Microsoft.NET.Test.Sdk`, `xunit`, `xunit.v3`, `NUnit`, `MSTest.TestFramework`, `MSTest`, + `TUnit` or `BenchmarkDotNet`. Path names are not used for this decision. The path regex of the direction + research (`sweep_summary.py`) is reported next to it, as a comparison only. +2. **Drop test registrations.** Registrations in test projects are removed. A registration with no owning + `.csproj` is kept and counted. +3. **Own implementation at the root.** The walk for a singleton registration starts from that registration's own + `deps`, not from the node of the same service name. +4. **Proven lifetime only.** A dependency name counts as scoped only when every remaining registration of that + name is scoped. It is followed as transient only when every remaining registration is transient. Mixed + lifetimes make the name unknown, and unknown adds no edge. The number of mixed names is reported. + +The DI001 rule itself (singleton → scoped, through transients) does not change. + +## Inputs + +- **Target.** OrchardCore holdout facts as saved by D11 (Own.NET `e7d33e33`). They are not re-extracted. +- **Positive controls (must keep firing).** + - `frontend/roslyn/samples/DiCaptiveSample.cs`: exactly four DI001 (`EmailSender -> AppDbContext`, + `ReportService -> UnitOfWork -> AppDbContext`, `CacheService -> IRepo`, `PrimaryCtorService -> AppDbContext`) + and silence on `Metrics -> Clock` and `PublicCtorOnly`, as its CI assertions pin today. + - Corpus pair `rrr-pi-rate/StockPriceSheetPrintService#60` (C10): DI001 present on `base`, absent on `fix`, as in + the D6 ledger. +- **New-finding check.** The other 14 holdout repositories and the 13 design-B sweep repositories, all from saved + facts. Rule 3 can add findings that the current core does not report, so every finding that the current core + does not report is listed and triaged by reading the code. + +## Verdict rules + +`PASS-G0` needs all of: + +- all 7 known OrchardCore FPs are gone, each by a rule named above; +- both positive controls hold exactly; +- every new finding is triaged, and none is a FP. An `UNCLEAR` counts as a FP; +- elapsed work within 0.25 agent-day. + +`KILL-N3-PILOT` at G0 if any of the following: + +- a known FP survives the four rules and removing it needs another mechanism; +- a positive control is lost; +- a new finding is a FP or `UNCLEAR`; +- the budget runs out before a verdict. + +No rule may be added or changed after the first run. A fifth rule invented after the run is a G0 failure, not a +fix. + +## Out of scope for G0 (input to G1) + +- Framework registrations (`AddDbContext`, `AddHttpClient`, controllers, Razor components). Their lifetime comes from + the framework, not from an `Add*` call in the repo. G1 must say how N3 gets "scoped" for them; G0 does not test it. +- Open generics, factory lambdas, assembly scanning: unknown, as today. From 80734ff797abcc1e36fa0277b68e5611704d616c Mon Sep 17 00:00:00 2001 From: PhysShell <45852143+PhysShell@users.noreply.github.com> Date: Tue, 20 Oct 2026 20:06:56 +0500 Subject: [PATCH 2/2] =?UTF-8?q?docs(evidence):=20N3=20pilot=20G0=20?= =?UTF-8?q?=E2=80=94=20PASS-G0=20(scope=20identity)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All 7 OrchardCore DI001 FPs of D11 are removed by the pre-registered rules: rule 3 (own implementation at the root) removes the implementation-merge FP, rule 4 (proven lifetime only) the six test-registration FPs. Controls hold exactly (DiCaptiveSample 4/4, rrr-pi-rate#60 base 1 / fix 0); 0 new findings over 27 saved holdout and sweep facts. Limits carried into G1: the test-project rule missed OrchardCore.Tests (xunit.v3.mtp-v2), so rule 2 removed none of the seven; a known Orleans factory-lambda FP survives; framework-provided scoped lifetimes (HttpContext, AddDbContext, controllers) are not covered by the registration graph. Research only: no production, OwnIR, CI or golden change. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01TFkNAFFQz9KoTzpPws8vYG --- docs/evidence/n3-pilot-2026-10/REPORT-G0.md | 105 +++++++ .../n3-pilot-2026-10/data/g0_ablation.tsv | 156 ++++++++++ .../n3-pilot-2026-10/data/g0_findings.tsv | 20 ++ .../n3-pilot-2026-10/data/g0_summary.tsv | 31 ++ .../scripts/g0_scope_identity.py | 285 ++++++++++++++++++ 5 files changed, 597 insertions(+) create mode 100644 docs/evidence/n3-pilot-2026-10/REPORT-G0.md create mode 100644 docs/evidence/n3-pilot-2026-10/data/g0_ablation.tsv create mode 100644 docs/evidence/n3-pilot-2026-10/data/g0_findings.tsv create mode 100644 docs/evidence/n3-pilot-2026-10/data/g0_summary.tsv create mode 100644 docs/evidence/n3-pilot-2026-10/scripts/g0_scope_identity.py diff --git a/docs/evidence/n3-pilot-2026-10/REPORT-G0.md b/docs/evidence/n3-pilot-2026-10/REPORT-G0.md new file mode 100644 index 00000000..61a8a16a --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/REPORT-G0.md @@ -0,0 +1,105 @@ +# N3 bounded pilot, gate G0 (scope identity) — report + +**Result: `PASS-G0`, by the pre-registered rules.** Three limits below bind G1. + +Rules: [`00-preregistration-g0.md`](00-preregistration-g0.md), committed in `14be6c33` before the filter was +written or run. No rule was changed after the first run. + +Nothing in production, OwnIR, CI or goldens was touched. The script reads saved `facts.json` files, `.csproj` files +and the unchanged core (`ownlang/di.py`). + +## 1. What was run + +- **Script.** [`scripts/g0_scope_identity.py`](scripts/g0_scope_identity.py). +- **Facts.** The facts saved by the direction research (private), produced by the Own.NET `e7d33e33` Release + extractor: + - 15 holdout repositories; + - 13 design-B sweep repositories; + - corpus pair rrr-pi-rate#60, `base` and `fix`. + + `frontend/roslyn/samples/DiCaptiveSample.cs` was extracted with the same binary. `di.py` and the sample are + unchanged between `e7d33e33` and `main` (`76bc4222`). +- **Baseline.** The current core, `find_captive_dependencies`, over the same facts. +- **Self-check.** + - With all three rules switched off, the script's walk reproduces the core's findings in all 30 inputs, with 0 + differences. + - A second run produced identical output files. + +Command: + +``` +python -I docs/evidence/n3-pilot-2026-10/scripts/g0_scope_identity.py --ownnet . \ + --research --out \ + --extra "sample/DiCaptiveSample=@." +``` + +## 2. Verdict, criterion by criterion + +| Criterion | Result | +|---|---| +| All 7 known OrchardCore FPs gone, each by a named rule | yes, 7/7 (§3) | +| `DiCaptiveSample`: exactly four DI001, silence on `Metrics -> Clock` and `PublicCtorOnly` | yes: `EmailSender -> AppDbContext`, `ReportService -> UnitOfWork -> AppDbContext`, `CacheService -> IRepo`, `PrimaryCtorService -> AppDbContext`; nothing else | +| rrr-pi-rate#60: DI001 on `base`, none on `fix` | yes: `IDiscordBotMessageReceiver -> ITriggerReportService` on `base`; 0 on `fix` | +| New findings over 27 holdout and sweep repositories, all triaged, none FP or `UNCLEAR` | 0 new findings | +| Within 0.25 agent-day | yes | + +## 3. Which rule removed which FP (ablation) + +[`data/g0_ablation.tsv`](data/g0_ablation.tsv) records every subset of rules 2, 3 and 4. A `1` means the finding is +still reported. + +| Known FP (OrchardCore) | none | 2 | 3 | 4 | 2+3 | 2+4 | 3+4 | 2+3+4 | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| `IShellHost -> IExtensionManager` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `ICompositionStrategy -> IExtensionManager` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `IShellContainerFactory -> IExtensionManager` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `IShellDescriptorManager -> IExtensionManager` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `IPageApplicationModelProvider -> IExtensionManager` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `MediaCommandParser -> IMediaTokenService` | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | +| `IDeploymentTargetProvider -> RemoteInstanceService` | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | + +- Rule 3 (walk from the registration's own implementation) removes the implementation-merge FP. Nothing else + removes it. +- Rule 4 (proven lifetime only) removes the six test-registration FPs. +- Rule 2 (drop test registrations) removes none of the seven (limit 1). +- Partial subsets add findings: rule 3 alone gives 2 new ones, rules 3+4 give 1. All of them are in nopCommerce test + code (`src/Tests/Nop.Tests/BaseNopTest.cs:482`, `ITaskScheduler`). With all three rules on, there are 0. + +## 4. Limits that bind G1 + +1. **The test-project rule missed the project that holds the FP source.** `test/OrchardCore.Tests` references + `xunit.v3.mtp-v2`, which is not in the fixed package list, so rule 1 classed it as product. + - The `StubExtensionManager` and `MediaTokenTests` registrations stayed in the graph. They were neutralised only + because product code registers the same names as singleton, so rule 4 saw mixed lifetimes. + - A scoped registration that exists only in an unrecognised test project would still read as proven scoped. + - One existing DI001 on a test-file registration also stays: `AttachedMediaFieldFileService -> + IUserAssetFolderNameProvider`, `ViewMediaFolderAuthorizationHandlerTests.cs:461`. + - Over all inputs, rule 1 marks 603 of 4,503 registrations as test, and the comparison path regex marks 1,682. + The regex also covers samples, docs and benchmarks, so the two numbers do not measure the same thing. + - Package-name matching is brittle. G1 must not treat "not in a recognised test project" as proof of product + code. +2. **Rule 4 trades recall for precision.** Names with mixed lifetimes become unknown: 48 over all inputs: 23 in + OrchardCore, 11 in Orleans, 6 in bitwarden, 8 in eShop, grpc-dotnet, Quartz.NET and nopCommerce. For N3 this direction is acceptable: + unknown means silence. +3. **A known FP survives G0.** In Orleans, `DhtGrainLocator -> IGrainContext` (`DefaultSiloServices.cs:156`) was + triaged FP in the sweep: the singleton is built by a factory lambda that never resolves `IGrainContext`. It is not + one of the seven targets, and G0 does not fix it. The two nopCommerce `ElFinderService` findings that remain were + triaged true but benign in the sweep. +4. **G0 does not cover where N3's scoped objects mostly come from.** In the Phase 0 instances these are + `HttpContext`, `DbContext` registered by `AddDbContext`, and controllers or other per-request framework types. + Their lifetime is set by the framework, not by an `Add*` call in the repository, so the registration graph alone + cannot prove them scoped. G1 has to settle this first, and a framework lifetime table must be fixed before any + run. + +## 5. Files + +- [`00-preregistration-g0.md`](00-preregistration-g0.md): the rules, committed before the run. +- [`scripts/g0_scope_identity.py`](scripts/g0_scope_identity.py): the filter and the ablation. +- [`data/g0_summary.tsv`](data/g0_summary.tsv): per input, the registrations, test-project and path-regex counts, + mixed-lifetime names, and DI001 counts for the current core and for G0. +- [`data/g0_findings.tsv`](data/g0_findings.tsv): every current-core finding, marked `kept` or `removed`, and any + `NEW` finding. +- [`data/g0_ablation.tsv`](data/g0_ablation.tsv): every finding under every rule subset. + +The input facts and the third-party source trees are in the direction-research repository (private) and are not +committed here. diff --git a/docs/evidence/n3-pilot-2026-10/data/g0_ablation.tsv b/docs/evidence/n3-pilot-2026-10/data/g0_ablation.tsv new file mode 100644 index 00000000..7caf1f8c --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/data/g0_ablation.tsv @@ -0,0 +1,156 @@ +input rules_on file line singleton captured origin result +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current reported +holdout/OrchardCMS__OrchardCore none repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current reported +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current - +holdout/OrchardCMS__OrchardCore 4 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current - +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 3 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current - +holdout/OrchardCMS__OrchardCore 34 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 2 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current reported +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current - +holdout/OrchardCMS__OrchardCore 24 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current - +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current reported +holdout/OrchardCMS__OrchardCore 23 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager current - +holdout/OrchardCMS__OrchardCore 234 repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider current reported +sweep/bitwarden__server none ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current reported +sweep/bitwarden__server none ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current reported +sweep/bitwarden__server 4 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current reported +sweep/bitwarden__server 4 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current reported +sweep/bitwarden__server 3 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 3 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/bitwarden__server 34 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 34 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/bitwarden__server 2 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 2 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/bitwarden__server 24 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 24 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/bitwarden__server 23 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 23 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/bitwarden__server 234 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery current - +sweep/bitwarden__server 234 ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext current - +sweep/dotnet__orleans none ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 4 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 3 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 34 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 2 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 24 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 23 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/dotnet__orleans 234 ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext current reported +sweep/nopSolutions__nopCommerce none ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce none ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce none ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current reported +sweep/nopSolutions__nopCommerce 4 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current - +sweep/nopSolutions__nopCommerce 4 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current - +sweep/nopSolutions__nopCommerce 4 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +sweep/nopSolutions__nopCommerce 3 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce 3 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce 3 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current reported +sweep/nopSolutions__nopCommerce 3 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 482 ITaskScheduler IScheduleTaskService new reported +sweep/nopSolutions__nopCommerce 3 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 482 ITaskScheduler IStoreContext new reported +sweep/nopSolutions__nopCommerce 34 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current - +sweep/nopSolutions__nopCommerce 34 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current - +sweep/nopSolutions__nopCommerce 34 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +sweep/nopSolutions__nopCommerce 34 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 482 ITaskScheduler IStoreContext new reported +sweep/nopSolutions__nopCommerce 2 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce 2 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce 2 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +sweep/nopSolutions__nopCommerce 24 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce 24 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce 24 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +sweep/nopSolutions__nopCommerce 23 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce 23 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce 23 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +sweep/nopSolutions__nopCommerce 234 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider current reported +sweep/nopSolutions__nopCommerce 234 ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper current reported +sweep/nopSolutions__nopCommerce 234 ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager current - +pair/rrr-pi-rate#60/base none evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 4 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 3 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 34 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 2 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 24 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 23 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +pair/rrr-pi-rate#60/base 234 evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService current reported +sample/DiCaptiveSample none frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample none frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample none frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample none frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 4 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 4 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 4 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 4 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 3 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 3 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 3 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 3 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 34 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 34 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 34 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 34 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 2 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 2 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 2 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 2 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 24 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 24 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 24 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 24 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 23 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 23 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 23 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 23 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported +sample/DiCaptiveSample 234 frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext current reported +sample/DiCaptiveSample 234 frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext current reported +sample/DiCaptiveSample 234 frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo current reported +sample/DiCaptiveSample 234 frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext current reported diff --git a/docs/evidence/n3-pilot-2026-10/data/g0_findings.tsv b/docs/evidence/n3-pilot-2026-10/data/g0_findings.tsv new file mode 100644 index 00000000..7bd3c97f --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/data/g0_findings.tsv @@ -0,0 +1,20 @@ +input status file line singleton captured path impl path_regex +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Deployment/Startup.cs 31 IDeploymentTargetProvider RemoteInstanceService IDeploymentTargetProvider -> RemoteInstanceService FileDownloadDeploymentTargetProvider product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore.Modules/OrchardCore.Media/Startup.cs 177 MediaCommandParser IMediaTokenService MediaCommandParser -> IMediaTokenService MediaCommandParser product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore.Mvc.Core/RazorPages/ModularPageMvcCoreBuilderExtensions.cs 24 IPageApplicationModelProvider IExtensionManager IPageApplicationModelProvider -> IExtensionManager ModularPageApplicationModelProvider product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 18 IShellHost IExtensionManager IShellHost -> IExtensionManager ShellHost product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 28 ICompositionStrategy IExtensionManager ICompositionStrategy -> IExtensionManager CompositionStrategy product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 30 IShellContainerFactory IExtensionManager IShellContainerFactory -> IExtensionManager ShellContainerFactory product +holdout/OrchardCMS__OrchardCore removed repos/holdout/OrchardCMS__OrchardCore/src/OrchardCore/OrchardCore/Shell/ServiceCollectionExtensions.cs 55 IShellDescriptorManager IExtensionManager IShellDescriptorManager -> IExtensionManager SetFeaturesShellDescriptorManager product +holdout/OrchardCMS__OrchardCore kept repos/holdout/OrchardCMS__OrchardCore/test/OrchardCore.Tests/Modules/OrchardCore.Media/SecureMedia/ViewMediaFolderAuthorizationHandlerTests.cs 461 AttachedMediaFieldFileService IUserAssetFolderNameProvider AttachedMediaFieldFileService -> IUserAssetFolderNameProvider AttachedMediaFieldFileService nonproduct +sweep/bitwarden__server removed ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler IAccessClientQuery IAuthorizationHandler -> IAccessClientQuery AllowedRequirementHandler nonproduct +sweep/bitwarden__server removed ../sweep/bitwarden__server/test/Libraries/OrganizationAuthorization.Test/AuthorizeAttributeTests.cs 60 IAuthorizationHandler ICurrentContext IAuthorizationHandler -> ICurrentContext AllowedRequirementHandler nonproduct +sweep/dotnet__orleans kept ../sweep/dotnet__orleans/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs 156 DhtGrainLocator IGrainContext DhtGrainLocator -> IGrainContext DhtGrainLocator product +sweep/nopSolutions__nopCommerce kept ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService INopFileProvider IElFinderService -> INopFileProvider ElFinderService product +sweep/nopSolutions__nopCommerce kept ../sweep/nopSolutions__nopCommerce/src/Presentation/Nop.Web.Framework/Infrastructure/NopStartup.cs 294 IElFinderService IWebHelper IElFinderService -> IWebHelper ElFinderService product +sweep/nopSolutions__nopCommerce removed ../sweep/nopSolutions__nopCommerce/src/Tests/Nop.Tests/BaseNopTest.cs 411 IReviewTypeService IShortTermCacheManager IReviewTypeService -> IRepository -> IShortTermCacheManager ReviewTypeService nonproduct +pair/rrr-pi-rate#60/base kept evidence/pairs/rrr-pi-rate_StockPriceSheetPrintService__60/base/StockPriceSheetPrintService/ServiceCollectionExtensions.cs 21 IDiscordBotMessageReceiver ITriggerReportService IDiscordBotMessageReceiver -> ITriggerReportService DiscordMessageDistributor product +sample/DiCaptiveSample kept frontend/roslyn/samples/DiCaptiveSample.cs 214 EmailSender AppDbContext EmailSender -> AppDbContext EmailSender nonproduct +sample/DiCaptiveSample kept frontend/roslyn/samples/DiCaptiveSample.cs 219 ReportService AppDbContext ReportService -> UnitOfWork -> AppDbContext ReportService nonproduct +sample/DiCaptiveSample kept frontend/roslyn/samples/DiCaptiveSample.cs 222 CacheService IRepo CacheService -> IRepo CacheService nonproduct +sample/DiCaptiveSample kept frontend/roslyn/samples/DiCaptiveSample.cs 225 PrimaryCtorService AppDbContext PrimaryCtorService -> AppDbContext PrimaryCtorService nonproduct diff --git a/docs/evidence/n3-pilot-2026-10/data/g0_summary.tsv b/docs/evidence/n3-pilot-2026-10/data/g0_summary.tsv new file mode 100644 index 00000000..a24c6c02 --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/data/g0_summary.tsv @@ -0,0 +1,31 @@ +input registrations test_project path_regex_nonproduct no_csproj unresolved_file mixed_lifetime_names di001_current di001_g0 di001_g0_new +holdout/Jackett__Jackett 0 0 0 0 0 0 0 0 0 +holdout/MassTransit__MassTransit 214 167 182 0 0 0 0 0 0 +holdout/OrchardCMS__OrchardCore 1199 15 265 0 0 23 8 1 0 +holdout/Radarr__Radarr 9 0 0 0 0 0 0 0 0 +holdout/confluentinc__confluent-kafka-dotnet 3 0 3 0 0 0 0 0 0 +holdout/dotnet__eShop 66 0 4 1 0 2 0 0 0 +holdout/files-community__Files 76 0 0 0 0 0 0 0 0 +holdout/gitextensions__gitextensions 0 0 0 0 0 0 0 0 0 +holdout/grpc__grpc-dotnet 66 1 60 1 0 3 0 0 0 +holdout/linq2db__linq2db 9 2 5 0 0 0 0 0 0 +holdout/microsoft__garnet 0 0 0 0 0 0 0 0 0 +holdout/mongodb__mongo-csharp-driver 0 0 0 0 0 0 0 0 0 +holdout/quartznet__quartznet 175 1 150 0 0 1 0 0 0 +holdout/rabbitmq__rabbitmq-dotnet-client 0 0 0 0 0 0 0 0 0 +sweep/Flow-Launcher__Flow.Launcher 18 0 0 0 0 0 0 0 0 +sweep/HangfireIO__Hangfire 4 0 0 0 0 0 0 0 0 +sweep/MessagePack-CSharp__MessagePack-CSharp 0 0 0 0 0 0 0 0 0 +sweep/akkadotnet__akka.net 25 14 19 0 0 0 0 0 0 +sweep/bitwarden__server 806 118 122 0 0 6 2 0 0 +sweep/dotnet__orleans 952 29 578 2 0 11 1 1 0 +sweep/duplicati__duplicati 29 0 0 0 0 0 0 0 0 +sweep/git-ecosystem__git-credential-manager 0 0 0 0 0 0 0 0 0 +sweep/jellyfin__jellyfin 169 9 9 0 0 0 0 0 0 +sweep/lepoco__wpfui 46 0 11 0 0 0 0 0 0 +sweep/nats-io__nats.net 18 18 18 0 0 0 0 0 0 +sweep/nopSolutions__nopCommerce 537 226 226 0 0 2 3 2 0 +sweep/npgsql__npgsql 0 0 0 0 0 0 0 0 0 +pair/rrr-pi-rate#60/base 26 0 0 0 0 0 1 1 0 +pair/rrr-pi-rate#60/fix 29 3 3 0 0 0 0 0 0 +sample/DiCaptiveSample 27 0 27 27 0 0 4 4 0 diff --git a/docs/evidence/n3-pilot-2026-10/scripts/g0_scope_identity.py b/docs/evidence/n3-pilot-2026-10/scripts/g0_scope_identity.py new file mode 100644 index 00000000..75ed4de8 --- /dev/null +++ b/docs/evidence/n3-pilot-2026-10/scripts/g0_scope_identity.py @@ -0,0 +1,285 @@ +"""N3 pilot, gate G0: DI001 over saved `services` facts, current core vs the four +pre-registered rules (00-preregistration-g0.md). Research only: reads facts and +.csproj files, imports the unchanged core, writes a TSV of findings. + +usage: python -I g0_scope_identity.py --ownnet \ + --research --out [--extra name=facts.json ...] +""" + +from __future__ import annotations + +import argparse +import glob +import json +import os +import re +import sys + +TEST_PACKAGES = ( + "Microsoft.NET.Test.Sdk", + "xunit", + "xunit.v3", + "NUnit", + "MSTest.TestFramework", + "MSTest", + "TUnit", + "BenchmarkDotNet", +) +PKG_RE = re.compile(r']*Include\s*=\s*"([^"]+)"', re.I) +IS_TEST_RE = re.compile(r"\s*true\s*", re.I) +# comparison only (rule 1 does not use it): the direction research's path regex +NONPRODUCT = re.compile( + r"(^|[\\/])(tests?|testing|unittests?|[^\\/]*tests?[^\\/]*|benchmarks?|samples?|examples?" + r"|demos?|docs?|playground|fixtures?|perf)([\\/]|$)", + re.I, +) + + +def resolve(path: str, bases: list[str]) -> str | None: + for b in bases: + p = os.path.normpath(os.path.join(b, path)) + if os.path.exists(p): + return p + return None + + +_proj_cache: dict[str, tuple[str | None, bool]] = {} + + +def owning_project(src: str) -> tuple[str | None, bool]: + """Nearest ancestor directory holding a .csproj -> (csproj path, is test project).""" + d = os.path.dirname(src) + seen = [] + while True: + if d in _proj_cache: + res = _proj_cache[d] + break + projs = sorted(glob.glob(os.path.join(glob.escape(d), "*.csproj"))) + seen.append(d) + if projs: + text = "\n".join(open(p, encoding="utf-8", errors="replace").read() for p in projs) + pkgs = {m.lower() for m in PKG_RE.findall(text)} + is_test = bool(IS_TEST_RE.search(text)) or any(t.lower() in pkgs for t in TEST_PACKAGES) + res = (projs[0], is_test) + break + parent = os.path.dirname(d) + if parent == d: + res = (None, False) + break + d = parent + for s in seen: + _proj_cache[s] = res + return res + + +def to_services(raw: list[dict], di) -> list: + # the same field mapping as ownlang/ownir.py::_di_findings + return [ + di.Service( + name=str(s.get("name", "?")), + lifetime=str(s.get("lifetime", "")), + deps=tuple(s.get("deps", [])), + weak_deps=tuple(s.get("weak_deps", [])), + root_resolves=tuple(s.get("root_resolves", [])), + disposable=s.get("disposable") is True, + file=str(s.get("file", "?")), + line=int(s.get("line", 0) or 0), + ctor_file=str(s.get("ctor_file", "?")), + ctor_line=int(s.get("ctor_line", 0) or 0), + ctor_type=str(s.get("ctor_type", "")), + ) + for s in raw + ] + + +def g0_captives( + services: list, di, own_root: bool = True, proven_only: bool = True +) -> tuple[list[tuple], int]: + """Rules 3 and 4 over already-filtered registrations (rule 2). Same DI001 rule: + singleton -> scoped, following transients only. The flags switch a rule off for + the ablation: own_root=False walks from by_name[s.name] like the core, and + proven_only=False lets the last registration of a name decide its lifetime.""" + by_name: dict[str, list] = {} + for s in services: + by_name.setdefault(s.name, []).append(s) + + def proven(name: str) -> str | None: + regs = by_name.get(name) + if not regs: + return None + if not proven_only: + return regs[-1].lifetime + lts = {r.lifetime for r in regs} + return lts.pop() if len(lts) == 1 else "mixed" + + mixed = sum(1 for n in by_name if len({r.lifetime for r in by_name[n]}) > 1) + out = [] + for s in services: + if s.lifetime != di.SINGLETON: + continue + reported, visited = set(), set() + # rule 3: the root is this registration, not by_name[s.name] + root = s if own_root else by_name[s.name][-1] + stack = [(tuple(root.deps), (s.name,))] + while stack: + deps, path = stack.pop() + for dep in deps: + lt = proven(dep) + npath = (*path, dep) + if lt == di.SCOPED: + if dep not in reported: + reported.add(dep) + out.append((s.file, s.line, s.name, dep, " -> ".join(npath), s.ctor_type)) + elif lt == di.TRANSIENT and dep not in visited: + visited.add(dep) + for r in by_name[dep] if proven_only else by_name[dep][-1:]: + stack.append((tuple(r.deps), npath)) + out.sort() + return out, mixed + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--ownnet", required=True) + ap.add_argument("--research", required=True) + ap.add_argument("--out", required=True) + ap.add_argument("--extra", action="append", default=[], help="name=facts.json[@source-base]") + a = ap.parse_args() + sys.path.insert(0, os.path.abspath(a.ownnet)) + from ownlang import di + + R = os.path.abspath(a.research) + inputs: list[tuple[str, str, list[str]]] = [] + for p in sorted(glob.glob(os.path.join(R, "evidence", "holdout", "ownnet", "*", "facts.json"))): + inputs.append(("holdout/" + os.path.basename(os.path.dirname(p)), p, [R])) + for p in sorted(glob.glob(os.path.join(R, "evidence", "sweep", "runs", "*", "facts.json"))): + inputs.append( + ( + "sweep/" + os.path.basename(os.path.dirname(p)), + p, + [os.path.join(R, "repos", "Own.NET"), R], + ) + ) + pair = os.path.join(R, "evidence", "pairs", "rrr-pi-rate_StockPriceSheetPrintService__60") + for side in ("base", "fix"): + inputs.append( + (f"pair/rrr-pi-rate#60/{side}", os.path.join(pair, f"{side}.facts.json"), [R]) + ) + for e in a.extra: + name, rest = e.split("=", 1) + fp, _, base = rest.partition("@") + inputs.append((name, fp, [base or os.path.dirname(fp)])) + + os.makedirs(a.out, exist_ok=True) + rows, summary, ablation = [], [], [] + for name, fp, bases in inputs: + facts = json.load(open(fp, encoding="utf-8")) + raw = facts.get("services", []) if isinstance(facts.get("services"), list) else [] + cur = di.find_captive_dependencies(to_services(raw, di)) + kept, n_test, n_noproj, n_unres, regex_test = [], 0, 0, 0, 0 + for s in raw: + src = resolve(str(s.get("file", "?")), bases) + if NONPRODUCT.search(str(s.get("file", ""))): + regex_test += 1 + if src is None: + n_unres += 1 + kept.append(s) + continue + proj, is_test = owning_project(src) + if proj is None: + n_noproj += 1 + if is_test: + n_test += 1 + continue # rule 2 + kept.append(s) + new, mixed = g0_captives(to_services(kept, di), di) + cur_keys = {(f.file, f.line, f.singleton, f.captured) for f in cur} + # ablation: each subset of rules 2/3/4 (rule 1 is the input to rule 2) + for r2 in (False, True): + for r3 in (False, True): + for r4 in (False, True): + got, _ = g0_captives( + to_services(kept if r2 else raw, di), di, own_root=r3, proven_only=r4 + ) + keys = {g[:4] for g in got} + tag = "".join(n for n, on in (("2", r2), ("3", r3), ("4", r4)) if on) or "none" + for k in sorted(cur_keys | keys): + ablation.append( + ( + name, + tag, + k[0], + k[1], + k[2], + k[3], + "current" if k in cur_keys else "new", + "reported" if k in keys else "-", + ) + ) + new_keys = {r[:4] for r in new} + for f in cur: + k = (f.file, f.line, f.singleton, f.captured) + rows.append( + ( + name, + "removed" if k not in new_keys else "kept", + f.file, + f.line, + f.singleton, + f.captured, + " -> ".join(f.path), + f.consumed_type, + "nonproduct" if NONPRODUCT.search(f.file) else "product", + ) + ) + for r in new: + if r[:4] not in cur_keys: + rows.append( + ( + name, + "NEW", + r[0], + r[1], + r[2], + r[3], + r[4], + r[5], + "nonproduct" if NONPRODUCT.search(r[0]) else "product", + ) + ) + summary.append( + ( + name, + len(raw), + n_test, + regex_test, + n_noproj, + n_unres, + mixed, + len(cur), + len(new), + sum(1 for r in new if r[:4] not in cur_keys), + ) + ) + + with open(os.path.join(a.out, "g0_findings.tsv"), "w", encoding="utf-8", newline="\n") as f: + f.write("input\tstatus\tfile\tline\tsingleton\tcaptured\tpath\timpl\tpath_regex\n") + for r in rows: + f.write("\t".join(map(str, r)) + "\n") + with open(os.path.join(a.out, "g0_summary.tsv"), "w", encoding="utf-8", newline="\n") as f: + f.write( + "input\tregistrations\ttest_project\tpath_regex_nonproduct\tno_csproj\tunresolved_file\t" + "mixed_lifetime_names\tdi001_current\tdi001_g0\tdi001_g0_new\n" + ) + for r in summary: + f.write("\t".join(map(str, r)) + "\n") + with open(os.path.join(a.out, "g0_ablation.tsv"), "w", encoding="utf-8", newline="\n") as f: + f.write("input\trules_on\tfile\tline\tsingleton\tcaptured\torigin\tresult\n") + for r in ablation: + f.write("\t".join(map(str, r)) + "\n") + print(open(os.path.join(a.out, "g0_summary.tsv"), encoding="utf-8").read()) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())