Default to minimal verbosity, and add the missing "Notice" message level - #347
Conversation
MessageLevel had no rung meaning "significant, but not a warning, and visible at minimal verbosity" -- the thing MSBuild has always had as MessageImportance.High and syslog calls Notice. Its absence is why the two IReporter implementations disagreed about the same call: TaskLoggingHelperReporter had nothing to put in MSBuild's High slot, so it shifted the whole ladder down a notch and mapped Info there, while ConsoleReporter hid Info at minimal. Notice goes between Warning and Info. Six levels no longer fit five thresholds injectively, so IsEnabled can no longer compare the enums' underlying values; MessageLevelExtensions.MinimumVerbosity states the mapping instead, and is now the single authority both reporters answer to. The enums' docs lose the one-to-one claim they can no longer make, and the Notice-versus-Info criterion goes on the enum member itself, where the next call-site author will meet it. TaskLoggingHelperReporter's outbound map shifts by one rung and its Verbosity getter with it, collapsing to two branches: minimal and quiet now answer the same. Both remaining judgment calls in that getter over-claim on purpose, and the remarks say why -- an honest Detailed would make the formatting overloads drop Trace under -v:diag, and an honest Quiet would make them drop warnings MSBuild still prints. The remarks also record that Detail and Trace share MessageImportance.Low because MSBuild's ladder has three rungs and ends there: EngineServices exposes no verbosity to read, by design, so detailed and diagnostic are indistinguishable from inside a task. Activity lines stay gated at Info on both sides, which is the agreement they already had -- the SDK side logs them at Normal importance so they stay hidden at MSBuild's default verbosity. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The lines `bv release` uses to record what it did to the repository -- version spec changed, N public API files modified, changelog substituted, N self-referenced files rewritten, N packages pushed, and every "skipped, because" line -- are the audit trail of a CI-only operation, so they move to Notice and survive the minimal verbosity the next commit makes the default. What the command is doing at a given moment stays at Info: "Reading release asset lists...", the changelog and public-API services' narration, the hook runner's, the Git service's. Three lines outside `release` come along: - VersioningService's "Version X (height N, publicity)". This one is collateral of the remap rather than a call-site judgment: it is Core code that also runs inside SDK tasks, where Info used to mean MessageImportance.High, so the line shows on every plain `dotnet build` today. Notice is where it belongs on the criterion anyway -- it records the version this build decided to stamp -- and keeps `dotnet build` output exactly as it is. - ServerRelease's "Repository unchanged, no commit to push.", a release outcome with no aggregate counterpart in ReleaseCommand to carry it. - All three of `version advance`'s outcome lines, not just the one naming the new spec. The command has no deliverable stream of its own, so at Info the no-op case would print nothing at all, and promoting the outcome without the "review and commit" line would strand it: leaving the change uncommitted for review is what the command is for. Two candidates stay at Info deliberately. The fallback-push-credentials line is a setup fact rather than an outcome, and the case worth surfacing at minimal is already covered by the warning in its else branch; and the successful changelog check records nothing and changes nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
bv defaulted to normal while `dotnet restore`/`build`/`test`/`pack` -- the commands the build pipeline wraps, and forwards its own verbosity to verbatim -- default to minimal, so plain `bv build` produced a markedly noisier MSBuild log than plain `dotnet build`. Buildvana is a component of a .NET toolchain: where the toolchain has settled a question of behavior, we settle it the same way rather than on the merits. The default is uniform across commands, so the per-command defaultVerbosity goes with it, along with the ImplementsCommandAttribute parameter, the CommandRegistration member, the CommandRegistry plumbing, and the single call site on `version show`. That carve-out existed to give a query command a quieter default than normal; with minimal as the base there is nothing left for it to do. Nothing replaces it: verbosity is process-wide, and a per-command exception would restore the noisy MSBuild log in `release`, which runs the build pipeline itself and has the longest log of all. Program's DefaultVerbosity is a constant because the pre-verbosity error path needs the same value: a reporter built before --verbosity is parsed must filter like the one built after it. Two unreleased changelog entries described behavior this commit changes -- `version show`'s own minimal default, and the resolved verbosity forwarded to `dotnet` -- and are corrected in place rather than left to contradict the new entries in the same release. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
release.yml offered three of the five verbosity values and defaulted to normal; it now offers all five in ladder order and defaults to minimal. Its `if [ -z "$BV_VERBOSITY" ]` line goes: the input is required and defaulted on a dispatch-only workflow, so it can never be empty. Note that dispatching a release at quiet now hides the release record entirely, Notice being gated at minimal -- that is the level doing its job, but worth knowing for an operation that mutates and pushes. build-test-pack.yml had no such input at all, so its own -z fallback pinned Normal unconditionally on every push and pull request. It now passes no --verbosity and lets bv's default apply. Both keep the RUNNER_DEBUG override, and the verbosity literals are lowercase in both files. No changelog entry: these are Buildvana's own CI workflows, not behavior we ship. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #347 +/- ##
==========================================
+ Coverage 73.66% 74.57% +0.90%
==========================================
Files 161 162 +1
Lines 4530 4582 +52
Branches 785 788 +3
==========================================
+ Hits 3337 3417 +80
+ Misses 1033 1014 -19
+ Partials 160 151 -9 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
@claude please review this PR. |
|
Claude finished @rdeago's task in 8m 4s —— View job Review: PR #347 — default to minimal verbosity, add
|
The Notice(CompositeFormat, ...) overload added by this branch had no test, and neither did the eleven lines around it: the whole formatting-overload family, Error(string) and Trace(string), and Report's null check and its skip-formatting short-circuit were all uncovered before this branch touched the file. Each of the two table tests calls all six shortcuts against one reporter and asserts the six emitted lines, so what is pinned is the level-to-label mapping, not merely that the lines execute. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
At minimal verbosity `bv release` recorded what it had prepared - the version, the changelog edits, the file counts - and the packages it pushed, but never that it had pushed the release commits or published the release itself. The no-op branch of PushUpdates says "Repository unchanged, no commit to push." at notice level; its counterpart said nothing at all. Both outcome lines go in the server-independent layer, next to the facts they complete: ServerRelease.PublishAsync reports the published tag and its asset count once DoPublishAsync returns, and GitService.Push reports branch and remote after the push. Any future server adapter therefore inherits the record instead of reinventing it. The "Pushing..." and "Publishing..." lines stay at info: they narrate what is about to happen in front of a network call, which is not what the reader wants afterwards. The force-push branch is reported too. It runs during rollback, so it is the one push whose omission would leave the trail describing a remote state that was subsequently undone. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"No test projects found, skipping tests." is a deliberate skip, which the MessageLevel.Notice criterion covers, and nothing else records it: at the new default, `bv test` on a solution with no test project was indistinguishable from one whose tests all passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Running a repository-owned hook is a fact worth keeping: it can change files, and outside `bv release` - whose caller reports the file count separately - nothing else records that it happened. The absent-hook branch stays at info. Its cost grows with the number of hooks a command raises events for, and a repository with no hooks at all would pay a notice per event to be told about files it never had, which is the reverse of what the level is for. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A whole JSON document on one line is fine-grained diagnostic chatter, not a detail to follow a release by: it belongs one rung further down. The same document is written to the hook's args file and left there after the run, so nothing is lost by asking for `--verbosity diagnostic` to see it inline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The entry claimed that at the default verbosity the report is all there is. It no longer is: the version line reporting height and publicity is now a notice, so `bv version show` writes it to standard error at the default too. What the command actually guarantees, and what the entry should have said in the first place, is that the report is alone on standard output - which is the property anyone piping it cares about, and one no verbosity setting can take away. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
MinimumVerbosity threw with nameof(@this), and nameof strips the @: the exception carried ParamName "this", a name no caller of the method can see. It also contradicted IsEnabled, which documents the exception as being about its `level` parameter, and it silently renamed what TextWriterReporter.Report used to throw - reporting an unknown level was StyleFor's job before IsEnabled began consulting MinimumVerbosity, and StyleFor named it "level". The throw moves into a static local function whose parameter is actually called `level`, so nameof keeps doing the work and nothing has to be kept in sync by hand. Both tests that exercise the unknown-level path asserted the exception type alone, which is why the change went unnoticed; they now assert ParamName too. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three notice call sites in ReleaseCommand were already past 140 characters before this branch, and promoting them from Info to Notice pushed them two characters further. Modified lines comply, so they are wrapped here; the lines this branch never touched are dealt with separately. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The leftover wraps, kept out of the previous commit so that the change under review stays readable: five lines that were already past 140 characters and that this branch never touched, plus the primary constructor, which a declaration's stricter 120-character limit catches. Two of the five are the arguments of calls that take more than one, so they cannot simply span two lines (SA1118). The long error message is hoisted into a local constant, which is also where a reader looking for the text will now find it; the two warnings wrap around string.Create, like every other formatted message in the file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Finding 1 was the real one, and it would have shipped. Six commits, one per addressed finding. 1. The release log records the no-op but not the act — fixed, one level upThe outcome lines go in the server-independent layer rather than in the GitHub adapter: The force-push branch is reported too: it runs during rollback, so it is the one push whose omission would leave the trail describing a remote state that was subsequently undone.
2. "Deliberately skipped" one level down — two of three
3.
|
|
Claude finished @rdeago's task in 4m 50s —— View job Re-review: PR #347 — the six follow-up commitsWalked all eight commits since
Verified1 — fixed, and one layer better than I proposed. 2 — the strongest one taken, the other two declined on grounds I buy. 3 — fixed, and rephrased around the right invariant. 4 — fixed. The static local function keeps 5 — fixed. No line over 140 remains in 6 — your call, and the reasoning holds: errors survive
New: the act survives at minimal, the undoing of it does notThis is a consequence of commit The cheap half. The design half. The rollback's own acts are invisible at minimal, except the one you promoted:
Your argument for the force-push is that it "would leave the trail describing a remote state that was subsequently undone". That argument covers the release deletion and the commit reset verbatim: both change state that an earlier notice claimed. As it stands, a rolled-back release reads, at the default: Three notices describing a state that no longer exists, and a force-push that at minimal is indistinguishable from an ordinary one — its "Force pushing changes to..." narration is Judgment call whether it is worth it — it only bites on the failure path, which is also the only time anyone reads the log closely. The first half I'd just take; the second is yours to weigh. Nits
Nothing here blocks. Finding 1's cheap half is a two-line move; the rest is discretionary. |
PublishAsync printed its notice as soon as DoPublishAsync returned, then registered the rollback that undoes the publication and awaited OnPublishedAsync. That last step can still fail - it writes the Actions step output, so an unset GITHUB_OUTPUT or an I/O error is enough - and its failure leaves _published false, so DisposeAsync rolls the release back and deletes the very release and tag the log had just claimed. The notice moves to the end of the method, past the point where the rollback actions are cleared. Nothing changes on the ordinary path: the steps it now follows print nothing of their own. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The argument that promoted the rollback's force push covers the rest of the rollback verbatim: each of its steps undoes state that an earlier notice claimed. Without them, a release that fails and rolls back reads, at the default verbosity, as a pushed branch and a published release followed by an error and a force push, with nothing to say that the release and its tag were deleted and the commits reset. Deleting the release and deleting the tag get one notice each, right after the act, as the pushes do; the paths that find no tag to delete stay at info level, having changed nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"Hook release/post-release: ran .buildvana/hooks/release/post-release.cs." says the context and the event twice: the path is built from them, so it carries no information the hook name does not. Harmless while the line was narration; the line is a notice now, and appears in everyone's default output. Both the announcement and the outcome shed the path and read as the plain narration/outcome pair the pushes use. The line reporting an absent hook keeps its path: there, the path is the file one would create. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The Actions step output is written after the release has been published, and SetActionsStepOutput read GITHUB_OUTPUT right there, failing the release if the variable was unset. That is the worst possible moment to discover it: the publication has succeeded, so the failure rolls it back, deleting a release and a tag that were correct. GitHubServerRelease now requires the variable in its factory method, before the draft release is created - nothing exists to be undone yet, and the message names the variable exactly as it would have before - and remembers the path for the whole life of the release. SetActionsStepOutput takes the path from its caller and is left with only the Actions-specific part: the name=value line. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The leftover wraps for the two files this round works in, kept apart from the changes under review as the style guide asks. Seven lines, none of them touched by this branch: four internal-error messages, a two-argument guard, a property initializer, and a call to the release-notes endpoint. The four messages are the sole argument of their call, so they simply move to the following line; the rest take the one-per-line treatment. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Both halves of the new finding taken, both nits taken, plus one change of @rdeago's that the first half made obvious. Five commits. The publication is announced before it becomes irreversible — fixedRight, and it would have shipped: The rollback's own acts are invisible at minimal — fixedAgreed: the argument for the force push covers the release deletion and the commit reset verbatim. Wording of the reset line is The third sub-item is declined. The rollback's force push does not need renaming: at minimal it already reads Nits
Additional change:
|
|
Claude finished @rdeago's task in 5m 38s —— View job Re-review: PR #347 — the five new commitsWalked
Verified
The
|
The variable's read moved from after publication to before anything exists, which changes released behavior: an unset variable used to fail - and therefore roll back - a release that had already been published correctly, and the failure message changed with the move. The entry joins the other "bv release no longer publishes the wrong thing" siblings under Bugs fixed in this release. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The rollback walks back the release commit and any post-release commits on top of it, so a notice inside UndoLastCommit printed the same line as many times as there were commits: accurate, but read as a duplicate rather than as two undos. The record moves to the loop that owns the act - only the caller knows what the set of commits was - and names them the way the rest of the release log does. UndoLastCommit keeps its narration and gains a remark saying why it no longer reports an outcome. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"Deleted the previously created release." named nothing, while its counterpart reads "Published release X with N assets."; and in the rollback that runs before publication the reader has never been told a release existed, the draft's creation being narration. The tag name comes from the caller, not from the release object: the draft is created before the release commit exists, and that commit always moves the version, so the tag name the draft carries is never the one the release ends up published under. A draft has no tag at all, so it is reported as the draft it is rather than named after a version that never existed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The changelog entry and both nits taken; the observation left as a recorded decision. Three commits. The
|
|
Claude finished @rdeago's task in 3m 55s —— View job Re-review: PR #347 — the three new commitsWalked
Verified
Grammar covers all three cases: 0 →
The two notices land right after their own acts ( Rollback ordering still holds after all this. The stack is constructor-delete-draft → undo-commits → undo-publish, popped in reverse, and which is the complete undoing, in order, with no line claiming a state that outlives it. NitThe changelog's "where a failure costs nothing" is a shade stronger than what you decided. Note, pre-existing and narrow — no action proposedIf Nothing blocks; the nit is a clause. From my side this reads ready to merge. |
"where a failure costs nothing" claims more than the fix delivers: the
variable is required where the release is created, which is after the
verification pass, so an unset variable still costs a clean, a build, and a
test run. What it no longer costs is an undoing: nothing has been created or
changed at that point, which is the whole of the fix and is what the entry
now says.
docs/EnvironmentVariables.md already puts it that way ("before creating
anything") and needs no change.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The nit taken, the note recorded. One commit.
|
TransferAllPublicApisToShipped yields both files of every pair it modifies - the unshipped file is emptied into the shipped one, and the release commit carries both - so the count is always even, and "1 public API file was modified." could never be printed. The switch is now an expression over the two cases that exist, with a comment saying why there is no singular. Found while reading what the coverage report says this branch never reaches. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The lines that count something - the version spec, the public API files, the hook's changes, the self-reference rewrites - are how a release is read, and every case but the plural one went untested. The branches sit in the middle of a command that only runs end to end, so nothing short of one repository shape per case reaches them, and a wording that reads wrong for a count of one would have gone out unnoticed. The harness grows the one knob that was missing for it: how many of the three self-reference targets the repository contains, so that the update can find none of them, one, or all three. Its new Notices view is what the tests assert on - the messages of the level a default run shows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ServerRelease is a contract for every server adapter, and the release command walks one path through it: it never calls a method out of order, it always has a commit to push, and it adds at most one post-release commit. So the guards that keep a release rollbackable, and the lines that count what was undone or published, are asserted by driving the class directly over the harness's repository rather than through its one caller. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The gate's ReSharper pass flags every capture of the harness in the hook callback, and a "disable once" covers one of them: a two-statement lambda needs a suppression per statement, or a disable/restore pair that then trips StyleCop's rule against a comment followed by a blank line. What the hook writes moves into a method taking the harness as a parameter, leaving the callback the single-expression shape the other hook tests already use. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Codecov's patch check, not a review finding. Four commits, and one of them touches production code — flagging that here, since it lands after the ready-to-merge verdict. What the red number was made of
The public API count could never say "one" (77e9318)
The counted lines are tested (888654e, c91601c, ae10864)What was genuinely untested is one thing throughout: every counted line except its plural case. The command's cases go through Measured on the Release build the gate produces: The Octokit files are left alone
|
Checklist of related issues / discussions
Proposed changes
Two problems, independently real, coupled tightly enough that fixing either alone makes things worse.
bv's default verbosity did not matchdotnet's.bvdefaulted tonormal; the pipeline commands it wraps default tominimal, andbvforwards its own verbosity to them verbatim — so plainbv buildproduced a markedly noisier MSBuild log than plaindotnet build. Where the toolchain we belong to has already settled a question of behavior, we settle it the same way.The
MessageLevelladder was missing a rung. There was no level meaning significant, but not a warning, and visible at minimal verbosity — the thing MSBuild has always had asMessageImportance.Highand syslog callsNotice. Its absence was visible in the tree:TaskLoggingHelperReporterhad nothing to put in MSBuild'sHighslot, so it shifted the whole ladder down a notch and mappedInfothere, whileConsoleReporterhidInfoat minimal. Two implementations of one contract disagreed about when the same call is visible.They are coupled because
bv releaserecords what it did to the repository through some twentyInfocalls, and on CI that log is the audit trail: flipping the default without a level that survives it would silence exactly the output that most needs to survive.Four commits:
MessageLevel.Noticegoes betweenWarningandInfo. Six levels no longer fit five thresholds injectively, soIsEnabledcan no longer compare the enums' underlying values; the newMessageLevelExtensions.MinimumVerbosity()states the mapping and is now the single authority both reporters answer to.TaskLoggingHelperReporter's outbound map shifts by one rung and itsVerbositygetter with it. Both enums' docs lose the one-to-one claim they can no longer make, and theNotice-versus-Infocriterion goes on the enum member itself, where the next call-site author will meet it.Notice; messages narrating what the tool is doing right now stayInfo.defaultVerbosityplumbing, whose only carve-out disappears withminimalas the base.At the default verbosity,
bv build/restore/test/packnow produce output comparable to thedotnetcommand underneath,bv releasestill prints its complete record, and a givenMessageLevelbecomes visible at the same point whetherbv's console or an MSBuild task renders it.bv build -v normalreproduces the old default output.Two judgment calls in
TaskLoggingHelperReporterare documented in its remarks rather than left to be rediscovered: theVerbositygetter over-claims at both ends of the ladder on purpose (an honestDetailedwould make the formatting overloads dropTraceunder-v:diag; an honestQuietwould make them drop warnings MSBuild still prints), andDetailandTraceshareMessageImportance.Lowbecause MSBuild's ladder has three rungs and ends there —EngineServicesexposes no verbosity to read, by design, so detailed and diagnostic are indistinguishable from inside a task.Additional changes
Beyond what the issue laid out:
Noticethan the issue enumerates:VersioningService's "Version X (height N, publicity)" line,ServerRelease's "Repository unchanged, no commit to push.",ReleaseCommand's committer-identity and empty-changelog-substitution lines,DotNetService's "No test projects found, skipping tests." — which nothing else recorded, leavingbv teston a solution with no test project indistinguishable from one whose tests all passed — and all three ofbv version advance's outcome lines rather than the one the issue names, the command having no deliverable stream of its own to carry the rest. Each records a fact, which is where the criterion puts it.VersioningService's is also collateral of the remap: it is Core code that runs inside SDK tasks too, whereInfoused to meanMessageImportance.High, so leaving it would have removed it from every plaindotnet build. Side effect worth knowing:bv version shownow emits that one line on standard error alongside its report, which is untouched and still pipes clean.bv releasegains the outcome lines it never had. The reclassification could only promote messages that already existed, and neither the push, nor the publication, nor the rollback had one: at the new default, a successful release announced everything it had prepared and nothing it had published.GitService.Pushnow records the branch and the remote,ServerRelease.PublishAsyncthe published tag and its asset count, and each rollback step what it undoes — all in the server-independent layer, so a future adapter inherits the record instead of reinventing it. The publication line comes last, past the point where the rollback actions are cleared, so it cannot claim a release that a later failure would delete.HookRunnerstates that a hook ran, which nothing recorded. The absent-hook message stays atInfo: its cost scales with the number of hook events a command raises, and a repository with no hooks at all would pay a notice per event to be told about files it never had.DetailtoTrace. A whole JSON document on one line is diagnostic chatter, and the same document is written to the hook's args file and left there after the run.GITHUB_OUTPUTis read before the release exists. The Actions step output is written after publication, and reading the variable there let one that was never set fail — and therefore roll back — a release that had otherwise succeeded.GitHubServerReleasenow requires it in its factory method, before the draft release is created, and remembers the path for the life of the release;SetActionsStepOutputtakes the path from its caller and keeps only the Actions-specific part.docs/EnvironmentVariables.mdstates the new guarantee, and the changelog carries the entry: this changes released behavior.TransferAllPublicApisToShippedyields both files of every pair it modifies, so the count is always even and1 public API file was modified.could never be printed. The switch is now an expression over the two cases that exist.TaskLoggingHelperReporter.Verbositycollapses from three branches to two. The issue's inverse table has four rows, but its bottom two both yieldMinimal, which makes theHighprobe dead code. Same semantics.CHANGELOG.mdentries are corrected in place rather than left to contradict the new ones in the same release:bv version show's own minimal default, and the resolved--verbosityforwarded todotnet.ReporterExtensions' whole shortcut-and-formatting family was uncovered before theNoticeoverload joined it,Report's null check and skip-formatting short-circuit included. So was every counted line a release prints except its plural case, inReleaseCommandand inServerRelease, along with the guards that keep a release rollbackable — its one caller never calls a method out of order, always has a commit to push, and adds at most one post-release commit. The command's cases go throughReleaseHarness, which grows the one knob they needed: how many of the three self-reference targets the repository has.ReleaseCommand,ServerRelease, andGitHubServerAdapter, plusReleaseCommand's primary constructor under the stricter 120-character limit on declarations. Each such sweep is its own commit, so the change under review stays readable.MessageLevelExtensionsthrows a plainArgumentOutOfRangeExceptioninstead of usingCommunityToolkit.Diagnostics'ThrowHelper:Buildvana.Core.Abstractionshas no package references at all, and a throw helper is not reason enough to add one.Nothing is done about
GitHubServerAdapterandGitHubServerRelease, whose Octokit calls account for most of what Codecov's patch check still misses: neither file has ever been covered onmaineither.[ExcludeFromCodeCoverage]on the methods that do nothing but make those calls is defensible — that is behavior the environment owns — but it moves the badge, and it is a policy decision of its own rather than something to settle at this PR's tail.Types of changes
This pull request introduces the following types of changes:
docsdirectory) update.gitattributes,.gitignore)Breaking changes
This pull request introduces breaking changes:
Every command's default output changes. CI logs get quieter; anyone who wants today's behavior passes
-v normal. No migration is required and nothing fails, but the change is user-visible and gets a**BREAKING CHANGE**:entry under Changes to existing features.Checklist
docsdirectory) only: