test(gates): the register test reads every config block, option and key, not eight samples and severities
E32 review round 1 (T1–T5, s1). The test that holds docs/gates.md to the effective configuration could itself be passed by a narrowing it did not look at: - ESLint: besides each scope's sample, every config block is read on its own. A block that targets files no sample reaches fails as an "unsampled block"; a no-restricted-* list re-declared without an entry src has, an option that lets something through (allow…/ignore…/except…), a block-level `ignores` and EVERY global ignores object (not only the first) count. A scope switching a src rule at warn off now counts too (it skipped them). Two live narrowings surfaced and are registered: no-floating-promises' allowForKnownSafeCalls (src and e2e) and the three network owners' no-restricted-globals. - TypeScript: a strict sub-flag set false beside `strict: true`, an extends/exclude/files, a changed include, and a frontend-root config file no project checks. eslint.config.js is that file: listed, with the 43 errors strict checkJs reports in it (measured, none a defect). - Ruff, basedpyright, pytest and knip are read as key whitelists (an unknown key fails until someone decides whether it narrows); pyright's information/hint count as weak; ruff's extend-select is pinned; pytest's three keys are pinned exactly; knip's script must run both modes. Each new check was probed with a planted narrowing (an unsampled block, a block ignores, a second global ignores, a warn rule off in a scope, strictNullChecks false, a ruff extend-exclude, a pytest -m) and failed on it.
This commit is contained in:
+15
-2
@@ -14,7 +14,11 @@ name its invariant. Whatever is left narrowed is listed here, and
|
||||
not an oversight; a narrowing missing from here is a test failure.
|
||||
|
||||
How the test matches: each narrowing must appear in a table row below as its `code-quoted` id, in a
|
||||
row whose **Scope** cell names the scope exactly as the test reports it.
|
||||
row whose **Scope** cell names the scope exactly as the test reports it. For ESLint it reads each
|
||||
scope's effective config through a sample file AND every config block on its own: a block that
|
||||
targets files no sample reaches fails as an `unsampled block` (add a sample), a rule a block or src
|
||||
sets weaker than src counts, so does a `no-restricted-*` list that leaves out an entry src has, and
|
||||
so does an option that lets something through (`allow…`, `ignore…`, `except…`) (E32 review).
|
||||
|
||||
## ESLint (frontend)
|
||||
|
||||
@@ -34,6 +38,11 @@ them itself (`no-undef`, `no-redeclare`, `no-dupe-keys`, …), nor the formattin
|
||||
| src | `react-hooks/unsupported-syntax` — warn | Preset level; fails under `--max-warnings 0`. | 0 |
|
||||
| src | `react-refresh/only-export-components` — warn | Fails under `--max-warnings 0`; `allowConstantExport` lets a module export constants beside its component. | 0 |
|
||||
| src | `@typescript-eslint/no-unused-expressions` — narrowed | `allowShortCircuit` + `allowTernary`: `cond && f()` / `a ? f() : g()` side-effect statements are an idiom here. | — |
|
||||
| src | `@typescript-eslint/no-floating-promises` — narrowed | `allowForKnownSafeCalls`: React Query's `invalidateQueries`, `refetchQueries`, `cancelQueries`, `resetQueries`, `prefetchQuery`, `prefetchInfiniteQuery` never reject unless asked to (`throwOnError`), so a bare call is safe by name. | 6 names |
|
||||
| e2e | `@typescript-eslint/no-floating-promises` — narrowed | The same `allowForKnownSafeCalls` list (the typed rules are one object for both scopes). | 6 names |
|
||||
| lib/http.ts | `no-restricted-globals` — narrowed | A network owner (`NETWORK_OWNERS` in eslint.config.js): the one module that may call `fetch` (`send`, which `req` and the public pages go through). Every other network global stays restricted there. | 1 global |
|
||||
| lib/api/core.ts | `no-restricted-globals` — narrowed | A network owner: `uploadReq` is the one `XMLHttpRequest` (upload progress). | 1 global |
|
||||
| lib/messagesSocket.ts | `no-restricted-globals` — narrowed | A network owner: the chat socket is the one `WebSocket`. | 1 global |
|
||||
| src tests | `no-restricted-globals`, `no-restricted-properties` — off | A test stands a double in for the network (`vi.stubGlobal("fetch", …)`) and may reach it directly. | — |
|
||||
| src tests | `local/literal-a11y-text`, `local/button-primitive`, `local/input-primitive`, `local/surface-role`, `local/glyph-link` — off | A test renders throwaway markup (a raw button as a focus target, an untranslated label) that is not product UI. | — |
|
||||
| FocusSafeButton.tsx | `local/focus-safe-disabled` — off | It IS the focus-safe primitive the rule points everyone else to. | — |
|
||||
@@ -51,10 +60,14 @@ none real in the sample; the curated typed pair `no-floating-promises` + `no-dep
|
||||
|
||||
| Scope | Narrowed | Why | Measured |
|
||||
| --- | --- | --- | --- |
|
||||
| config files | `eslint.config.js — not type-checked` | Linted (the `js configs` row) and executed by every lint run, but in no tsc project. Under the node project's `strict` + `checkJs` it reports 43 errors: 42 implicit-`any` parameters in the local rules' visitors (JSX nodes, which ESLint's own `Rule` typings do not model) and one inferred `string` severity. None is a defect; typing them means moving the local rules onto typescript-eslint's `TSESTree` types — a refactor of its own, not done in E32. | 43 (E32 review) |
|
||||
| all three projects | `skipLibCheck` | The `.d.ts` of installed packages are not type-checked (ours are). Standard for an app: a package's own types are its maintainers' gate, and checking them costs minutes and reports errors we cannot fix. | — |
|
||||
|
||||
Every project has `strict`, `noUncheckedIndexedAccess`, `noUnusedLocals`, `noUnusedParameters` and
|
||||
`noFallthroughCasesInSwitch` on; the test fails if one goes off.
|
||||
`noFallthroughCasesInSwitch` on; the test fails if one goes off, if a `strict` sub-flag
|
||||
(`strictNullChecks`, `noImplicitAny`, …) is set false beside it, if a project gains an `extends`,
|
||||
`exclude` or `files`, or if its `include` changes — and a config file at the frontend root that no
|
||||
project checks needs a row.
|
||||
|
||||
## Ruff (backend + scripts)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user