Skip to content

Commit 3d6be6c

Browse files
PhysShellclaude
andcommitted
docs(evidence): P-014 bounded design — scope D1, CS0101 vs CS0433, owner ruling
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
1 parent 3e736b7 commit 3d6be6c

1 file changed

Lines changed: 47 additions & 9 deletions

File tree

  • docs/evidence/p014-bounded-design-2026-10

‎docs/evidence/p014-bounded-design-2026-10/DESIGN.md‎

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,17 @@ on disk.
7979
- **Effect on the #419 data.** For P2, P4 and P5 the rule happens to agree: the framework is newer or covered by
8080
an override in every conflict. P1 cannot be judged, because its exact pack is missing. **This is not a reason
8181
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.
8593

8694
**Still outside the class** (detected cheaply, never guessed):
8795
- `<Reference HintPath>` and `<COMReference>`;
@@ -106,13 +114,17 @@ references as `CompilationReference`. Output: [`falsifiers/d2_isolation.out.txt`
106114

107115
| Case | Merged (today's shape) | Per-project |
108116
|---|---|---|
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 |
110118
| 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 |
111119
| F2.3 ImplicitUsings on in P1, off in P2 | **P2's `File.Exists` binds**: the #407 leak, silent | P2: unresolved + CS0103 (correct) |
112120
| F2.4 `Timer`: P1 implicit usings (`System.Threading`), P2 `using System.Timers` | P2: CS0104; `t.Elapsed` unresolved **with no site error** | P2 binds `System.Timers.Timer.Elapsed` (`IEventSymbol`) |
113121
| 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) |
114122

115123
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.
116128
- **Ambiguity is often not a candidate list.** In F2.1/P3 the site has `Symbol == null` and **no**
117129
`CandidateSymbols`; the conflict is visible only as CS0433 on the site span. F2.4's `Elapsed` has neither.
118130
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.
314326
## 7. Verdict
315327

316328
**`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.
318331
- D2 `PASS` for per-project compilation; `KILL` for A.
319332
- D3 `PASS`.
320333
- D4 `PASS` only for coverage-only; full activation killed now.
321334
- D5 `PASS` by construction; cost unmeasured.
322335

323-
**What this does not allow:**
336+
**What this does not allow** (the #407 KILL and its deferral stand unchanged):
324337
- production code;
325338
- extractor or OwnIR changes;
326339
- diagnostic activation;
@@ -336,7 +349,7 @@ separate design decision**. It must not be encoded through `release`, `use` or e
336349
`P014Bind`, built offline. It reads assets, packs and the cache, and writes the §4 sidecar. It never touches the
337350
extractor.
338351

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

341354
**Fixtures:**
342355
- **Synthetic.**
@@ -366,8 +379,9 @@ extractor.
366379
- Every #419 B-resolved site in P4/P5 is `SYMBOL_RESOLVED` with the same symbol, or the difference is listed and
367380
read.
368381
- 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.
371385

372386
**Baseline equivalence.** Extractor facts for P4/P5 are byte-identical before and after. This holds trivially,
373387
because the extractor is not touched, and it is checked anyway. Python/Rust parity: **not applicable**, because
@@ -424,3 +438,27 @@ P5.
424438
and it is documented intent, not checked here.
425439
- Should generated global usings and TFM defines enter the PoC as a separately reported source-set axis, or wait
426440
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`)
443+
444+
`ACCEPT-PHASE-0 / GO-EVIDENCE-PR / GO-METRICS-ONLY-POC / NO-PRODUCTION`.
445+
446+
- **This evidence.** It may be published as a PR containing only this folder.
447+
- **D1.** Accepted as a counterexample to framework-first, not as proof of a new selection rule. The exact rule
448+
must follow the SDK's contract; `AssemblyVersion` alone is not a replacement for MSBuild.
449+
- **The Tiny PoC.** Allowed as a **separate stage after this evidence is accepted**, with a ceiling of
450+
**0.25 agent-day** to the next kill-gate.
451+
- Inputs: existing assets and reference packs only, with no third-party restore or build.
452+
- Conflicts are resolved by assembly identity and verifiable SDK rules.
453+
- Implicit usings and defines are not added globally; #407 stays a separate axis.
454+
- It repeats the D1/D2 controls and measures P4/P5: binding coverage, compiler diagnostics, time and peak
455+
memory.
456+
- Time and memory limits are fixed before the first run.
457+
- No OwnIR or public verdict change. Any finding change is recorded as a breach of the PoC boundary, not as an
458+
improvement.
459+
- **KILL if:**
460+
- isolation cannot be achieved without false bindings;
461+
- the references cannot be selected on a sound basis;
462+
- the cost is out of proportion to the observed gain.
463+
- **Production stays forbidden.** #407 stays deferred and its KILL stands. #420 is a separate package and is not
464+
touched.

0 commit comments

Comments
 (0)