The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms.
This report summarizes scanner evidence for Tencent/libpag, a HTML project with 5,803 GitHub stars. SynthScan examined 478,238 lines of code across 2678 source files, recording 2441 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 5.5 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2368 finding(s).
Are imports declared and package/API names verified? 11 finding(s).
Are wrappers, guards, and repeated structures necessary? 95 finding(s).
Which changes need focused human review? 2441 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2441 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pagx/wechat/CMakeLists.txt | 21 | endif () | COMMENT |
| LOW | pagx/wechat/script/cmake.wx.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | pagx/wechat/script/rollup.wx.js | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/decorators.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/render-canvas.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/binding.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/wx-system-info.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/backend-texture.ts | 1 | /////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/babel.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/gesture-manager.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/backend-context.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/types.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/pagx.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/pagx-view.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/ts/pagx-view.ts | 221 | // pan/zoom clamp math. Kept in canvas-physical-pixel space (offset) and | COMMENT |
| LOW | pagx/wechat/ts/interfaces.ts | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/binding.cpp | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 21 | #include <emscripten/html5.h> | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 41 | #include "pagx/nodes/Stroke.h" | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 61 | constexpr uint32_t RGBA_BYTES_PER_PIXEL = 4; | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 81 | constexpr double ZOOM_IN_END_TIMEOUT_MS = 300.0; | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 461 | // Replacement subtraction: when the same path is already attached, flushPendingUploads | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 541 | if (pendingUploads.empty() || context == nullptr || !document) { | COMMENT |
| LOW | pagx/wechat/src/PAGXView.cpp | 1561 | COMMENT | |
| LOW | pagx/wechat/src/PAGXView.h | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 21 | #include <emscripten/val.h> | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 381 | // the display list carried the user pan/zoom) now that the runtime tree is owned by PAGScene. | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 421 | // Wall-clock timestamp (emscripten_get_now ms) of the previous timeline advance, used to derive | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 441 | // without a full Record(). setGestureActive takes effect once a snapshot exists. Cleared on | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 481 | // push_back / clear / swap that touches pendingUploads. | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 501 | // LRU pressure entirely. | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 521 | // totalBytes crosses this line, but uploads are still allowed: the buffer between | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 541 | size_t fullBudgetHardCap = 384ULL * 1024 * 1024; | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 561 | COMMENT | |
| LOW | pagx/wechat/src/PAGXView.h | 581 | // GL.textures indices retired during the current draw (eviction, replacement upload, or | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 601 | // via the JS helper, wraps it in a non-adopted tgfx::Image (Image::MakeFrom) so tgfx never | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 621 | // logged in this case so sustained overflow stays visible without flooding the console. | COMMENT |
| LOW | pagx/wechat/src/PAGXView.h | 641 | COMMENT | |
| LOW | pagx/wechat/src/PAGXView.h | 661 | // that the upload can now fit. Eviction is silent (no host callback). | COMMENT |
| LOW | pagx/wechat/src/utils/ImagePatternMatrixCalculator.h | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/utils/ImagePatternMatrixCalculator.h | 41 | // image loading: they represent the full-resolution pixel dimensions recorded by the exporter | COMMENT |
| LOW | pagx/wechat/src/utils/ImagePatternMatrixCalculator.h | 61 | // first call, so repeated invocations after runtime image changes recompute against the | COMMENT |
| LOW | pagx/wechat/src/utils/ImagePatternMatrixCalculator.cpp | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | pagx/wechat/src/utils/ImagePatternMatrixCalculator.cpp | 21 | #include <cstdio> | COMMENT |
| LOW | pagx/wechat/src/utils/StringParser.h | 1 | ///////////////////////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | tools/html-snapshot/server.js | 181 | fail(`unknown option: ${a}`); | COMMENT |
| LOW | tools/html-snapshot/build-browser-bundle.js | 81 | * PAGX. The snapshot conforms to spec/html_subset.md. | COMMENT |
| LOW | tools/html-snapshot/bench/run-native.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/html-snapshot/bench/run-native.sh | 21 | # | COMMENT |
| LOW | tools/html-snapshot/bench/run-native.sh | 41 | # BASELINE_HOLD_MS ms each baseline run holds the page open (default 200) | COMMENT |
| LOW | tools/html-snapshot/bench/run-native.sh | 61 | # computes from /proc/<pid>/stat (Linux native) or `ps -A -o time=` | COMMENT |
| LOW | tools/html-snapshot/bench/summarize.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | tools/html-snapshot/bench/summarize.js | 21 | // so reviewers can drill into the heavy ones | COMMENT |
| LOW | tools/html-snapshot/bench/summarize-html.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | tools/html-snapshot/bench/summarize-html.js | 21 | // notes caveat box explaining the three memory metrics | COMMENT |
| LOW | tools/html-snapshot/bench/baseline-blank.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | tools/html-snapshot/bench/baseline-blank.js | 21 | // 1. Launch the same browser engine `snapshot.js` uses (puppeteer, | COMMENT |
| LOW | tools/html-snapshot/bench/run-bench.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/html-snapshot/bench/run-bench.sh | 21 | # the sampler. Default: puppeteer. | COMMENT |
| 2152 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | test/gen_html_comparison.sh | 50 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/gen_html_comparison.sh | 52 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/gen_html_comparison.sh | 147 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/gen_html_comparison.sh | 149 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/gen_html_comparison.sh | 154 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/gen_html_comparison.sh | 156 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 77 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 79 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 104 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 106 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 124 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 126 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 168 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 170 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 259 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 261 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 286 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 288 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 319 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 321 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 391 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gen_html_comparison.sh | 393 | #------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 295 | # ====================================================================== | COMMENT |
| MEDIUM⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 297 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 166 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 168 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 186 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 188 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 207 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 209 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 231 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 233 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 256 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 260 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 277 | # ====================================================================== | COMMENT |
| MEDIUM | .codebuddy/skills/squash/scripts/replace_branch.py | 280 | # ====================================================================== | COMMENT |
| MEDIUM | src/pagx/svg/SVGExporter.cpp | 2121 | // ── writeTextAsPath ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/svg/SVGExporter.cpp | 2243 | // ── writeTextAsFont ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/svg/SVGExporter.cpp | 2380 | // ── writeText ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 132 | // ── Transform decomposition ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 176 | // ── Shape envelope ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 228 | // ── Lazy build result ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 238 | // ── Shared XML helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 240 | // ── Custom geometry ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 258 | // ── Shape writers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 200 | // ── Bitmap glyphs ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 866 | // ── TextBox group ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 1324 | // ── Element / layer traversal ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 56 | // ── Picture helpers ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 87 | // ── Rasterized picture ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 101 | // ── ImagePattern as p:pic element ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 158 | // ── Color source / gradient ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 391 | // ── Fill / stroke ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTStyleEmitter.cpp | 476 | // ── Effects (shadow) ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/rendering/filters/DisplacementMapFilter.cpp | 308 | // │ │ └─────────────── B -> horizontal modulation | COMMENT |
| MEDIUM⚡ | src/rendering/filters/DisplacementMapFilter.cpp | 309 | // │ └─────────────────────────────── G -> vertical displacement | COMMENT |
| MEDIUM⚡ | src/rendering/filters/DisplacementMapFilter.cpp | 310 | // └─────────────────────────────────────────── R -> horizontal displacement | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | pagx/wechat/wx_demo/BUILD.md | 36 | ### Step 1: 配置环境 | COMMENT |
| LOW⚡ | pagx/wechat/wx_demo/BUILD.md | 46 | ### Step 2: 运行构建 | COMMENT |
| LOW⚡ | pagx/wechat/wx_demo/BUILD.md | 53 | ### Step 3: 验证输出 | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 281 | // Step 2: Layout and embed fonts | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 285 | // Step 3: Export to XML and save as PAGX file | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 294 | // Step 4: Load PAGX file and build layer tree (this is the viewer's actual path) | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1159 | // Step 3: Re-import from XML. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1164 | // Step 4: Verify Document customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1169 | // Step 5: Verify Layer customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1176 | // Step 6: Verify Element customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1188 | // Step 7: Verify SolidColor resource customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1194 | // Step 8: Re-export and re-import to verify consistency. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 263 | // Step 1: Parse SVG to PAGXDocument | COMMENT |
| LOW | test/src/PAGXTest.cpp | 1120 | // Step 1: Create document with customData on various nodes. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 1147 | // Step 2: Export to XML. | COMMENT |
| LOW | test/src/PAGSurfaceTest.cpp | 175 | // Step 1: Set external GL state before PAG rendering | COMMENT |
| LOW⚡ | test/src/PAGSurfaceTest.cpp | 188 | // Step 2: PAG rendering (GLRestorer should save state on lockContext, restore on unlockContext) | COMMENT |
| LOW⚡ | test/src/PAGSurfaceTest.cpp | 195 | // Step 3: Verify GL state is restored after PAG rendering | COMMENT |
| LOW⚡ | playground/pagx-viewer/README.md | 40 | // Step 1: Parse PAGX data without building layers. | COMMENT |
| LOW⚡ | playground/pagx-viewer/README.md | 43 | // Step 2: Get external file paths (e.g., images) referenced by the document. | COMMENT |
| LOW⚡ | playground/pagx-viewer/README.md | 46 | // Step 3: Download each external file and inject it back into the view. | COMMENT |
| LOW⚡ | playground/pagx-viewer/README.md | 53 | // Step 4: Build the layer tree after all external files are loaded. | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 105 | ### Step 1: Assess the current file | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 121 | ### Step 2: Make the edits | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 146 | ### Step 3: Polish & QA | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 231 | ### Step 0: One-time setup | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 269 | ### Step 1: Understand the request | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 284 | ### Step 2: Generate the HTML | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 312 | ### Step 3: Convert to PAGX | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 377 | ### Step 4: Review and iterate | COMMENT |
| LOW⚡ | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 130 | ### Step 1: Confirm the Scope | COMMENT |
| LOW⚡ | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 138 | ### Step 2: Read the libpag Source | COMMENT |
| LOW⚡ | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 145 | ### Step 3: Compare the Docs | COMMENT |
| LOW | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 159 | ### Step 4: Sync the Chinese/English Docs and the XSD | COMMENT |
| LOW | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 167 | ### Step 5: Check Whether a Sample Is Needed | COMMENT |
| LOW | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 185 | ### Step 6: In-Subsection Sample Placement | COMMENT |
| LOW | .codebuddy/skills/pagx/spec/sync_pagx_spec.md | 189 | ### Step 7: Report the Changes | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 47 | ## Step 1: Cleanup | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 64 | ## Step 2: Collect Commits | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 88 | ## Step 3: Analyze & Decide | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 145 | ## Step 4: Build New History | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 160 | ## Step 5: User Confirmation | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 179 | ## Step 6: Replace Branch | COMMENT |
| LOW | .codebuddy/skills/squash/SKILL.md | 216 | ## Step 7: Offer to Push | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 299 | # Step 1: Atomically update the branch ref FIRST, before removing | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 315 | # Step 2: Remove the temporary worktree (branch still exists) | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 325 | # Step 3: Verify the update succeeded | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 349 | # Step 4: Delete the temporary branch (worktree is already removed) | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 355 | # Step 5: Restore upstream tracking if it existed | COMMENT |
| LOW | .codebuddy/skills/cr/references/local-review.md | 17 | ## Step 1: Scope | COMMENT |
| LOW | .codebuddy/skills/cr/references/local-review.md | 52 | ## Step 2: Review | COMMENT |
| LOW | .codebuddy/skills/cr/references/local-review.md | 70 | ## Step 3: Filter | COMMENT |
| LOW | .codebuddy/skills/cr/references/local-review.md | 79 | ## Step 4: Report and fix | COMMENT |
| LOW | .codebuddy/skills/cr/references/local-review.md | 92 | ## Step 5: Checklist evolution | COMMENT |
| LOW | .codebuddy/skills/cr/references/checklist-evolution.md | 7 | ## Step 1: Draft candidates | COMMENT |
| LOW | .codebuddy/skills/cr/references/checklist-evolution.md | 26 | ## Step 2: User confirmation | COMMENT |
| LOW | .codebuddy/skills/cr/references/checklist-evolution.md | 31 | ## Step 3: Insert | COMMENT |
| LOW | .codebuddy/skills/cr/references/pr-review.md | 18 | ## Step 1: Create worktree | COMMENT |
| LOW | .codebuddy/skills/cr/references/pr-review.md | 58 | ## Step 2: Collect diff and context | COMMENT |
| LOW | .codebuddy/skills/cr/references/pr-review.md | 78 | ## Step 3: Review | COMMENT |
| 13 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | test/src/PAGXTest.cpp | 281 | // Step 2: Layout and embed fonts | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 285 | // Step 3: Export to XML and save as PAGX file | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 294 | // Step 4: Load PAGX file and build layer tree (this is the viewer's actual path) | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1159 | // Step 3: Re-import from XML. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1164 | // Step 4: Verify Document customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1169 | // Step 5: Verify Layer customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1176 | // Step 6: Verify Element customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1188 | // Step 7: Verify SolidColor resource customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 1194 | // Step 8: Re-export and re-import to verify consistency. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 263 | // Step 1: Parse SVG to PAGXDocument | COMMENT |
| LOW | test/src/PAGXTest.cpp | 1120 | // Step 1: Create document with customData on various nodes. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 1147 | // Step 2: Export to XML. | COMMENT |
| LOW | test/src/PAGSurfaceTest.cpp | 175 | // Step 1: Set external GL state before PAG rendering | COMMENT |
| LOW⚡ | test/src/PAGSurfaceTest.cpp | 188 | // Step 2: PAG rendering (GLRestorer should save state on lockContext, restore on unlockContext) | COMMENT |
| LOW⚡ | test/src/PAGSurfaceTest.cpp | 195 | // Step 3: Verify GL state is restored after PAG rendering | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 299 | # Step 1: Atomically update the branch ref FIRST, before removing | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 315 | # Step 2: Remove the temporary worktree (branch still exists) | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 325 | # Step 3: Verify the update succeeded | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 349 | # Step 4: Delete the temporary branch (worktree is already removed) | COMMENT |
| LOW⚡ | .codebuddy/skills/squash/scripts/replace_branch.py | 355 | # Step 5: Restore upstream tracking if it existed | COMMENT |
| LOW | src/renderer/GlyphRunRenderer.cpp | 215 | // Step 1: Compute the final matrix for each glyph (source transform × inverseMatrix). | COMMENT |
| LOW⚡ | src/renderer/GlyphRunRenderer.cpp | 275 | // Step 2: Classify all glyph matrices to find the most compact positioning mode. | COMMENT |
| LOW⚡ | src/renderer/GlyphRunRenderer.cpp | 284 | // Step 3: Write glyphs into the TextBlob with the determined mode. | COMMENT |
| LOW | src/renderer/GlyphRunRenderer.cpp | 306 | // Step 1: Compute the final matrix for each glyph. | COMMENT |
| LOW⚡ | src/renderer/GlyphRunRenderer.cpp | 321 | // Step 2: Classify all glyph matrices to find the most compact positioning mode. | COMMENT |
| LOW⚡ | src/renderer/GlyphRunRenderer.cpp | 330 | // Step 3: Write glyphs into the TextBlob with the determined mode. | COMMENT |
| LOW | src/cli/CommandVerify.cpp | 3034 | // Step 1: Resolve all import directives in the file (full file, idempotent). | COMMENT |
| LOW | src/cli/CommandVerify.cpp | 3045 | // Step 2: Load document and compute layout. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pagx/wechat/ts/wx-system-info.ts | 86 | function getDeviceBenchmarkInfoNativeAsync(): Promise<{ | CODE |
| LOW | pagx/wechat/ts/pagx-check.ts | 542 | function countPathDataWithExpansion(root: XmlNode): number { | CODE |
| LOW | tools/html-snapshot/lib/icon-font.ts | 334 | async function browserCollectFontFaceMap(): Promise<Record<string, FontFaceEntry[]>> { | CODE |
| LOW | tools/html-snapshot/lib/icon-font.ts | 358 | async function browserCollectIconFontTargets(): Promise<IconFontTarget[]> { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 491 | export function pagxResolveCapturedTransformOrigin( | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 960 | export function pagxResolveClipNoneSamples( | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 1034 | export function pagxElementUsesStepTiming(el: Element): boolean { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 1562 | export function pagxBuildCanonicalAnimation( | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 1640 | export function pagxTransitionDescriptorFromBags( | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 1800 | export function pagxSettleAndInlineCanvases(settleBudgetMs: number): { count: number } { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 2556 | export function pagxMeasureGlobalDurationMs(): number { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 2634 | export function pagxCaptureAnimeInstances(): void { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 3630 | export function buildAnimationCapturePayload(opts: { | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 3647 | export async function capturePagxAnimationsOnPage( | CODE |
| LOW | tools/html-snapshot/lib/animation-capture.ts | 3692 | export async function settleAndInlineCanvasesOnPage( | CODE |
| LOW | tools/html-snapshot/lib/snapshot-runner.ts | 129 | export function makeResourceCacheRouteHandler( | CODE |
| LOW | tools/html-snapshot/lib/snapshot-runner.ts | 150 | export function makeResourceCacheListener( | CODE |
| LOW | tools/html-snapshot/lib/snapshot-runner.ts | 297 | async function resettleAfterViewportRevert(page: any): Promise<void> { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 734 | function hasHiddenAnimatedAncestor(el) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1036 | function normalizeEmptyImagePlaceholders(root) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1097 | function restoreEmptyImagePlaceholders(root) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1405 | function appendBackgroundImageFitting(parts, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1918 | function isCssBorderTrianglePattern(el, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 2537 | function boundarySpacePreservation(textNode, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 3514 | function isIntrinsicWidthInlineRunChild(el) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 3553 | function isInlineTextLeafCandidate(el, computed, precomputedHasChildren) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 4222 | function isIntrinsicInlineContentWidth(el, computed, rect, opts) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 5794 | async function materializeDecorativePseudoElements() { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 6204 | function expandStickyScrollytelling() { | CODE |
| LOW | playground/pagx-player/src/editor/index.ts | 79 | function ensureEditorStylesInjected(): void { | CODE |
| LOW | playground/pagx-preview/scripts/prebuild.js | 161 | function buildUpstreamDependencies({ release, mt }) { | CODE |
| LOW | web/lite/src/base/time-range.ts | 79 | export function convertFrameByStaticTimeRanges(timeRanges: Array<TimeRange>, frame: number): number { | CODE |
| LOW | ohos/hvigorfile.ts | 11 | function overrideSigningConfigIfNeeded() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | test/gen_html_comparison.py | 172 | if (found && location.hash !== '#' + id) { | CODE |
| HIGH⚡ | test/gen_html_comparison.py | 173 | history.replaceState(null, '', '#' + id); | CODE |
| HIGH⚡ | test/gen_html_comparison.py | 181 | history.pushState(null, '', '#' + id); | CODE |
| HIGH | .codebuddy/skills/squash/scripts/replace_branch.py | 15 | - upstream_remote: original upstream remote name (or null) | STRING |
| HIGH | .codebuddy/skills/squash/scripts/replace_branch.py | 16 | - upstream_merge: original upstream merge ref (or null) | STRING |
| HIGH | .codebuddy/skills/squash/scripts/build_history.py | 15 | - upstream_remote: original upstream remote name (or null) | STRING |
| HIGH | .codebuddy/skills/squash/scripts/build_history.py | 16 | - upstream_merge: original upstream merge ref (or null) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/html-snapshot/bench/run-native.sh | 27 | # (mirrors the eval/ harness — every run gets its own | COMMENT |
| MEDIUM | tools/html-snapshot/bench/run-bench.sh | 12 | # (mirrors the eval/ harness — every run gets its own | COMMENT |
| MEDIUM | test/src/PAGXRuntimeTest.cpp | 885 | // (seamless loop t == duration equals t == 0). | COMMENT |
| MEDIUM | src/pagx/html/importer/HTMLValueParser.cpp | 772 | // to exactly one `periodPx`-tall (or wide) span in the layer, keeping the repeat seamless and the | COMMENT |
| MEDIUM | src/pagx/html/importer/HTMLCssCascade.cpp | 288 | // Ensure the declaration block is terminated so re-parsing stays robust. | COMMENT |
| MEDIUM | src/pagx/html/importer/HTMLElementEmitter.cpp | 1384 | // blend is the more robust of the two here: a non-Normal blend renders the subtree into an | COMMENT |
| MEDIUM | src/pagx/ppt/PPTContourUtils.cpp | 74 | // approximation, this is robust to paths with few high-curvature curves. | COMMENT |
| MEDIUM | src/pagx/ppt/PPTContourUtils.cpp | 158 | // midpoint makes the ContourInsideContour fallback robust for high-curvature | COMMENT |
| MEDIUM | src/renderer/LayerBuilder.cpp | 3420 | // subtree build so it is robust even if TextBoxes were ever nested. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .codebuddy/skills/squash/scripts/resolve_scope.py | 81 | except OSError: | CODE |
| HIGH | .codebuddy/skills/squash/scripts/replace_branch.py | 352 | except GitError: | CODE |
| HIGH | .codebuddy/skills/squash/scripts/replace_branch.py | 364 | except GitError: | CODE |
| HIGH | .codebuddy/skills/squash/scripts/build_history.py | 291 | except GitError: | CODE |
| HIGH | .codebuddy/skills/squash/scripts/build_history.py | 295 | except GitError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/html-snapshot/bench/run-native.sh | 22 | # Usage: | COMMENT |
| LOW | tools/html-snapshot/bench/run-bench.sh | 7 | # Usage: | COMMENT |
| LOW | tools/html-snapshot/bench/run-cases.sh | 17 | # Usage: | COMMENT |
| LOW | test/run_html_eval.sh | 23 | # Usage: | COMMENT |
| LOW⚡ | test/gen_html_comparison.sh | 45 | # Usage: | COMMENT |
| LOW | cli/npm/pack.sh | 35 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .codebuddy/skills/squash/scripts/resolve_scope.py | 37 | CODE | |
| LOW | .codebuddy/skills/squash/scripts/format_report.py | 31 | CODE | |
| LOW | .codebuddy/skills/squash/scripts/collect_commits.py | 87 | CODE | |
| LOW | .codebuddy/skills/squash/scripts/collect_commits.py | 182 | CODE | |
| LOW | .codebuddy/skills/squash/scripts/build_history.py | 120 | CODE | |
| LOW | .codebuddy/skills/squash/scripts/build_history.py | 276 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1136 | return (el.value || el.getAttribute('placeholder') || '').trim(); | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1141 | return (el.value || el.getAttribute('placeholder') || '').trim(); | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 3238 | const placeholderColor = (!el.value && el.getAttribute('placeholder')) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/pagx/ppt/PPTWriter.h | 913 | // scaffold that both native-text and TextBox shape frames share. The caller | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/gen_html_comparison.py | 21 | CODE |