Develop - #33
Merged
Merged
Conversation
… moved, and asked a one-stop panel for a move it cannot make movedExpression took `before = document.activeElement` inside the expression evaluated AFTER the key was dispatched. CDP acks a key event only once the renderer has handled it, so that snapshot was already the moved element and the wait asked for a second move that never came, spending its whole 2000ms bound on every press. Measured on this machine: navigation 15ms, panel 450ms, and every one of the 21 presses 2010ms or more -- 42s of a 48s sweep. It was invisible because a barrier that expires resolves the same value as one that is satisfied, which is the fixed sleep the header of this gate refuses to contain. The snapshot is now armed before the key is dispatched. A barrier also has to be one the press can satisfy: where a panel holds one Tab stop, Tab returns to the element it started on, so no move is possible and asking for one spends the bound to learn what the stop count already said. There the subject is containment, which is what heldExpression already asks, so it is asked with the keypress bound rather than a second wait spelled beside it. Both bounds stay generous and only a failing walk pays one. 48.2s to 3.9s, same verdict. Checked against fixtures that a fast gate is not a blind one: an untrapped panel still reports the escape, a trap clamped on one control still reports reaching 1 of 3, a page with no panel still reports the expiry, and a one-stop panel whose focus escapes is still caught -- that last one covers the branch this commit adds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
…thout declaring them, so the cache kept them while their subject changed check:target-size declared the kitchen-sink directories and two token files, and what it renders is the whole page: 246 of the 331 files it opens were undeclared. check:community declared five paths, and policyProblems walks the tree for every .md to assert the governance phrase has one home: 407 undeclared. A fingerprint blind to an input is a gate KEPT from the cache while the thing it judges changes, which is the failure check/AGENTS.md names first -- a PASS over code nothing looked at. Swap a webfont and check:target-size, the gate that holds Arena to WCAG 2.5.8, reported green on activation boxes it never measured. Measured rather than argued: perturb one byte of an undeclared file and ask the graph whether the gate is still kept. Both were blind to 12 of 12 sampled files, with declared files as the positive control. Afterwards both detect 12 of 12, and `check:graph --audit` reports each opening nothing it does not declare. The .md spec was checked against the walk in both directions, 437 files each way, since a declaration WIDER than the walk is the mirror defect and nothing catches that one. check:pixel-parity had the same hole and is the reason the audit could not say so: it sits in UNTRACEABLE, so nothing had ever measured it. It renders the pages check:target-size renders, whose trace is authoritative for them, and it was blind to the fonts and to contracts/design/*.css -- the two inputs a gate comparing rendered pixels can least afford to miss. It is fixed here with the other two. Declaring reads on generated artefacts left eight writers owing their new reader a subscription, which check:graph failed on and which is the invariant working: 280 edges to 288. The cache loses nothing -- a warm run is 7.8s with 67 of 80 kept, what it was before. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
… it renders the same pages as had been audited all along UNTRACEABLE said of check:pixel-parity that "it drives a browser too, and captures over the same socket". Driving a browser is not what puts a node out of reach: the tracer patches node:fs in the gate's own process, and the static server serving those pages runs in that process, so every file the page fetches is opened right where the tracer can see it. check:target-size drives the same browser over the same pages through the same server and was never on the list -- it is audited on every run, and that is how the hole this closes was found. The entry was not merely unnecessary, it was load-bearing in the wrong direction. A node on the list is reported unaudited and never clean, so nothing had ever measured the most expensive gate in the repository, and the reads it was missing went unseen for as long as the entry stood. Removing it: 60 of 86 nodes clean becomes 63, and 13 spawning a process becomes 12. check:pixel-parity now audits at 0 undeclared of 330 opened, which independently confirms the declaration the previous commit derived for it by hand from check:target-size's trace. Now that the gate can be measured, two declarations turn out to name files it never opens -- frameworks/react/playground/*.generated.js here, and contracts/design/density.comfortable.json and spacing.json on check:target-size, whose floors are literals in SCOPES rather than read from the tokens. That is the mirror defect AGENTS.md says nothing catches, and the playground one invents an upstream edge. Both predate this work and neither is touched here: deleting a read makes the cache keep MORE, which is the direction that wants a decision rather than a tidy-up. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
…aph carried a dependency the run does not have check:pixel-parity declared frameworks/react/playground/*.generated.js and opens none of the three. check:target-size declared contracts/design/density.comfortable.json and contracts/design/spacing.json and opens neither: its floors are the literals 24 and 44 in SCOPES, and the token file is named in a comment arguing against one of them rather than read. Each is the mirror defect -- a declaration wider than the walk -- and it stayed invisible while check:pixel-parity sat in UNTRACEABLE, since a node nothing measures cannot disagree with what it says about itself. Measured after: every remaining spec on both nodes is touched by at least one file the trace records, both still audit at 0 undeclared of 330 and 331 opened, and the inputs the previous commit rescued still dirty their gate -- a webfont and a colour each send both gates back to a run. A correction to 3cafce1, which said the playground spec invented an upstream edge. It did not. build:demos writes that path and frameworks/react/components/**/*.generated.js both, and check:pixel-parity genuinely reads 141 files under the second, so the edge build:demos -> check:pixel-parity was already carried and the edge count is 288 before this change and after it. The spec was redundant rather than inventive, which is a smaller fault than the one claimed and still not one to leave standing. density.comfortable.json is the one deletion with something to say for it: the gate hardcodes a floor that file argues 48px against, so declaring it read as "if this moves, look at me again". The graph has no spelling for a conceptual dependency, and a read that is not a read cannot be the place to keep one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
…he same claim in two places, and nothing failed when either moved SCOPES draws the comfortable floor at 44px. density.comfortable.json sets ctl-h-sm to 44 and argues in its own $description that the smallest control of a touch density still has to clear what a thumb needs -- "a ladder whose bottom rung misses the floor the file above argues for is a ladder that does not hold it". Two statements of one thing, joined by nothing a run could read. Lower ctl-h-sm and the density quietly stops answering the floor this gate measures against, everywhere no component happens to render small enough for the browser sweep to catch it; move the floor in SCOPES and the file's argument is about a number that no longer exists. Either way both sides stay green. ARGUED is that tie written as a reason-carrying entry, in UNSIZED's shape, and it fails five ways: the scope is not in SCOPES, the recorded floor disagrees with the one SCOPES now draws, the file is gone, the token is not a px dimension there, or the token has dropped below the floor. Each was exercised, and lowering ctl-h-sm to 40 in the real file reports it and restores clean. This is the vertex 3cafce1 and c31287c turned over: that link had been kept as a read spec for a file the gate never opened, which is a dependency the graph carries and the run does not have, so c31287c deleted it. A conceptual dependency has no spelling in the graph -- but it has one in a gate, and it is the same one every other exception here uses. The read is declared again because it is now a read: the audit goes 331 opened to 332, still 0 undeclared, and the spec is no longer a name for a file nothing touches. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
…ts on a developer machine, so check:graph failed everywhere it does not bcba888 gave check:community the .md walk it actually performs, and excluded .claude/** because check-agents.ts:SKIPPED_ANYWHERE skips that directory and a declaration wider than the walk is the mirror defect. .claude/ is in .gitignore. It is on the machine the spec was written on and on no runner, and check:graph fails a spec whose directory holds no file at all -- "no directory fails, one holding no match is a note" -- so test core failed on the first push while a full local check passed 83/83. The gate was right and the spec was parochial. Reproduced before changing anything by running emptySpecProblems over the path list with .claude/ filtered out, which is the runner's tree without touching the disk: 1 problem there and 0 here, and 0 in both once the exclusion is dropped. What dropping it costs is one file in the wrong direction on a machine that has one: the spec resolves 438 .md against a walk of 437, the extra being .claude/RESUME.md, and 0 in the walk are missing from the spec. A gate re-running because a local scratch file moved is a spurious run; the direction that matters, a run that should happen and does not, stays closed. On a runner the counts agree exactly, since the directory is not there to match. Also verified, and NOT from this branch: check:contracts-package and check:packages fail on this working copy because 30ea6dc took the tree to 10.2.2 while dist/ here was still assembled at 10.2.1. They fail identically with every change stashed, and bun run build:packages clears them. Recorded so the next reader does not go looking for it in the graph. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq4GiDhwkPmT3Do3Lwz8nn
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.