Rule Catalog
Curated rule overrides, activation boundaries, rationale, fixtures, and ownership.
Generated rule catalog
This file is generated from
src/ledger.ts. Runpnpm generateafter ledger changes.
The curated v0.1 ledger contains 27 reviewed additions, overrides, and exceptions with repository-owned fixtures. The broad baseline is materialized from the pinned Oxlint categories and snapshot-tested; the single experimental rule remains isolated from every configurable artifact.
| Rule | Defect class | Profile | Activation | AI behavior | Path | Severity | Stability | Rationale | Fixtures | Replaces | Conflicts | Review trigger |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
eslint/no-debugger | debugger statements committed to production code | core | essential | — | native | error | stable | A committed breakpoint changes runtime behavior and can expose internals. | fixtures/rules/core/valid.ts; fixtures/rules/core/invalid.ts | eslint/no-debugger | — | Review if Oxlint changes debugger-statement parsing or defaults. |
eslint/no-dupe-keys | overwritten object literal properties | core | essential | — | native | error | stable | Duplicate keys silently discard an earlier value. | fixtures/rules/core/valid.ts; fixtures/rules/core/invalid.ts | eslint/no-dupe-keys | — | Review if JavaScript changes duplicate-key semantics. |
eslint/no-unsafe-finally | control flow that suppresses try or catch completion | core | essential | — | native | error | stable | Return or throw in finally silently replaces the original result or error. | fixtures/rules/core/valid.ts; fixtures/rules/core/invalid.ts | eslint/no-unsafe-finally | — | Review if Oxlint changes control-flow analysis for finally blocks. |
eslint/valid-typeof | misspelled typeof comparison values | core | essential | options → [{"requireStringLiterals":true}]. AI can consistently emit literal typeof comparisons, eliminating ambiguous variable-based checks without adding a new rule. | native | error | stable | Invalid typeof strings make a branch permanently false. | fixtures/rules/core/valid.ts; fixtures/rules/core/invalid.ts | eslint/valid-typeof | — | Review when JavaScript adds a new typeof result. |
import/no-duplicates | duplicate imports from one module | imports | recommended | — | native | error | stable | One import declaration per module prevents split ownership and noisy diffs. | fixtures/rules/imports/valid.ts; fixtures/rules/imports/invalid.ts | eslint/no-duplicate-imports, eslint-plugin-import/no-duplicates | eslint/no-duplicate-imports | Review when the native rule subsumes type-only import edge cases. |
import/no-self-import | modules importing themselves | imports | strict | — | native | error | stable | Self imports indicate a mistaken path and can create partial initialization. | fixtures/rules/imports/valid.ts; fixtures/rules/imports/invalid.ts | eslint-plugin-import/no-self-import | — | Review if import resolution behavior changes. |
typescript/ban-ts-comment | unexplained TypeScript diagnostic suppression | typescript-syntax | essential | — | native | error | stable | Type suppressions must use an expected-error directive with an explanation. | fixtures/rules/typescript-syntax/valid.ts; fixtures/rules/typescript-syntax/invalid.ts | @typescript-eslint/ban-ts-comment | — | Review when TypeScript introduces new diagnostic directives. |
typescript/no-duplicate-enum-values | ambiguous duplicate enum values | typescript-syntax | essential | — | native | error | stable | Duplicate enum values make reverse mapping and intent ambiguous. | fixtures/rules/typescript-syntax/valid.ts; fixtures/rules/typescript-syntax/invalid.ts | @typescript-eslint/no-duplicate-enum-values | — | Review if TypeScript changes enum runtime emission. |
typescript/no-extra-non-null-assertion | redundant chained non-null assertions | typescript-syntax | recommended | — | native | error | stable | Repeated assertions obscure intent without changing the type. | fixtures/rules/typescript-syntax/valid.ts; fixtures/rules/typescript-syntax/invalid.ts | @typescript-eslint/no-extra-non-null-assertion | — | Review if TypeScript changes non-null assertion syntax. |
typescript/no-floating-promises | unhandled promise rejections | typescript-type-aware | essential | — | native-type-aware | error | version-pinned | Unhandled promises can fail after the caller has reported success. | fixtures/rules/typescript-type-aware/valid.ts; fixtures/rules/typescript-type-aware/invalid.ts | @typescript-eslint/no-floating-promises | — | Review on any Oxlint, oxlint-tsgolint, or TypeScript version change. |
typescript/await-thenable | awaiting values that cannot settle asynchronously | typescript-type-aware | essential | — | native-type-aware | error | version-pinned | Awaiting a non-thenable often reveals a missing call or incorrect API type. | fixtures/rules/typescript-type-aware/valid.ts; fixtures/rules/typescript-type-aware/invalid.ts | @typescript-eslint/await-thenable | — | Review on any Oxlint, oxlint-tsgolint, or TypeScript version change. |
typescript/switch-exhaustiveness-check | non-exhaustive switches over closed unions | typescript-type-aware | strict | — | native-type-aware | error | version-pinned | Exhaustive switches keep behavior aligned when a union gains a member. | fixtures/rules/typescript-type-aware/valid.ts; fixtures/rules/typescript-type-aware/invalid.ts | @typescript-eslint/switch-exhaustiveness-check | — | Review on any Oxlint, oxlint-tsgolint, or TypeScript version change. |
react/jsx-key | unstable identity for rendered list children | react | essential | — | native | error | stable | Missing keys can associate component state with the wrong list item. | fixtures/rules/react/valid.tsx; fixtures/rules/react/invalid.tsx | react/jsx-key, @eslint-react/no-missing-key | — | Review when React changes list reconciliation guidance. |
react/jsx-no-undef | undefined JSX component references | react | essential | — | native | error | stable | An undefined JSX identifier fails at render time. | fixtures/rules/react/valid.tsx; fixtures/rules/react/invalid.tsx | react/jsx-no-undef | — | Review if the JSX runtime changes identifier resolution. |
react/rules-of-hooks | conditional or reordered React hook calls | react | essential | — | native | error | stable | Hook call order must remain stable between renders. | fixtures/rules/react/valid.tsx; fixtures/rules/react/invalid.tsx | react-hooks/rules-of-hooks | — | Review when React changes the Rules of Hooks. |
jsx-a11y/alt-text | images without an accessible text alternative | jsx-a11y | essential | — | native | error | stable | Images need meaningful alternative text or explicit decorative intent. | fixtures/rules/jsx-a11y/valid.tsx; fixtures/rules/jsx-a11y/invalid.tsx | jsx-a11y/alt-text | — | Review when JSX accessibility semantics or framework mappings change. |
node/no-exports-assign | CommonJS exports object reassignment | node | essential | — | native | error | stable | Reassigning exports does not update module.exports. | fixtures/rules/node/valid.cjs; fixtures/rules/node/invalid.cjs | n/no-exports-assign | — | Review if Node.js changes CommonJS export semantics. |
node/no-path-concat | platform-dependent path concatenation | node | strict | — | native | error | stable | String concatenation with __dirname can create invalid cross-platform paths. | fixtures/rules/node/valid.cjs; fixtures/rules/node/invalid.cjs | n/no-path-concat | — | Review if Node.js path APIs or rule semantics change. |
node/no-new-require | constructing through the CommonJS require function | node | strict | — | native | error | stable | require is a loader function, not a constructor. | fixtures/rules/node/valid.cjs; fixtures/rules/node/invalid.cjs | n/no-new-require | — | Review if Node.js changes CommonJS loader semantics. |
vitest/no-focused-tests | focused Vitest cases committed to the suite | vitest | scoped | — | native | error | stable | Focused tests silently skip most of the suite in CI. | fixtures/rules/vitest/valid.ts; fixtures/rules/vitest/invalid.ts | vitest/no-focused-tests | jest/no-focused-tests | Review on Vitest major versions or native plugin changes. |
vitest/no-import-node-test | Node test-runner APIs mixed into a Vitest suite | vitest | scoped | — | native | error | stable | Mixing test runners bypasses Vitest lifecycle and configuration behavior. | fixtures/rules/vitest/valid.ts; fixtures/rules/vitest/invalid.ts | vitest/no-import-node-test | — | Review on Vitest or node:test interop changes. |
vitest/no-identical-title | duplicate Vitest case titles in one suite | vitest | scoped | — | native | error | stable | Unique titles make failures and filters unambiguous. | fixtures/rules/vitest/valid.ts; fixtures/rules/vitest/invalid.ts | vitest/no-identical-title | jest/no-identical-title | Review on Vitest major versions or native plugin changes. |
jest/no-focused-tests | focused Jest cases committed to the suite | jest | scoped | — | native | error | stable | Focused tests silently skip most of the suite in CI. | fixtures/rules/jest/valid.ts; fixtures/rules/jest/invalid.ts | jest/no-focused-tests | vitest/no-focused-tests | Review on Jest major versions or native plugin changes. |
jest/no-jasmine-globals | legacy Jasmine globals in a Jest suite | jest | scoped | — | native | error | stable | Jasmine globals tie tests to an obsolete implementation detail of Jest. | fixtures/rules/jest/valid.ts; fixtures/rules/jest/invalid.ts | jest/no-jasmine-globals | — | Review on Jest test-runner architecture changes. |
jest/no-identical-title | duplicate Jest case titles in one suite | jest | scoped | — | native | error | stable | Unique titles make failures and filters unambiguous. | fixtures/rules/jest/valid.ts; fixtures/rules/jest/invalid.ts | jest/no-identical-title | vitest/no-identical-title | Review on Jest major versions or native plugin changes. |
eslint/no-warning-comments | unresolved TODO markers left by assisted development | ai | ai | Added only when ai: true | native | warning | stable | Visible TODO markers keep provisional generated code from becoming invisible debt. | fixtures/rules/ai/valid.ts; fixtures/rules/ai/invalid.ts | eslint/no-warning-comments | — | Review when the AI profile gains a more specific native defect signal. |
react/react-compiler | React code rejected by the experimental compiler | react-compiler | named | — | native-experimental | warning | experimental | Compiler diagnostics are useful migration evidence but are not stable enough for defaults. | fixtures/rules/react-compiler/valid.tsx; fixtures/rules/react-compiler/invalid.tsx | react-hooks/react-compiler | — | Review every Oxlint or React Compiler upgrade before promoting the rule. |
Native replacement example
import/no-duplicates is the owner for duplicate-import diagnostics. It replaces both the predecessor's JavaScript-plugin rule eslint-plugin-import/no-duplicates and the overlapping core rule eslint/no-duplicate-imports. The conflict field prevents both owners from entering one generated config; the shared valid/invalid fixture proves the native behavior.
Stability boundary
react/react-compiler is emitted only by the explicitly named experimental artifact and begins as a warning. Testing Library, Playwright, and Storybook are package-owned file-scoped integrations rather than ledger profiles; Testing Library inherits the upstream DOM or React preset, while Playwright and Storybook inherit flat/recommended. Local evidence covers selection, activation, isolation, runtime resolution, and a clean-consumer diagnostic. SonarJS and regular-expression plugin domains are Deferred with explicit re-entry gates in the migration guide.