Skip to content

Preserve definite assignment across short-circuit outcomes - #9944

Open
richlander wants to merge 6 commits into
mainfrom
fix/rts-revealed-row-triage
Open

richlander wants to merge 6 commits into
mainfrom
fix/rts-revealed-row-triage

Conversation

@richlander

Copy link
Copy Markdown
Owner

Preserve primitive-boolean outcome assignment facts

Change

Conclusion: REVIEW — scoped native fidelity improves; the full-corpus raw validity gate remains BLOCKED under #9939. Four sampled rows become Exact without availability losses. No whole-corpus legality or merge-readiness claim is made. The raw validity-shell failure remains visible under #9939 and full Render A/B acquisition is limited by #9935.

Evidence map

Lens Scope Compared Held constant Answers
Method validity TypeRef::DisplayName, dotnet-inspect.any 0.14.0 Base d93cb58 → head 8d72a54 Pinned assembly bytes and target signature Does emitted C# bind?
Method correctness Same DisplayName method Base → head Reads require the same guarded TryGetValue call Is the removed store unobservable?
Method IL fidelity Same DisplayName method Base → head Original IL, native RTS v5 Does recompilation match?
Structural review Same DisplayName method Exact CLI documents Same physical MethodDef and provenance Does correspondence support the initializer change?
PDB Source → After Same pinned method and checksum-matched PDB document Authored source → head Portable-PDB SHA256 agreement What differs from source?
Render A/B 46,945 methods in 13 pinned assemblies Exact merge-base 2768de6 → head 40d6eed Same bytes, paths, working directory, uncapped sampling, workers 2 Which bodies changed?
Changed-method native fidelity The 139 Render A/B changed methods plus 2 CSharp validity rows d93cb58 → 8d72a54 Same complete 14-assembly reference population and v5 engine Which changes compile and become Exact?
Reduced binding Compiler-produced returning guard and user-truthiness decline, plus synthetic outcome boundaries Base product → head product Same lowering and binding contracts Does the proof preserve legality and declines?
Full corpus 89,065 methods in 14 baseline assemblies Clean d93cb58 → clean 1f729e6 Same cap 4000 / fidelity cap 50 / rts-cutover Exact attribution of all changed statuses

Shared judgment

Lens Scope Evidence kind Direction Comparison What decides the judgment
Method validity DisplayName Product quality Same Both compile under native RTS Bound product artifact
Method correctness DisplayName Product quality Same Same branch/read behavior Only an unobservable initializer is removed
Method IL fidelity DisplayName Product quality Better OpcodeDiff → Exact Unchanged native v5 comparison
Structural review DisplayName Evidence coverage Same No structural changes generated Initializer text is outside supported changed correspondence
PDB Source → After DisplayName Product quality Not directional Different source spelling Text similarity alone is not a quality oracle
Render A/B 46,945 methods Product quality Not directional 139 initializer-only changes; raw shell has 57 valid→invalid reports #9939 limits the raw legality lane; preserve the reports
Changed-method native fidelity 141 methods Product quality Better 65 checkable rows: 0→50 Exact; 76 unavailable rows unchanged No newly unavailable row; no validity claim for unavailable rows
Reduced binding Outcome/decline fixtures Product quality Better Regressions repaired; user-truthiness fallback retained Compiler-produced binding and native Exact witness
Full corpus 89,065 methods Product quality Not directional 4 native Exact gains; 40 raw CS0165 losses Mixed signals; #9939 bounds legality evidence and keeps the failing gate visible

Raise contract

Normative owner: docs/design/value-typed-emission.md#instance-3--definite-assignment-decided-before-printing — emit a bare local only when every path reaching its read establishes definite assignment before printing.

Supporting roles: MethodRef.TryGetVerifiedOutLocal supplies metadata-derived out facts; ShortCircuitFidelity supplies the user-truthiness decline constraint; the correctness pipeline separates legality, correctness, and native fidelity; CSharpPrinter consumes the existing decided initializer set across CLI and Browser paths.

Obligation Contract
Lowering shell Release primitive-boolean &&, or negated || returning guards, containing a verified out call. The compiler-produced Parse specimen and pinned DisplayName retain the shape.
Consumed ownership No blocks, statements, labels, stores, or locals are removed from IR. Only the already-owned initializer decision consumes true/false assignment sets. Nested bodies retain separate local tables.
Control flow Unchanged. False/true path intersections and fall-through joins exclude returning arms; unsupported transfers preserve the existing conservative fallback.
Replacement The emitted local has no initializer; its first read follows the same verified out call. Independent binding, compiler-produced native Exact, and 50 real changed-method Exact results corroborate it.
Decline boundary Skipped calls, ref/unknown facts, handler entries, external branches, nested-body reads, and user-truthiness chains retain initialization. The latter may bind overloaded operators and lacks primitive C# outcome facts.
Falsifier A reaching read whose verified call was skipped, or a complete-context C# CS0165 introduced by elision. The compiler-produced truthiness negative caught and closed such a proposal before publication.

Correctness-fix contract

Obligation Contract
False claim The body was valid and behavior-preserving but introduced default-store IL absent from the original. No claim that the old body was an observable semantic defect.
Root cause Assignment facts from a short-circuit right operand were discarded before the outcome-specific branch was visited.
Fix shape Preserve primitive condition outcome sets and join only reaching paths; decline user-defined truthiness.
Scope boundary Other storage/branch reconstruction, generated names, declaration spelling, composition, and comparator rows remain tracked separately.
Falsifier A new required initializer is omitted or a same-population compiled native row becomes unavailable.

Structural review

Scope: one pinned DisplayName MethodDef. Required exact CLI document acquisition and structural review completed at base d93cb58 / head 8d72a54.

Attempted — unavailable for the claimed change: generated result is No structural changes. The emitted initializer has no supported changed structural row. Standalone before/after bodies are retained; no caller-authored correspondence or carets are substituted.

PDB Source → After

# ILInspector.Decompiler.Pipeline.TypeRef.DisplayName

Type: ILInspector.Decompiler.Pipeline.TypeRef | Library: /home/rich/.nuget/packages/dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll | Source: Library

## Source Diff

PDB source: https://raw.githubusercontent.com/richlander/dotnet-inspect/8681f6eac3ff44b231925913c3e2b17c8be0ddd4/src/ILInspector.Decompiler/Pipeline/TypeRef.cs  
Integrity: PDB source document bytes match portable-PDB SHA256 checksum 36167FE9FBE1F2E4E0452A7B84182E6623ED75286CBFDB0253ACD0B4A58A6552.  

```diff
--- PDB comparison
+++ Decompiled comparison
@@ -1,2 +1,3 @@
-string DisplayName()
+private string DisplayName()
 {
+    string keyword;
@@ -2,0 +4 @@ whitespace-only: line breaks
+
@@ -3,9 +5,7 @@
-    if (Assembly == CoreLibrary && Namespace == "System" && s_keywords.TryGetValue(Name, out var keyword))
+    if (Assembly == "corelib" && Namespace == "System" && TypeRef.s_keywords.TryGetValue(Name, out keyword))
+    {
         return keyword;
-    // Nested types carry the metadata `Outer+Inner` name; C# refers to
-    // them by the innermost simple name (the namespace-stripping
-    // convention extended inward), so `Interop+Error` renders `Error`.
+    }
     int nested = Name.LastIndexOf('+');
-    string innermost = nested < 0 ? Name : Name[(nested + 1)..];
-    return CSharpNaming.TypeNameSegment(innermost);
+    return CSharpNaming.TypeNameSegment(nested < 0 ? Name : Name.Substring(nested + 1));
 }
\ No newline at end of file
```

Benchmark target

Package dotnet-inspect.any 0.14.0, tools/net10.0/any/ILInspector.Decompiler.dll.

dotnet-inspect member ILInspector.Decompiler.Pipeline.TypeRef \
  --library /home/rich/.nuget/packages/dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll \
  -m DisplayName --all -S "Decompiled Source"

Before

private string DisplayName()
{
    string keyword = default;

    if (Assembly == "corelib" && Namespace == "System" && TypeRef.s_keywords.TryGetValue(Name, out keyword))
    {
        return keyword;
    }
    int nested = Name.LastIndexOf('+');
    return CSharpNaming.TypeNameSegment(nested < 0 ? Name : Name.Substring(nested + 1));
}
  • Valid: True (native compilation).
  • Correct: True (same guarded read behavior).
  • Printer exact: not enrolled in a whole-file authored-source oracle.
  • IL fidelity: False (OpcodeDiff).
  • Taste applied: None (empty Applied Taste result).
  • Commit: d93cb58f8b5c44ecc831158db64cee502a7e63e6.

After

private string DisplayName()
{
    string keyword;

    if (Assembly == "corelib" && Namespace == "System" && TypeRef.s_keywords.TryGetValue(Name, out keyword))
    {
        return keyword;
    }
    int nested = Name.LastIndexOf('+');
    return CSharpNaming.TypeNameSegment(nested < 0 ? Name : Name.Substring(nested + 1));
}
  • Valid: True (native compilation).
  • Correct: True (verified out call dominates every read on the entering outcome).
  • Printer exact: not enrolled in a whole-file authored-source oracle.
  • IL fidelity: True (Exact, v5).
  • Taste applied: None (empty Applied Taste result).
  • Commit: 8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8.

Fully raised

The After decompilation is in the fully raised state.

Evidence

Check Baseline Head
Release build Pass, d93cb58, zero warnings/errors Pass, 8d72a54, zero warnings/errors
Matched focused tests, prior pair 6f846c4/f35404ed5 35 cases: 26 passed, 9 regression cases failed 35/35 passed
Matched fast tests, same prior pair 7,103 cases: 7,095 passed, 8 regression cases failed 7,103/7,103 passed
Final focused scope Prior positive/negative proofs above 36/36 passed, including the added compiler-produced truthiness decline
Final fast source build, integrated 1f729e6 Prior matched population above 7,130/7,130 passed; upstream fixture growth is population accounting, not a directional aggregate claim
Exact-candidate changed-method native delta, 141 methods 65 OpcodeDiff, 72 RecompileFail, 4 ContextFail 50 Exact, 15 OpcodeDiff, 72 RecompileFail, 4 ContextFail
Generated-baseline pins and deserialization Existing pins at d93cb58: 682 / 37 / 42 / 34 / 0 4/4 tests pass; values unchanged, so no pin edit
Matched PR quick census 1,716 methods, zero pass bugs Zero changed rows; identical metrics, PASS
Structural review Exact document acquired Exact document compared; initializer change unsupported
Render A/B 46,945 methods 139 changed, 172 initializer removals, zero other edits, zero added/removed methods

The nine matched base failures are only the new scoped regression cases: positive AND/OR outcomes, nested AND, host half of nested-body isolation, returning guard, conditional expression, compiler-produced no-default and native Exact cases, and pinned DisplayName. Their negatives remain green. The fast lane excludes the slow native compiler-produced Exact case, leaving eight expected failures at base. Known main failures #9504 and #9875 are outside this fast lane and are not claimed fixed.

The temporary truthiness-probe assembly and durable test-host truthiness fixture are distinct compiler-produced witnesses, not the same physical input. #9940 owns their separate pre-existing guard-folding fidelity defect; this slice preserves legality by declining its outcome facts.

Corpus validity

Conclusion: BLOCKED for the raw validity lane — Render A/B reports 57 new CS0165 cases. #9939 proves the witness is a dependent diagnostic from missing receiver/callee context. Native RTS independently proves 24 of those 57 compilable (17 Exact gains, 7 retained OpcodeDiff); the other 33 remain RecompileFail at both revisions. No blanket all-method validity claim is made.

Scope: fixed 13-assembly A/B population; 139 changed methods. Raw generated transitions: 59 valid→valid, 0 invalid→valid, 57 valid→invalid, 23 invalid→invalid. These raw labels include the harness's binding/coverage limitations and remain unmodified. The full 14-assembly acquisition failure is #9935; Microsoft.CodeAnalysis.CSharp is excluded only from this A/B population, not native reference closure or full-corpus capture.

The full capture separately reports 40 raw valid→CS0165 rows: 15 native Exact gains, 7 retained OpcodeDiff, and 18 unchanged RecompileFail. Native proves only 22 compilable. Complete 40-row ledger; refreshed native attribution including both CSharp rows.

Complete per-method spelling, raw validity, and native status ledger: #9929 (comment). Refreshed exact-base/head documents have identical 139 identities and byte pairs; the native rerun at the refreshed pair gives the same transitions.

Decompiler quality

Conclusion: BLOCKED for the raw validity gate — native fidelity improves, while the untouched validity shell reports 40 new CS0165 rows. The regenerated baseline records both facts. No tolerance, oracle, or comparator change masks the failing gate.

Scope: 14 pinned assemblies, 89,065 methods, 25,354 validity checks, and 682 independently selected fidelity targets. Clean base d93cb58f8 reproduces main's committed baseline on every method row and metric. Clean source head 1f729e607 differs on exactly 43 methods: 40 validity transitions and four native/legacy OpcodeDiff→Exact transitions, with one overlap. Their identities and attribution match the preceding pair before #9914. The final 8d72a548d commit only installs this generated baseline.

The four native Exact gains are ILInspector.Analysis.TypeRef::ArityOf, ILInspector.Decompiler.Pipeline.TypeRef::DisplayName, and ILInspector.Metadata.TypeResolver::{ApplyGenericArguments,FormatDisplayName} (both in MetadataPrimitives.dll). The five #9914 availability gains are already present at base and are not attributed to this slice. Full malformed stays 1; pass bugs stay 8; availability and all cutover pins remain unchanged.

The generated “Fully raised” quality row is the validity-qualified population and falls by 40 with the raw CS0165 labels. The all-method fullyRaised flag count stays 78,952. These are different metrics; neither substitutes for the other.

Matched quick census

The standard PR quick preparation selects 19 assemblies, capped at 100 methods each, yielding 1,716 methods. Both products inspect the same prepared physical binaries and paths from the same working directory. This is a matched source-build input population, separate from the 14-assembly pinned real-world corpus and from the committed quick manifest. Compile/fidelity caps are zero, so this lane gives no legality or fidelity verdict. It reports zero changed rows and identical metrics.

### Decompiler quality diff

| Metric | Change |
| ------ | ------ |
| Detected lowering residue ↓ | 232 (13.52%) → 232 (13.52%) (0 methods) |
| Conditional-branch residue ↓ | 39 (2.27%) → 39 (2.27%) (0 methods) |
| Forward-merge stops ↓ | 30 (1.75%) → 30 (1.75%) (0 methods) |
| Pass bugs ↓ | 0 → 0 (0) |

**Input**

- Corpus: #1166 real-world decompiler corpus sensor: #1150 pinned NuGet assemblies plus dotnet-inspect managed assemblies. 19 assemblies, 1,716 methods
- Corpus profile: real-world
- Method cap: 100

**Analysis**

- Correctness coverage: validity not run; fidelity not run
- Pinned control-flow raises: 0 lost, 0 gained across 1,278 stable sites.
- Current measured debt: 232 methods with detected lowering residue.
- Regression verdict: PASS — corpus sensor matched baseline tolerances.

Pinned-subset gate (PR quick rate/count regressions evaluated here): detected lowering residue 16.00% -> 16.00% (0 pp); conditional-branch residue 3.33% -> 3.33% (0 pp); fidelity ungated (sampling differs; rely on changed-method fidelity).

Per-method delta artifact: `/home/rich/.cache/rts-row-triage/quick-delta-d93-1f729.json`

Full-corpus generated card

Decompiler quality diff

Metric Change
Detected lowering residue ↓ 10,113 (11.35%) → 10,113 (11.35%) (0 methods)
Conditional-branch residue ↓ 2,535 (2.85%) → 2,535 (2.85%) (0 methods)
Forward-merge stops ↓ 2,137 (2.40%) → 2,137 (2.40%) (0 methods)
Full malformed ↓ 1 → 1 (0)
Semantic defects ↓ 217 (0.86%) → 257 (1.01%) (+40 methods) ✗
Fidelity opcode diffs ↓ 67 (9.82%) → 63 (9.24%) (-4 methods) ✓
Fidelity operand diffs ↓ 6 (0.88%) → 6 (0.88%) (0 methods)
Fidelity unavailable comparisons ↓ 0 (0.00%) → 0 (0.00%) (0 methods)
Fidelity not Full ↓ 3 (0.44%) → 3 (0.44%) (0 methods)
Fidelity recompile failures ↓ 169 (24.78%) → 169 (24.78%) (0 methods)
Fidelity context failures ↓ 0 (0.00%) → 0 (0.00%) (0 methods)
RTS cutover exact losses ↓ 37 → 37 (0)
RTS cutover availability losses ↓ 42 → 42 (0)
RTS cutover native available 510 → 510 (0)
RTS cutover native unavailable ↓ 172 → 172 (0)
RTS cutover legacy available 503 → 503 (0)
RTS cutover legacy unavailable 179 → 179 (0)
RTS cutover exact gains ↑ 46 → 46 (0)
RTS cutover availability gains ↑ 49 → 49 (0)
RTS cutover same status 582 → 582 (0)
RTS cutover compile-back floor applications ↓ 0 → 0 (0)
Pass bugs ↓ 8 → 8 (0)
Fidelity check coverage ↑ 682 (0.77%) → 682 (0.77%) (0 methods)
Fidelity exact (contract v5; EH-blind) ↑ 437 (64.08%) → 441 (64.66%) (+4 methods) ✓
Fully raised ↑ 24,505 (96.34%) → 24,465 (96.19%) (-40 methods) ✗

Input

  • Corpus: Real-world corpus regression baseline (continuous CI sensor) #1166 real-world decompiler corpus sensor: Design spike (#1148): sequence the dominator/retained-label rewrite #1150 pinned NuGet assemblies plus dotnet-inspect managed assemblies. 14 assemblies, 89,065 methods
  • Corpus profile: real-world
  • Method cap: uncapped
  • Per-assembly fidelity cap: 50
  • Source revision: 1f729e607396d376eca918a56c8a8d007071782b (clean)
  • Compiler: Microsoft.CodeAnalysis.CSharp, Version=5.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  • Runtime: .NET 11.0.0-rc.1.26425.128; Ubuntu 26.04.1 LTS; X64
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Core.dll @ 362d6e0b-0ce7-4fad-b3c5-fa0efdd2ba29
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Packages.dll @ 69e682d2-be56-4acc-8dba-916ceab1291f
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Services.dll @ a72489e5-3025-490b-bb65-85c3d994e299
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Analysis.dll @ 9975f197-525d-47a9-b01a-4a70417ddf49
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll @ eed37876-108a-4357-8a37-04b7b8c7c80a
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll @ fe800527-5802-493c-8bcb-f25dd7b52fe4
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.MetadataPrimitives.dll @ 4d3d5a39-db35-4ca1-a2db-a917dbed66a6
  • Input: nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/dotnet-inspect.dll @ 25685158-507c-4a08-8fd6-356dde6bfc5b
  • Input: nuget:microsoft.applicationinsights/2.23.0/lib/netstandard2.0/Microsoft.ApplicationInsights.dll @ bcf1683b-7056-470d-acdf-320c98769a42
  • Input: nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll @ bc961ed5-3be6-478b-adaf-34d3f75b70ec
  • Input: nuget:microsoft.codeanalysis.csharp/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll @ a39e195a-baba-49cd-a757-3f6c39a6df15
  • Input: nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll @ 00b3a5ef-dbc3-4c2f-9c39-8fe4911d40e8
  • Input: nuget:nuget.versioning/7.3.0/lib/net8.0/NuGet.Versioning.dll @ 190ca792-bfd7-4581-af2f-0d95522d4759
  • Input: nuget:system.commandline/3.0.0-preview.5.26302.115/lib/net10.0/System.CommandLine.dll @ e5447a43-dc39-4096-8c93-68b4cdab5332

Analysis

  • Correctness coverage: validity compiled 25,354 methods (compile-cap 4,000; per-sample, not corpus-wide); fidelity (rts-cutover) sampled 682 / 89,065 (0.77%), RTS cutover 37 exact losses and 42 availability losses / 682 independently selected
  • Pinned control-flow raises: 0 lost, 0 gained across 161,685 stable sites.
  • Current measured debt: 10,113 methods with detected lowering residue; 1 malformed Full method; 257 semantic defects among 25,354 checked; 63 fidelity opcode diffs among 682 checked; 6 fidelity operand diffs among 682 checked; 169 fidelity recompile failures among 682 checked; 8 pass bugs.
  • Regression verdict: FAIL — corpus sensor reported regressions; review before merging.

Pinned-subset gate (PR quick rate/count regressions evaluated here): detected lowering residue 11.35% -> 11.35% (0 pp); conditional-branch residue 2.85% -> 2.85% (0 pp); Full malformed 1 -> 1 (0); semantic defects 217 -> 257 (+40); opcode diffs 67 -> 63 (-4).

Regressions:

  • semantic defect methods (pinned) increased by 40 (baseline 217, current 257, tolerance 0)
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Services.dll!DotnetInspector.Services.ProjectAssetsParser::TryGetFrameworkDependencies(System.Text.Json:System.Text.Json.JsonElement, corelib:System.String, ref System.Text.Json:System.Text.Json.JsonElement) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Analysis.dll!ILInspector.Analysis.TypeRef::DisplayName() -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.CSharpPrinter::BitwiseUnsignedOperand(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrExpression, corelib:System.Boolean) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.CSharpPrinter::EnumMemberName(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Constant) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.CSharpPrinter::EnumUnderlyingType(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.TypeRef) -> ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.TypeRef -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.CSharpPrinter::IsOutOfRangeUnsignedConstant(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrExpression) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.CrossAssemblyTypeResolver::Implements(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.TypeRef, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.TypeRef) -> ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.MetadataFactState -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.IsPatternPass::FoldPositionalPatternReturnOne(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Stepper) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.IteratorReconstructionPass::Run(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.PassContext) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.NullConditionalPass::RaiseSpilled(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Stepper) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.RangeFromGetSubArrayPass::Run(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.PassContext) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.StructuringPass::EndsWithBranchTo(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.StructuringPass+Ctx, corelib:System.Int32, corelib:System.Int32) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.TupleBinaryOperatorPass::TryRaiseOperandComparisonAt(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Block, corelib:System.Int32, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Stepper) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.TupleBinaryOperatorPass::TryRaiseReturnAt(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Block, corelib:System.Int32, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Stepper) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.TupleBinaryOperatorPass::TryRaiseSlotAt(ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.IrFunction, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Block, corelib:System.Int32, ILInspector.Decompiler:ILInspector.Decompiler.Pipeline.Stepper) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll!ILInspector.Decompiler.Pipeline.TypeRef::DisplayName() -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll!ILInspector.Metadata.ApiSurfaceExtractor::FormatDefaultValue(System.Reflection.Metadata:System.Reflection.Metadata.MetadataReader, corelib:System.Object, corelib:System.String, corelib:System.Boolean) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll!ILInspector.Metadata.ApiSurfaceExtractor::TryReadAttributedParameterDefault(System.Reflection.Metadata:System.Reflection.Metadata.MetadataReader, System.Reflection.Metadata:System.Reflection.Metadata.CustomAttributeHandleCollection, ref corelib:System.Object) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll!ILInspector.Metadata.ApiSurfaceExtractor::TryReadDecimalConstantAttribute(System.Reflection.Metadata:System.Reflection.Metadata.MetadataReader, System.Reflection.Metadata:System.Reflection.Metadata.CustomAttribute, ref corelib:System.Decimal) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll!ILInspector.Metadata.EcosystemIntegrationScanner::AddType(ILInspector.Metadata:ILInspector.Metadata.EcosystemIntegrationScanner+IntegrationBuckets, corelib:System.String, corelib:System.String) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll!ILInspector.Metadata.TypeMatcher::Normalize(corelib:System.String) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/dotnet-inspect.dll!DotnetInspector.Inspectors.PackageFileLister::ResolvePackageReadme(corelib:System.String, corelib:System.String) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.applicationinsights/2.23.0/lib/netstandard2.0/Microsoft.ApplicationInsights.dll!Microsoft.ApplicationInsights.Extensibility.Implementation.Telemetry::IsDeveloperMode(Microsoft.ApplicationInsights:Microsoft.ApplicationInsights.Channel.ITelemetry) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CommonCompiler::TryReadEmbeddedFileContent(corelib:System.String, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.DiagnosticBag) -> Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.EmbeddedText -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Diagnostics.AnalyzerDriver::GetFilteredDiagnostic(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostic, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Compilation, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.SeverityFilter, Microsoft.CodeAnalysis:Roslyn.Utilities.ConcurrentSet`1corelib:System.String, corelib:System.Threading.CancellationToken) -> Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostic -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Diagnostics.AnalyzerManager.AnalyzerExecutionContext::TryProcessCompletedMemberAndGetPendingSymbolEndActionsForContainer(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.ISymbol, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.ISymbol, ref corelib:System.ValueTuple2<System.Collections.Immutable:System.Collections.Immutable.ImmutableArray1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.SymbolEndAnalyzerAction, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.SymbolDeclaredCompilationEvent>) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Emit.DefinitionMap::TryGetMethodHandle(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Symbols.IMethodSymbolInternal, ref System.Reflection.Metadata:System.Reflection.Metadata.MethodDefinitionHandle) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Emit.EncVariableSlotAllocator::TryGetPreviousLambda(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxNode, corelib:System.Boolean, corelib:System.Int32, System.Collections.Immutable:System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.CodeGen.DebugId>, ref Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.CodeGen.DebugId, ref corelib:System.Nullable1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Emit.RuntimeRudeEdit) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Emit.EncVariableSlotAllocator::TryGetPreviousStateMachineState(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxNode, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.CodeGen.AwaitDebugId, ref Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.StateMachineState) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.GreenNode::GetDiagnostics() -> Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.DiagnosticInfo[] -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.PEModule::HasDateTimeConstantAttribute(System.Reflection.Metadata:System.Reflection.Metadata.EntityHandle, ref Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.ConstantValue) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.PEModule::HasInlineArrayAttribute(System.Reflection.Metadata:System.Reflection.Metadata.TypeDefinitionHandle, ref corelib:System.Int32) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.csharp/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.ObjectDisplay::FormatLiteral(corelib:System.Char, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.ObjectDisplayOptions) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:microsoft.codeanalysis.csharp/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.SyntaxAndDeclarationManager::UpdateSyntaxTreesAndOrdinalMapOnly(Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder1<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree>, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, corelib:System.Collections.Generic.IDictionary2<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, corelib:System.Int32>, System.Collections.Immutable:System.Collections.Immutable.ImmutableDictionary2<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, System.Collections.Immutable:System.Collections.Immutable.ImmutableArray1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.LoadDirective>, System.Collections.Immutable:System.Collections.Immutable.ImmutableDictionary`2<corelib:System.String, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree>) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll!Newtonsoft.Json.Serialization.JsonArrayContract::.ctor(corelib:System.Type) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll!Newtonsoft.Json.Serialization.JsonDictionaryContract::.ctor(corelib:System.Type) -> corelib:System.Void -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll!Newtonsoft.Json.Serialization.JsonSerializerInternalReader::EnsureType(Newtonsoft.Json:Newtonsoft.Json.JsonReader, corelib:System.Object, corelib:System.Globalization.CultureInfo, Newtonsoft.Json:Newtonsoft.Json.Serialization.JsonContract, corelib:System.Type) -> corelib:System.Object -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll!Newtonsoft.Json.Serialization.JsonSerializerInternalWriter::GetPropertyName(Newtonsoft.Json:Newtonsoft.Json.JsonWriter, corelib:System.Object, Newtonsoft.Json:Newtonsoft.Json.Serialization.JsonContract, ref corelib:System.Boolean) -> corelib:System.String -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:nuget.versioning/7.3.0/lib/net8.0/NuGet.Versioning.dll!NuGet.Versioning.NuGetVersion::TryParse(corelib:System.String, ref NuGet.Versioning:NuGet.Versioning.NuGetVersion) -> corelib:System.Boolean -> semantic-defect:CS0165
  • valid method regressed (pinned): nuget:nuget.versioning/7.3.0/lib/net8.0/NuGet.Versioning.dll!NuGet.Versioning.SemanticVersion::ToString(corelib:System.String, corelib:System.IFormatProvider) -> corelib:System.String -> semantic-defect:CS0165

Per-method delta artifact: /home/rich/.cache/rts-row-triage/corpus-delta-d93cb58f8-1f729e607.json

No contract/comparator changes, no compile-back floor, and no ReturnToSender or validity-harness edits are included. The artifact.Source dump used for triage was temporary and removed before the first product commit. The temporary probes invoke existing APIs without repairing product source. Keep source-build fixture growth separate from the fixed corpus.

Validation

dotnet build dotnet-inspect.slnx -c Release
source eng/activate-iltools.sh --mdv
dotnet run --project tests/ILInspector.Decompiler.Tests -c Release --no-build -- \
  --filter-class '*ShortCircuitDefiniteAssignmentTests' '*DefiniteAssignmentPassTests' '*DataflowFactsTests'
dotnet run --project tests/ILInspector.Decompiler.Tests -c Release --no-build -- --gate fast
npx markdownlint-cli docs/design/value-typed-emission.md

Generated by Codex.

@richlander

Copy link
Copy Markdown
Owner Author

Round 1 candidate lock

  • Theme: Resolve RTS-revealed fidelity rows by owner, fixing decompiler raise defects.
  • Candidate 1: 8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8, pushed at 2026-10-11 00:24:54 UTC.
  • Effective base: d93cb58f8b5c44ecc831158db64cee502a7e63e6 (main); local test merge passes, GitHub reports mergeable.
  • Normative owner: docs/design/value-typed-emission.md#instance-3--definite-assignment-decided-before-printing — emit a bare local only when every reaching read is preceded by proven assignment; preserve primitive-boolean outcome facts and conservative declines.
  • Focused gates: 36/36; baseline tests: 4/4; integrated fast suite: 7,130/7,130. Build and Markdown checks pass. Exact-candidate native audit: 50 OpcodeDiff→Exact, 15 unchanged OpcodeDiff, 76 unchanged unavailable results.
  • One planned adversarial reviewer: GPT-6 Sol (gpt-6-sol), high reasoning, isolated read-only worktree. Dispatch requires green current-head ci-required.
  • Waiting: check:ci-required. Bounded status wait: 30 minutes from the first schedule.
  • Raw full-corpus validity gate remains BLOCKED under Render A/B validity shell produces cascading CS0165 when out-call context cannot bind #9939: all 40 reported losses remain visible, including 18 native-unavailable rows. No whole-corpus legality or merge-readiness claim.
  • Merge authorization: none.

Generated by Codex.

@richlander

Copy link
Copy Markdown
Owner Author

Round 1 adversarial review dispatched

  • Locked head: 8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8.
  • Effective base: d93cb58f8b5c44ecc831158db64cee502a7e63e6.
  • Reviewer: GPT-6 Sol (gpt-6-sol), high reasoning, one seat.
  • Dispatch recorded: 2026-10-11 00:39:49 UTC.
  • Current-head ci-required is green. Local conflict probe passes; PR is open, non-draft, and mergeable; no review threads or auto-merge.
  • Briefing starts with the complete canonical prompt verbatim, followed by the self-contained frame and complete decompiler evidence-integrity appendix.
  • Isolated read-only worktree: .worktrees/rts-row-triage-review-r1.
  • The raw corpus validity gate and its unavailable rows remain explicitly BLOCKED under Render A/B validity shell produces cascading CS0165 when out-call context cannot bind #9939. This review does not imply merge readiness or authorization.

Generated by Codex.

@richlander

richlander commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner Author

Round 1 reconciliation

CLEAN at locked head 8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8.
One adversarial reviewer, GPT-6 Sol with high reasoning, returned one usable
review and no qualifying findings. The reviewer independently reran the
focused Release suite (36/36), Markdown lint, and git diff --check.

The reviewer verified the outcome-specific verified-out facts and conservative
fallbacks, the native RTS product-artifact path with its compile-back floor
disabled, and the disclosed comparison-only structural and PDB evidence.
The generated baseline preserves all raw failures and unchanged cutover pins.

Prior obligations and limitations remain explicit:

At 2026-10-11 00:43:44 UTC, a fresh whole-PR snapshot confirmed unchanged head
and base d93cb58f8b5c44ecc831158db64cee502a7e63e6, a clean local conflict
probe, successful current-head ci-required, and no review threads.

Round start: 2026-10-11 00:24:54 UTC. Round end: 2026-10-11 00:43:44 UTC.
Duration: 00:18. Progress: 1 candidate, 1 usable review, 0 accepted findings.
Reviews: 1/1 clean. Recommendation: wait on #9939's raw validity gate.
The review is clean; the candidate is not merge-ready. No merge authorization
has been given, and no merge was performed.

Generated by Codex.

This branch has not been deployed

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

Labels

review-clean PR has met the adversarial review standard per AGENTS.md.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Preserve condition-outcome assignment facts to remove redundant short-circuit out local stores

1 participant