The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms.
This report presents the forensic synthetic code analysis of Tencent/libpag, a HTML project with 5,743 GitHub stars. SynthScan v2.0 examined 443,638 lines of code across 2621 source files, recording 2273 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 5.6 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 2273 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | } | COMMENT |
| LOW | tools/html-snapshot/server.js | 461 | // cookies: [{ name, value }] only — anything else is dropped (validators | 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 |
| 2010 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 | 2125 | // ── writeTextAsPath ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/svg/SVGExporter.cpp | 2246 | // ── writeTextAsFont ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/svg/SVGExporter.cpp | 2383 | // ── writeText ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 133 | // ── Transform decomposition ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 177 | // ── Shape envelope ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 232 | // ── Lazy build result ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 242 | // ── Shared XML helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/pagx/ppt/PPTExporter.cpp | 244 | // ── Custom geometry ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTExporter.cpp | 262 | // ── Shape writers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 133 | // ── Bitmap glyphs ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 785 | // ── TextBox group ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pagx/ppt/PPTTextWriter.cpp | 1210 | // ── 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 | 279 | // Step 2: Layout and embed fonts | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 283 | // Step 3: Export to XML and save as PAGX file | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 292 | // Step 4: Load PAGX file and build layer tree (this is the viewer's actual path) | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 851 | // Step 3: Re-import from XML. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 856 | // Step 4: Verify Document customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 861 | // Step 5: Verify Layer customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 868 | // Step 6: Verify Element customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 880 | // Step 7: Verify SolidColor resource customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 886 | // Step 8: Re-export and re-import to verify consistency. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 261 | // Step 1: Parse SVG to PAGXDocument | COMMENT |
| LOW | test/src/PAGXTest.cpp | 812 | // Step 1: Create document with customData on various nodes. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 839 | // 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 | 101 | ### Step 1: Assess the current file | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 117 | ### Step 2: Make the edits | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 142 | ### Step 3: Polish & QA | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 212 | ### Step 0: One-time setup | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 250 | ### Step 1: Understand the request | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 265 | ### Step 2: Generate the HTML | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 283 | ### Step 3: Convert to PAGX | COMMENT |
| LOW | .codebuddy/skills/pagx/SKILL.md | 339 | ### 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 | 279 | // Step 2: Layout and embed fonts | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 283 | // Step 3: Export to XML and save as PAGX file | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 292 | // Step 4: Load PAGX file and build layer tree (this is the viewer's actual path) | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 851 | // Step 3: Re-import from XML. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 856 | // Step 4: Verify Document customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 861 | // Step 5: Verify Layer customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 868 | // Step 6: Verify Element customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 880 | // Step 7: Verify SolidColor resource customData. | COMMENT |
| LOW⚡ | test/src/PAGXTest.cpp | 886 | // Step 8: Re-export and re-import to verify consistency. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 261 | // Step 1: Parse SVG to PAGXDocument | COMMENT |
| LOW | test/src/PAGXTest.cpp | 812 | // Step 1: Create document with customData on various nodes. | COMMENT |
| LOW | test/src/PAGXTest.cpp | 839 | // 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 | 2986 | // Step 1: Resolve all import directives in the file (full file, idempotent). | COMMENT |
| LOW | src/cli/CommandVerify.cpp | 2997 | // Step 2: Load document and compute layout. | COMMENT |
| 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 | src/pagx/html/importer/HTMLValueParser.cpp | 723 | // to exactly one `periodPx`-tall (or wide) span in the layer, keeping the repeat seamless and the | 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 | 3237 | // subtree build so it is robust even if TextBoxes were ever nested. | 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 | 231 | async function browserCollectFontFaceMap(): Promise<Record<string, ParsedSrc>> { | CODE |
| LOW | tools/html-snapshot/lib/icon-font.ts | 255 | async function browserCollectIconFontTargets(): Promise<IconFontTarget[]> { | CODE |
| LOW | tools/html-snapshot/lib/snapshot-runner.ts | 120 | export function makeResourceCacheRouteHandler( | CODE |
| LOW | tools/html-snapshot/lib/snapshot-runner.ts | 141 | export function makeResourceCacheListener( | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 659 | function appendBackgroundImageFitting(parts, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1153 | function isCssBorderTrianglePattern(el, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 1724 | function boundarySpacePreservation(textNode, computed) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 2630 | function isInlineTextLeafCandidate(el, computed, precomputedHasChildren) { | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 4271 | async function materializeDecorativePseudoElements() { | 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 |
|---|---|---|---|---|
| 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 | 516 | return (el.value || el.getAttribute('placeholder') || '').trim(); | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 521 | return (el.value || el.getAttribute('placeholder') || '').trim(); | CODE |
| LOW | tools/html-snapshot/lib/browser-snapshot.ts | 2352 | const placeholderColor = (!el.value && el.getAttribute('placeholder')) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/pagx/ppt/PPTWriter.h | 930 | // 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 |