Repository navigation
Conversation
…laced window.Map The clip walker keyed its slot, pruned and scroller-chain lookups on globalThis.Map/Set, so a classic page script's `var Map = ...` aborted the whole describe. The label memo from the <br> fix already avoided the page's Map; the walker now falls back to a list when the global is not a usable Map.
…ialogs and cross-origin frames (#1487)
…a commit window The per-window fold picks a name's outermost frames, but it only saw the 50 nodes with the most self time, so a recursion's outer frame that ranked lower was dropped and its nested frame counted as outermost.
latekvo
commented
Nov 4, 2026
This was referenced Nov 4, 2026
… sample in component_cpu queryCpuWindow only listed frames that took a self sample, so a recursion's outer frame with none was never seen by the outermost-member fold and the nested frame's inclusive time was reported instead. component_cpu now asks for the callers too and keeps only rows with self time. Also pins the cross-window sum and the self-time ranking.
… had one Under an unwritable ~/.argent the crash breadcrumb said the log file was kept at a path that never existed. Keep the file only when there is one, and still report the session as a lost connection. Also pins the canonical device id in the missing-file recovery scope.
# Conflicts: # packages/docs/docs/reference/tools.mdx
Conflicts resolved: - profiler: keep main's render_counts and rerender gating with the group's self-time ranking and max-inclusive grouping. Take main's report and skills, which no longer mention the hidden react-profiler-renders; its comment no longer claims double counting. - scroll-to: keep the group's anchored, limited increments and its every-increment-sent fix inside main's macOS no-scroller catch. - selectorToNode takes main's frontmost-layer filter. - snapshot: main's macOS topMask, without normalizeSizes, which the group removed. screenshot-diff keeps main's Mac line, trimmed to what the dimensions sentence does not already say. - docs: main's tables plus the group's await-screen-idle wording, scroll-to link and fill error codes, now under SDK-only tools. Tests adapted to the merged types: component_cpu fixtures carry didRender and a null render summary, a CPU hotspot fixture gets its nodeId, and the all-clear react-profiler-renders test is dropped with the bullet it pinned.
…e dimension_mismatch remedy The remedy listed device model, orientation and screenshot scale only, so a Mac window that grew or an Android foldable in another posture got advice whose conditions already held. visual-regression.mdx and the argent-screenshot-diff skill had the same gap.
On a full disk the log file's open fails with ENOSPC, and the note blamed an unwritable ~/.argent and pointed at sudo chown. The writer keeps no errno, and a failed mkdir leaves open() with ENOENT, so the note names both causes and offers chown only when root owns ~/.argent.
A target cut by an outer native scroller and by the overflow:hidden `within` box was checked only against the scroller's window, which leaves out boxes inside it. Once clear of that window it passed with no wheel while the box still hid part of it. Such a round now wheels at the container's centre, as for an uncut target, so the box's own wheel listener can reveal it.
Headless Chrome: a 20px header above an overscroll-contained carousel in a 300px list. scroll-to's anchor on the header scrolls the list 24 of the 30px the row needs; once the header is gone, every point in the list is over the carousel, which keeps the wheel, and the step passes with the row cut by 6px. The reference and the skill say so.
…ents No fixture hit a <frame>, <object> or <embed>, so dropping any of them from wheelScroller's frame rule left the suite green. In headless Chrome, with that rule cut to IFRAME|FRAME, the anchor lands on an <object> or <embed> whose document takes the wheel, and the list moves 0px (16px with the rule).
… root A page can put the selection in a contenteditable host's own text while focus stays on an input inside the host's closed shadow root. The guard took the host as focused itself, so fill wrote the host's text and verified it there: verified:true with the focused input unchanged. In a focused page, an editing host focused itself matches :focus-visible and a host whose focus is in its shadow tree does not, so fill refuses the latter with the closed-shadow-root error and changes nothing.
Its parentElement is null. Without the null check in the closed-host guard the page script throws and every such fill (a Lit-style editor) fails with "fill could not run in the page"; no test caught that.
The mock style gave both axes one overflow value and no case had a scroller whose content fits, so five mutants of scrolls() passed the suite: either size check always true, overflow-y matching only auto, and each axis reading the other's overflow. The mock style is per axis and six cases, each checked against headless Chrome, pin them.
A Chromium page busy in one task longer than the no-op's 10 s fails with the nothing-changed error, on a fresh connect as on a connected session. A fresh CDP session gets no signal that tells such a page from one under a JavaScript dialog: Page.enable, Page.getFrameTree, Runtime.evaluate and Performance.getMetrics all go unanswered in both, no javascriptDialogOpening arrives, and Page.handleJavaScriptDialog says no dialog is showing. So the budget stays, and the error, the budget's comment and the tools reference state it: the page did not answer for 10 s, and a retry fills a busy page once its task ends.
…parent placed a child Every light child of a div, span or custom element that reached past its clip in view was hit-tested, at a cost of one pass over the page's paint layers each. On a sheet of 2000x15 `relative truncate` cells describe took about 3.4 s (probe off: 31 ms) with the same tree, and await-ui-element timed out on a button it could see. The walker now first asks layout. A child whose parent contains absolute boxes and is its offsetParent cannot have been slotted out of that parent's clips, since offsetParent skips a closed tree's boxes and only a fixed or top-layer box escapes. Under any other parent, a child inside the parent's border box or scrollable overflow that names no slot is skipped too. A closed root's absolute box showing default-slotted content within that overflow is the case this gives up.
…n HTML one The legend lookup recursed once per display:contents box, so a fieldset holding a chain of 4500 of them aborted describe with 'Maximum call stack size exceeded'. It also took an SVG element named legend (or fieldset) for an HTML one, and then read an HTMLElement offset getter on it: 'Illegal invocation'. Main describes both pages. The lookup walks an explicit stack and checks the namespace as isHtml does.
A slot inside a pruned element dropped everything assigned to it, though Chrome paints and hit-tests a fixed child, or an absolute one whose containing block lies outside, past a collapsed overflow:hidden box. The slot's clips are now folded down its path from the pruned element, and only content those clips cut to nothing is dropped.
… and the rotate sign
The walker used ?., ?? and ??=, which V8 parses only from Chrome 80 and 85, so describe failed with a SyntaxError on older Chromium and Electron renderers. A test parses the walker at describe's and flows' limits, and the fill script, for syntax newer than ES2019.
…w root accessibleName looked every id up with document.getElementById, so a control in an open shadow root never found a target beside it and could take the text of a page element with the same id instead (Chrome: "Shadow label", describe: "Doc label"). Ids now resolve in the control's document or shadow root, the label cache is kept per root, and the document's getElementById comes from its prototype, so a <form name="getElementById"> no longer makes describe throw. Fixes #1756.
…lker
Only visibility:hidden counted as hidden. A visibility:collapse element (on
anything but a table row it is visibility:hidden, and Tailwind's `collapse`
sets it) was emitted as a visible, clickable node, and in a collapsed table
row framed over the next row's button, though Chrome hits through it and
leaves it out of the accessibility tree. In an aria-labelledby target a
collapsed part was read into the name ("Delete (old) file", Chrome: "Delete
file"), and a collapsed target was read as shown. Every visibility check in
the walker now treats any value but visible as hidden, as the option and
::before/::after checks already did.
caseText passed the whole -webkit-locale to toLocaleUpperCase, which throws on
tr_TR, so the text fell back to the root case mapping ("ISTANBUL", Chrome:
"İSTANBUL"), and canonicalizes tur to tr, which Blink does not. Blink cases
by a lang's first 2 letters when a "-", "_", "@" or the end follows them, and
caseText now does the same.
…hrome does An embedded text field reads its value (a password as bullets), else its aria-label, title or placeholder; a button input its value; an image input its alt; a range input its value. The control being named reads in its own target by its aria-label, title or placeholder instead, as Chrome does, so a label wrapping its field keeps reading "Name".
An element's value read its text nodes as authored, so an uppercase button read "Save draft" where Chrome and the screen show "SAVE DRAFT". Own text now takes the element's text-transform under its lang, with capitalize reading on from what is laid out before each text node. A ::first-letter's case is left out: it costs every text an ancestor climb (about +25% describe time on plain pages). A case-sensitive `matches` regex sees the shown case, so the e2e YAML reference and skill say so.
Each assertion fails under one mutant that the suite let through: a closed <details>' second <summary>, inert on an SVG element, a hidden <math> parting words, an inline listbox's leading space, a ::before alt of empty strings, a visibility:collapse pseudo, a -webkit-box pseudo, a block-level replaced element before a first letter, a blank block ::before ending an ancestor's first letter, a first letter's combining marks under Greek casing, and a block pseudo in an inline box.
This branch has not been deployed
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.
Folds 11 open describe / capture / debugger fix PRs into one review. Each original PR is one squashed commit titled
... (#N), so it reads commit by commit; follow-ups from folding are separate commits.beta
Fixes from reviewing the fold:
var Map = Immutable.Mapwithin, else of the window that cuts the target. The cut is accepted if that leaves it in place too, or if the target lies under that centre, so the page takes at most two wheels.NodeorHTMLSlotElementNode(or a non-functionHTMLSlotElement) made describe throw 'Uncaught' (main describes it).<svg><title>, ruby, shadow-DOM and slotted labels, aria-hidden="TRUE", script boxes and empty parts named unlike Chrome.const URL = ...broke IDN email fills.<div>(or span, section, any attachShadow host but a custom element) slotting a button into a fixed box: 0x0, scrolled out (main: framed).<fieldset>was clipped (y 22..50) and row one framed over it.<details>content, inert text, ::before/::after, a blank element's title, range values and unselected listbox options read unlike Chrome.map 2.02 / 2.01.2.01 / 2.01.text-transformwas ignored: an uppercase label readsave it(ChromeSAVE it).Intl.Segmenterleaves the text uncased.withinbox, passed with no scroll (main scrolls once).within: one scroll.fill cannot reacha closed shadow root, nothing changed.|, readAll returned one entry more than the note's count, with a cut message.<details>await visiblepassed and taps landed elsewhere (main the same).content-visibility: hidden.<br>read as a space and a hidden block glued words; aria-label beat aria-labelledby;role="foo listbox", native<progress>/<meter>,::first-lettercasing and capitalize after an aria-hidden icon, earlier text or an astral letter read unlike Chrome.fill cannot reacha closed shadow root, nothing changed.beforeinput; await-screen-idle did not say an unreachable Chromium app fails; the overflow:hidden hint said the clip stays hidden.withinbox cutwithinbox (scrolled by its own wheel listener) passed with 0 wheels, 70 of its 150px hidden, and a tap on it failed (main reveals it).relative truncatecells: describe 2.5-4.5 s (probe off: 41 ms, same tree); await-ui-element missed a visible button at 5 s.<input aria-labelledby=sl>read "a@b.c"; a shadow button whose id also exists in the top document read "Doc label" (#1756).<legend>threw Illegal invocation (main describes both).?.and??=, so Chromium before 85 could not parse it (main parses on V8 7.8).visibility:collapsetext read as shown;lang=tr_TRcased as no lang;Qty <input value=5> itemsread "Qty items"; an uppercase-styled button's value read "save it" while a label it supplied read "SAVE IT".fill cannot reacha closed shadow root, nothing changed.Not folded: #1382 (superseded: #1403 removes the aspect tolerance it capped; #807 is covered by #1403 here).
Closes #908, #1338, #1337, #1230, #1005, #1143, #826, #805, #838, #807, #1564, #1693, #1694, #1756, #1759.
Evidence per row
Each fix's test fails on origin/main and passes here.
as a space' (expected 'alphabeta' to be 'alpha beta').
diffPathreaches the agent by no route #826: Real startMcpServer over stdio with the SDK client, against an in-process tool-server HTTP app, main vs group. 2/2 new content.test.ts tests fail on main and pass here.screenshotat scale 1.0 through the shipped simulator-server returns a 1080x2400 PNG. The non-square frame that radon#228 fixed no longer fails.Searchand<div>Save</div><div>draft</div>, an<h2>+<p>target and a target withdisplay:noneor<style>text exactly as Chrome's Accessibility names do.Review feedback carried from the original PRs
var Map = .... With both folded, describe aborted on such a page ('Chromium describe failed: Uncaught' in headless Chrome at 70b1ea8), while main and the group branch describe it. The walker now falls back to a list-backed map when globalThis.Map is not usable. The new test fails when slotClips/chains or pruned revert to the globalThis builtins, and when the fallback's has/get/set is broken.Local CI
At 515887a: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest: 10347 passed, 10 skipped, 0 failed. argent-mcp vitest: 215/215. npx docusaurus build: succeeds.
At 5a2f26e: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest in 6 shards: 9216 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). argent-mcp vitest: 195/195. npx docusaurus build: succeeds. GitHub CI at 7ddca21: all green.
At 64edb2d: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest in 6 shards: 9175 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). GitHub CI at 89f47f2: all green.
At 9055f47: prettier --check and eslint on every file changed since 6988790: pass. tsc --build, typecheck:tests and knip: exit 0. tool-server vitest in 6 shards: 8849 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). argent-mcp vitest: 195/195. npx docusaurus build (at a9f502a): succeeds.
At 6988790 (changed since the main merge 6c3be48: flow-actions.ts, flow-scroll.test.ts): prettier --check and eslint on both: pass. tsc --build and typecheck:tests: exit 0. tool-server test/flows vitest: 2366 passed, 1 failed (flows/e2e-tool-aliases, local-only as below).
At 9e65f4a (docs build and argent-mcp re-run at 2e88d62): prettier --check and eslint (8 GB heap) on every changed file: pass. tsc --build and typecheck:tests: exit 0. tool-server vitest in 6 shards: 8722 passed, 1 skipped, 1 failed: flows/e2e-tool-aliases (81 vs 83 ids), a known local-only failure that also fails on origin/main. argent-mcp vitest: 195/195. npx docusaurus build: succeeds. Each squash carries exactly the PR's net change vs its merge-base (numstat identical).