Skip to content

feat: adopt DevCli release and promote the CI package - #10

Merged
StevenTCramer merged 12 commits into
masterfrom
task/010-adopt-devcli-dev-release-command-and-release-pipel
Nov 9, 2026
Merged

StevenTCramer merged 12 commits into
masterfrom
task/010-adopt-devcli-dev-release-command-and-release-pipel

Conversation

@StevenTCramer

Copy link
Copy Markdown
Contributor

Summary

TimeWarp.Nuru.DevCli 4.0.0-beta.11 supplies clean, check-version, release, and self-install. This repo keeps build, test, pack, format, verify-samples, and workflow. Release mode promotes Packages-* and pushes TimeWarp.Builder to nuget.org. It does not rebuild. <Version> is still 1.1.0. No tag and no GitHub Release were created.

dev self-install AOT-publishes because tools/dev-cli/Directory.Build.props sets GenerateDocumentationFile to false, so the publish no longer looks for dev.xml. Amuru stays at 2.0.0: 3.0.0-beta.1 is net11.0 only, and the git hooks restore that package. DevCli 4.0.0-beta.11 compiles against Amuru 2.0.0.

ganda repo audit first reported one warning, vscode-window-icon, because .vscode/settings.json was missing. ganda repo audit --fix --checks vscode-window-icon wrote that file. It is gitignored (.gitignore line .vscode/*). The re-audit reported Passed 38, Failed 0, Skipped 3.

On the clean task branch, ./bin/dev release --dry-run passed the gh and clean-tree guards and stopped with "release must be cut from master". git tag -l 'v1.1.0' was empty. ./bin/dev workflow --mode pr then ran self-install, clean, build, test, and pack and printed Pipeline SUCCEEDED. The packed file is artifacts/packages/TimeWarp.Builder.1.1.0.nupkg.

Review round 1's open findings were both in documentation/developer/guides/releasing.md. The guide says dev release walks back only over kanban/ (at most 50 commits). A docs-only HEAD is recovered with gh workflow run workflow.yml --ref master -f mode=merge, then another dry-run after that run is green. Download and Break-glass state that gh run rerun lasts 30 days. Past that, while master is still the tagged commit, the recovery is that merge-mode dispatch (the upload step requires refs/heads/master) and then break-glass on the tag. Round 1 merged.md marks M1 and M2 fixed. Round 2 verified those two and opened M3.

This fix pass reran ganda repo audit (Passed 38, Failed 0, Skipped 3), ./bin/dev build (0 warnings, both target DLLs), ./bin/dev test (6 of 6 Jaribu files), and ./bin/dev check-version (source 1.1.0, NuGet 1.0.0). ./bin/dev release --dry-run stopped at the clean-tree guard while these edits were uncommitted. After that commit, the same command passed the clean-tree guard and stopped with "release must be cut from master". It did not run gh release create. git tag -l 'v1.1.0' was empty. source/Directory.Build.props was unchanged.

Review round 2's bug was the pre-cut gate. Step 2 no longer reads the run id from guard 8. Guard 8 prints OrderCandidateRuns(...)[0], which is the push run when one exists, so a refresh leaves that line on the expired version-bump run. The guide now tells the operator to take the full SHA from the dry-run Target commit: line, list gh run list --workflow workflow.yml --commit SHA --status success, skip pull_request, and continue when any other run has a Packages-* artifact with expired false. Refresh is the same merge-mode dispatch, and only when every such artifact is missing or expired. The push run staying older than 7 days is not another refresh. Download says an expired push run is skipped so the later dispatch's artifact is the one promoted. Round 2 merged.md marks M3 fixed. Disposition waits for review round 3.

Review round 3's bug was the refresh loop that the M3 wording added. The merge-mode dispatch builds master HEAD. When HEAD is kanban-only commits past the dry-run target, the live Packages-* artifact is at HEAD, and the next dry-run moves Target commit: there. The guide no longer says to repeat the list at the SHA from before the refresh. After the run is green, the operator dry-runs again and lists at the new Target commit: SHA. That SHA stays when HEAD was already the target, and only then does guard 8 still name the old push run. It moves to HEAD when HEAD was kanban-only past the old target. Download no longer says the dispatch is "at the same commit". It says a later merge-mode dispatch on master supplies the bytes when that dispatch ran at the commit being released. Round 3 merged.md marks M4 fixed. Disposition waits for review round 4. No tag and no GitHub Release were created. <Version> is still 1.1.0.

This fix pass reran ganda repo audit (Passed 38, Failed 0, Skipped 3), ./bin/dev build (0 warnings, both target DLLs, package TimeWarp.Builder.1.1.0.nupkg), ./bin/dev test (6 of 6 Jaribu files), and ./bin/dev check-version (source 1.1.0, NuGet 1.0.0). ./bin/dev release --dry-run stopped at the clean-tree guard while these edits were uncommitted. After that commit, the same command passed the clean-tree guard and stopped with "release must be cut from master". It did not run gh release create. git tag -l 'v1.1.0' was empty. source/Directory.Build.props was unchanged.

Review round 4's bug was the guard 8 refusal paragraph. The walk names the first commit with a path outside kanban/. That commit is HEAD, or the commit under a run of kanban-only commits. On this repo the usual documentation-only merge is followed by land kanban commits, so the refusal names the merge. The clause "when HEAD is not kanban-only" is gone. The merge-mode dispatch builds HEAD, so after it is green the new Target commit: is HEAD. The operator dry-runs again and applies the artifact check at that line. Round 4 merged.md marks M5 fixed. Disposition waits for review round 5. No tag and no GitHub Release were created. <Version> is still 1.1.0.

This fix pass reran ganda repo audit (Passed 38, Failed 0, Skipped 3), ./bin/dev build (0 warnings, both target DLLs, package TimeWarp.Builder.1.1.0.nupkg), ./bin/dev test (6 of 6 Jaribu files), and ./bin/dev check-version (source 1.1.0, NuGet 1.0.0). ./bin/dev release --dry-run stopped at the clean-tree guard while these edits were uncommitted. After that commit, the same command passed the clean-tree guard and stopped with "release must be cut from master". It did not run gh release create. git tag -l 'v1.1.0' was empty. source/Directory.Build.props was unchanged.

Test plan

Smoke: from this worktree, on a clean tree:

./bin/dev --help
./bin/dev release --dry-run
./bin/dev check-version
./bin/dev build
./bin/dev test
git tag -l 'v1.1.0'
git diff -- source/Directory.Build.props
grep -n -E 'kanban-only|mode=merge|30 days|Target commit:|pull_request|OrderCandidateRuns' documentation/developer/guides/releasing.md

Expect: release is in ./bin/dev --help. ./bin/dev release --dry-run exits non-zero because this branch is not master, prints no gh release create execution, and git tag -l 'v1.1.0' stays empty. ./bin/dev check-version prints Packages checked: TimeWarp.Builder, Version in source: 1.1.0, and Latest NuGet version: 1.0.0. ./bin/dev build is 0 warnings and writes source/timewarp-builder/bin/Release/net10.0/TimeWarp.Builder.dll and source/timewarp-builder/bin/Release/net11.0/TimeWarp.Builder.dll. All 6 Jaribu runfiles pass. source/Directory.Build.props still has <Version>1.1.0</Version>. The guide's walk-back sentence names kanban-only commits and says a path outside kanban/, including documentation/, ends the walk. It contains gh workflow run workflow.yml --ref master -f mode=merge as the guard 8 recovery and as the pre-cut refresh. The pre-cut check copies the full SHA from Target commit:, runs gh run list --workflow workflow.yml --commit SHA --status success, skips pull_request, and continues when any other run has a Packages-* artifact with expired false. After the refresh is green it says to dry-run again and list at the new Target commit: SHA, and not to repeat the list at the SHA from before the refresh. It says that SHA moves to HEAD when HEAD was kanban-only commits past the old target, and that the old SHA still showing every artifact expired is not a reason to dispatch again. It limits "the push run that guard 8 names stays older than 7 days" to the case where HEAD was already the target. Download says a later merge-mode dispatch on master supplies the bytes when that dispatch ran at the commit being released. It says GitHub accepts gh run rerun for 30 days, and the break-glass section then dispatches merge mode on master while master is still the tagged commit. The guard 8 refusal starts with "no successful CI run of workflow.yml". When the walk reaches a commit with a path outside kanban/, it names that commit and the path. That commit is HEAD, or the commit under a run of kanban-only commits. The usual case is a documentation-only merge followed by land kanban commits, and the refusal names the merge. The dispatch builds HEAD, so after the run is green the new Target commit: is HEAD. The paragraph does not say the refused commit is HEAD, and it does not say "when HEAD is not kanban-only".

Automated gate: ./bin/dev build and ./bin/dev test from the repo root. ganda repo audit exits 0.

The release cut itself is not part of this validation. Run dev release only with --dry-run on this branch.

Kanban task 010
Session: 01a1bcc1-3c09-78e2-8fa0-ceeacadc6e70

StevenTCramer and others added 12 commits November 9, 2026 03:01
A release of TimeWarp.Builder rebuilt the nupkg on release:published and
the GitHub Release was created by hand. DevCli 4.0.0-beta.11 supplies
release, and the workflow now pushes the Packages-* artifact CI already
tested. The props version stays 1.1.0.

Co-Authored-By: grok <noreply@x.ai>
The clean-tree dry-run stopped on the master guard, and the PR workflow
packed TimeWarp.Builder.1.1.0 without creating a tag.

Co-Authored-By: grok <noreply@x.ai>
DevCli 4.0.0-beta.11 walks back only over kanban-only commits, and a
deferred 1.1.0 cut outlives the 7-day Packages-* artifact. The guide
told operators that documentation commits were skipped and that
gh run rerun was always enough.

Co-Authored-By: grok <noreply@x.ai>
Guard 8 names the push run, so a refresh left the guide looping on an
expired artifact. The cut proceeds when any non-pull-request run at the
target commit still has a live Packages-* artifact.

Co-Authored-By: grok <noreply@x.ai>
The guide fix was uncommitted during the first dry-run, so that pass
stopped on the dirty tree. The rerun on the committed branch stopped
because the branch is not master.

Co-Authored-By: grok <noreply@x.ai>
A merge-mode dispatch builds master HEAD. When HEAD is kanban-only
commits past the dry-run target, the live package artifact is there,
and repeating the list at the old SHA loops on refresh.

Co-Authored-By: grok <noreply@x.ai>
The guide fix was uncommitted during the first dry-run, so that pass
stopped on the dirty tree. The rerun on the committed branch stopped
because the branch is not master.

Co-Authored-By: grok <noreply@x.ai>
The walk stops at the first path outside kanban/, which sits under
land kanban commits after a documentation merge. A merge-mode
dispatch builds HEAD, so the next Target commit is HEAD.

Co-Authored-By: grok <noreply@x.ai>
The guide fix was uncommitted during the first dry-run, so that pass
stopped on the dirty tree. The rerun on the committed branch stopped
because the branch is not master.

Co-Authored-By: grok <noreply@x.ai>
@StevenTCramer
StevenTCramer merged commit 2a0f98a into master Nov 9, 2026
1 check passed
@StevenTCramer
StevenTCramer deleted the task/010-adopt-devcli-dev-release-command-and-release-pipel branch November 9, 2026 05:30
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