Commit Graph
7 Commits
Author SHA1 Message Date
timothyandtimothy 736649b3b7 fix(812): classify the narrative sites by who-benefits; keep the detector's reach (#882)
Build ErsatzTV Image / CI toolchain image resolves (push) Successful in 7s
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 22s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 9m18s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m33s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Skipped
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m52s
Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-29 20:28:14 +00:00
timothyandtimothy b16ec15d6c docs(781,799): re-measure the tooling audit from a derived population, and adopt serena (#862)
Build ErsatzTV Image / CI toolchain image resolves (push) Successful in 9s
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 23s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 8m36s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m11s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m10s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m13s
§5.3's verdicts rested on a single surface, which manufactured four false zeros: codex is driven
through `codex exec` inside Bash, security-guidance and ralph-loop expose no tool at all and run as
hooks (1,086 executions each), and feature-dev is used through its agents. The audit also compared
current enablement against historical usage — six of the eight plugins it called "genuinely unused"
were disabled for 16 of the 30 corpus days.

The retirement half of #781 is answered *no* on evidence: the zeros split six ways and only one is
grounds for removal. Eight plugins are kept by operator decision.

#799's observation was correct and its cause is now established. serena was `false` in settings.json
until 2026-08-14T12:31Z, when a concurrent session enabled it; its tools appear in no transcript
before 12:42:54Z. #799's session started at 12:01Z and never reloaded, so its probe correctly found
nothing while the settings file already said `true`. serena is adopted and documented as the third
code-intelligence surface.

Four review rounds, two independent cold reviewers (one cross-family); rounds 1-3 BLOCKED.

fixes #781
fixes #799

Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-28 14:37:34 +00:00
timothyandtimothy d4c72697f2 feat(780): commit a ruff config and enforce it in CI (#813)
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 28s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 8m29s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 5m54s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 5m59s
Build ErsatzTV Image / Build & push image (amd64) (push) Failing after 15s
Python lint here was a property of the operator's laptop: the global instructions
say to run ruff, no workflow ran it, and with no committed config ruff fell back
to whichever ~/.config/ruff/ruff.toml the machine happened to have.

- ruff.toml at the root, pinned ruff==0.12.11 in the script-tests job.
- Both lint steps pass an EXPLICIT population from `git ls-files` with
  `--no-force-exclude`, never `ruff check .` — an `exclude` empties a
  discovery-based run into a GREEN one (top level empties both commands, [lint]
  empties check, [format] empties format --check), and `ruff check .` over zero
  files exits 0 with only a stderr warning. Guarded by an empty-population arm.
- Tree clean: 74 findings at 706674272, 57 fixed in code, 17 per-site noqa with
  reasons inline. S105 deliberately per-site, not a directory blanket. RUF100
  selected so a suppression that suppresses nothing is itself a finding.
- pyright stays ungated; reasoning in the record.

Both steps witnessed red on the runner against the shipped bodies: run 2173 job
9176 (ruff check) and run 2170 job 9163 (ruff format --check).

Docs: new record ci.python-lint-ruff-config-committed, ci.script-tests-job
cross-ref, docs/ci-cd.md (also correcting a stale ~190-tests/~10s figure to the
measured 773 tests / ~4.5 min), docs/defect-shapes-773.md §5.2 resolved.

fixes #780

Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-22 00:33:18 +00:00
107716fa4f docs(781): re-measure §5.3 from a derived population — the zeros split four ways (#800)
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 26s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 9m21s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m49s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m24s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m42s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
The §5.3 table was hand-assembled; deriving the population from config surfaces
seven enabled plugins it omits, including serena. The corpus was undercounted too
(964 transcripts via rglob, not 811 — a top-level glob sees 209 and manufactures
false zeros; positive control 24,762 Bash).

Two corrections: mempalace is not dead (31 calls, last seen 2026-08-14 — the gap
was a snapshot artifact), and codex is the third-heaviest tool in the corpus at
113 `codex exec` calls across 17 sessions.

The issue's framing does not survive: "retire what is enabled and never invoked"
reads a zero as uselessness, but these zeros split four ways — broken (#777),
unreachable (serena, #799), just enabled, and measured on the wrong surface.
Establishing WHY a counter is zero is a precondition for acting on it.

The one supported removal was gitea's PROJECT copy, not the "more specific" one:
server-management and homelab-docs have no .mcp.json and depend on user scope.

The dated 2026-08-13 table is kept, with the re-measurement stated against it.

refs #781

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-16 08:02:15 +00:00
timothyandtimothy 499dd348ab feat(776): every hook reports that it fired, and the report is measured (#795)
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 25s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 9m14s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m37s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m16s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m19s
Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-14 19:11:05 +00:00
4bead26326 fix(777): repair both broken LSPs, and name the surface a subagent can actually reach (#793)
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 26s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 9m34s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m35s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m22s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 5m12s
Both C#/TS language servers and the csharp-lsp MCP server were dead; all three are
fixed and each demonstrated with a real find-all-references call in this repo.

Root causes were one shape — a config naming a path this machine does not have,
with nothing checking. None returned a wrong answer; each refused to start:
- csharp-ls: MSBuildLocator needs a dotnet root owning host/fxr; Homebrew's bin
  has none, libexec does.
- typescript-language-server: the LSP workspace root is the repo root but
  `typescript` lives in web/node_modules, and the plugin cannot pass a tsserver
  path (v5 dropped --tsserver-path; lspServers cannot set initializationOptions).
- the csharp-lsp MCP server: .mcp.json named a dotnet install that no longer
  existed, while ~/.codex/config.toml's copy of the same server had been migrated.
  Both files are gitignored, so nothing could compare them.

Corrects defect-shapes-773.md §5.1: the "workflow agents must use csharp-lsp" note
names the MCP server's tools, which subagents DO reach — it was dead because the
server could not start, not because agents cannot call it. The LSP tool is the one
no subagent has been observed to resolve.

Six cold review rounds. Five false greens were found in this PR's own verification
code, each introduced by the fix for the previous one — extracted as #796.

fixes #777

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-14 15:55:20 +00:00
timothyandtimothy e1937674cd docs(773): root-cause the recurring defect shapes across the full closed-issue corpus (#782)
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 23s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 9m24s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m42s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m23s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m38s
Analysis over all 349 closed issues (95 carry a `## Closing record`), classified by five
independent raters against a written taxonomy that permitted `NEW:<name>`, with two controls: a
blind inter-rater re-rating (12/15 agreement) and a backward-generalization sample over the 254
pre-convention issues.

Findings that change the picture #773 started from:

- The ranking reverses. Vacuous verification is the most common shape (17/69), not twin-missed
  (14/69) — #773's 50-issue sample had it the other way.
- #773's central hypothesis holds and extends: twin-missed, vacuous-by-sampling and symptom-keyed
  guards are one error (reasoning about a representative instead of a population), 27/69 (39%),
  one detector — already reinvented six times in this repo under six names.
- The shapes predate the closing-record convention (#1, #215, #232, #403, #473), so they are not an
  artifact of recent guard-building. That confound was tested and refuted, not assumed away.
- A class the taxonomy missed entirely: check-and-use races over mutable state (#536, #622, #632,
  #706, #707).
- Overclaim drops to 4% as a primary cause — a modifier, not a class. Round-churn likewise: 33 of 69
  records narrate >=3 review rounds, spread across every family, only 2 in the class named after it.

Part 2, measured rather than assumed: csharp-lsp cannot initialize and typescript-lsp cannot resolve
typescript, the LSP tool has 0 calls across 811 transcripts, ruff/pyright are enforced nowhere
despite the global instruction, no hook scripts are dead — but PreToolUse/PostToolUse execution
leaves no durable trace, so we cannot tell whether our own guards fire.

Names the classes where no mechanical detector is plausible rather than inventing weak ones, and
strikes one proposed tool (shellcheck) after testing showed it does not catch the case it was
proposed for.

Provenance, kept here rather than in the document because a reader never saw the earlier drafts: six
cold review rounds, worktree-isolated. Rounds 2-5 each found a real defect in the text written to fix
the round before — two fabricated quotes, a Family A/C double-count, a miscited precedent (#711
argues FOR the enumeration it was cited as rejecting), a false floor-rounding claim, and a
round-count built by pattern-matching that undercounted by half. Every one landed in new prose, never
in the text under review, which is the document's own thesis operating on its author and the reason
the final pass was whole-file rather than delta-scoped.

Spawns #774-#781 and #784, tracked in the "Defect-shape hardening" milestone.

fixes #773

Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be>
2026-08-13 19:16:50 +00:00