Skip to content

docs(readme): bring the README level with the tree - #814

Merged
JSdotNet merged 1 commit into
mainfrom
schedule/issue-sweep/2026-09-28/761-readme-level-with-tree
Sep 29, 2026
Merged

JSdotNet merged 1 commit into
mainfrom
schedule/issue-sweep/2026-09-28/761-readme-level-with-tree

Conversation

@JSdotNet

Copy link
Copy Markdown
Owner

Closes #761

Merge order. The new ReadmeTests.The_project_table_lists_every_project_under_src_and_tests fails for every draft that adds a project without a README row. That covers #804 (Backlog.Infrastructure.DevPc and its tests), #796 (Backlog.Infrastructure.Copilot.UnitTests), #806 (Backlog.Infrastructure.BlobStorage.UnitTests) and #813 (Backlog.Infrastructure.Sessions and its tests). Whichever lands second adds the missing rows.

What changed

I brought README.md level with the tree for issue #761 and added tests/Backlog.ArchitectureTests/ReadmeTests.cs so it cannot drift again. I wrote the test first. It went red for the stated reasons: the project table was missing exactly the 20 projects the issue lists, there was no Build and test section, the run command had no --isolated, and the README still said "setup mode". Then I changed the README:
(a) Current state now uses the wording from CLAUDE.md and arc42 chapter 01 (local-first, AI-first; desktop, mobile and IDE channels plus a thin cloud sync service; standalone with optional sync). It points to the MSIX and APK install sections and names only the domains that have a module under src/Modules/.
(b) A new Build and test section gives dotnet build Backlog.sln and dotnet test Backlog.sln. It warns that dotnet test can report "Zero tests ran", says to check the assembly count and total, and gives a PowerShell loop that runs each built test executable by project name from its own folder.
(c) Running locally now uses aspire start --isolated --non-interactive --apphost src/Aspire/Backlog.Aspire.AppHost/Backlog.Aspire.AppHost.csproj, with notes that the exit code proves nothing and how to stop it. The side-by-side worktree paragraph names --isolated.
(d) The project table now has all 20 missing rows (9 src, 11 tests), each with a one-line role taken from the project's code and csproj comments. Existing rows are kept, including src/App/Backlog.Ide.VsCode.
(e) The Sync paragraph no longer says the service holds data "only until the desktop picks it up". It now says what main does: it pairs devices and carries the task, session, annotation and capture/attachment replicas. It makes no new product claim, and the domain side is left to #762.

Evidence:

  • With one row (tests/Backlog.SharedKernel.UnitTests) deleted, the table test failed and named that exact folder. It passed again after I restored the row.
  • dotnet build Backlog.sln: 0 errors, 75 warnings. None of the warnings are in ReadmeTests.cs or the Backlog.ArchitectureTests project.
  • Full Backlog.ArchitectureTests executable: 179 total, 0 failed, 0 errors. This includes the AspireAppModelTests README assertions.
  • node .devbook/_tools/devbook-meta/build.mjs --check passes, and tools/devbook/check-metadata.mjs reports 0 blocking.
  • git status shows only README.md modified and ReadmeTests.cs added. Nothing under .devbook/ changed.

Could not be proved (belongs in the PR description): once this lands, ReadmeTests.The_project_table_lists_every_project_under_src_and_tests will fail for the open drafts that add projects until each adds its README row:

Files: D:/iswp/761/README.md, D:/iswp/761/tests/Backlog.ArchitectureTests/ReadmeTests.cs

Acceptance criteria

  • README.md no longer contains "currently in setup mode". Its Current state section describes the product as built on main, using wording from the devbook or CLAUDE.md, and names no feature that is not in the tree. — see coverage below
  • README.md has a "Build and test" section that gives dotnet build Backlog.sln and a test command. It says that dotnet test can report "Zero tests ran" and that readers should check the per-assembly count and total, or run the built test executables. — see coverage below
  • README.md's Running locally section uses aspire start --isolated --non-interactive --apphost src/Aspire/Backlog.Aspire.AppHost/Backlog.Aspire.AppHost.csproj and no longer tells readers to use dotnet run --project src/Aspire/Backlog.Aspire.AppHost. The paragraph on running several worktrees side by side names --isolated. — see coverage below
  • Every one of the 49 src/ csproj folders and 24 tests/ csproj folders on main has a row in the README project table, including the 20 the issue lists, each with a one-line role. Existing rows are kept, including the non-csproj src/App/Backlog.Ide.VsCode. — see coverage below
  • A new test in tests/Backlog.ArchitectureTests fails, naming the missing project, when a csproj under src/ or tests/ (bin/obj excluded) has no README table row. It passes on the updated README. Verified by temporarily deleting one row and watching it go red, then restoring it. — see coverage below
  • The existing AspireAppModelTests README assertions (mobile-maui, mobile-tunnel, foundry-local with "only when foundry is on PATH") still pass. — see coverage below
  • dotnet build Backlog.sln reports 0 errors and no new warnings, and the Backlog.ArchitectureTests executable reports all tests passed. — see coverage below
  • No file under .devbook/ is changed. — see coverage below
  • The PR description has a "could not be proved" note: once this lands, the new test will fail for the open drafts refactor(devpc): move the tools adapter into Infrastructure.DevPc #804 (Backlog.Infrastructure.DevPc and its tests), fix(copilot): dispose the process the CLI launcher starts #796 (Backlog.Infrastructure.Copilot.UnitTests), test(blobstorage): cover BlobAttachmentStore against a fake container #806 (Backlog.Infrastructure.BlobStorage.UnitTests) and refactor(sessions): move the disk adapters into Infrastructure.Sessions #813 (Backlog.Infrastructure.Sessions and its tests) until each adds its README row. Merge those first, or have each rebase and add its row. — see coverage below

Verification

  • Command: cd "D:/iswp/761" && dotnet build Backlog.sln ; then for dir in tests/*/; do proj=$(basename "$dir"); exe="$dir/bin/Debug/net10.0/$proj.exe"; [ -f "$exe" ] || continue; timeout 900 "$exe" < /dev/null; done ; plus a targeted run: tests/Backlog.ArchitectureTests/bin/Debug/net10.0/Backlog.ArchitectureTests.exe -class Backlog.ArchitectureTests.ReadmeTests -class Backlog.ArchitectureTests.AspireAppModelTests
  • Build passed: true; tests passed: true; 9463 passed, 0 failed
  • Repair attempts: 0
  • Notes: Worktree D:/iswp/761 had uncommitted changes: README.md modified and new tests/Backlog.ArchitectureTests/ReadmeTests.cs. That file has 4 tests: The_project_table_lists_every_project_under_src_and_tests, The_run_command_is_the_isolated_aspire_start, The_build_and_test_section_warns_that_dotnet_test_can_run_nothing and The_current_state_no_longer_says_setup_mode.

Build: dotnet build Backlog.sln reported Build succeeded, 0 Warning(s), 0 Error(s), in 4.8s. This was an incremental build. Repo memory warns that an incremental build can hide warnings, so no full rebuild was done to confirm "no new warnings". Backlog.ArchitectureTests.dll (08:12:47) is newer than ReadmeTests.cs (08:12:43), so the new test was compiled in.

Targeted run of ReadmeTests + AspireAppModelTests: Total 27, Failed 0.

Full suite: 24 test executables, 9464 tests in total, 0 failed, 0 errors, 1 skipped (Backlog.EndToEndTests, Total 1, Skipped 1).

  • Backlog.ArchitectureTests: 179
  • Desktop.UI.UnitTests: 3465
  • UI.Components.UnitTests: 2639
  • FileSystem: 460
  • Tasks: 423
  • GitHub: 354
  • Infrastructure.Sync: 309
  • Dashboard: 222
  • Roadmap: 216
  • Inbox: 203
  • Sync.Api: 161
  • Mcp: 153
  • Mobile.UI: 114
  • Capture infra: 99
  • Devbook: 95
  • Sqlite: 89
  • Sync module: 81
  • Cosmos: 63
  • Claude: 49
  • Capture module: 36
  • HostComposition: 20
  • ServiceDefaults: 19
  • SharedKernel: 14

Sync.Api.UnitTests printed a logged OptionsValidationException for SyncTokenOptions.SigningKey, but its run reported 0 failures. It looks like an expected negative-path log. tests/Fixtures and tests/Shared have no executable, which is expected.

Acceptance criterion 5 (delete one README row, watch the test go red, restore it) was not done here, because this task was build/test only with no edits.

Review

No blocker or major findings.

Minor findings left open:

  • tests/Backlog.ArchitectureTests/ReadmeTests.cs:94: A second private Readme() loader and a second home for README contracts. AspireAppModelTests.cs:474 already has an identical Readme() and holds the README resource-table and Foundry assertions, so the README's text contracts are now split across two classes, each with its own copy of the loader.
  • tests/Backlog.ArchitectureTests/ReadmeTests.cs:60: The_current_state_no_longer_says_setup_mode guards against one retired phrase and says nothing about behaviour. A future stale Current state section that uses any other wording ('in early setup', 'not yet usable') passes it, so it pins this one edit rather than the drift the class says it guards against.

What could not be proved

  • 5 acceptance criterion/criteria have no test proving them: "1. README no longer contains 'currently in setup mode'; Current state describes main using devbook/CLAUDE.md wording and names no feature not in the tree"; "3. Running locally uses the aspire start --isolated command, drops dotnet run --project; side-by-side paragraph names --isolated"; "7. dotnet build Backlog.sln 0 errors and no new warnings; ArchitectureTests executable all passed"; "8. No file under .devbook/ changed"; "9. PR description carries the 'could not be proved' note about refactor(devpc): move the tools adapter into Infrastructure.DevPc #804, fix(copilot): dispose the process the CLI launcher starts #796, test(blobstorage): cover BlobAttachmentStore against a fake container #806, refactor(sessions): move the disk adapters into Infrastructure.Sessions #813"
  • The run took 11 assumption(s) instead of asking: How strictly should the test match? Assumed: each csproj's repo-relative folder path (forward slashes, in backticks, e.g. src/Modules/Sync/Backlog.Modules.Sync) must appear in README.md, anywhere in the file rather than only inside the first table. Extra rows with no csproj are allowed.; Should the second table (desktop bounded contexts, README lines 162-171) also be complete? Assumed no: only the main project table is regenerated and tested.; How much of the Sync paragraph (lines 91-95) changes? Assumed the smallest change that stops contradicting main, now that Backlog.Modules.Sync, Sync.Abstractions and Infrastructure.Sync/Cosmos/BlobStorage exist, with no new domain claim. Domain-level wording is left to Add the Sync bounded context to the domain model #762.; What wording replaces Current state? Assumed it is drawn from .devbook/arc42/01-introduction-and-goals.md and CLAUDE.md's opening paragraph, not invented.; Which test instruction goes in the README? Assumed both: dotnet test Backlog.sln with the zero-tests caveat, and the loop over the built test executables.; The worktree has 48 csproj under src/ (not 49 as the scope summary says) and 24 under tests/. The table has 73 rows: 72 csproj-backed plus the non-csproj Backlog.Ide.VsCode. The set of missing projects matched the issue's 20 exactly.; The table test reads only the table headed '| Project | Channel / role |' up to its first non-table line, so rows in the separate bounded-context table do not count. Folder paths are compared case-sensitively after normalizing to forward slashes.; I did not invoke delivery:flow-code myself. This subagent is a stage of the workflow that owns the flow, and the task says not to commit, push or open a PR.; The 75 build warnings were not compared against a clean baseline build of main (incremental builds can hide warnings). None of them come from Backlog.ArchitectureTests or the new file.; I dropped the old README sentence saying the AppHost uses the Aspire CLI bundle via dotnet run, because it described the dotnet run path. The new text says the Aspire CLI is needed, following .agents/skills/start.md.; The Current state wording counts Dev PC Management and Devbook as 'having a module', although their module folders hold only .Abstractions and .UI projects.

Assumptions

  • How strictly should the test match? Assumed: each csproj's repo-relative folder path (forward slashes, in backticks, e.g. src/Modules/Sync/Backlog.Modules.Sync) must appear in README.md, anywhere in the file rather than only inside the first table. Extra rows with no csproj are allowed.
  • Should the second table (desktop bounded contexts, README lines 162-171) also be complete? Assumed no: only the main project table is regenerated and tested.
  • How much of the Sync paragraph (lines 91-95) changes? Assumed the smallest change that stops contradicting main, now that Backlog.Modules.Sync, Sync.Abstractions and Infrastructure.Sync/Cosmos/BlobStorage exist, with no new domain claim. Domain-level wording is left to Add the Sync bounded context to the domain model #762.
  • What wording replaces Current state? Assumed it is drawn from .devbook/arc42/01-introduction-and-goals.md and CLAUDE.md's opening paragraph, not invented.
  • Which test instruction goes in the README? Assumed both: dotnet test Backlog.sln with the zero-tests caveat, and the loop over the built test executables.
  • The worktree has 48 csproj under src/ (not 49 as the scope summary says) and 24 under tests/. The table has 73 rows: 72 csproj-backed plus the non-csproj Backlog.Ide.VsCode. The set of missing projects matched the issue's 20 exactly.
  • The table test reads only the table headed '| Project | Channel / role |' up to its first non-table line, so rows in the separate bounded-context table do not count. Folder paths are compared case-sensitively after normalizing to forward slashes.
  • I did not invoke delivery:flow-code myself. This subagent is a stage of the workflow that owns the flow, and the task says not to commit, push or open a PR.
  • The 75 build warnings were not compared against a clean baseline build of main (incremental builds can hide warnings). None of them come from Backlog.ArchitectureTests or the new file.
  • I dropped the old README sentence saying the AppHost uses the Aspire CLI bundle via dotnet run, because it described the dotnet run path. The new text says the Aspire CLI is needed, following .agents/skills/start.md.
  • The Current state wording counts Dev PC Management and Devbook as 'having a module', although their module folders hold only .Abstractions and .UI projects.

An unattended run of delivery-schedule:schedule-issue-sweep (delivery-schedule@1.10.0) opened this pull request as a draft. It verified the change with the unit suite only.

🤖 Generated with Claude Code

The README said the project was "in setup mode", listed 52 of its 72
projects, never said how to build or test, and ran the AppHost with
dotnet run. It now:
- describes the current state in the devbook's and CLAUDE.md's words;
- adds a Build and test section, which warns that dotnet test can
  report "Zero tests ran" and shows how to run the test executables;
- starts the AppHost with aspire start --isolated, and names
  --isolated in the side-by-side worktree paragraph;
- lists every csproj under src/ and tests/ in the project table.

ReadmeTests keeps the table complete, so it cannot drift again.

Build: 0 errors; 9463 tests passed, 0 failed.

Refs #761

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JSdotNet
JSdotNet marked this pull request as ready for review September 29, 2026 10:13
@JSdotNet
JSdotNet merged commit 74f35fe into main Sep 29, 2026
5 checks passed
@JSdotNet
JSdotNet deleted the schedule/issue-sweep/2026-09-28/761-readme-level-with-tree branch September 29, 2026 10:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bring README.md level with the tree

1 participant