docs: cut CLAUDE.md to the rules it is for
CLAUDE.md had grown to 4,046 lines, ~3,300 of them per-component write-ups: why a breakpoint is 500px, why a cap is a quarter, what a spec once missed. Every session loaded all of it, and the rules that apply to every change were buried among decisions that apply to one. Those write-ups were already duplicated as comments beside the code they describe -- every issue number they cite also appears in a code comment -- so they are deleted rather than moved. What is left is the tracker workflow, the commands, the verification tiers and a set of broad engineering rules distilled from them, each pointing at where its example lives. Three declined decisions recorded nowhere else go to NOTES.md, and three code comments that cited CLAUDE.md sections by name no longer do. Closes #256 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -5078,3 +5078,22 @@ last rendered card.
|
||||
("ask the virtualizer for a larger overscan") is therefore not
|
||||
available without patching a private, which is why the request is
|
||||
issued ahead of the element instead.
|
||||
|
||||
## Declined, and recorded nowhere else (2026-09-25, #256)
|
||||
|
||||
When CLAUDE.md was cut down to rules, most of its "considered and
|
||||
declined" paragraphs already had a home in a code or config comment
|
||||
beside what they explain. These three did not:
|
||||
|
||||
- **`touch-action: manipulation` was declined** (#54). The 300ms tap
|
||||
delay it is offered for is already absent on a `width=device-width`
|
||||
viewport; what it would actually change is the gesture stack #63 tuned
|
||||
by measurement on the reference device.
|
||||
- **There is no "Go to Genre"** in the phone row menu (#67). That menu
|
||||
replaces name links a phone cannot use, and there has never been a
|
||||
genre link to replace — it would be new navigation, which wants its
|
||||
own issue.
|
||||
- **The overlaid queue has no tap-outside gutter on a phone** (#171).
|
||||
The drawer-style gutter would buy the affordance by taking width off a
|
||||
full-screen surface on a 424px viewport; back and a 44px close button
|
||||
answer it instead.
|
||||
|
||||
@@ -171,8 +171,8 @@ test.describe('search on a phone', () => {
|
||||
// Attached, not visible: `wa-dialog`'s host is `display: contents`,
|
||||
// so the element carrying the testid always reports hidden — what
|
||||
// is visible is the native `<dialog>` inside it. That awkwardness
|
||||
// is written down in CLAUDE.md and is why the assertion that this
|
||||
// is really up is the role query below.
|
||||
// is why the assertion that this is really up is the role query
|
||||
// below.
|
||||
await expect(dialog).toBeAttached();
|
||||
|
||||
// Named, which `getByRole` can answer and the a11y snapshot cannot
|
||||
|
||||
@@ -172,8 +172,7 @@ describe('<player-progress-line>', () => {
|
||||
* The reason this component asks `matchMedia` instead of letting a
|
||||
* stylesheet hide it: a media query cannot stop a 1 Hz interval
|
||||
* running for the life of every desktop session. That claim is
|
||||
* load-bearing in CLAUDE.md, so it is asserted rather than
|
||||
* described — the timer count, because a desktop render is empty
|
||||
* load-bearing, so it is asserted rather than described — the timer count, because a desktop render is empty
|
||||
* either way and so cannot tell the two apart.
|
||||
*/
|
||||
it('runs no interpolation timer above the breakpoint', async () => {
|
||||
|
||||
@@ -64,8 +64,7 @@ var frontendDistAssets embed.FS
|
||||
// Returning early is not a degraded mode: `nativeInit` has already
|
||||
// re-attached the bridge, so the recreated activity's WebView talks to
|
||||
// the app that is still running, with its queue and its playback
|
||||
// position intact. See CLAUDE.md, "An activity is a view onto the
|
||||
// process".
|
||||
// position intact.
|
||||
//
|
||||
// It is inert off Android, where a process has exactly one main().
|
||||
var mainStarted atomic.Bool
|
||||
|
||||
Reference in New Issue
Block a user