Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,26 @@ pattern. Every repo that takes the generated dev CLI hits this.
classes may have the same problem).
- Add a regression gate: compile the DevCli content with CA1812 on (Nuru's own `NoWarn` hides it today).

## Checklist
## Goal (implementer restatement)

- [ ] Reproduce: compile DevCli content with CA1812 as error, list every type that fires
- [ ] Choose a fix that satisfies CA1812, CA1034 and CA2000 together without suppression
- [ ] Apply it to all affected content types
- [ ] Regression gate compiles the content with CA1812 enabled
A repo that compiles the TimeWarp.Nuru.DevCli source content with CA1812 enabled and warnings as
errors must build clean, with no suppression in the content or the consumer. The four nested
`internal sealed class Handler` endpoint handlers are only built by the DI container, so CA1812
sees no instantiation. Fix it so the instantiation is real and visible, without bringing back
CA1034 (public nested types) or CA2000, and keep runtime dispatch unchanged.

Acceptance:
- Every shipped content type compiles with CA1812 on and reports nothing (reproduce first, list
every type that fires).
- No `<auto-generated/>`, `#pragma`, `[SuppressMessage]` or globalconfig in the shipped content.
- `tests/devcli-consumer-check` compiles the content with CA1812 enabled (regression gate).
- Endpoint dispatch through the generated mediator still works (full test suite green).


- [x] Reproduce: compile DevCli content with CA1812 as error, list every type that fires
- [x] Choose a fix that satisfies CA1812, CA1034 and CA2000 together without suppression
- [x] Apply it to all affected content types
- [x] Regression gate compiles the content with CA1812 enabled
- [ ] Ships in the next DevCli beta; consumers (multiavatar, amuru) can then drop their suppressions

## Session
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Disposition — task 575

**Date:** 2026-11-14
**Outcome:** clean
**Rounds:** 1
**Final open count:** 0

## Summary

Round 1 (effort 1, general only) found no issues. `dev build` still restores `timewarp-nuru.slnx` once, then each per-project Release build calls `WithNoRestore()`. Project order is unchanged. The Ganda template was correctly left alone. Recorded build, `--clean`, test, and audit results cover the change.

## Exception log (if accepted-exceptions)

None.

## Escalations

- None.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Review framework — task 575

**Date:** 2026-11-14
**Host task:** kanban/in-progress/575-pass-no-restore-after-the-initial-restore-in-dev-build/
**Diff scope:** branch `task/575-pass-no-restore-after-the-initial-restore-in-dev` vs `master` (`master...HEAD`). Product delta is `tools/dev-cli/endpoints/build-command.cs` (3 insertions). Kitchen move of task 575 is out of product scope.
**Plan / brief:** `dev build` keeps the one solution restore of `timewarp-nuru.slnx`, then each per-project `DotNet.Build()` calls `WithNoRestore()`. Project order and Release stay. No Ganda template change.
**Effort:** 1 (general only)
**Reviewer roster:** general
**Session IDs:** review oracle session not reported (cursor, grok-4.7). Turn cap 80; cursor harness uncapped.

## Budget (by-diff)

- Lines changed: 125
- Effort: 1
- TCB hits: none
- Roster axes: general
- Turn cap: 80 (--max-turns; cursor uncapped)

## Ground rules

- Reviewers are read-only on product code; they write only under `review/round-N/`
- Severity: bug | suggestion | nit — Status starts as open
- Do not invent issues to fill space; zero issues is a valid outcome
- Address the diff and surrounding call sites; re-verify falsifiable claims by reading the diff and the kitchen `## Results` and `### How to validate` record
- Do not re-run a full build, a full test run, an audit, or the hooks; those belong to the implementer's recorded results, the host audit node, and CI
- Exception: one targeted command may check one suspected bug; the finding names the command and the reason. A full build, full test run, or audit is never that command
- A missing or thin recorded result is a finding, not a reason to run the gates
- Prior rounds are immutable; new work goes in `round-(N+1)/`
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Round 1 — general
**Date:** 2026-11-14
**Scope reviewed:** `tools/dev-cli/endpoints/build-command.cs` vs `master`, checked against the task and `## Goal (implementer restatement)`. Amuru `WithNoRestore()` emission read in `timewarp-amuru` `dot-net.build.cs` (sets `NoRestore` and adds `--no-restore`). Solution membership of the eight projects checked in `timewarp-nuru.slnx`.

## Summary

The diff adds `.WithNoRestore()` to the single per-project `DotNet.Build()` chain inside the existing loop. The solution `DotNet.Restore()` still runs first, optional `DotNet.Clean()` still follows that restore, and the eight projects stay in the same order at `Release`. All eight paths are projects in `timewarp-nuru.slnx`, so the up-front solution restore is the restore those builds skip. The implementer restatement matches the task: no Ganda template edit, and `--clean` still relies on the restore that already ran (`dotnet clean` leaves `obj/project.assets.json`). Recorded gates cover the change: `./bin/dev build` (verbose run reported `--no-restore` on all eight projects), `./bin/dev build --clean`, `./bin/dev test`, and `ganda repo audit`, plus a `### How to validate` smoke. No misread. No issues.

## Issues
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Round 1 — merged findings
**Date:** 2026-11-14
**Sources:** general

## Counts

| Severity | open | fixed | wontfix |
|----------|------|-------|---------|
| bug | 0 | 0 | 0 |
| suggestion | 0 | 0 | 0 |
| nit | 0 | 0 | 0 |

## Issues

No findings.

## Duplicates / conflicts

- None. Single reviewer.
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Pass --no-restore after the initial restore in dev build

## Description

`dev build` should pass `--no-restore` (`WithNoRestore()`) after the initial solution restore so later per-project builds do not restore again.

Current pattern in `tools/dev-cli/endpoints/build-command.cs:53-116`: always `DotNet.Restore()` on `timewarp-nuru.slnx`, optionally `DotNet.Clean()`, then `DotNet.Build().WithProject(...).WithConfiguration("Release")` for each project **without** `WithNoRestore()`. Amuru already supports the flag (`source/timewarp-amuru-tools/dot-net-commands/dot-net.build.cs:362`).

## Requirements

- Keep the explicit first restore of the solution.
- After that restore (and after an optional `--clean`, which should still restore if needed), each `DotNet.Build()` in the per-project loop must use `WithNoRestore()`.
- Do not change the project order or Release configuration.

## Ganda dev-cli template

The shared Ganda template `timewarp-ganda/source/timewarp-ganda/templates/dev-cli/endpoints/build-command.cs.txt:76-80` is a **different** pattern: a single `DotNet.Build().WithConfiguration("Release")` and no explicit prior restore. It does not have Nuru's restore-then-per-project loop, so this task does not require a template change. If that template later gains an explicit restore plus follow-on builds, those follow-on builds should also use `WithNoRestore()`.

## Goal (implementer restatement)

`dev build` restores `timewarp-nuru.slnx` once, optionally cleans, then builds eight projects one by one in Release. Each of those per-project builds currently restores again. Make each per-project `DotNet.Build()` pass `--no-restore` via `WithNoRestore()` so the solution restore is the only restore.

Acceptance:
- The single explicit solution restore stays first.
- Every per-project build command line includes `--no-restore`.
- Project order and `Release` configuration are unchanged.
- `dev build --clean` still works (`dotnet clean` leaves `obj/project.assets.json`, so the up-front restore still covers the builds).
- The Ganda template needs no change (single build, no explicit restore).

## Checklist

- [x] Add `WithNoRestore()` to the per-project builds after the solution restore in `build-command.cs`
- [x] Confirm `dev build` still restores once up front and still builds in the existing project order
- [x] Note-only for the Ganda template unless it is updated to the same two-step pattern

## Acceptance criteria

- The commands `dev build` issues after the first restore include `--no-restore`.
- `dev build --clean` still works.

## Review

- Round 1: Done

## Notes

- Related incrementality work (other repos): timewarp-terminal 040 and timewarp-flexbox 157 (`ContinuousIntegrationBuild` only in CI). Umbrella: timewarp-jenzi 011.
- Filed by Jenzi from cross-repo build-telemetry audit 2026-11-12.

## Results

`tools/dev-cli/endpoints/build-command.cs` now adds `.WithNoRestore()` to each per-project `DotNet.Build()` in the loop. Nothing else changed: the solution restore still runs first, the optional `--clean` still follows it, and the 8 projects build in the same order in `Release`. `dotnet clean` keeps `obj/project.assets.json`, so the up-front restore still covers the builds after `--clean`. No Ganda template change was made because that template has no explicit restore followed by more builds.

### Gates

- `./bin/dev build`: **pass** (exit 0, all 8 projects, "Build completed successfully!"). This ran after `dotnet run --file tools/dev-cli/dev.cs -- self-install` installed the edited dev CLI.
- `./bin/dev build --clean`: **pass** (exit 0)
- `./bin/dev test`: **pass** (exit 0). Multi-mode: 2185 total, 2179 passed, 6 skipped, 0 failed. Standalone: 0 failed.
- `ganda repo audit`: **pass** (exit 0, 43 passed, 1 advisory warning). The first run failed `kanban-landed` because task 573's live-claim kitchen had drifted from origin-home. I fixed it with `ganda kanban reconcile --task-id 573` (boy-scout fix) and reran the audit. The remaining warning is `vscode-window-icon` (`.vscode/settings.json` is missing). It is advisory and was not changed.

### How to validate

Smoke: `./bin/dev build --verbose 2>&1 | grep '^dotnet build'`

Expect: 8 `dotnet build <project> --configuration Release --verbosity normal --no-restore` lines, in this order: analyzers, build, nuru, mcphost, daemon, mcp, search, devcli. Only one restore happens: the "Restoring packages..." step on `timewarp-nuru.slnx`. `./bin/dev build --clean` exits 0.

### Review

- Rounds: 1. Roster: general. Effort: 1.
- Counts: bug 0 open / 0 fixed / 0 wontfix; suggestion 0; nit 0. Final open count: 0.
- Disposition: clean. No wontfix and no escalation.
- Paths: `review/review-framework.md`, `review/round-1/general.md`, `review/round-1/merged.md`, `review/disposition.md`.

## Session

- Implement oracle: implemented by implementer-claude (claude, vendor anthropic, model claude-opus-5-5), session not reported, max-turns 500, Done — 2026-11-13T19:55:29Z
- Review oracle: general (grok, vendor xai, model grok-4.7), session not reported, review budget max-turns 80 (cursor harness uncapped), effort 1, clean — 2026-11-14
- Review oracle: review by reviewer-cursor (cursor, vendor xai, model grok-4.7-high), session not reported, max-turns uncapped (no --max-turns flag; bound 80), artifacts general.md, merged.md, disposition.md — 2026-11-13T19:58:41Z

This file was deleted.

3 changes: 3 additions & 0 deletions tools/dev-cli/endpoints/build-command.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,12 @@ public async ValueTask<Unit> Handle(BuildCommand command, CancellationToken ct)
string fullPath = Path.Combine(repoRoot, projectPath);
Terminal.WriteLine($"\nBuilding {projectPath}...");

// The solution restore above already covers every project; restoring
// again per project only costs time (kanban 575).
CommandResult buildCommandResult = DotNet.Build()
.WithProject(fullPath)
.WithConfiguration("Release")
.WithNoRestore()
.WithVerbosity(verbosityLevel)
.Build();

Expand Down
Loading