Skip to content

build: a change to tools or tests runs the test projects it reaches - #274

Merged
CaffeinatedCoder merged 1 commit into
release/2.4.0from
build/ci-tests-by-reach
Oct 31, 2026
Merged

CaffeinatedCoder merged 1 commit into
release/2.4.0from
build/ci-tests-by-reach

Conversation

@CaffeinatedCoder

Copy link
Copy Markdown
Owner

Closes #268

Problem

Under decision 113 every lane built and tested the whole solution unless the change was prose throughout. #266, one
tool, its tests, docs and a line of .gitignore, ran 12m55s on Linux and 13m32s on Windows in run 41215127177, and
packed and smoke-tested because .gitignore was unlisted. The tests that could notice it were the BashGuard tests and
the conventions.

Change

  • tools/CiLanes: a third suite, reach. When every changed path is prose, .gitignore, or inside a solution project
    under tools/ or test/, select answers suite=reach and projects, the projects the change reaches: a project
    reaches its own directory, what its items and imports name outside it (a linked source, a ProjectReference), and,
    through each reference, what that project reaches; prose adds test/Prose.slnf. Anything else, or any file it
    cannot read (the solution, a project file, the prose filter), runs the whole solution. select always writes
    projects ([] outside reach). New ci-lanes suite <path>... answers each path alone.
  • .gitignore gets the class ignore list: Linux alone, narrowed to the conventions. No test reads it (the
    conventions list the index), and dotnet pack does not. .gitattributes stays unlisted.
  • The gate accepts reach only beside no pack and no macOS leg, with one or more distinct tools//test/ project
    files; it refuses projects beside prose/full and a missing or malformed projects.
  • dotnet.yml: the changes job exports projects; the test legs write it as test/Reach.slnf (gitignored) and
    restore, build and test that when the suite is reach.
  • A run-time read by path is declared with <ReadsByPath Include="..." />: the conventions declare the root, the
    oracle tests test/ (they find each claim's test among every test project's sources). Measured: no other test
    project reads another by path.
  • Conventions: TestReachTests evaluates every tools/ and test/ project with MSBuild and fails a build input that
    would not run its test project; scans test sources for literals naming another project, or a scan of test//tools/,
    that the reader does not reach; and fails a narrowed suite without the conventions. ReleaseWiringTests holds the
    new workflow step.
  • design/adr/0127, amending 0113; AGENTS.md lists ci-lanes suite.

This PR changes tools/CiLanes and the workflow, so its own run is the whole solution on Linux and Windows with the
pack, as before.

Tests

  • SelectionTests: rows for a tool-only change, a test-project-only change, a linked source, transitive reach through a
    referenced test project, the build: run parallel work in worktrunk worktrees beside the repository #266 shape (tool, tests, docs, .gitignore), .gitignore alone, tools/Shared, a mix
    with src/, paths outside every solution project, an unreadable project file, and suite. Each failed against
    113's selection first.
  • GateTests: a reached suite passes on Linux and on Linux and Windows; fails cancelled, skipped or failed legs, the
    pack, macOS, empty/out-of-place/duplicate projects, projects beside the other suites, and a malformed or missing
    projects. The new rows failed against the old gate first.
  • Seeded and caught: ci-lanes skipping linked sources (TestReachTests and SelectionTests fail), skipping reference
    recursion, dropping the ignore-list class; removing the oracle tests' or the conventions' ReadsByPath; a read of
    tools/PrHygiene added to the BashGuard tests. Each failed the test that claims it, then passed when restored.
  • Locally: test/Reach.slnf written as the leg writes it, from build: run parallel work in worktrunk worktrees beside the repository #266's paths, builds. The whole solution: 24128
    passed; the 12506 failures are all the SQL Server host (SqlServer.cs:84, SqlServerFactHost.cs:29), whose
    container does not start on this arm64 Mac without TYPEKIT_MSSQL_IMAGE; CI's Linux leg runs them.

🤖 Generated with Claude Code

When every changed path is prose, .gitignore, or inside a solution project under
tools/ or test/, ci-lanes answers suite=reach and the projects the change reaches:
a project's own directory, what its items and imports name outside it, and what
its references reach, plus test/Prose.slnf for prose. The legs write them as
test/Reach.slnf and build and test that. Anything else, or anything unreadable,
runs the whole solution.

A test that reads another project by path declares it with <ReadsByPath>: the
conventions the root, the oracle tests test/. TestReachTests holds the
declarations against MSBuild's evaluation and the test sources' literals.
.gitignore gets the class "ignore list", Linux alone. The gate refuses a reached
suite with no projects, the pack or macOS. Decision 127 amends 113.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CaffeinatedCoder CaffeinatedCoder added this to the 2.4.0 milestone Oct 31, 2026
@CaffeinatedCoder CaffeinatedCoder added chore Build, CI, tooling, packaging, refactoring with no behaviour change area/tooling The repository's tools: prober, verdict, guard, docs-query, smoke test labels Oct 31, 2026
@CaffeinatedCoder
CaffeinatedCoder merged commit 500231d into release/2.4.0 Oct 31, 2026
13 checks passed
@CaffeinatedCoder
CaffeinatedCoder deleted the build/ci-tests-by-reach branch October 31, 2026 20:16
CaffeinatedCoder added a commit that referenced this pull request Oct 31, 2026
Brings #271 (CMTK0005 SetCount) and #274 (CI tests by reach). Both
changelog lines are kept, CMTK0005's before CMTK0009's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/tooling The repository's tools: prober, verdict, guard, docs-query, smoke test chore Build, CI, tooling, packaging, refactoring with no behaviour change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant