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.
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())