---
changelog:
  category: Release
  version: ultracite@8.0.2
date: '2026-10-22T16:06:26Z'
seo:
  description: >-
    Make ultracite fix --claude and --codex judge each retry by what the
    previous edit actually did. An issue that's still reported gets the old note
    asking for a…
title: ultracite@8.0.2
type: changelog
---
## Patch Changes

- 9f80955: Make `ultracite fix --claude` and `--codex` judge each retry by what the previous edit actually did. An issue that's still reported gets the old note asking for a structurally different approach, but one that only appeared after the edit is now handed back as new, with the agent told to build on the fix rather than undo it. Before, a correct ARIA button pattern that then tripped `prefer-tag-over-role`, or a correct `<button>` missing its `type`, was treated as a failed fix and thrown away. When an issue needs a person's decision, the agent now lists it at the end of its final message. Ultracite stops retrying it and shows the agent's explanation in the summary, where it used to be discarded. The handoff also gets three fixes. Biome's `a11y` rules now reach the agent with their help text and documentation link, which a pattern that didn't allow digits in a rule group had dropped. A path Oxlint has no files to lint, such as a Markdown file, no longer crashes the run. And Biome's internal errors, such as `internalError/io` for a file it can't write, are no longer handed to the agent as lint issues.
- 30e03ef: Give `jsx-a11y/label-has-associated-control` in `ultracite/oxlint/react` the options the ESLint react preset already sets: `<Label>` counts as a label, `<Input>`, `<Select>`, `<Textarea>`, `<Checkbox>` and `<Radio>` count as controls, and a control is found up to three levels deep. Oxlint used to miss a `<Label>` with no control, and flagged an `<Input>` inside a `<label>`, or an input nested three deep, as unlabelled. Biome's `noLabelWithoutControl` in `ultracite/biome/core` gets the same label and control components.
- 947ca03: Turn off `promise/prefer-await-to-then` in `ultracite/oxlint/core` and `ultracite/eslint/core`, and `github/no-then` in `ultracite/oxlint/js-plugins` and `ultracite/eslint/core`. Both rules match `.then()`, `.catch()` and `.finally()` by method name, without type information, so they flagged APIs that aren't promises, such as [Zod's `.catch()` fallback](https://zod.dev/api#catch). They also flagged a fire-and-forget promise given a `.catch()` handler. Oxlint closed the false positive as [not planned](https://github.com/oxc-project/oxc/issues/22161). `promise/always-return` and `promise/catch-or-return` are now on in both presets, so an unhandled promise chain is still reported. In ESLint, `unicorn/prefer-await` moves to `ultracite/eslint/type-aware`, where it uses type information to skip calls that aren't on a promise. The test-file overrides that turned `promise/prefer-await-to-then` off in the jest and vitest presets are gone, since the rule is off everywhere.
- c198d06: Stop `unicorn/no-useless-undefined` in `ultracite/oxlint/core` from checking function call arguments. A required parameter typed `string | undefined` has to be passed `undefined` explicitly, but Oxlint flagged `consume(undefined)` and `ultracite fix` rewrote it to `consume()`, which TypeScript rejects with TS2554. The rule can't see parameter types, so it now runs with `checkArguments: false`. It still reports `let value = undefined`, `return undefined` and the rest of its checks. `ultracite/eslint/core` sets the same option. [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-undefined.md) already skipped arguments in TypeScript files, and now skips them in JavaScript too. Biome's `noUselessUndefined` never checked arguments.
