feat(perf): 构建性能量化系统与优化工作流#156
Open
wuqie-xuanzhao wants to merge 16 commits into
Open
Conversation
治理入口里同时存在极简速查和极简工作流,内容重复且容易漂移;提交前也需要明确受保护分支下的默认协作路径。 ## docs - 将 AGENTS.md / CLAUDE.md 的极简速查内容合并到单一极简工作流。 - 在提交前规则中补充受保护分支默认走分支和 PR 的路径。 - 同步 git-workflow.md 中的受保护分支说明。 ## test - git diff --check - python qmclient_scripts/gate/check_docs.py --sync-only --prefer agents - python qmclient_scripts/gate/check_docs.py
run_cxx_tests 需要在 build 目录执行,避免 CTestInfo 的 tmp/tests 产物落到仓库根;源码结构测试则需要显式源码根读取 src/... 和 data/... 文件。 ## fix - 为 testrunner 注入 DDNET_TEST_SOURCE_DIR,并让 run_cxx_tests 显式以 PROJECT_BINARY_DIR 为工作目录。 - 将 gate 的 C++ 测试入口改为 run_cxx_tests,避免直接运行 testrunner 绕过目标工作目录语义。 ## test - 增加 TestSourcePath / ReadTestSourceFile,并迁移源码结构测试读取路径。 - 暂时跳过两个已知 i18n 约束测试,保留为后续中文源 key 计划项。 ## docs - 更新验证文档和脚本概览中的 run_cxx_tests 命令说明。 ## verification - python qmclient_scripts/gate/check_docs.py --sync-only --prefer agents - python qmclient_scripts/gate/check_docs.py - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14: 1175 passed / 2 skipped / 0 failed - python qmclient_scripts/gate/check_gate.py --mode quick --base-ref main: pass, with local main ref warning
提交当前工作区剩余改动,包含 Axiom 自动登录组件拆分、脚本治理入口迁移、配置结构清理和资源生成产物更新。 ## feat - 将 Axiom 自动登录逻辑迁移到 QmClient 组件,并从 TClient 侧移除对应状态和处理路径。 ## chore - 新增 QmClient 自有检查脚本和 icon atlas 构建脚本,更新 gate 检查、严格构建和 workflow 相关入口。 - 删除 config_variables_qmclient_extra.h,将相关配置迁移回主配置头。 ## docs - 补充 qmclient_scripts 与上游 scripts 的边界说明。 ## test - 更新源码结构测试对 Axiom 自动登录组件位置和 i18n 后续约束的预期。 ## assets - 更新输入覆盖图、GUI logo 和 QmClient icon atlas 资源。 ## verification - 沿用上一提交前已跑的 check_docs、run_cxx_tests 和 quick gate 验证;本提交为剩余工作区整体提交,未单独重跑完整验证。
QmClient 组件目录已从平铺结构拆出 voice、translate、hud_notifications 和 monitoring 分组,降低根目录噪声并保持对外组件入口稳定。 ## refactor - 移动 voice、translate、hud_notifications、monitoring 相关源码到子目录 - 同步 CMake 源文件列表、gameclient.h 和测试 include 路径 - 保留 perf_logging.h 在 qmclient 根目录作为跨组件共享工具 ## docs - 增加 components-modularization 探索记录,说明迁移边界和后续不混入菜单拆分 ## test - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14 - python qmclient_scripts/gate/check_gate.py --mode quick --report-json-path tmp/check-gate-precommit-report.json
问题/背景:性能量化系统需要从 MVP 报表推进到可用于生产排查的采集、摘要、质量判断和对比基线。此前空 frame-time 样本还可能被叙事误判为性能良好,审查发现后已修复。 FEAT: 增加 report quality、operation signature、summary JSON、页面性能归因、Section Top-10 和自动 baseline 对比提示。 FEAT: 为设置页、demo browser、server browser、section cache、work drain 等路径补充可归因 perf telemetry。 FIX: 空 frame-time 样本返回 WARN,并输出不可判断说明,避免生成 PASS/性能表现良好。 TEST: 扩展 perf TypeScript 测试和 C++ 源码断言,覆盖采样偏差、空样本、归因字段、section dirty reason 与摘要序列化。 DOCS: 更新性能量化 spec、生产化计划、固定采集场景与代码审查记录。
问题/背景:当前仓库远程主分支是 master,gate 默认硬编码 main 会让未显式传 --base-ref 的命令在主线一致时仍可能取错差异基线。 FIX: check_gate 和 strict_build 在未传 base-ref 时解析 origin/HEAD,并按 origin/master、origin/main、master、main 回退。 DOCS: 更新 verification、git workflow 和 scripts overview 中的 gate 命令示例,默认不再要求手写 --base-ref main。
问题/背景:性能量化系统已经从 MVP 进入生产级方向,后续性能优化、重构、安全、特性引入、内存管理和观测排查需要稳定的专项工作流规则。 DOCS: 在 docs/ai-workflow/advanced/ 下新增专项路由和性能系统、性能优化、重构、安全、特性引入、内存生命周期、线程 jobs、观测调试、回归防护规则。 DOCS: 更新 meta、AGENTS 和 CLAUDE 入口,说明 advanced 只作为按风险触发的补充规则。 DOCS: 归档 fuck-u-code 扫描与重构机会分析,作为后续重构工作流参考资料。
问题/背景:前序格式检查留下了两个测试文件的 include 顺序、空行和宏列表缩进调整,未与功能提交合并。 TEST: 单独提交 qm_hud_notifications_test 与 translate_llm_parse_test 的源码格式整理。
自动 check 同时卡在 style 和 clang-tidy:style 在 CI 已安装 clang-format-22 时仍只探测 clang-format-20;clang-tidy 全量构建命中了图像缩放局部常量命名规则。 ## fix - 让 fix_style.py 能探测 clang-format-20 到 clang-format-30 的版本化二进制。 - 将 ResizeImage 内的采样坐标局部常量改为符合 clang-tidy 常量命名规则的 U/V。 ## test - python qmclient_scripts/gate/check_docs.py - python qmclient_scripts/gate/check_gate.py --mode quick --report-json-path tmp/check-gate-ci-fix-report.json - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14
自动检查暴露了两类问题:sanitizer 测试目标链接 race.cpp 时会在 UBSan/vptr 下拉入 CGameClient RTTI,clang-tidy 22 也会把新成员命名规则作为 error。 ## fix - 将 CRaceHelper 的纯完赛时间解析实现拆到 race_parse.cpp,让 testrunner 只链接解析逻辑,避免 sanitizer 测试目标依赖完整客户端 RTTI。 - 调整 settings section/warmup 新增布尔成员命名,并把 SColorKey 改为数据结构体,满足 clang-tidy identifier-naming 规则。 ## test - python qmclient_scripts/gate/check_gate.py --mode quick --report-json-path tmp/check-gate-auto-check-fix-report.json:10 pass / 0 warning / 0 fail - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14:1180 run / 1178 passed / 2 skipped
自动检查仍有 clang-tidy 命名错误,以及 KCP 第三方 C 实现触发 UBSan null 类报告。 ## fix - 将 OpenGL render target 状态成员和设置页、粒子、IME 局部常量改为符合 clang-tidy 命名规则的形式。 - 对外部 KCP 实现补充 UBSan null suppression,避免第三方 intrusive-list 写法阻断 sanitizer job。 - 对本轮触碰的粒子和 IME 文件执行 clang-format 22,满足 quick gate 的格式检查。 ## test - python qmclient_scripts\\gate\\check_gate.py --mode quick --report-json-path tmp\\check-gate-ci-followup-report.json - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14
sanitizer Linux 环境下 PRIu64 的展开和 Windows 不同,源码扫描测试不能依赖平台相关宏拼接结果。 ## test - 将皮肤性能日志字段断言拆成稳定字段片段,保留对关键 request window / list drain 字段的覆盖。 - cmake-build-release\\testrunner.exe --gtest_filter=Skins.TeeSettingsListEmitsRequestWindowPerfLogs - python qmclient_scripts\\gate\\check_gate.py --mode quick --report-json-path tmp\\check-gate-ci-followup-2-report.json - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14
CI clang-tidy 在 QmUi 局部常量命名和地图预览裁剪路径上仍有阻断诊断,本提交只处理这些自动检查失败点。 ## fix - 按 DDNet/QmClient 命名规则重命名 QmAnim、QmAnimResolve 和 UiNavigation 中被 clang-tidy 标为错误的局部变量。 - 在地图预览透明边裁剪后拒绝零尺寸结果,避免静态分析器走到 malloc(0) 路径。 - 按项目 fix_style.py 对触碰文件应用必需格式化。 ## test - python qmclient_scripts\\gate\\check_gate.py --mode quick --report-json-path tmp\\check-gate-ci-followup-3-report.json - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14
当前 clang-tidy 会把 readability-identifier-naming 作为 error,导致 DDNet 风格局部命名阻断 PR。 ## ci - 保留 readability-identifier-naming 检查输出,但不再通过 WarningsAsErrors 让命名风格失败阻断。 - 让 clang-tidy 更聚焦编译错误、bugprone、clang-analyzer 和安全相关诊断。 ## test - python qmclient_scripts\\gate\\check_gate.py --mode quick --report-json-path tmp\\check-gate-ci-followup-4-report.json - qmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14
wxj881027
approved these changes
Jun 10, 2026
There was a problem hiding this comment.
Pull request overview
This PR establishes a more production-grade performance quantification pipeline in QmClient by expanding perf telemetry coverage in the client and upgrading the qmclient_scripts/perf analyzer/report workflow, alongside a broader component/module reshaping (notably under qmclient/*) and gate/script hardening.
Changes:
- Add/standardize perf telemetry events and fields (page switch, list frame, section dirty reason + text container reuse stats, work drain), plus a shared duration gating helper.
- Improve perf analysis tooling: parsing diagnostics, quality warnings, operation signature, and summary JSON outputs for bundles/archives.
- Refactor/relocate multiple QmClient modules (voice/translate/monitoring/hud_notifications) and update tests/build/gate/docs accordingly.
Reviewed changes
Copilot reviewed 135 out of 145 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| ubsan.supp | Add UBSan suppression for ikcp.c. |
| src/test/voice_core_test.cpp | Update voice include paths and make source-file reads robust via TestSourcePath. |
| src/test/translate_llm_parse_test.cpp | Update translate parse include path. |
| src/test/test.h | Add TestSourcePath/ReadTestSourceFile helpers for tests. |
| src/test/test.cpp | Implement test source path + file reader with DDNET_TEST_SOURCE_DIR. |
| src/test/render_target_test.cpp | Replace ad-hoc file reading with shared test helper. |
| src/test/QmIconAtlasTest.cpp | Replace ad-hoc file reading with shared test helper. |
| src/test/qmclient_monitoring_test.cpp | Add perf threshold test and update file reads to be source-root based; validate new telemetry strings. |
| src/test/qm_new_ui_menu_branch_test.cpp | Use shared file reader; skip two tests with explicit rationale; update Axiom auto-login assertions. |
| src/test/qm_hud_notifications_test.cpp | Update hud_notifications includes to new folder layout; adjust literals indentation. |
| src/test/assets_preview_scale_test.cpp | Use TestSourcePath for stable source reads. |
| src/game/map/map_preview_common.cpp | Add guard for zero-size crop results in CropClearColorBorder. |
| src/game/client/ui.h | Extend DoLabelStreamed API with optional “text container recreated” out param. |
| src/game/client/ui.cpp | Implement DoLabelStreamed out-param reporting for text container recreation. |
| src/game/client/race.cpp | Remove race finish-time parsing helpers (moved). |
| src/game/client/race_parse.cpp | New file containing extracted race finish-time parsing helpers. |
| src/game/client/QmUi/UiNavigation.cpp | Formatting/renaming and minor refactors in UI widget helpers. |
| src/game/client/QmUi/QmAnimResolve.cpp | Rename constants/locals for consistency; keep cache pruning behavior. |
| src/game/client/QmUi/QmAnim.cpp | Formatting + naming consistency adjustments in easing/spring code. |
| src/game/client/gameclient.h | Add CQmAxiomAutoLogin component; update qmclient module includes. |
| src/game/client/gameclient.cpp | Register new component; remove legacy HUD alias migration/chains. |
| src/game/client/components/tclient/tclient.h | Remove Axiom auto-login state/functions (moved to QmClient component). |
| src/game/client/components/tclient/menus_tclient.cpp | Rename settings section cache flags; adjust session cache validity field. |
| src/game/client/components/skins.h | Change nested SColorKey to struct (equivalent default visibility). |
| src/game/client/components/settings_warmup.h | Rename m_b* fields to clearer names. |
| src/game/client/components/settings_warmup.cpp | Apply renamed warmup scheduler fields. |
| src/game/client/components/section_loader.h | Add UNKNOWN dirty reason; expose dirty reason name helper; extend cached draw API. |
| src/game/client/components/qmclient/voice/voice_utils.h | Update header guard to new folder-based naming. |
| src/game/client/components/qmclient/voice/voice_core.h | Update header guard naming. |
| src/game/client/components/qmclient/voice/voice_core.cpp | Fix include path to qmclient.h after module reshuffle. |
| src/game/client/components/qmclient/voice/voice_component.h | Update header guard naming. |
| src/game/client/components/qmclient/voice/voice_capture_pipeline.h | Update header guard naming. |
| src/game/client/components/qmclient/translate/translate.h | Update header guard naming. |
| src/game/client/components/qmclient/translate/translate_ui_settings.h | New header in translate subdir. |
| src/game/client/components/qmclient/translate/translate_ui_settings.cpp | Move include to top; keep translate settings UI logic. |
| src/game/client/components/qmclient/translate/translate_parse.h | Update header guard naming. |
| src/game/client/components/qmclient/translate/translate_parse.cpp | Minor formatting include spacing. |
| src/game/client/components/qmclient/translate_ui_settings.h | Delete old translate UI settings header (moved into subdir). |
| src/game/client/components/qmclient/qmclient.cpp | Remove unused keyword-reply migration helper. |
| src/game/client/components/qmclient/perf_logging.h | Add QmPerfShouldLogDuration; use it in QmPerfLogStage. |
| src/game/client/components/qmclient/monitoring/monitoring.h | Update header guard naming; adjust formatting. |
| src/game/client/components/qmclient/monitoring/monitoring.cpp | Fix perf_logging include path after module move. |
| src/game/client/components/qmclient/monitoring_device_perf.cpp | Remove old path version (moved under monitoring/). |
| src/game/client/components/qmclient/menus_qmclient.cpp | Update translate settings include path; route streamed labels via wrapper in key places. |
| src/game/client/components/qmclient/hud_notifications/hud_notifications.h | Adjust includes after folder move; update header guard and include paths. |
| src/game/client/components/qmclient/hud_notifications/hud_notifications.cpp | Minor formatting include spacing. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_static_upstream_rules.h | Update header guard naming. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_static_rules.h | Update header guard naming. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_static_alias_rules.h | Update header guard naming. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_rules.h | Update header guard naming. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_rules.cpp | Include ordering; macro formatting normalization. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_catalog.h | Update header guard naming. |
| src/game/client/components/qmclient/hud_notifications/hud_notification_catalog.cpp | New catalog metadata table + helpers with static_assert sync checks. |
| src/game/client/components/qmclient/axiom_auto_login.h | New QmClient component for Axiom auto-login state/logic. |
| src/game/client/components/menus.h | Add DoSettingsLabelStreamed helper and perf stats struct; extend cache draw API. |
| src/game/client/components/menus.cpp | Implement DoSettingsLabelStreamed; enrich page switch telemetry; propagate dirty reason from cache. |
| src/game/client/components/menus_settings.cpp | Add section perf logging incl. dirty reason + text reuse stats; enrich settings page perf payload; revise work_drain summary event. |
| src/game/client/components/menus_ingame.cpp | Switch Axiom community checks to new m_QmAxiomAutoLogin. |
| src/game/client/components/menus_demo.cpp | Add demo browser list-frame perf telemetry (rows visible/processed/skipped, dur). |
| src/game/client/components/menus_browser.cpp | Add server browser list-frame perf telemetry with richer counters and duration gating. |
| src/game/client/components/chat.h | Update hud_notifications include path. |
| src/engine/shared/config_variables.h | Remove legacy config macros for old scoreboard/SMTC/miniview. |
| src/engine/shared/config_variables_tclient.h | Remove waterfall/sidebar legacy configs. |
| src/engine/shared/config_variables_qmclient.h | Remove several legacy/unused configs; keep core qmclient configs. |
| src/engine/gfx/image_manipulation.cpp | Rename u/v to U/V (no logic change). |
| src/engine/client/client.cpp | Include reordering; refactor connect-link parsing flow. |
| src/engine/client/backend/opengl/backend_opengl.h | Rename m_bRenderTargetActive to m_RenderTargetActive. |
| src/engine/client/backend/opengl/backend_opengl.cpp | Apply renamed render-target active flag. |
| scripts/fix_style.py | Improve clang-format discovery by trying more versioned binaries. |
| qmclient_scripts/scripts_overview.md | Clarify scripts/ vs qmclient_scripts/ boundary; update gate command examples and test notes. |
| qmclient_scripts/perf/tsconfig.json | Enable TS extension imports; set noEmit; include test.ts. |
| qmclient_scripts/perf/README.md | Document production usage conventions, fixed scenarios link, and expanded report contents. |
| qmclient_scripts/perf/lib/quality.ts | New quality + summary bundle generation utilities (warnings, attribution top-N). |
| qmclient_scripts/perf/lib/quality_core.ts | New operation signature + comparability checker. |
| qmclient_scripts/perf/lib/parse.ts | Add parseLogWithDiagnostics producing entries + invalid line counts. |
| qmclient_scripts/perf/analyze.ts | Use diagnostics-aware parsing; generate HTML + summary JSON (archive + bundle canonical name). |
| qmclient_scripts/languages_qmclient/migrate_chinese_keys_to_english.py | Formatting-only refactors for readability. |
| qmclient_scripts/languages_qmclient/extract_strings.py | Update paths for moved qmclient files; formatting-only refactors. |
| qmclient_scripts/gate/lib/scope.py | Default base ref selection (origin/HEAD then fallbacks); accept base_ref=None. |
| qmclient_scripts/gate/checks/tests.py | Run run_cxx_tests target; warn if tests skipped; unify job count. |
| qmclient_scripts/gate/checks/style.py | Use qmclient_scripts/fix_style.py instead of root scripts/. |
| qmclient_scripts/gate/checks/strict_build.py | Add analyzer warning filtering to changed lines; base ref defaulting; bump build parallelism. |
| qmclient_scripts/gate/checks/identifiers.py | Downgrade high-noise naming checks to WARN and summarize output. |
| qmclient_scripts/gate/checks/headers.py | Use qmclient_scripts copies of header guard/unused-header scripts. |
| qmclient_scripts/gate/checks/dilate.py | Build dilate tool in dedicated build dir; run qmclient dilate checker; support Windows cmd wrapper. |
| qmclient_scripts/gate/checks/clang_tidy_warn.py | Skip non-TU files; add header-filter suppression; log skipped files. |
| qmclient_scripts/gate/check_gate.py | Make --base-ref optional and auto-selected when absent. |
| qmclient_scripts/fix_style.py | Expand C/C++ suffix list; accept explicit file list; improve clang-format discovery. |
| qmclient_scripts/check_unused_header_files.py | New unused-header checker script (used by gate). |
| qmclient_scripts/check_header_guards.py | Remove guard overrides; relax initial-line scanning to tolerate indentation/whitespace. |
| qmclient_scripts/check_dilate.py | New dilate checking script used by workflow/gate. |
| qmclient_scripts/check_config_variables.py | Expand “used” detection regex to include console registration/execute usage. |
| docs/superpowers/explore/2026-06-09-性能量化固定场景.md | New fixed-scenario document for perf comparisons. |
| docs/ai-workflow/verification.md | Update C++ test invocation to run_cxx_tests; update gate examples. |
| docs/ai-workflow/meta.md | Document advanced/ routing and stability intent. |
| docs/ai-workflow/git-workflow.md | Update verification example; add protected-branch default workflow note. |
| docs/ai-workflow/advanced/threading-jobs.md | New advanced workflow doc (threading/jobs). |
| docs/ai-workflow/advanced/safety-security.md | New advanced workflow doc (security/data boundaries). |
| docs/ai-workflow/advanced/regression-prevention.md | New advanced workflow doc (regression prevention). |
| docs/ai-workflow/advanced/refactor-workflow.md | New advanced workflow doc (refactor boundaries). |
| docs/ai-workflow/advanced/README.md | New advanced workflow index/routing doc. |
| docs/ai-workflow/advanced/performance-workflow.md | New advanced workflow doc (performance optimization). |
| docs/ai-workflow/advanced/perf-system-workflow.md | New advanced workflow doc (perf system evolution). |
| docs/ai-workflow/advanced/observability-debugging.md | New advanced workflow doc (observability/debug bundles). |
| docs/ai-workflow/advanced/memory-lifetime.md | New advanced workflow doc (memory/lifetime). |
| docs/ai-workflow/advanced/feature-introduction.md | New advanced workflow doc (feature introduction). |
| CMakeLists.txt | Update data sync target; move qm scripts to qmclient_scripts; include moved sources; add DDNET_TEST_SOURCE_DIR; run tests from build dir. |
| CLAUDE.md | Align workflow guidance and add advanced/ routing reference. |
| AGENTS.md | Align workflow guidance and add advanced/ routing reference. |
| .github/workflows/style.yml | Use qmclient_scripts/check_dilate.py in CI. |
| .clang-tidy | Stop treating readability-identifier-naming as Werror. |
Comment on lines
+15
to
+21
| for root, _, files in os.walk(directory): | ||
| for file in files: | ||
| with open(os.path.join(root, file), "r", encoding="utf-8") as f: | ||
| content = f.read() | ||
| for header in header_files: | ||
| if header in content: | ||
| used_files.add(header) |
Comment on lines
+1
to
+23
| import { basename } from 'node:path'; | ||
|
|
||
| import type { PerfEntry } from './parse.ts'; | ||
| import { operationSignature, type OperationSignature } from './quality_core.ts'; | ||
| import { | ||
| BUDGET, | ||
| calcPercentiles, | ||
| detectSpikes, | ||
| inferSamplingThreshold, | ||
| isSamplingBiased, | ||
| pagePerformanceAttribution, | ||
| selectFrameTimeEntries, | ||
| type AttributionEntry, | ||
| type Percentiles, | ||
| type Verdict, | ||
| computeVerdict, | ||
| entryDurationMs, | ||
| } from './stats.ts'; | ||
|
|
||
| export interface ParseDiagnostics { | ||
| totalLines: number; | ||
| invalidLines: number; | ||
| } |
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.
Summary
本 PR 现在作为性能量化系统与性能优化的主线 PR:先把页面 / 菜单性能采集、报表量化、质量判断、回归对比和后续优化工作流落到仓库里,再以真实客户端采集数据推进具体性能优化项。
feat
fix
--base-ref时优先使用origin/HEAD,再回退origin/master/origin/main/ 本地分支。docs
docs/ai-workflow/advanced/专项工作流:性能量化系统、性能优化、重构、安全、特性引入、内存生命周期、线程 jobs、观测调试和回归防护。test
Verification
Push-Location qmclient_scripts/perf; npm test; npx tsc --noEmit; Pop-Location,通过python qmclient_scripts/gate/check_docs.py --sync-only --prefer agents; python qmclient_scripts/gate/check_docs.py,通过python qmclient_scripts/gate/check_gate.py --mode quick --report-json-path tmp/check-gate-prepush-report.json,10 pass / 0 warning / 0 failqmclient_scripts/cmake-windows.cmd --build cmake-build-release --target run_cxx_tests -j 14,1180 run / 1178 passed / 2 skippedFollow-up Plan
docs/ai-workflow/advanced/performance-workflow.md做优化前后对比。Risks / Gaps
sort_changed/filter_active/refresh_triggered等字段仍是后续采集合同扩展,不在本阶段内强行补齐。