Repository navigation
cli/project: residual cells after P46 — build/project deploy (R-HF), malformed .spyproj catch-all, <Reference Include=""/> dropped, CompileProject ignores cfg.References, CLR-namespace import arms unrecorded in UsedAssemblyPaths #2313
Description
Class
Successor to #2223 (P46, DONE @ 3f16f26, auto-closed by commit prose). Contract: every item a .spyproj or the command line names is honoured or refused, never dropped or answered with a catch-all — and every assembly an import binds through is recorded, on every arm. Two cures the owner ruled on the closed tracker ride with it (R-HF, R-HG below). All cells are pre-existing; none is a P46 regression (verify round, built sharpyc @ 10b43ea → 13af752, re-read @ 3f16f26).
Matrix: project item {<Compile>, <Reference Include>, <Reference> + <HintPath>, <ModulePath>, <PackageReference>, unknown element} × value state {valid, empty, missing attribute, malformed XML, symlink to the wrong kind} × route {compile x.spyproj, project, Compiler.CompileProject(cfg) API, CompilerApi.AnalyzeProject}; and import arm {module functions, module types, module fields, CLR namespace, CLR type} × recording {UsedAssemblyPaths contains the assembly}.
Rulings (owner, 2026-10-14)
- R-HE (D4 a): ONE successor tracker (this issue) for the cells cli: paths and options beyond compile's table — -m never reaches .spy import resolution, user references are not copied beside the output, a .spyproj <Reference> naming nothing is accepted, build/run/emit parse a .spyproj as Sharpy (#2173 continuation) #2223's round left; placed as P46b directly after P42, generator FIRST (residue group, contract §11). Rejected: keep the cells on the closed cli: paths and options beyond compile's table — -m never reaches .spy import resolution, user references are not copied beside the output, a .spyproj <Reference> naming nothing is accepted, build/run/emit parse a .spyproj as Sharpy (#2173 continuation) #2223 (R-GT's cells were informational; these are defects); reopen cli: paths and options beyond compile's table — -m never reaches .spy import resolution, user references are not copied beside the output, a .spyproj <Reference> naming nothing is accepted, build/run/emit parse a .spyproj as Sharpy (#2173 continuation) #2223.
- R-HF (D5 c):
buildandprojectdeploy likecompileandrundo — every referenced assembly and the runtime dependencies beside the output; both gain--no-deps; "assembly only" is the opt-in on every producing command. Basis:dotnet build's output runs in place (copy-local references,deps.json,runtimeconfig.json); onlycscleaves a non-runnable executable, and no everyday .NET command does. Rejected: (a)build/projectassembly-only as landed @ 10d0b3d (documented but inverts the .NET vocabulary); (b)projectonly. Lands as a chore FIRST (cell 0 below), before the group: two more callers of the one deployment seam, two option rows in the effect registry,ReferenceDeploymentMatrixTestsgains the two routes as honoured cells (today they are the documented controls),--help/README/module_system.mdtext updated, direction record against 3f16f26. One-way in practice once scripts rely on the option. - R-HG (D6 a):
emit diagnostics --metrics-format/--metrics-outputstay rostered Ignored on both branches (as landed). Rejected: thread metrics out of analysis (SemanticResult.Metrics); honour on--include-codegenonly. Recorded as cell 7 so the door is not lost.
Cells
| # | axis values | program | observed @ sha | expected | lane | reach | found by |
|---|---|---|---|---|---|---|---|
| 0 | route × deployment (R-HF chore) | sharpyc project app.spyproj then dotnet bin/Debug/net10.0/App.exe |
FileNotFoundException: 'Sharpy.Core, Version=0.22.1.0' @ 27e2616; documented as by design @ 10d0b3d |
the program runs from its output directory; --no-deps opts out |
runtime-throw | program | P46 implementation (door a) |
| 1 | malformed .spyproj × {non-XML, truncated <Project>, symlink to a .spy} × {project, compile} |
project bad.spyproj |
Unexpected error: Data at the root level is invalid. Line 1, position 1., exit 1, no file named (catch-all) @ 10b43ea |
Error: 'bad.spyproj' is not a valid project file: <xml message> (line, col) |
message | program | P46 verify prober (5 cells) |
| 2 | <Reference Include=""/> |
an item naming nothing | silently skipped by the parser (IsNullOrWhiteSpace → continue) @ 10b43ea |
refused (an item that names nothing is neither honoured nor dropped) | silent-wrong | probe | P46 regression auditor |
| 3 | API route × references | new Compiler(new CompilerOptions()).CompileProject(cfg) with a missing <Reference> |
no SPY0305; the registry is built from CompilerOptions.References only, cfg.References never reaches discovery; Roslyn skips the missing file @ 0afdad6 |
the door reads the config it is given | silent-wrong | API (probe) | P46 Phase 3 compiler lane |
| 4 | import arm × UsedAssemblyPaths |
compile main.spy -r /abs/Tablegreeter.dll with from Tablegreeter import Greeter, then read CompileResult.UsedAssemblyPaths |
absent — the three module arms record, the two CLR-namespace arms (IsNetNamespace/GetNamespaceTypes/TryResolveNetType) do not @ 710f86a; deployment masked by seeding from the explicit references |
every assembly an import binds through is recorded | silent-wrong | probe (masked) | P46 Phase 4 deployment lane |
| 5 | file-less SPY0305 position | emit diagnostics main.spy -r does/not/exist.dll |
SPY0305 at (0:0) @ 739ae54 |
the project's unattributed target / no position | message | probe | P46 lead |
| 6 | LSP lifecycle (recorded here; no open LSP-lifecycle tracker) | sharpyc lsp with stdin closed |
the process does not exit @ 739ae54 (pre-existing) | exits when the client goes away | tooling | probe | P46 lead |
| 7 | emit diagnostics --include-codegen --metrics-* (R-HG door) |
the pair compiles but reports no metrics; --help rosters it "without effect" |
as ruled: Ignored on both branches | — | message | probe | P46 verify |
Acceptance
- Cell 0 chore:
ReferenceDeploymentMatrixTestsgreen on {build, project} × {-r,<Reference>,<HintPath>} × {default,--no-deps}, the program run from its output directory; mutation (drop one caller → red) and the direction record against 3f16f26 in the commit body;--help, README andmodule_system.mdsay every producing command deploys unless--no-deps. - Group: a
.spyprojitem generator over the matrix with an allowlist ratchet drained to empty; oneXmlExceptionarm at the one parser naming the file;<Reference Include=""/>refused; the API door readscfg.References(one authority); the five import arms record through one helper with a totality guard (parallel-site meta-class, contract §1); mutation records per guard. - Cells 5–7 close with evidence or move to a ledger row.
Labels: class-tracker, lane:silent-wrong, reach:probe.
Charter: .claude/plans/remediation-round-2026-09-20-batching.md §3.5b — P46b (order 30b, directly after P42); cell 0 is a §3.0 chore (R-HF). Predecessor: #2223. Siblings posted by the same round: #2182 (not-an-assembly .dll, P42), #2250 (compile server × -r, P54), #2132 (module file-name case, P25), #2309 (<Reference> file watch, P53b).
Activity
antonsynd commentedon Oct 15, 2026
Batching 2026-10-14 @ 3f16f26 — charter
.claude/plans/remediation-round-2026-09-20-batching.md§3.5b, P46b — project-file item & reference-recording residue (order 30b, directly after P42; R-HE) — and §3.0 for cell 0, thebuild/project-deploy chore (R-HF; same band as #2261 part 2 and #2311, after P54).Filed by call 23 as #2223's successor; rulings R-HE (this tracker), R-HF (cell 0, option c) and R-HG (cell 7, option a) are in the body. Lane / reach: silent-wrong · probe (tracker); cells 0 and 1 are program-reach. Generator FIRST (residue group): a
.spyprojitem generator over item × value state × route with an allowlist ratchet; the import-arm recording totality is a five-arm roster with a census guard. After P42 because the reference-state axis {resolves, missing, unloadable (#2182), not-an-assembly (R-HI)} is P42's. Standing harnesses it extends:CliOptionEffectSweepTests,InputKindMatrixTests,ProjectReferenceRouteTests,ReferenceDeploymentMatrixTests. Class tracker: this issue.antonsynd commentedon Oct 15, 2026
Cell (P54 implementation round, lane globals): import arm
from sharpy import <Stdlib type>×sharpyc run:from sharpy import Lock/lk: Lock = Lock()/print(lk.locked())→ compiles, then at run timeSystem.IO.FileNotFoundException: Could not load file or assembly 'Sharpy.Stdlib, Version=0.22.1.0'atMain, exit 134 @ 486c9a8. Expected: the program runs, so Sharpy.Stdlib is deployed. Lock is a Stdlib type, and thesharpypseudo-module import arm records no used assembly, so the deployment seed omits Sharpy.Stdlib. This is the contract's "every assembly an import binds through is recorded, on every arm". (The same program'swith lk:lowering is a separate class: #2315.) Lane silent-wrong (deployment), reach program. Found by P54 (#2250) Phase 3 task 1.test(server): {no -r, -r, no -r} on one server must answer as three f…
test(conformance): the in-process isolation sweep is load-bearing — b…
antonsynd commentedon Oct 15, 2026
Batching 2026-10-15 @ f8c37f9 — charter
.claude/plans/remediation-round-2026-09-20-batching.md§3.5b, P46b — project-file item & reference-recording residue (order 30b; placement unchanged). Cell recorded on the charter (2026-10-15): import armfrom sharpy import <Stdlib type>×run—from sharpy import Lock+lk.locked()compiles, thenFileNotFoundException: Sharpy.StdlibatMain, exit 134 @ 486c9a8: thesharpypseudo-module arm records no used assembly, so the deployment seed omits Sharpy.Stdlib. Cell 4's recording roster grows to SIX arms {module functions, module types, module fields, CLR namespace, CLR type,sharpypseudo-module}; the census guard counts six. Note: P27 (R-CT) later refuses this door for Stdlib module types, but the arm still binds Core types, so the recording cure stands. The lowering twin (with lk:→using) is #2315 (P15). Lane silent-wrong · program.fix(cli): every producing command's output runs from its output direc…
antonsynd commentedon Oct 22, 2026
Landed (chores band 2026-10-22) on
dev@ 4d22212, PR #2346 to mainline. Whole-solution gate 81669/0/7 @ 4d22212 (measured), against 81093/0/7 @ be4664e.Cell 0, commit 28a84a9 (R-HF).
buildandprojectnow deploy dependencies beside the output throughRuntimeDependencyHelper, asdotnet builddoes, and both gain--no-deps.Stays open for the other residual cells: the malformed
.spyprojcatch-all, a dropped<Reference Include=""/>,CompileProjectignoringcfg.References, and the CLR-namespace import arms missing fromUsedAssemblyPaths.New cell (agent probe, not re-measured by the lead): the compile server's
projectrequest,ProjectCommand.CompileProjectForServer, does not deploy.Related, filed: #2343. A reused
Compilerkeeps an earlier compile's used-assembly set, so a long-lived server over-deploys.Merge pull request #2346 from antonsynd/dev
antonsynd commentedon Oct 22, 2026
Batching 2026-10-22 @ 4d22212 — charter
.claude/plans/remediation-round-2026-09-20-batching.md§3.0, chores — call-28 band: cell 0b (order 0, one commit, no plan; rides P21e's gate). Cells 1–7 stay P46b (§3.5b, order 30b).Cell 0b: the compile server's
projectrequest does not deploy. Contract (R-HF): every producing command's output runs from its output directory unless--no-deps— on every route. Read @ 4d22212 (grep-only; the band agent's cell above):ProjectCommand.CompileProjectForServer(ProjectCommand.cs:291) has noRuntimeDependencyHelper.CopyRuntimeDependenciescall; the direct route calls it (~:247). Lane / reach: runtime-throw · program. Cure: the server route calls the one deployment seam;ReferenceDeploymentMatrixTestsgains the route axis {direct, compile server} with the program run from its directory; mutation (drop the call → the server row red); direction record against 4d22212. Cli.Tests only. R-HF binds; no new ruling. Two-way.fix(cli): the compile server's `project` request deploys its output l…
Merge dev into mainline: call-28 band slice 2 (refs #2057 #2143 #2342 #…
antonsynd commentedon Oct 22, 2026
Landed: cell 0b @ 26271b0. The compile server's
projectrequest now deploys like theprojectcommand.DeployOutputstep: the default references plus the project's user references.--no-deps.projecthas no--server); a client of the server protocol does.Guard:
ReferenceDeploymentMatrixTestsgains the route "project (server request)" for the three.spyprojreference sources. It sendsCommandProjectthroughCompileServerClientto a server started for the cell, then asserts Tablegreeter.dll and Sharpy.Core.dll sit beside App.exe and thatdotnet App.exerun from there prints the library's line. 40/40 green.Mutation record: with the server route's
DeployOutputdropped, the 3 server cells go red.#2313 stays open for its P46b cells.