Repository navigation
Normalize test project names to .Tests and collapse the test-name probes #38
Description
Activity
matt-edmondson commented
on Sep 8, 2026 ContributorAuthorMore actionsTriage
Priority: Medium Effort: Medium
What needs to be done: Rename every
.Testproject (41 repos) plus the two SDK-internal ones to.Tests, then collapse the four test-name probes inSdk.propsinto one.Suggested next steps / acceptance criteria:
- Land Sdk#37 first so renamed projects settle in one step
- Mechanical rename across the 41 listed repos (no published identity changes since test projects aren't packable)
- Collapse the probe logic in
Sdk.propsand confirmIsTestProjectno longer depends on incidentalMSTest.Sdkbehavior
Blockers / dependencies: Depends on Sdk#37 landing first (explicit ordering in the issue). Part of the Sdk#36 naming epic
Generated by Claude Code
matt-edmondson commented
on Sep 25, 2026 ContributorAuthorMore actionsTriage
The recorded blocker has cleared — #37 merged on 2026-09-13 — and nothing here has been re-triaged since. Still not actionable unattended, but for a different reason than the one on file: the routing, not the dependency. Not assigning myself, nothing branched.
The 2026-09-08 triage says "Depends on Sdk#37 landing first (explicit ordering in the issue)". That is now stale: #37 is closed as completed via #46 (
fix: strip scaffolding folder segments from derived project identity). The Order section of this issue is satisfied, so the renames are no longer fighting suppressions that were about to be deleted.The premise still holds — verified at
main(bafee81)Sdk/Sdk.propsstill probes four spellings in sequence, each falling through to the next (lines 279–298):# Probe Line 1 $(SolutionName).Test279 2 $(SolutionName).Tests285 3 $(SolutionName)Test290 4 $(SolutionName)Tests295 So the collapse this issue asks for has not happened.
Two corrections to the issue body, both worth having before it is scheduled
1. The four probed spellings are not the four spellings in the table. The issue's table lists
.Test/.Tests/.UiTests/.SmokeTestas what live repos use, and says "Sdk.propsprobes for all four". It does not. The probes are dot-vs-no-dot × singular-vs-plural of the solution name, so.UiTestsand.SmokeTestmatch no probe at all. Those two projects are already in the failure mode this issue describes, today — not merely at risk of it.2. The latent gap is narrower and sharper than stated.
IsTestProjectis set from a single equality:<IsTestProject Condition="'$(MSBuildProjectName)' == '$(TestProjectName)'">true</IsTestProject>
TestProjectNameresolves to exactly one value per solution, so at most one project per repository can ever beIsTestProject, whatever it is called. A repo with two test projects has one of them treated as a shippable library regardless of spelling. Renaming to.Testsdoes not fix that on its own; collapsing to one probe does not either. Whatever lands should address the one-project-per-solution assumption, or the guard stays coincidental in the way the issue rightly objects to.3. Sdk's own test projects are three, not two, and not where the issue says. Actual layout:
examples/demos/Test/Calculator.Test—.Testexamples/analyzers/KTSU0002-MissingInternalsVisibleTo/Service.Test—.Test(underexamples/analyzers/, notexamples/demos/)test/Sdk.Examples.Tests— already.Testsexamples/demos/Namespaces/Testing/Testing.csproj— matches no probe
Why I stopped rather than starting it
The work is 43 project renames across 41 repositories, and the probe collapse cannot land until they are all done — a collapsed probe against an unrenamed repo silently turns its test project into a shippable library, which is the exact defect this issue exists to remove. So it is not decomposable into "do the Sdk half now": the ordering runs the other way from #37's.
That makes it a multi-repo campaign needing a route, and the route is your call:
- A batch of one-file PRs across runs, one per repo, then the
Sdk.propscollapse last once all 41 are merged. Slow, visible, and safe — but 41 PRs of org-wide traffic, and the collapse sits unmergeable until the final rename lands. - Direct pushes, which is faster but wants your machine.
This is the same routing question already open on
ktsu-dev/.github#5, and for the same reason. Worth answering once for both rather than twice.One thing worth deciding in the same breath, since it changes the size: whether
.UiTests,.SmokeTestandTestingare renamed to.Teststoo, or whether the collapsed probe accepts a suffix match. The issue assumes the former; the latter is a smaller campaign and arguably a better convention, since it lets a repo have more than one test project — which theIsTestProjectgap above says it currently cannot.
Generated by Claude Code
matt-edmondson commented
on Sep 28, 2026 ContributorAuthorMore actionsDecision (maintainer, 2026-09-28)
- Routing: rename
.Testprojects as part of each repository'sci.ymlmigration (Finish the pull_request paths-ignore sweep on the 16 remaining repos .github#5). There will be no separate per-repository rename PRs. This answers the routing question shared with .github#5 once for both. - Probe: use a suffix match rather than one exact name, so a repository can have more than one test project. That fixes the one-
IsTestProject-per-solution gap. It is the smaller campaign:.UiTests,.SmokeTestand similar spellings are not force-renamed.
Next reader: change the
Sdk.propstest-project detection to a suffix match on the project name, with a test covering a repository that has two test projects. Keep the.Testprobe working until theci.ymlmigrations have renamed the remaining projects, then drop it. Rename the Sdk repository's own.Testprojects (Calculator.Test,Service.Test) in its migration.
Generated by Claude Code
- Routing: rename
Test projects are spelled four ways across the live repos, and
Sdk.propsprobes for all four:.Test.Tests.UiTests.SmokeTestIsTestProjectis true only when the project name matches one of the probed spellings. A testproject outside the set is treated as a shippable library. That is currently masked only because
MSTest.Sdkindependently setsIsPackable=false, so the guard is coincidental rather thandesigned.
Change
Rename every
.Testproject to.Tests, then collapse the four test-name probes inSdk.propstoone. That turns the convention from a suggestion into something the SDK enforces.
Test projects are not packable, so no published identity changes. This is mechanical.
Repos with a
.TestprojectAppDataStorage, BlastMerge, CaseConverter, CodeBlocker, Coder, Containers, CredentialCache,
CrossRepoActions, DeepClone, DelegateTransform, Extensions, Frontmatter, FuzzySearch,
GitIntegration, IconHelper, ImageDescriber, ImGuiProvider, IntervalAction, Invoker,
JsonRequiredConditionally, Keybinding, KtsuTools, Navigation, NJsonSchemaJsonConverter, OAICLI,
PreciseNumber, RoundTripStringJsonConverter, RunCommand, Schema, Sdk, Semantics, SignificantNumber,
SingleAppInstance, Sorting, SvnToGit, TextFilter, ThemeProvider, TUI, UndoRedo, VST.
Sdk carries two of its own, both under
examples/demos/:Calculator.TestandService.Test.Order
Land the scaffolding-strip change first, so the renamed projects settle on their final identity in
one step rather than two.