Skip to content

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

Open

Description

@antonsynd

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)

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: ReferenceDeploymentMatrixTests green 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 and module_system.md say every producing command deploys unless --no-deps.
  • Group: a .spyproj item generator over the matrix with an allowlist ratchet drained to empty; one XmlException arm at the one parser naming the file; <Reference Include=""/> refused; the API door reads cfg.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

  1. added
    lane:silent-wrongCompiles and runs with wrong output or semantics (rank first)
    reach:probeNeeds an escaped spelling, a wrong-annotation probe or a python3 message diff
    class-trackerThe one issue per class: carries the contract and the cell table
    on Oct 15, 2026
  2. antonsynd commented on Oct 15, 2026

    @antonsynd
    OwnerAuthor

    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, the build/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 .spyproj item 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.

  3. antonsynd commented on Oct 15, 2026

    @antonsynd
    OwnerAuthor

    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 time System.IO.FileNotFoundException: Could not load file or assembly 'Sharpy.Stdlib, Version=0.22.1.0' at Main, exit 134 @ 486c9a8. Expected: the program runs, so Sharpy.Stdlib is deployed. Lock is a Stdlib type, and the sharpy pseudo-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's with lk: lowering is a separate class: #2315.) Lane silent-wrong (deployment), reach program. Found by P54 (#2250) Phase 3 task 1.

  4. antonsynd commented on Oct 15, 2026

    @antonsynd
    OwnerAuthor

    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 arm from sharpy import <Stdlib type> × run — from sharpy import Lock + lk.locked() compiles, then FileNotFoundException: Sharpy.Stdlib at Main, exit 134 @ 486c9a8: the sharpy pseudo-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, sharpy pseudo-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.

  5. antonsynd commented on Oct 22, 2026

    @antonsynd
    OwnerAuthor

    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). build and project now deploy dependencies beside the output through RuntimeDependencyHelper, as dotnet build does, and both gain --no-deps.

    Stays open for the other residual cells: the malformed .spyproj catch-all, a dropped <Reference Include=""/>, CompileProject ignoring cfg.References, and the CLR-namespace import arms missing from UsedAssemblyPaths.

    New cell (agent probe, not re-measured by the lead): the compile server's project request, ProjectCommand.CompileProjectForServer, does not deploy.

    Related, filed: #2343. A reused Compiler keeps an earlier compile's used-assembly set, so a long-lived server over-deploys.

  6. added a commit that references this issue on Oct 22, 2026
  7. antonsynd commented on Oct 22, 2026

    @antonsynd
    OwnerAuthor

    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 project request 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 no RuntimeDependencyHelper.CopyRuntimeDependencies call; the direct route calls it (~:247). Lane / reach: runtime-throw · program. Cure: the server route calls the one deployment seam; ReferenceDeploymentMatrixTests gains 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.

  8. antonsynd commented on Oct 22, 2026

    @antonsynd
    OwnerAuthor

    Landed: cell 0b @ 26271b0. The compile server's project request now deploys like the project command.

    • Both routes call one DeployOutput step: the default references plus the project's user references.
    • The request carries no --no-deps.
    • Reach note: no CLI command sends this request (project has no --server); a client of the server protocol does.

    Guard: ReferenceDeploymentMatrixTests gains the route "project (server request)" for the three .spyproj reference sources. It sends CommandProject through CompileServerClient to a server started for the cell, then asserts Tablegreeter.dll and Sharpy.Core.dll sit beside App.exe and that dotnet App.exe run from there prints the library's line. 40/40 green.

    Mutation record: with the server route's DeployOutput dropped, the 3 server cells go red.

    #2313 stays open for its P46b cells.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    class-trackerThe one issue per class: carries the contract and the cell tablelane:silent-wrongCompiles and runs with wrong output or semantics (rank first)reach:probeNeeds an escaped spelling, a wrong-annotation probe or a python3 message diff

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions