docs(469): sweep remaining stale format-job cost/memory claims (review)
Build ErsatzTV Image / CI image pin matches docker/ci (pull_request) Successful in 8s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 9s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 23s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 20s
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 5m49s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 18m28s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 18m33s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 5s
Build ErsatzTV Image / CI image pin matches docker/ci (pull_request) Successful in 8s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 9s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 23s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 20s
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 5m49s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 18m28s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 18m33s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 5s
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) <noreply@anthropic.com>
This commit is contained in:
+9
-5
@@ -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 <files>` (the full `dotnet format ErsatzTV.sln --include
|
||||
<files>` is a superset and also works).
|
||||
|
||||
+3
-2
@@ -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 <files>`. The full
|
||||
|
||||
Reference in New Issue
Block a user