# Duplication worth keeping

A long cleanup removed redundancy across the packages. Nine candidates survived
on purpose. Each had been proposed by an independent review and rejected with a
reason — and without the reason written down, each would be proposed again.

## When merging would change behaviour

Two menu families have typeahead buffers that look identical. They are not: one
treats a single character as a fresh search, the other counts it as a repeat.
Merge them and the first keypress lands on a different item.

Nineteen accessible-name resolutions across the packages use three spellings
but only **two** behaviours: eleven pass `aria-labelledby` through a blank
check, eight do not. Unifying them decides what a blank string means, which is
an API choice wearing a refactor's clothing.

## When merging would hide a defect

Two files call a twenty-millisecond timer `waitForRaf`. It is not a frame.
Folding it into the real frame helper does not fix the misnomer — it buries it
somewhere the next reader will trust it.

A keyboard table looks like it is missing right-to-left handling. It is not:
a capture-phase listener intercepts the arrows first when direction is RTL and
stops propagation, so the table below never sees them. Substituting one for the
other is behaviour-identical and costs a reader the reason two layers exist.

## When the abstraction costs more than the copies

Around forty presentational wrappers are the irreducible shape of a component
library under these conventions. Eight teardown blocks share two lines. An icon
size ramp repeats across recipes.

## The habit

The output of a cleanup is not only the diff. It is the **list of things you
decided not to change, and why** — otherwise the same review runs again in six
months, reaches the same conclusions, and this time nobody remembers the
reason.

A decision that produces no diff leaves no trace in the repository. Where it
matters, pin it with a test that asserts the current shape and names the reason
in its title.