| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(capture): bring back fast: false as a time-sliced capture fast: false yields about every frame and redoes a clone torn while yielding; 'auto' (experimental) yields only past 40 ms. #503 table: no task over 50 ms. Ref #503 | 9 天前 | |
I key the base reset memo on the universe it was pruned by The base reset has been pruned by the property universe since 630c6a4, but its memo was still keyed on the tag set alone. A capture that ran before any rule named `appearance` left a reset without appearance:none, the class diff omits the value because it equals the tag default, and every later capture of the same tags painted the native control. Code-split CSS reaches exactly that order. It surfaced as the new styled-slider test passing alone and failing next to its siblings. The memo now stores the universe next to the CSS. scanFor keeps the previous Set when a re-scan finds the same props, because any DOM mutation bumps the epoch and a new Set per scan would rebuild the reset (0.12-0.65 ms) on every capture of a live page. The relational-selector memo in diff.js assumed a new Set per epoch, and an adopted :has() sheet adds no prop, so it is now keyed on the document and the style epoch instead. Polling benchmark against HEAD stays within noise. Ref #502 | 10 天前 | |
feat(capture): bring back fast: false as a time-sliced capture fast: false yields about every frame and redoes a clone torn while yielding; 'auto' (experimental) yields only past 40 ms. #503 table: no task over 50 ms. Ref #503 | 9 天前 | |
perf: skip display:none subtrees when cloning. Ref #507 | 3 天前 | |
feat(capture): bring back fast: false as a time-sliced capture fast: false yields about every frame and redoes a clone torn while yielding; 'auto' (experimental) yields only past 40 ms. #503 table: no task over 50 ms. Ref #503 | 9 天前 | |
I key the base reset memo on the universe it was pruned by The base reset has been pruned by the property universe since 630c6a4, but its memo was still keyed on the tag set alone. A capture that ran before any rule named `appearance` left a reset without appearance:none, the class diff omits the value because it equals the tag default, and every later capture of the same tags painted the native control. Code-split CSS reaches exactly that order. It surfaced as the new styled-slider test passing alone and failing next to its siblings. The memo now stores the universe next to the CSS. scanFor keeps the previous Set when a re-scan finds the same props, because any DOM mutation bumps the epoch and a new Set per scan would rebuild the reset (0.12-0.65 ms) on every capture of a live page. The relational-selector memo in diff.js assumed a new Set per epoch, and an adopted :has() sheet adds no prop, so it is now keyed on the document and the style epoch instead. Polling benchmark against HEAD stays within noise. Ref #502 | 10 天前 | |
docs: every file in src explains itself; CLAUDE.md points at the code Comments only in src: the minified output of every touched file is byte-identical to what it was. Every file opens with a header saying what it owns and what a change must not break; every export has a verb-first line, the reason when it could be sourced (issue, measured number with its scene, the trap), the test that goes red ("Pinned by", greppable) and real @param/@returns types. Internals get a line only when the name does not carry the contract. About thirty Spanish comments became English. Ten JSDoc blocks sat on a constant instead of their function and moved. Several docstrings said things the code never did (a phantom embedFonts parameter on prepareClone, CachePolicy values the code never produces, a console mirror in sessionWarn, a clamp in formatCounter, a rule epoch that was reverted) and now say what it does. CLAUDE.md goes from 487 lines to about 200. The nine measured-mechanism paragraphs that duplicated the source are one pointer each; six facts that lived only there moved next to the code they describe. What stays is what the code cannot say: repos, goals, commands, testing traps, the release and real-Safari process, the comment convention. It also says what npm test actually runs (lint:fix, test:types, test:bundle, vitest), which it did not. | 23 天前 | |
fix: preserve document overflow in captures. Ref #505 | 4 天前 | |
docs: every file in src explains itself; CLAUDE.md points at the code Comments only in src: the minified output of every touched file is byte-identical to what it was. Every file opens with a header saying what it owns and what a change must not break; every export has a verb-first line, the reason when it could be sourced (issue, measured number with its scene, the trap), the test that goes red ("Pinned by", greppable) and real @param/@returns types. Internals get a line only when the name does not carry the contract. About thirty Spanish comments became English. Ten JSDoc blocks sat on a constant instead of their function and moved. Several docstrings said things the code never did (a phantom embedFonts parameter on prepareClone, CachePolicy values the code never produces, a console mirror in sessionWarn, a clamp in formatCounter, a rule epoch that was reverted) and now say what it does. CLAUDE.md goes from 487 lines to about 200. The nine measured-mechanism paragraphs that duplicated the source are one pointer each; six facts that lived only there moved next to the code they describe. What stays is what the code cannot say: repos, goals, commands, testing traps, the release and real-Safari process, the comment convention. It also says what npm test actually runs (lint:fix, test:types, test:bundle, vitest), which it did not. | 23 天前 | |
refactor(stages): drop the 'dom' stage, the clone is the floor `needs` had three values. The shallowest, 'dom', stopped the capture before the clone: run beforeSnap and beforeClone, then return null. Traced end to end, that is not a capture. No clone, no render, no memo (burst is disabled for anything that produces no render artifact), and the Safari pre-step skipped. What core contributed was option normalization, a hook runner and a result object wiring up the plugin's own exports. A plugin can do all of that by calling its own function on the element, which means the stage bought nothing and cost a public, documented contract to maintain forever. The one thing such a plugin genuinely needed from core is the compiled exclusion policy, so a semantic export agrees with what the image would have hidden. That is `ctx.shouldExclude` and it is available at every stage, independent of this. 'clone' stays, and it earns its place for the opposite reason: the clone IS the freeze and ~89% of the work, so a plugin that annotates it and skips the pixels is reusing real capture work. That is the cut worth having. The comment claiming 'dom' "skips ~89% of the capture" oversold it in both directions: you are not saving 89% of a capture, you are not doing one. `needs: 'dom'` now throws by name like any other unknown value, listing the two that remain, so an existing caller is told exactly what happened instead of silently getting the default. Nothing in this repo defaulted to it; it was opt-in, and the canonical example in stages.js was the oracle that lives in another repo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 9 天前 | ||
| 10 天前 | ||
| 9 天前 | ||
| 3 天前 | ||
| 9 天前 | ||
| 10 天前 | ||
| 23 天前 | ||
| 4 天前 | ||
| 23 天前 | ||
| 1 个月前 |