You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3d6be6c
Browse filesBrowse the repository at this point in the historyBrowse files
D1 is a counterexample to framework-first, not proof of a replacement rule;
CS0101 (merged, two source definitions) vs CS0433 (two referenced project
assemblies) made explicit; owner ruling recorded (PoC ceiling 0.25 agent-day,
metrics only, no production, #407 KILL stands).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TFkNAFFQz9KoTzpPws8vYG
Copy file name to clipboardExpand all lines: docs/evidence/p014-bounded-design-2026-10/DESIGN.md
+47-9Lines changed: 47 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -79,9 +79,17 @@ on disk.
79
79
-**Effect on the #419 data.** For P2, P4 and P5 the rule happens to agree: the framework is newer or covered by
80
80
an override in every conflict. P1 cannot be judged, because its exact pack is missing. **This is not a reason
81
81
to re-score #419.**
82
-
-**Resolution.** Replace the rule with the dotnet/sdk order. Its inputs are `PackageOverrides.txt`,
83
-
`FrameworkList.xml` and the DLLs' metadata versions: all on disk, no MSBuild. A pair that the order leaves
84
-
undecided is `CONFLICT_UNRESOLVED`, and the project is not `COMPLETE`.
82
+
-**What this shows, and what it does not.** F-D1a is a **counterexample to framework-first**. It is **not** a
83
+
proof that any replacement rule is correct.
84
+
-`d1_conflicts.py` applies only the first two steps of the dotnet/sdk order (package overrides, then
85
+
AssemblyVersion). On the rows above, those two steps decide every case.
86
+
- Taking the highest `AssemblyVersion` on its own does not replace MSBuild's conflict resolution.
87
+
-**Direction for the PoC.** Before the first PoC run, write down the selection rule from the SDK's contract
88
+
(the `ResolvePackageFileConflicts` / `ConflictResolver` order, with assembly identity, not only file names).
89
+
- Its inputs are on disk: `PackageOverrides.txt`, `FrameworkList.xml` and the DLLs' metadata. No MSBuild is
90
+
needed.
91
+
- A pair the rule leaves undecided is `CONFLICT_UNRESOLVED`, and the project is not `COMPLETE`.
92
+
- The rule is verified by the K8 controls (§8), not assumed.
85
93
86
94
**Still outside the class** (detected cheaply, never guessed):
87
95
-`<Reference HintPath>` and `<COMReference>`;
@@ -106,13 +114,17 @@ references as `CompilationReference`. Output: [`falsifiers/d2_isolation.out.txt`
106
114
107
115
| Case | Merged (today's shape) | Per-project |
108
116
|---|---|---|
109
-
| F2.1 `Dup.T` in P1 (`One()`) and P2 (`Two()`) | CS0101 once, at compilation level. **P2's `new Dup.T().One()` binds with no site error**: silent false certainty | P2 `One()`: unresolved + CS1061 (correct). P3 referencing both: **CS0433 at the site**, so site-level conflict becomes representable |
117
+
| F2.1 `Dup.T` in P1 (`One()`) and P2 (`Two()`) |**CS0101** once (two source definitions in one compilation). **P2's `new Dup.T().One()` binds with no site error**: silent false certainty | P2 `One()`: unresolved + CS1061 (correct). P3 referencing **two assemblies**, P1 and P2, that each define `Dup.T`: **CS0433 at the site**, so site-level conflict becomes representable |
110
118
| F2.2 `Lib` 1.0 in P1, 2.0 in P2 | first-name-wins: P2's `V2Only()` unresolved; with both: CS1704, P1's `V1Only()` unresolved | both bind to their own version |
111
119
| F2.3 ImplicitUsings on in P1, off in P2 |**P2's `File.Exists` binds**: the #407 leak, silent | P2: unresolved + CS0103 (correct) |
| F2.5 P3 lacks dependency `Dep`, P1 has it |**P3's `s.Changed += H` binds to `Dep`'s event**: an event fact the project could never compile | P3: unresolved, CS0246 (correct) |
114
122
115
123
Two observations for the design:
124
+
-**CS0101 vs CS0433.** CS0101 (a namespace already contains the definition) is the merged-compilation form:
125
+
two source definitions in one compilation, reported once and not at the site. CS0433 (the type exists in two
126
+
referenced assemblies) appears only once the projects are separate assemblies. The per-site conflict signal
127
+
therefore exists only with per-project compilation.
116
128
-**Ambiguity is often not a candidate list.** In F2.1/P3 the site has `Symbol == null` and **no**
117
129
`CandidateSymbols`; the conflict is visible only as CS0433 on the site span. F2.4's `Elapsed` has neither.
118
130
Site status must therefore combine `SymbolInfo` with the error diagnostics whose span intersects the site
@@ -314,13 +326,14 @@ measured. A is killed by D2.
314
326
## 7. Verdict
315
327
316
328
**`GO-P014-TINY-POC`.**
317
-
- D1 `PASS-NARROWED`: the conflict rule must be the dotnet/sdk order, not framework-first.
329
+
- D1 `PASS-NARROWED`: framework-first is falsified. A replacement rule must be written down from the SDK's
330
+
conflict-resolution contract and verified in the PoC; this packet does not prove one correct.
318
331
- D2 `PASS` for per-project compilation; `KILL` for A.
319
332
- D3 `PASS`.
320
333
- D4 `PASS` only for coverage-only; full activation killed now.
321
334
- D5 `PASS` by construction; cost unmeasured.
322
335
323
-
**What this does not allow:**
336
+
**What this does not allow** (the #407 KILL and its deferral stand unchanged):
324
337
- production code;
325
338
- extractor or OwnIR changes;
326
339
- diagnostic activation;
@@ -336,7 +349,7 @@ separate design decision**. It must not be encoded through `release`, `use` or e
336
349
`P014Bind`, built offline. It reads assets, packs and the cache, and writes the §4 sidecar. It never touches the
337
350
extractor.
338
351
339
-
**Budget.** 0.5 agent-day, not extended.
352
+
**Budget.**Proposed here as 0.5 agent-day; the owner set **0.25 agent-day** to the next kill-gate (§12).
340
353
341
354
**Fixtures:**
342
355
-**Synthetic.**
@@ -366,8 +379,9 @@ extractor.
366
379
- Every #419 B-resolved site in P4/P5 is `SYMBOL_RESOLVED` with the same symbol, or the difference is listed and
367
380
read.
368
381
- No resolved symbol's containing assembly is outside its unit's manifest.
369
-
- K4 shows CS0101 at compilation level, as before. F2.1/P3 shows **CS0433 at the site**, so the status is
370
-
`SYMBOL_AMBIGUOUS`: the per-site conflict check.
382
+
- K4 (one compilation, two source definitions) shows CS0101 at compilation level, as before. F2.1/P3 (two
383
+
referenced project assemblies) shows **CS0433 at the site**, so the status is `SYMBOL_AMBIGUOUS`: the per-site
384
+
conflict check.
371
385
372
386
**Baseline equivalence.** Extractor facts for P4/P5 are byte-identical before and after. This holds trivially,
373
387
because the extractor is not touched, and it is checked anyway. Python/Rust parity: **not applicable**, because
@@ -424,3 +438,27 @@ P5.
424
438
and it is documented intent, not checked here.
425
439
- Should generated global usings and TFM defines enter the PoC as a separately reported source-set axis, or wait
426
440
for the owner's #407 rule (implicit usings are a separate feature with a census)? This packet keeps them out.
441
+
442
+
## 12. Owner ruling (21.10.2026, recorded after review of `3e736b7`)
0 commit comments