Skip to content

Close the loose ends the last round of merges left - #169

Merged
JSdotNet merged 2 commits into
mainfrom
claude/wonderful-chaum-de742d
Aug 20, 2026
Merged

JSdotNet merged 2 commits into
mainfrom
claude/wonderful-chaum-de742d

Conversation

@JSdotNet

Copy link
Copy Markdown
Owner

Summary

A post-merge review of everything that landed on 19 and 20 August (#137 through #167), asking whether the pieces combined well and what they left behind.

Mostly they did. The combined state builds clean with no warnings, all tests pass, the solution matches what is on disk with nothing orphaned or dangling, no conflict markers survived any of the six Merge origin/main resolutions, every _meta graph is current, and all 55 .design anchors the storybook names resolve. The two headline renames are coherent rather than half-finished: the BacklogEntry → TaskItem drift in .domain/ is deliberately recorded in naming.md as deferred to orch-domain, and ADR 0003 explicitly addresses why Roadmap Planning stayed on JSON while tasks moved to SQLite. The three riskiest seams all merged correctly — WorkspaceSurface grew a fourth state with matching header segment, gating and Escape handling; DataTable arrived from the Sessions branch with RowKey set to Kind/Id so cross-agent id collisions cannot corrupt Blazor's keyed diff; Sessions' adapters follow the Dashboard.UI/Adapters/ precedent.

So this PR is the residue, not a repair.

Changes

A locked session file no longer costs an agent its whole list. Both readers guarded the parse of a live-session file but not the open of it — and these files are written by the process they describe, so a sharing violation is an ordinary event. The IOException escaped to LocalAgentSessionSource.Collect, which reads it as "this agent's folder cannot be read" and blanks every row it would have produced. The Claude reader's own comment already said that losing one row is the proportionate response to a file being rewritten underneath it; now the code does that.

The storybook's design references are enforced rather than hoped for. The restructure moved the rules into .design and had each page name a chapter and anchor, which DesignGuideline renders beside the component. Rename a heading and the page silently draws a sentence saying the rule is missing — in a host nothing in CI opens. Every other convention in this library is a test, so this one is now too, slugging headings the way GitHub does because that is what resolves these anchors everywhere else they are written.

README.md had drifted furthest, because four merges added projects to it and none updated it. Twelve of the forty-six were missing: all of Sessions, the Roadmap module and its Abstractions, Infrastructure.Sqlite and three other adapters, the storybook host, six test projects. Worse than incomplete — it still called Infrastructure.FileSystem the canonical local data, which ADR 0003 made untrue; still called Roadmap "scaffolding only so far"; still described the .backlog folder join that went with the repository integration; still listed a Monitoring module that has no project; and still linked to the domain/ and architecture/ folders the restructure replaced.

Two stale comments from the merge seams: the surface switcher said "both takeover features" after Sessions made it three, and CLAUDE.md wrote src/harness where the solution file, the architecture tests and every other document write src/Harness.

Testing

dotnet build Backlog.sln clean with 0 warnings and dotnet test Backlog.sln fully green — run both before the fixes and again after merging origin/main (which had moved five commits ahead onto Home.razor, one of the files here).

The two new reader tests hold a real FileShare.None handle over one session file and assert the sibling row survives. Both were checked against the unfixed readers and fail there — the Copilot one aborted the whole reader. The new architecture test was checked the same way, by renaming a .design heading and confirming it goes red. It also passes against color-scheme.md as #167 rewrote it, which is the guard doing its job on content it never saw.

No Aspire instance was started for this review, so there was none to stop.

Related

Two things left for you to decide

  • tests/Backlog.Infrastructure.FileSystem.UnitTests now holds only JsonRoadmapPlanRepositoryTests. That adapter's own workspace-settings and feature-flag tests sit in Backlog.Desktop.UI.UnitTests, because they serialize on a collection fixture defined there. Not trivially movable, so the split is documented in the README row rather than papered over.
  • .arc42/08-crosscutting-concepts.md names SQLite for tasks and JSON for settings and flags, but not the roadmap plan's own _roadmap/plan.json. A governed chapter, so it belongs to orch-arc42 rather than a drive-by edit here.

Also latent but harmless: the working directory is src/harness while git's index records src/Harness. Invisible on Windows under core.ignorecase, and since the index carries the casing everything references, a case-sensitive checkout gets the right name — nothing is broken, but it is why find and git ls-files disagree in this repo.

Checklist

  • Scope is focused and excludes unrelated changes
  • Documentation or instruction files were updated when governance or behavior changed
  • Running Aspire instances for this checkout were stopped before PR creation — none was started for this review
  • Follow-up work is captured when the implementation is intentionally partial — see "Two things left for you to decide"

🤖 Generated with Claude Code

JSdotNet and others added 2 commits August 20, 2026 09:11
A post-merge review of everything that landed on 19 and 20 August. The combined
state builds clean and all 2332 tests pass, the solution matches what is on disk,
and the two headline renames are coherent — so this is the residue rather than a
repair.

A locked session file no longer costs an agent its whole list. Both readers
guarded the parse of a live-session file but not the open of it, and these files
are written by the process they describe: a sharing violation escaped to
LocalAgentSessionSource, which reads an IOException as "this agent's folder cannot
be read" and blanks every row it would have produced. The Claude reader's own
comment already said losing one row is the proportionate response to a file being
written underneath it; now the code does that. Two tests hold a real FileShare.None
handle over one file and assert the sibling row survives — both fail against the
unfixed readers, and the Copilot one aborted the reader outright.

The storybook's design references are now enforced rather than hoped for. The
restructure moved the rules into .design and had each page name a chapter and
anchor, which DesignGuideline renders beside the component. Rename a heading and
the page silently draws a sentence saying the rule is missing, in a host nothing
in CI opens. Every other convention in this library is a test; this one is too
now, slugging headings the same way GitHub does because that is what resolves
these anchors everywhere else they are written.

README had drifted furthest, because four merges added projects to it and none
updated it. Twelve of the forty-six were missing — all of Sessions, the Roadmap
module and its Abstractions, Infrastructure.Sqlite and three other adapters, the
storybook host, six test projects. Worse than incomplete: it still called
Infrastructure.FileSystem the canonical local data, which ADR 0003 made untrue;
still called Roadmap scaffolding; still described the .backlog folder join that
went with the repository integration; still listed a Monitoring module that has no
project; and still linked to domain/ and architecture/ folders that the
restructure replaced. Every project is named now and every link resolves.

Two stale comments from the merge seams: the surface switcher said "both takeover
features" after Sessions made it three, and CLAUDE.md wrote src/harness where the
solution file, the architecture tests and every other document write src/Harness.

Left alone deliberately. The FileSystem adapter's settings and feature-flag tests
sit in the desktop UI project because the collection fixture they serialize on is
defined there, so the split is documented in the README row rather than papered
over. And arc42's storage concept does not mention the roadmap plan's own JSON;
that is a governed chapter and belongs to orch-arc42.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@JSdotNet
JSdotNet merged commit c2f0e0d into main Aug 20, 2026
4 checks passed
@JSdotNet
JSdotNet deleted the claude/wonderful-chaum-de742d branch August 20, 2026 10:12
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.

1 participant