Repository navigation
Description
The problem
clients/web/eslint.config.js ignores dist, storybook-static and coverage — but not build:
globalIgnores(["dist", "storybook-static", "coverage"]),clients/web/build/ is the tsup runner bundle (the prod Node web server, ~1.2 MB of generated JS including a vendored undici). Because it isn't ignored, npm run lint in clients/web lints generated third-party code, and the only lint output the web client produces today comes from inside that bundle:
clients/web/build/undici-HXPKCIY3.js
16021:11 warning Unused eslint-disable directive (no problems were reported from 'no-fallthrough')
✖ 1 problem (0 errors, 1 warning)
That directive is undici's own, in undici's own source. There is nothing to fix in this repo, and nothing anyone can act on.
Why web is the odd one out
The other three clients already ignore their build output. Web is the only client that emits both dist (the Vite SPA) and build (the tsup runner), and it looks like only the first was carried into the ignore list:
| Client | globalIgnores |
Emits build/? |
|---|---|---|
clients/web |
dist, storybook-static, coverage |
yes — not ignored |
clients/cli |
build, coverage |
yes — ignored |
clients/tui |
build, coverage |
yes — ignored |
clients/launcher |
build, coverage |
yes — ignored |
The root config is consistent with the three: it already ignores core/**/build/**, core/**/dist/** and test-servers/build/**.
Why it's worth fixing rather than tolerating
It's a warning today, so validate still passes — but:
- It trains people to ignore lint output. The web client's lint is never clean, and the one line it prints is noise. A real warning added later lands in a channel everyone has learned to skim past.
- A rule promotion turns generated code into a gate failure.
reportUnusedDisableDirectivesis a warning by default; anything that raises it — or any new rule that a bundled dependency happens to trip — failsvalidateon a file nobody wrote. Enable @typescript-eslint/no-floating-promises so an unhandled rejection can't fail the gate again #1959 (enablingno-floating-promisesacross all five scopes) is exactly the kind of change that walks into this. - It's wasted work. Every
npm run lintparses ~1.2 MB of bundled output, on a path that is gitignored and rebuilt on everynpm run build. - Nothing guards it.
verify:format-coverageandverify:typecheck-coverageassert that first-party source is covered; there is no guard asserting that generated output is excluded, so this drifted silently and would again.
The fix
Add build to the web client's ignore list, matching its three siblings:
- globalIgnores(["dist", "storybook-static", "coverage"]),
+ globalIgnores(["build", "dist", "storybook-static", "coverage"]),Verified locally: with that one line, npx eslint . in clients/web prints nothing and exits 0; without it, it prints the undici warning above.
While in there, it's worth a quick check of whether the same omission exists anywhere else a bundler writes into a linted scope.
Acceptance
cd clients/web && npm run lintproduces no output and exits 0 on a tree that has been built.npm run validatefrom the root stays green.- No file under any
clients/*/buildorclients/*/distis reported by ESLint from any scope.
Notes
Found while smoke-testing the v2.3.0 milestone. Pre-existing — not a regression introduced by anything in this milestone.
Activity
cliffhall commentedon Aug 17, 2026
Triage: Priority Medium (total 6)
Board: #28, Status
Todo, milestonev2.3.0.chore: ignore the web client's tsup build output in ESLint