From 33657b4753ab29a18793d4e0ec206c2ac5b94f40 Mon Sep 17 00:00:00 2001 From: Timothy Date: Sun, 19 Jul 2026 19:34:43 +0200 Subject: [PATCH] docs(469): sweep remaining stale `format`-job cost/memory claims (review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cold adversarial review (MERGEABLE) flagged two spots still describing the pre-#469 heavy `format` job as current, plus a wording imprecision: - ci-cd.md CI-lane table row: annotate `format` runtime 37s → ~0.5s (#469). - ci-cd.md #406 memory narrative: note the 3.95 GiB Roslyn heap is now moot (folder mode loads no workspace); api-docs remains the lane's real consumer. - Precise the coverage mechanism in ci-cd.md + decisions.md: the naming rule passes the full gate because naming violations have no `dotnet format` batch code-fixer (so `--verify-no-changes` sees no change), not merely a severity floor. Docs-only; no workflow/hook logic change from the reviewed commit. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/ci-cd.md | 14 +++++++++----- docs/decisions.md | 5 +++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/ci-cd.md b/docs/ci-cd.md index 85cf039b5..6064e9af5 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -103,7 +103,7 @@ saturated and the `small` lane idle — **queue wait exceeded every job's runtim | `migrations` | 639s | 1428s | ubuntu-latest | | `functional-e2e` | 520s | 1447s | ubuntu-latest | | `api-docs` | 5s | **1722s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | -| `format` | 37s | **1731s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | +| `format` | 37s → **~0.5s** (#469) | **1731s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | | `docs-reminder` / `decisions-guard` | 10s | **5s** | small | `api-docs` and `format` moved to `small` because the queue wait dwarfed their runtime. Both lanes @@ -116,10 +116,13 @@ API-touching PR `api-docs` does a full `dotnet build`, so it is not always small be the deciding factor, and "capacity 4 absorbs that" held only because **nothing enforces the sum** of the lanes' per-job caps. Each job container is correctly capped (`--memory=10g`), but 6 slots × 10 GiB = **60 GiB on a 25 GiB host** that also runs prod media; on 2026-07-17 bumblebee hit load -340 with 21 GiB swapped. These are not small jobs — a live `docker stats` caught the `format` job +340 with 21 GiB swapped. These were not small jobs — a live `docker stats` caught the `format` job container at **3.95 GiB**, which the re-sized 2 GiB `small` lane would OOM-kill outright. #604 fixes the queue at the source instead (`ubuntu-latest` grown to 5 slots: a 48 GiB ci-runner at capacity 4 plus a bumblebee overflow slot), so the `small` lane can be reserved for genuinely-tiny shell jobs. +(The `format` half of this is now **moot**: **ersatztv#469** moved it to `dotnet format whitespace . +--folder`, which loads no Roslyn workspace — the job's 3.95 GiB heap and multi-minute runtime are +gone, so it is no longer a reason to keep the lane large. `api-docs` on an API-touching PR still is.) Queue wait is still a dominant cost and capacity is server-management's boundary — tracked in **server-management#604**. The redundant triple-build behind those runtimes is **ersatztv#398**. @@ -695,9 +698,10 @@ reads `.editorconfig`. Verified **non-vacuous**: it exits non-zero on an injecte line (`error WHITESPACE`) and on a prepended UTF-8 BOM (`error CHARSET`), and exits 0 on a clean file. **No coverage was lost**: the full `dotnet format` gate did **not** enforce the style/analyzer pass either — a probe injecting a `warning`-severity naming violation (`local_constants` not `ALL_UPPER`) -passed the *full* solution format (exit 0), because the only `.editorconfig` rule above -`:suggestion`/`:none` severity is that one naming rule and `dotnet format`'s default severity ignores -it. The analyzers that **must** block (`NU1904`, `S3981`) are enforced at *compile time* via +passed the *full* solution format (exit 0): the only `.editorconfig` rule above `:suggestion`/`:none` +severity is that one naming rule, and naming violations have no `dotnet format` batch code-fixer, so +`--verify-no-changes` reports no change regardless of severity. The analyzers that **must** block +(`NU1904`, `S3981`) are enforced at *compile time* via `WarningsAsErrors` in `Directory.Build.props`, not by this job. Devs fix a violation with `dotnet format whitespace . --folder --include ` (the full `dotnet format ErsatzTV.sln --include ` is a superset and also works). diff --git a/docs/decisions.md b/docs/decisions.md index 46cfb9089..0347c8a40 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -2034,8 +2034,9 @@ The blocking `format` CI job (and the matching Husky pre-commit hook) verify cha trailing-whitespace line and `error CHARSET` on a prepended BOM; exits 0 on a clean file. What it drops is the style/analyzer pass — but the *full* gate never enforced that either: a probe injecting a `warning`-severity naming violation (`local_constants` not `ALL_UPPER`) **passed** the full solution - format (exit 0), because the only `.editorconfig` rule above `:suggestion`/`:none` severity is that one - naming rule and `dotnet format`'s default severity ignores it. The analyzers that must block (`NU1904`, + format (exit 0): the only `.editorconfig` rule above `:suggestion`/`:none` severity is that one naming + rule, and naming violations have no `dotnet format` batch code-fixer, so `--verify-no-changes` reports + no change regardless of severity. The analyzers that must block (`NU1904`, `S3981`) are enforced at compile time via `WarningsAsErrors` in `Directory.Build.props`, never by this job. - **Fix command for a violation:** `dotnet format whitespace . --folder --include `. The full