* feat(core): add severityOverrides config with per-rule / per-category / per-tag channels Introduces a unified severity-override resolver that lets users promote, demote, or fully disable rules across every diagnostic surface (CLI, PR comment, score, --fail-on) without editing source. - New `severityOverrides` field on `ReactDoctorConfig` with `rules`, `categories`, and `tags` channels. Values: `error` | `warn` | `off`. Precedence: `rules` > `categories` > `tags`; within the tag channel the most permissive override wins (`off` > `warn` > `error`). - `resolveRuleSeverityOverride` is a pure resolver shared between the oxlint config builder (next commit) and the post-lint diagnostic filter, so external-plugin rules (`react/*`, `jsx-a11y/*`) honor `off` too even though their severities live outside our control. - `applySeverityOverrides` drops `off` diagnostics, re-stamps `warn` / `error` severities, and short-circuits to the input array when no overrides are configured so the common path stays allocation-free. - `validateConfigTypes` coerces stringy mistakes and warns on invalid severities / channel shapes; `mergeAndFilterDiagnostics` runs the override before the existing ignore pipeline. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * feat(core): apply severityOverrides at oxlint config time Threads `severityOverrides` from the user config through `runOxlint` into `createOxlintConfig`, where it short-circuits `off` rules before registration (so they never run, never emit, and never reach any surface) and re-stamps the registered severity for `warn` / `error` overrides. The retry-without-extends fallback honors the same overrides so a crashed adopt-extends path doesn't quietly reactivate a silenced rule family. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * feat(plugin): bucket-derived auto-tags and migration-hint family Cross-cutting controls (`severityOverrides.tags`, `surfaces.*.excludeTags`, `config.ignore.tags`) need a way to target whole rule families without each rule file repeating the same tag. The codegen now merges bucket-derived tags into every entry: - `react-native/` bucket rules get `"react-native"` - `server/` bucket rules get `"server-action"` Tags authored on the rule (e.g. `test-noise` on `no-react19-deprecated-apis`) are preserved and deduped at registry build time. The four migration-prompt rules now carry an explicit `migration-hint` tag too: - `no-react19-deprecated-apis` - `no-react-dom-deprecated-apis` - `no-legacy-class-lifecycles` - `no-legacy-context-api` `formatAutoTagsLine` mirrors prettier's wrap-at-100-cols decision at codegen time so the regen-equals-formatted contract enforced by `gen:check` stays stable. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * test: cover severityOverrides resolution, post-lint apply, and tag registration - `resolve-rule-severity-override.test.ts` checks precedence, empty-overrides short-circuit, the multi-tag most-permissive-wins rule, and category / tag fallback. - `apply-severity-overrides.test.ts` verifies `off` drops both react-doctor and external-plugin diagnostics; `warn` / `error` re-stamps the severity; and the no-overrides path returns the input array by identity. - `rule-tag-registration.test.ts` guards the bucket-derived auto-tags (`react-native` on every RN rule, `server-action` on every server rule) and the explicit `migration-hint` tags on the four migration rules, plus that authored tags survive the bucket merge. - `validate-config-types.test.ts` extends the existing surfaces coverage with severityOverrides happy / invalid / partial-channel paths. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * docs: document severityOverrides and the five rule-family tags Adds a README section right after the surface controls explaining when to use `severityOverrides` (single value applied across every channel) vs `surfaces` (visibility-only, per channel), with a copy-pasteable JSON example covering the five tag families called out in the original TODO — `design`, `test-noise`, `react-native`, `server-action`, `migration-hint`. Updates the TODOs entry to landed status and adds a minor-bump changeset. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * refactor: tighten severity-override surface for elegance Net -58 lines while making each path read more directly: - New `get-diagnostic-rule-identity.ts` projects a diagnostic onto the three axes every rule-targeted control reasons about (`ruleKey`, `category`, `tags`). `filter-for-surface` and `apply-severity-overrides` both consume it instead of repeating the plugin-aware tag lookup inline. - `resolve-rule-severity-override` drops the two-level `pickMostPermissive` / `collectTagOverride` helpers in favor of a single linear scan with a small `isMorePermissive` predicate; reads top-to-bottom in rule > category > tags precedence order. - `apply-severity-overrides` factors a `restampSeverity` helper driven by a `SEVERITY_FOR_OVERRIDE` map, keeping the main loop to three lines of decision logic. - `createOxlintConfig` collapses the override-then-fallback into one `?? rule.severity` expression so the "\"off\" skips registration" check is the only branch left. - Codegen drops the manual prettier-width math entirely — the shorter `[...new Set(...)]` form always fits under 100 cols, so `gen:check` stays idempotent without the wrap-aware fork. - `validate-config-types` extracts `applyFieldValidator`, `isPlainObject`, and `formatType` so the four "if undefined skip; validate; store or delete" blocks at the bottom collapse into one expression each, and the three "must be plain object" guards stop duplicating their type check. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * test: dogfood js-combine-iterations in rule-tag-registration test React Review flagged two .filter().map() chains in the test file as `js-combine-iterations` warnings (we eat our own dogfood). Replaces both chains with a shared `collectRuleIdsMatching` helper that walks `Object.entries(plugin.rules)` once and pushes ids into a single result array — same behavior, single pass. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * fix(core): warn on unknown severityOverrides channel keys Bugbot caught an asymmetry: `validateSurfacesField` iterates the user-provided keys via `Object.entries` and warns on unknown surface names, but `validateSeverityOverridesField` only iterated the allowlist — so a typo like `"rule"` instead of `"rules"` or `"category"` instead of `"categories"` silently dropped the override with no signal to the user. Switches the iteration to walk the user's keys (matching surfaces) and emits `config field "severityOverrides.<key>" is not a known channel (expected one of: rules, categories, tags); ignoring.` when the key isn't recognized. Adds a regression test for the typo path. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * refactor: rename severityOverrides config to severity for ESLint/oxlint idiomacy The wrapper key `severityOverrides` was the only non-idiomatic part of the design — ESLint exposes severity under top-level `rules`, oxlint exposes it under top-level `rules` + `categories`, and Biome under `linter.rules`. None wrap it in a multi-word `*Overrides` namespace, and our own project's existing wrapper namespaces (`ignore`, `surfaces`) are single-word. Renames: - Config field `severityOverrides` → `severity`. The triple `ignore` / `surfaces` / `severity` reads as a coherent set of single-word namespaces parallel to the rest of the project. - Type `SeverityOverrideControls` → `RuleSeverityControls`. The value type stays `RuleSeverityOverride` so it doesn't collide with the plugin's existing `RuleSeverity = "error" | "warn"` (the registrable subset). - File `apply-severity-overrides.ts` → `apply-severity-controls.ts`, function `applySeverityOverrides` → `applySeverityControls`. Matches the config field's noun form. - Validation error messages updated from `config field "severityOverrides.<x>"` to `config field "severity.<x>"`. - README, changeset, and TODOs.md updated to draw the explicit parallel to ESLint's `rules: { ... }` and oxlint's `rules: { ... } + categories: { ... }`, plus the extra `tags` channel for behavioral families. All 1158 tests pass. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * refactor: promote severity controls to top-level rules / categories / tags (ESLint shape) The wrapper namespace was the last non-idiomatic piece. ESLint exposes severity under top-level `rules` (its hallmark field name and shape). oxlint exposes `rules` + `categories` at the top level. Promoting our three channels to the config root gives users the exact field they already know from ESLint, plus oxlint-shaped `categories` and a `tags` extension with the same Record-of-severity shape. Before: { "severity": { "rules": { "react-doctor/no-array-index-as-key": "error" }, "categories": { "React Native": "warn" }, "tags": { "design": "off" } } } After (matches ESLint's flat-config / .eslintrc shape exactly, plus oxlint's `categories`): { "rules": { "react-doctor/no-array-index-as-key": "error" }, "categories": { "React Native": "warn" }, "tags": { "design": "off" } } Changes: - `ReactDoctorConfig` drops `severity` and gains three top-level fields `rules`, `categories`, `tags`. Each is a `Record<string, RuleSeverityOverride>`. - New `buildRuleSeverityControls(config)` adapter assembles the internal `RuleSeverityControls` shape from the three top-level fields so the resolver and the oxlint config builder don't need to know about the public API shape. - `applySeverityControls` and `runOxlint` switch to the adapter; `resolveRuleSeverityOverride` is unchanged (still takes `RuleSeverityControls` directly). - Validation: drops the `severity` wrapper validator; adds a shared `validateSeverityMap(fieldName, value)` invoked once per top-level field. Error messages now read `config field "rules"` / `config field "tags.design"` — matching what the user typed. - Tests, README, changeset, and TODOs.md updated. README now opens the section with "The exact ESLint / oxlint shape" so the parity is the first thing a reader sees. All 1161 tests pass (gained 3 from build-rule-severity-controls.test.ts). Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * ci: retrigger workflow after path filter miss Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * ci: nudge actions queue Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * chore: drop changeset for category-level rule controls Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * docs(readme): tighten severity-controls section Previous version was 32 lines of intro + 5-bullet behavior reference + full tag/category enumeration. Cuts to one intro sentence, a compact JSON example, and a single paragraph covering precedence and where the value applies. The full tag/category list is implicit from the example; the precedence and most-permissive-wins rule are now one sentence each. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> * refactor: drop user-facing severity-by-tag (tags are internal metadata) Per-tag severity at the top level exposed an internal grouping concept that doesn't exist in ESLint or oxlint. Tags are behavioral labels rule authors invent; surfacing them as a first-class user config field made `react-doctor.config.json` depend on internal labeling decisions. Drops the top-level `tags` field. The severity surface is now strictly ESLint + oxlint shaped: - `rules` — ESLint's exact field - `categories` — oxlint's exact field Recovers the dropped functionality via existing fields: - whole-family suppression: `ignore.tags: ["design", ...]` (existing field, unchanged) - per-channel visibility: `surfaces.*.{include,exclude}Tags` (existing field, unchanged) - per-rule severity: list rules explicitly in `rules` Code falls out: - `RuleSeverityControls.tags` removed - `resolveRuleSeverityOverride` collapses to a two-line lookup (`rules` -> `categories`); drops the most-permissive-wins machinery and the `SEVERITY_RANK` map entirely - `buildRuleSeverityControls` drops the tag merge - `validate-config-types` SEVERITY_FIELD_NAMES = ["rules", "categories"] - `applySeverityControls` destructures only the two channels it needs from `getDiagnosticRuleIdentity` (which keeps returning tags for surface filters / ignore.tags consumers) Tests, README, and TODOs updated to reflect the smaller surface. 1169 tests still passing. Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Aiden Bai <aidenybai@users.noreply.github.com>
16 KiB
React Doctor / React Review TODOs
P0 - Trust-Breaking False Positives
[ ] Separate PR regressions from baseline health in React Review
Status: hosted/product, confirmed by screenshot.
Source:
- Screenshot: score 70, "Needs Improvement", "Below 90", but "This PR leaves the React health score unchanged."
Fix:
- Track baseline score, PR score, delta, new diagnostics, and fixed diagnostics.
- Use neutral wording when unchanged:
Repository score remains 70/100. This PR did not introduce React Review regressions.Baseline is below 90, but this PR leaves the score unchanged.
- Warn/fail only on worsened score or new blocking diagnostics unless absolute-score gating is explicitly configured.
[ ] Fix ReDoS risk in glob pattern compilation
Status: confirmed current, open.
Link: https://github.com/millionco/react-doctor/pull/243
Fix:
- Add max pattern length and max wildcard count.
- Reject pathological patterns with clear config errors.
- Prefer a proven glob matcher if possible.
- Add tests for worst-case patterns.
P1 - CI, Docs, Config, Product Semantics
[ ] Reconcile offline scoring behavior
Status: confirmed current.
Link: https://github.com/millionco/react-doctor/issues/89
Current problem:
inspect.tsomits score in offline mode.- README says offline skips score API and no score is shown.
action.ymlsays offline will "calculate score locally."
Fix:
- Implement local score calculation or update
action.ymland marketplace docs. - Add tests for
--offline,--score --offline, Action offline score output, and CI auto-offline.
[ ] Stop recommending millionco/react-doctor@main
Status: confirmed current.
Links:
- https://github.com/millionco/react-doctor/issues/75
- https://github.com/millionco/react-doctor/issues/79
Current problem:
- README still uses
uses: millionco/react-doctor@main. @mainwas explicitly reported as supply-chain risk.- No
.github/workflows/release.ymlwas found.
Fix:
- Recommend stable action tags.
- Ensure release workflow exists.
- Ensure released action inputs match docs.
- Document npm/action/marketing version mapping.
[ ] Expose --annotations through action.yml
Status: partially addressed.
Link: https://github.com/millionco/react-doctor/issues/81
Fix:
- Add
annotationsinput. - Pass
--annotationswhen enabled. - Document annotations-only, comments-only, or both.
[x] Add category-level rule controls
Status: landed.
Done:
- Added the ESLint / oxlint-shaped severity surface: top-level
rulesandcategoriesfields onReactDoctorConfig, each aRecord<string, "error" | "warn" | "off">.rulesis the exact ESLint.eslintrc/ flat-config shape;categoriesmirrors oxlint'scategoriesfield, keyed by React Doctor's display categories. Per-rule wins over per-category. Applied at lint registration time so"off"short-circuits before the rule runs, and re-stamped post-lint so--fail-on, the score, the CLI summary, and external-plugin rules all see the user-chosen severity. - Composes with the existing
surfacescontrols (per-channel visibility) andignore.tags(whole-family suppression for behavioral groupings like"design"/"test-noise"/"migration-hint"that don't align with a single category). Userules/categoriesto change severity across every channel at once. - Bucket-derived auto-tags so cross-cutting controls can target whole
families without each rule repeating the tag —
"react-native"on every rule in thereact-native/bucket,"server-action"on every rule in theserver/bucket, and explicit"migration-hint"onno-react19-deprecated-apis,no-react-dom-deprecated-apis,no-legacy-class-lifecycles, andno-legacy-context-api. - README documents the five rule families called out in the original
fix (
design,test-noise,react-native,server-action,migration-hint) with copy-pasteable JSON examples.
[ ] Support mature-codebase adoption workflows natively
Status: user feedback, react-doctor@0.0.31.
Sources:
- Team disabled duplicate
react/*,jsx-a11y/*,react-hooks-js/*, andreact-hooks/exhaustive-depsrules because ESLint already covers them. - Team disabled
react-doctor/no-barrel-importbecause barrel files are an intentional public API pattern and not a Vite perf concern. - Team disabled 8 CSS/animation perf rules after autofixes degraded
prefers-reduced-motionbehavior by making animations complete instantly and look stuck. - Team built custom pre-commit, CI, PR comment, dashboard, parallel worker, and per-module config plumbing around React Doctor.
Remaining:
- Make CSS/animation autofixes
prefers-reduced-motionaware and mark risky autofixes separately from safe ones. - Add native diff-only/touched-line enforcement for staged files and PRs.
- Add baseline mode so existing violations can be tracked without blocking new commits.
- Emit first-class PR comment data or provide built-in sticky PR comments with violation summaries and autofix guidance.
- Support per-module/package reports, scores, trends, ownership, and backlog counts for monorepos.
- Add native parallel runner controls and config inheritance/per-module overrides.
- Make
no-barrel-importbundler/framework aware, or add an official way to mark barrel files as intentional public APIs.
[ ] Make test-noise suppression consistent
Status: partially addressed.
Fix:
- Audit every rule.
- Tag noisy test rules:
- remaining async defer rules,
- JS micro-performance,
- fixture-heavy UI rules.
- Keep hooks correctness, accessibility correctness, and security enabled in tests.
[ ] Improve suppression ergonomics
Status: partially addressed.
Sources:
- Issue #206 suppression friction.
- Historical issues: #144, #158, #159, #161.
Fix:
- Show exact suppression snippet in PR comments.
- Accept bare rule IDs when unambiguous.
- Link each PR comment group to suppression docs.
[ ] Finish Husky/lint-staged docs
Status: open.
Links:
- Issue: https://github.com/millionco/react-doctor/issues/203
- PR: https://github.com/millionco/react-doctor/pull/213
- Related: #74, #115, #31
Fix:
- Land or replace #213.
- Explain
--diff,--staged,--full, partially staged files, and index-vs-working-tree behavior. - Add recipes for Husky, lint-staged, Lefthook, and pre-commit.
[ ] Decide custom package.json path support
Status: open duplicate PRs.
Links:
- https://github.com/millionco/react-doctor/pull/214
- https://github.com/millionco/react-doctor/pull/32
Fix:
- Pick
--package-json <path>or another stable API. - Avoid cache bugs when same source dir is analyzed with different manifests.
- Close duplicate PR.
[ ] Keep React dependency detection robust in non-standard workspaces
Status: partially addressed.
Sources:
- "No React dependency found" reports in Bun workspaces, catalog setups, and non-standard
package.jsonlayouts. - Related fixed issues: #27, #87, #101, #105, #116, #191.
- Related open PRs: #214, #32.
Fix:
- Keep regression coverage for pnpm/Bun catalogs, grouped catalogs, peer deps, and dev deps.
- Improve error text with nearest detected package and suggested
--package-json/--projectfix. - Do not regress root-project and monorepo package discovery.
[ ] Track large-codebase crash and resource failure modes
Status: partially addressed by #262.
Sources:
- PR: https://github.com/millionco/react-doctor/pull/262
- High RAM / OOM / SIGABRT reports on large monorepos.
- Historical dead-code crashes: #77, #132, #135, #149.
- Historical large command/path issue: #46.
Fix:
- Keep crash regressions even after Knip removal.
- Add clearer partial-output/error reporting for scan aborts.
- Document memory expectations and large-repo mitigations.
- Re-check Windows/path-length behavior outside dead-code scanning.
[ ] Clarify React Doctor vs React Review
Status: hosted/product.
User confusion:
- "Should we use react doctor or react review?"
- "Is there additional benefit if already using react-doctor?"
- "So a react-doctor clone?"
Fix:
- React Doctor: local CLI, packages, CI command, offline/local workflows.
- React Review: hosted dashboard, GitHub App, PR comments, baseline/delta, team workflow.
- Add "Already using React Doctor?" migration path.
[ ] Fix hosted private-repo / repo-not-found failures
Status: hosted/product.
Fix:
- Audit private repo auth path.
- Distinguish not installed, missing permission, private repo, rate limit, unsupported host, and backend failure.
- Add reconnect/retry path.
[ ] Add non-GitHub / self-hosted GitLab integration path
Status: hosted/product.
Source:
- Self-hosted GitLab user said they feel left out.
Fix:
- Decide support level for GitLab SaaS, self-hosted GitLab, generic CI annotations, and webhook-based hosted Review.
- Publish current workaround using CLI JSON/SARIF or CI output.
- Add GitLab CI recipe if hosted integration is not immediate.
[ ] Improve install flow and post-install empty states
Status: hosted/product.
Sources:
- Fintech user cannot install third-party GHAs.
- User saw scary full-account GitHub access.
- User installed but could not see lints.
Fix:
- Make GitHub App, OAuth, GHA, CLI, and enterprise/self-hosted paths explicit.
- Explain selected-repo vs account-wide access before redirect.
- Add states for waiting, queued, running, no issues, comment failed, repo access failed, unsupported project, backend error.
- Alert internally when install succeeds but no analysis/comment appears.
[ ] Keep local and hosted privacy/data behavior explicit
Status: partially addressed.
Links:
- https://github.com/millionco/react-doctor/issues/35
- https://github.com/millionco/react-doctor/issues/89
- https://github.com/millionco/react-doctor/issues/92
Fix:
- Explain what CLI sends to score/share APIs.
- Explain what
--offlinedisables. - Explain hosted Review repo/code access.
- Explain local CLI-only mode and share-link opt-out.
[ ] Improve score-change communication
Status: partially addressed.
Sources:
- 89 -> 49.
- 93 -> 68.
- 44/100 with hundreds of warnings.
Fix:
- Add release notes for material rule changes.
- Show why scores changed: new rules, changed severities, formula, unique error/warning rules.
- Avoid encouraging blind 100/100 chasing.
[ ] Add clear release/version mapping
Status: partially addressed.
Fix:
- Publish mapping for marketing version, npm version, action tag, and hosted Review version.
- Include rule diff and expected score impact in releases.
[ ] Verify local report/export support and docs
Status: partially addressed.
Links:
- #47
- #60
- #88
Fix:
- Confirm current JSON/report/share outputs.
- Document local-only report workflow.
- Add SARIF or generic report path if needed for non-GitHub CI.
P2 - Platform and Product Expansion
[ ] Decide dangerous CI/security config detection
Status: product.
Source:
- User suggested detecting dangerous configs like
pull_request_targetplus shared caches.
Candidate checks:
pull_request_targeton untrusted PRs.- Shared caches in publish/release pipelines.
- Cache poisoning.
- Unpinned third-party actions.
- Overbroad
GITHUB_TOKENpermissions. - Secrets exposed to PR code.
- Publish jobs after untrusted build/test.
- Unsafe
workflow_run.
[ ] Reframe positioning away from generic "React review bot"
Status: product.
Source:
- User said they did not naturally feel a strong urge to install a "react review bot."
Better wedges:
- Catch bad agent-generated React before merge.
- Stop hooks/rendering/server-client bugs in PRs.
- Framework-aware React CI guardrail.
- Security/correctness-first React reviewer.
- React Review plus repo/CI security checks.
[ ] Improve hosted React Review PR comment and dashboard polish
Status: hosted/product.
Sources:
- v1 feedback called out dashboard/error states and PR comment quality.
- Competitive feedback criticized whimsical, filler, low-value, or over-broad bot comments.
Fix:
- Put new regressions first and baseline findings separately.
- Collapse low-value warnings by default.
- Keep comments concise, serious, and actionable.
- Improve dashboard empty/error states and copy.
[ ] Add Preact support position
Status: platform.
Fix:
- Decide no support, best effort, Preact-specific mode, or rule subset.
- Detect
preact,preact/compat, and@preact/signals. - Document unsupported React-specific rules.
[ ] Clarify React Native coverage
Status: partially addressed.
Links:
- Support: #21, #65, #64
Fix:
- Publish RN support matrix.
- Document
rawTextWrapperComponents.
[ ] Decide HIR precision work priority
Status: open.
Link: https://github.com/millionco/react-doctor/pull/164
Decision:
- HIR may reduce AST heuristic false positives.
- Do not merge until false-positive policy is stable and regressions prove it improves real cases.
[ ] Decide TUI priority
Status: open.
Link: https://github.com/millionco/react-doctor/pull/173
Decision:
- Useful for local exploration.
- Not a blocker for PR trust, install, or false-positive quality.
- Keep behind subcommand or beta flag.
[ ] Decide broader ecosystem "Doctor" variants
Status: product.
Source:
- Requests mention Vue, Angular, Svelte, TypeScript, Python, Solid, and broader agent-friendly-code checks.
Decision:
- Keep React Doctor React-only, or create separate rule packs/products.
- If broadening, separate branding and diagnostics so React-specific quality is not diluted.
Open PR Triage
- #251
feat: port PR 217 lint rule coverage- large rule expansion; do not land before false-positive defaults are settled. - #243 ReDoS glob pattern fix - prioritize security review.
- #238 React Review audit - reconcile remaining React Review audit findings.
- #217 v2 Rasmus precision branch - port useful fixes intentionally.
- #214 / #32
--package-json- pick one API and close duplicate. - #213 Husky/lint-staged docs - land or replace.
- #210
fix- retitle/body or close. - #207 Molten Hub coverage - triage likely unrelated.
- #189 Simplified Chinese README - docs decision.
- #186 library-aware React 19/test scoping/build-entry/string lookup - partly obsolete after Knip removal; port useful parts.
- #179 index-derived key locals - decide priority.
- #173 TUI - product priority.
- #164 HIR port - precision research; high review burden.
Open Issue Triage
- #219 React Review audit - covered by async/test noise, baseline semantics, and #238.
- #216 React Review default-branch diagnostics - covered by async/test noise, baseline semantics, and #238.
- #215
Hello- close unless reporter adds actionable detail. - #203 Husky/lint-staged docs - covered by P1.
Historical Regression Ledger
Monorepo and discovery
- #82 Action/docs still need stale docs and release pinning fixes.
GitHub Action and CI
- #75 / #79 release tags addressed historically, but README still uses
@main. - #107 Action offline input exists but description is wrong.
- #81 annotations exist in CLI but not
action.yml.
CLI and agent workflow
- #74 / #115 / #203 pre-commit docs and staged semantics.
- #45 changed-file scan summary still needs clear baseline/diff wording.
- #89 offline score still inconsistent.
- #47 / #60 / #88 local reports: verify current support/docs.
- #214 / #32 custom package JSON path.
Rule quality
- #127
no-usememo-simple-expressionneeds clearer rationale/threshold docs. - #95
set-state-in-effectprecision remains worth tracking. - #179 index-derived key locals open.
Product and docs
- #99 offline docs stale because Action description conflicts.
- #188 / #97 Action docs and PR blocking partially addressed; need stable tags and delta semantics.
- #189 Simplified Chinese README open.
- #203 Husky/lint-staged docs open.
- #65 / #21 / #64 RN support exists; support matrix/docs remain open.
Shipped enhancements
- #164 HIR port open.
- #173 TUI open.
- #57 configurable accessibility presets closed without clear current support.
Immediate Order
- Add remaining JS micro-perf test-file suppression.
- Change React Review PR comment semantics to delta-first.
- Update docs for stable action tags, offline score behavior, and annotations.
- Triage stale PRs #210 and #207.