cann-workbench 0.0.0-stage → 0.0.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +183 -2
  2. package/THIRD_PARTY_NOTICES.md +85 -0
  3. package/cordis.patch.yml +3 -0
  4. package/doctor/LICENSE +202 -0
  5. package/doctor/NOTICE +12 -0
  6. package/doctor/README.md +18 -0
  7. package/lib/client.js +94437 -0
  8. package/lib/index.d.ts +722 -0
  9. package/lib/index.js +33711 -0
  10. package/locale/en.json +6 -0
  11. package/locale/zh.json +6 -0
  12. package/package.json +171 -4
  13. package/skills/asc-tools/tool-ops-tune/INSTALL.md +52 -0
  14. package/skills/asc-tools/tool-ops-tune/LICENSE +38 -0
  15. package/skills/asc-tools/tool-ops-tune/README.md +167 -0
  16. package/skills/asc-tools/tool-ops-tune/SKILL.md +93 -0
  17. package/skills/asc-tools/tool-ops-tune/agent/AGENTS.md +195 -0
  18. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
  19. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
  20. package/skills/asc-tools/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
  21. package/skills/asc-tools/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
  22. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
  23. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
  24. package/skills/asc-tools/tool-ops-tune/docs/ops-tune-design.md +404 -0
  25. package/skills/asc-tools/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +730 -0
  26. package/skills/asc-tools/tool-ops-tune/docs//347/237/245/350/257/206/345/272/223/350/247/204/350/214/203.md +103 -0
  27. package/skills/asc-tools/tool-ops-tune/evals/evals.json +242 -0
  28. package/skills/asc-tools/tool-ops-tune/ops-collect/SKILL.md +146 -0
  29. package/skills/asc-tools/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
  30. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_board.sh +458 -0
  31. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
  32. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
  33. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
  34. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
  35. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1102 -0
  36. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/isolation_test.py +452 -0
  37. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
  38. package/skills/asc-tools/tool-ops-tune/ops-family/SKILL.md +76 -0
  39. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
  40. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
  41. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
  42. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
  43. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
  44. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
  45. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
  46. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
  47. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
  48. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
  49. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
  50. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
  51. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
  52. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/index.md +9 -0
  53. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
  54. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
  55. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
  56. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
  57. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
  58. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
  59. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
  60. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
  61. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
  62. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
  63. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
  64. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
  65. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
  66. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
  67. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
  68. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
  69. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
  70. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
  71. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
  72. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
  73. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
  74. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
  75. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
  76. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
  77. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
  78. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
  79. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
  80. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
  81. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
  82. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
  83. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
  84. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
  85. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
  86. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
  87. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
  88. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
  89. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
  90. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
  91. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
  92. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
  93. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
  94. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +87 -0
  95. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
  96. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
  97. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
  98. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
  99. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
  100. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
  101. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
  102. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
  103. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
  104. package/skills/asc-tools/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
  105. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
  106. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
  107. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
  108. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
  109. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
  110. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
  111. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
  112. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
  113. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
  114. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
  115. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
  116. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
  117. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
  118. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
  119. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
  120. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
  121. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
  122. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
  123. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
  124. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
  125. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
  126. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
  127. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
  128. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
  129. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
  130. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
  131. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
  132. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
  133. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
  134. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
  135. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
  136. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
  137. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
  138. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
  139. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
  140. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
  141. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
  142. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
  143. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
  144. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
  145. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
  146. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
  147. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
  148. package/skills/asc-tools/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
  149. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
  150. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
  151. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
  152. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
  153. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
  154. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
  155. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
  156. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
  157. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
  158. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
  159. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
  160. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
  161. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
  162. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
  163. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
  164. package/skills/asc-tools/tool-ops-tune/ops-report/SKILL.md +77 -0
  165. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/run_evals.py +963 -0
  166. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
  167. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +535 -0
  168. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
  169. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
  170. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
  171. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
  172. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
  173. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
  174. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
  175. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
  176. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
  177. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
  178. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
  179. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
  180. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
  181. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
  182. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
  183. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +466 -0
  184. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
  185. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/delta_compare.py +278 -0
  186. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/render_html.py +304 -0
  187. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
  188. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
  189. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/verdict.py +1094 -0
  190. package/skills/asc-tools/tool-ops-tune/scripts/diff_audit.py +281 -0
  191. package/skills/asc-tools/tool-precision-debug/LICENSE +38 -0
  192. package/skills/asc-tools/tool-precision-debug/README.md +190 -0
  193. package/skills/asc-tools/tool-precision-debug/scripts/install.sh +475 -0
  194. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/LICENSE +38 -0
  195. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/SKILL.md +136 -0
  196. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/evals/evals.json +932 -0
  197. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/baseline.md +69 -0
  198. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/checkpoint-design.md +82 -0
  199. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/dumptensor.md +83 -0
  200. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/hypothesis-experiment.md +114 -0
  201. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/index.md +20 -0
  202. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/localization.md +85 -0
  203. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/numerical-modeling.md +94 -0
  204. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/operator-modeling.md +116 -0
  205. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/progressive-error-analysis.md +86 -0
  206. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reporting.md +140 -0
  207. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reproducibility.md +121 -0
  208. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/semantic-bisection.md +72 -0
  209. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/sensitive-points.md +146 -0
  210. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fp16-promotion-boundary.md +46 -0
  211. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fused-rmsnorm-gelu-residual.md +162 -0
  212. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/index.md +16 -0
  213. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/integer-float-collision.md +44 -0
  214. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/partial-statistics-merge.md +30 -0
  215. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/softplus-v2-grad-family.md +156 -0
  216. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/sync-dataflow-handshake.md +89 -0
  217. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/tail-valid-region-state.md +30 -0
  218. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/thnn-fused-gru-bias-reduction.md +73 -0
  219. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/index.md +34 -0
  220. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/accumulation-order.md +108 -0
  221. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/algorithm-parameter-contract.md +118 -0
  222. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/buffer-lifetime-alias.md +133 -0
  223. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/cast-rounding.md +76 -0
  224. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/complex-operator-boundary.md +48 -0
  225. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/data-movement-alignment.md +104 -0
  226. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/golden-host-contract.md +84 -0
  227. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index-address-ownership.md +57 -0
  228. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index.md +32 -0
  229. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/multicore-ownership.md +117 -0
  230. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/pipeline-sync-visibility.md +146 -0
  231. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/precision-mode-approximation.md +90 -0
  232. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/shape-boundary-contract.md +57 -0
  233. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/special-values.md +122 -0
  234. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/tiling-tail-state.md +146 -0
  235. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/broadcast-transpose.md +64 -0
  236. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/convolution.md +60 -0
  237. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/dynamic-quant.md +47 -0
  238. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/index.md +18 -0
  239. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/matmul-mmad.md +131 -0
  240. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/normalization.md +145 -0
  241. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/reduction.md +167 -0
  242. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/softplus-v2-grad.md +58 -0
  243. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/sort-merge.md +65 -0
  244. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/index.md +18 -0
  245. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/kernel-debug-data.md +133 -0
  246. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/msobjdump.md +150 -0
  247. package/skills/cann-doctor/SKILL.md +15 -0
  248. package/skills/catalog.json +79 -0
  249. package/skills/mattpocock/GLOSSARY.md +30 -0
  250. package/skills/mattpocock/LICENSE +21 -0
  251. package/skills/mattpocock/README.md +258 -0
  252. package/skills/mattpocock/SCOPE.md +35 -0
  253. package/skills/mattpocock/docs/agents/triage-labels.md +15 -0
  254. package/skills/mattpocock/docs/engineering/ask-matt.md +91 -0
  255. package/skills/mattpocock/docs/engineering/code-review.md +101 -0
  256. package/skills/mattpocock/docs/engineering/codebase-design.md +88 -0
  257. package/skills/mattpocock/docs/engineering/diagnosing-bugs.md +94 -0
  258. package/skills/mattpocock/docs/engineering/domain-modeling.md +86 -0
  259. package/skills/mattpocock/docs/engineering/grill-with-docs.md +82 -0
  260. package/skills/mattpocock/docs/engineering/implement-spec.md +86 -0
  261. package/skills/mattpocock/docs/engineering/implement.md +97 -0
  262. package/skills/mattpocock/docs/engineering/improve-codebase-architecture.md +113 -0
  263. package/skills/mattpocock/docs/engineering/pr.md +79 -0
  264. package/skills/mattpocock/docs/engineering/prototype.md +67 -0
  265. package/skills/mattpocock/docs/engineering/research.md +73 -0
  266. package/skills/mattpocock/docs/engineering/resolving-merge-conflicts.md +53 -0
  267. package/skills/mattpocock/docs/engineering/retro.md +81 -0
  268. package/skills/mattpocock/docs/engineering/setup-matt-pocock-skills.md +94 -0
  269. package/skills/mattpocock/docs/engineering/tdd.md +94 -0
  270. package/skills/mattpocock/docs/engineering/to-spec.md +81 -0
  271. package/skills/mattpocock/docs/engineering/to-tickets.md +99 -0
  272. package/skills/mattpocock/docs/engineering/triage.md +109 -0
  273. package/skills/mattpocock/docs/engineering/wayfinder.md +103 -0
  274. package/skills/mattpocock/docs/engineering/wizard.md +96 -0
  275. package/skills/mattpocock/docs/productivity/grill-me.md +76 -0
  276. package/skills/mattpocock/docs/productivity/grilling.md +87 -0
  277. package/skills/mattpocock/docs/productivity/handoff.md +76 -0
  278. package/skills/mattpocock/docs/productivity/teach.md +97 -0
  279. package/skills/mattpocock/docs/productivity/to-questionnaire.md +78 -0
  280. package/skills/mattpocock/docs/productivity/wait-what.md +36 -0
  281. package/skills/mattpocock/docs/productivity/writing-for-agents.md +70 -0
  282. package/skills/mattpocock/scripts/link-skills.sh +62 -0
  283. package/skills/mattpocock/scripts/list-skills.sh +7 -0
  284. package/skills/mattpocock/scripts/sync-plugin-version.mjs +41 -0
  285. package/skills/mattpocock/skills/deprecated/README.md +3 -0
  286. package/skills/mattpocock/skills/engineering/README.md +34 -0
  287. package/skills/mattpocock/skills/engineering/ask-matt/PHASE-BOUNDARIES.md +55 -0
  288. package/skills/mattpocock/skills/engineering/ask-matt/SKILL.md +97 -0
  289. package/skills/mattpocock/skills/engineering/ask-matt/agents/openai.yaml +5 -0
  290. package/skills/mattpocock/skills/engineering/code-review/SKILL.md +89 -0
  291. package/skills/mattpocock/skills/engineering/code-review/agents/openai.yaml +3 -0
  292. package/skills/mattpocock/skills/engineering/codebase-design/DEEPENING.md +37 -0
  293. package/skills/mattpocock/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
  294. package/skills/mattpocock/skills/engineering/codebase-design/SKILL.md +114 -0
  295. package/skills/mattpocock/skills/engineering/codebase-design/agents/openai.yaml +3 -0
  296. package/skills/mattpocock/skills/engineering/diagnosing-bugs/SKILL.md +138 -0
  297. package/skills/mattpocock/skills/engineering/diagnosing-bugs/agents/openai.yaml +3 -0
  298. package/skills/mattpocock/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  299. package/skills/mattpocock/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
  300. package/skills/mattpocock/skills/engineering/domain-modeling/GLOSSARY-FORMAT.md +60 -0
  301. package/skills/mattpocock/skills/engineering/domain-modeling/SKILL.md +74 -0
  302. package/skills/mattpocock/skills/engineering/domain-modeling/agents/openai.yaml +3 -0
  303. package/skills/mattpocock/skills/engineering/grill-with-docs/SKILL.md +7 -0
  304. package/skills/mattpocock/skills/engineering/grill-with-docs/agents/openai.yaml +5 -0
  305. package/skills/mattpocock/skills/engineering/implement/SKILL.md +17 -0
  306. package/skills/mattpocock/skills/engineering/implement/agents/openai.yaml +5 -0
  307. package/skills/mattpocock/skills/engineering/implement-spec/SKILL.md +42 -0
  308. package/skills/mattpocock/skills/engineering/implement-spec/agents/openai.yaml +5 -0
  309. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
  310. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/SKILL.md +71 -0
  311. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/agents/openai.yaml +5 -0
  312. package/skills/mattpocock/skills/engineering/pr/CREDITS.md +3 -0
  313. package/skills/mattpocock/skills/engineering/pr/SKILL.md +170 -0
  314. package/skills/mattpocock/skills/engineering/pr/agents/openai.yaml +3 -0
  315. package/skills/mattpocock/skills/engineering/prototype/LOGIC.md +67 -0
  316. package/skills/mattpocock/skills/engineering/prototype/SKILL.md +26 -0
  317. package/skills/mattpocock/skills/engineering/prototype/UI.md +112 -0
  318. package/skills/mattpocock/skills/engineering/prototype/agents/openai.yaml +3 -0
  319. package/skills/mattpocock/skills/engineering/research/SKILL.md +12 -0
  320. package/skills/mattpocock/skills/engineering/research/agents/openai.yaml +3 -0
  321. package/skills/mattpocock/skills/engineering/retro/SKILL.md +44 -0
  322. package/skills/mattpocock/skills/engineering/retro/agents/openai.yaml +5 -0
  323. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/SKILL.md +120 -0
  324. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/agents/openai.yaml +5 -0
  325. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
  326. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +50 -0
  327. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
  328. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
  329. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
  330. package/skills/mattpocock/skills/engineering/tdd/SKILL.md +38 -0
  331. package/skills/mattpocock/skills/engineering/tdd/agents/openai.yaml +3 -0
  332. package/skills/mattpocock/skills/engineering/tdd/mocking.md +59 -0
  333. package/skills/mattpocock/skills/engineering/tdd/tests.md +77 -0
  334. package/skills/mattpocock/skills/engineering/to-spec/SKILL.md +75 -0
  335. package/skills/mattpocock/skills/engineering/to-spec/agents/openai.yaml +5 -0
  336. package/skills/mattpocock/skills/engineering/to-tickets/SKILL.md +105 -0
  337. package/skills/mattpocock/skills/engineering/to-tickets/agents/openai.yaml +5 -0
  338. package/skills/mattpocock/skills/engineering/triage/AGENT-BRIEF.md +207 -0
  339. package/skills/mattpocock/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
  340. package/skills/mattpocock/skills/engineering/triage/SKILL.md +112 -0
  341. package/skills/mattpocock/skills/engineering/triage/agents/openai.yaml +5 -0
  342. package/skills/mattpocock/skills/engineering/wayfinder/SKILL.md +128 -0
  343. package/skills/mattpocock/skills/engineering/wayfinder/agents/openai.yaml +5 -0
  344. package/skills/mattpocock/skills/engineering/wizard/SKILL.md +44 -0
  345. package/skills/mattpocock/skills/engineering/wizard/agents/openai.yaml +3 -0
  346. package/skills/mattpocock/skills/engineering/wizard/template.sh +223 -0
  347. package/skills/mattpocock/skills/in-progress/README.md +17 -0
  348. package/skills/mattpocock/skills/in-progress/chief-of-staff/SKILL.md +75 -0
  349. package/skills/mattpocock/skills/in-progress/chief-of-staff/agents/openai.yaml +5 -0
  350. package/skills/mattpocock/skills/in-progress/claude-handoff/SKILL.md +18 -0
  351. package/skills/mattpocock/skills/in-progress/claude-handoff/agents/openai.yaml +5 -0
  352. package/skills/mattpocock/skills/in-progress/loop-me/SKILL.md +32 -0
  353. package/skills/mattpocock/skills/in-progress/loop-me/agents/openai.yaml +5 -0
  354. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/SKILL.md +102 -0
  355. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/agents/openai.yaml +5 -0
  356. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
  357. package/skills/mattpocock/skills/in-progress/software-factory/EXAMPLE-TASKS.md +80 -0
  358. package/skills/mattpocock/skills/in-progress/software-factory/GIT-HOSTS.md +84 -0
  359. package/skills/mattpocock/skills/in-progress/software-factory/OBSERVABILITY-PLATFORMS.md +75 -0
  360. package/skills/mattpocock/skills/in-progress/software-factory/RUNNERS.md +94 -0
  361. package/skills/mattpocock/skills/in-progress/software-factory/SKILL.md +98 -0
  362. package/skills/mattpocock/skills/in-progress/software-factory/TICKET-TRACKERS.md +85 -0
  363. package/skills/mattpocock/skills/in-progress/writing-beats/SKILL.md +67 -0
  364. package/skills/mattpocock/skills/in-progress/writing-beats/agents/openai.yaml +5 -0
  365. package/skills/mattpocock/skills/in-progress/writing-fragments/SKILL.md +79 -0
  366. package/skills/mattpocock/skills/in-progress/writing-fragments/agents/openai.yaml +5 -0
  367. package/skills/mattpocock/skills/in-progress/writing-shape/SKILL.md +79 -0
  368. package/skills/mattpocock/skills/in-progress/writing-shape/agents/openai.yaml +5 -0
  369. package/skills/mattpocock/skills/misc/README.md +8 -0
  370. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
  371. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/agents/openai.yaml +3 -0
  372. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
  373. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
  374. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/agents/openai.yaml +3 -0
  375. package/skills/mattpocock/skills/misc/scaffold-exercises/SKILL.md +106 -0
  376. package/skills/mattpocock/skills/misc/scaffold-exercises/agents/openai.yaml +3 -0
  377. package/skills/mattpocock/skills/misc/setup-pre-commit/SKILL.md +91 -0
  378. package/skills/mattpocock/skills/misc/setup-pre-commit/agents/openai.yaml +3 -0
  379. package/skills/mattpocock/skills/productivity/README.md +20 -0
  380. package/skills/mattpocock/skills/productivity/grill-me/SKILL.md +7 -0
  381. package/skills/mattpocock/skills/productivity/grill-me/agents/openai.yaml +5 -0
  382. package/skills/mattpocock/skills/productivity/grilling/SKILL.md +30 -0
  383. package/skills/mattpocock/skills/productivity/grilling/agents/openai.yaml +3 -0
  384. package/skills/mattpocock/skills/productivity/handoff/SKILL.md +16 -0
  385. package/skills/mattpocock/skills/productivity/handoff/agents/openai.yaml +5 -0
  386. package/skills/mattpocock/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
  387. package/skills/mattpocock/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
  388. package/skills/mattpocock/skills/productivity/teach/MISSION-FORMAT.md +31 -0
  389. package/skills/mattpocock/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
  390. package/skills/mattpocock/skills/productivity/teach/SKILL.md +140 -0
  391. package/skills/mattpocock/skills/productivity/teach/agents/openai.yaml +5 -0
  392. package/skills/mattpocock/skills/productivity/to-questionnaire/SKILL.md +54 -0
  393. package/skills/mattpocock/skills/productivity/to-questionnaire/agents/openai.yaml +5 -0
  394. package/skills/mattpocock/skills/productivity/wait-what/SKILL.md +7 -0
  395. package/skills/mattpocock/skills/productivity/wait-what/agents/openai.yaml +5 -0
  396. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL-MECHANICS.md +22 -0
  397. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL.md +81 -0
  398. package/skills/mattpocock/skills/productivity/writing-for-agents/agents/openai.yaml +3 -0
  399. package/skills/task-agents/operator-development/Agent.md +71 -0
  400. package/skills/task-agents/operator-development/skills.json +120 -0
  401. package/skills/task-agents/operator-development/stages.schema.json +532 -0
  402. package/skills/task-agents/performance-optimization/Agent.md +78 -0
  403. package/skills/task-agents/performance-optimization/skills.json +64 -0
  404. package/skills/task-agents/response-protocol.md +35 -0
  405. package/skills/task-agents/sidebar-contracts.schema.json +4168 -0
  406. package/skills/task-agents/sidebar-selection.schema.json +971 -0
  407. package/skills/task-agents/visuals/components.json +283 -0
  408. package/skills/task-agents/visuals/contracts.schema.json +3628 -0
@@ -0,0 +1,963 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ----------------------------------------------------------------------------------------------------------
4
+ # Copyright (c) 2026 Huawei Technologies Co., Ltd.
5
+ # This program is free software, you can redistribute it and/or modify it under the terms and conditions of
6
+ # CANN Open Software License Agreement Version 2.0 (the "License").
7
+ # Please refer to the License for details. You may not use this file except in compliance with the License.
8
+ # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
9
+ # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
10
+ # See LICENSE in the root of the software repository for the full text of the License.
11
+ # ----------------------------------------------------------------------------------------------------------
12
+ """run_evals.py — 判定引擎执行式回归(fixture CSV/标量 → 断言 verdict 输出)
13
+
14
+ 设计立场:判定知识若不进脚本,就无法回归——文本形式的评测对判定质量
15
+ 没有守护力。判定已经进脚本(verdict.py),评测必须跟着进脚本:
16
+ 任何阈值/规则变更必须先过本回归全绿。
17
+
18
+ 用例分两组(共 40 条):
19
+ - E1-E26:verdict.py 判定回归(fixture → 断言 findings/verdict;含 R 值
20
+ 临界值双侧守护 E12b/E12c——区间重叠只在边界值暴露)
21
+ - S1-S14:门禁脚本回归(snapshot/delta_compare/batch/加载校验/边界)——
22
+ Step 4 的结论门禁(KEEP/REVERT 判错 = 错误归档)与加载校验负例的
23
+ 回归网;S13/S14 守护 batch_pipeline 结论分类
24
+ 与 delta_compare 口径键缺失留痕(issue #308)
25
+
26
+ 用法:
27
+ python3 evals/run_evals.py # 全部用例
28
+ python3 evals/run_evals.py -v # 逐断言明细
29
+ 退出码:0 全绿 / 1 有失败(CI 门禁语义)。
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import json
35
+ import subprocess
36
+ import sys
37
+ import tempfile
38
+ from pathlib import Path
39
+
40
+ HERE = Path(__file__).resolve().parent
41
+ SKILL_DIR = HERE.parent
42
+ RULES = SKILL_DIR / "rules"
43
+ FIXTURES = SKILL_DIR / "fixtures"
44
+ SCRIPTS = SKILL_DIR / "scripts"
45
+ VERDICT = SCRIPTS / "verdict.py"
46
+ SNAPSHOT = SCRIPTS / "snapshot.py"
47
+ DELTA_COMPARE = SCRIPTS / "delta_compare.py"
48
+ BATCH_PIPELINE = SCRIPTS / "batch_pipeline.py"
49
+
50
+ # ---------------------------------------------------------------------------
51
+ # 用例定义:输入 → 断言(findings / skipped / verdict / headline 片段)
52
+ # 每条用例对应一个真实调优场景的已知答案(源自真机调优案例标定)。
53
+ # ---------------------------------------------------------------------------
54
+ CASES = [
55
+ {
56
+ "id": "E1-mte2-bound",
57
+ "desc": "MTE2 占比 78% 且为最大 pipe → MTE2_BOUND 命中(主判定阈值表)",
58
+ "args": [
59
+ "--rules",
60
+ str(RULES / "L1-single-core.yaml"),
61
+ "--csv",
62
+ str(FIXTURES / "mte2_bound_a2.csv"),
63
+ "--soc",
64
+ "a2",
65
+ ],
66
+ "assert": {
67
+ "hit": ["L1_MTE2_BOUND"],
68
+ "not_hit": ["L1_VEC_BOUND", "L1_CUBE_BOUND", "L1_LATENCY_SYNC_SUSPECT"],
69
+ "verdict": "NEEDS_OPTIMIZATION",
70
+ },
71
+ },
72
+ {
73
+ "id": "E2-mte2-counter-evidence",
74
+ "desc": "同 E1 输入 + active_bw=85%峰值 → 命中反证『真带宽饱和』(优化方向改变)",
75
+ "args": [
76
+ "--rules",
77
+ str(RULES / "L1-single-core.yaml"),
78
+ "--csv",
79
+ str(FIXTURES / "mte2_bound_a2.csv"),
80
+ "--soc",
81
+ "a2",
82
+ "--scalar",
83
+ "mte2_active_bw_pct_of_peak=85",
84
+ ],
85
+ "assert": {
86
+ "hit": ["L1_MTE2_BOUND"],
87
+ "counter_evidence": ["true-bandwidth-saturation"],
88
+ },
89
+ },
90
+ {
91
+ "id": "E3-serial-no-overlap",
92
+ "desc": "cube 0.44+mte2 0.42+mte1 0.18≈1 且最大 pipe<70% → 串行无重叠指纹命中(串行无重叠实测案例)",
93
+ "args": [
94
+ "--rules",
95
+ str(RULES / "L1-single-core.yaml"),
96
+ "--csv",
97
+ str(FIXTURES / "serial_no_overlap_a2.csv"),
98
+ "--soc",
99
+ "a2",
100
+ ],
101
+ "assert": {
102
+ "hit": ["L1_SERIAL_NO_OVERLAP"],
103
+ "not_hit": ["L1_CUBE_BOUND", "L1_MTE2_BOUND"],
104
+ },
105
+ },
106
+ {
107
+ "id": "E4-core-tail",
108
+ "desc": "逐核耗时均值~93us 峰值~185us(≈2x)→ 核间长尾命中 critical(a2 48 AIV 场景)",
109
+ "args": [
110
+ "--rules",
111
+ str(RULES / "L2-inter-core.yaml"),
112
+ "--csv",
113
+ str(FIXTURES / "core_tail_a5.csv"),
114
+ "--soc",
115
+ "a2",
116
+ "--scalar",
117
+ "physical_cores=48,block_dim=24,task_duration_us=195",
118
+ ],
119
+ "assert": {
120
+ "hit": ["L2_CORE_TAIL", "L2_IMBALANCE_SEVERE"],
121
+ "not_hit": ["L2_UNDERUTILIZATION"],
122
+ },
123
+ },
124
+ {
125
+ "id": "E5-underutilization",
126
+ "desc": "仅 8 个 block 行(<48×0.33)→ 切核不足命中(occupancy 判定档)",
127
+ "args": [
128
+ "--rules",
129
+ str(RULES / "L2-inter-core.yaml"),
130
+ "--csv",
131
+ str(FIXTURES / "serial_no_overlap_a2.csv"),
132
+ "--soc",
133
+ "a2",
134
+ "--scalar",
135
+ "physical_cores=48,task_duration_us=620",
136
+ ],
137
+ "assert": {"hit": ["L2_UNDERUTILIZATION"]},
138
+ },
139
+ {
140
+ "id": "E6-mc2-compute-bound",
141
+ "desc": "T_comm=420 T_compute=880 → R=2.10 → 强计算 bound(R 值五档判定)",
142
+ "args": [
143
+ "--rules",
144
+ str(RULES / "L3-inter-card.yaml"),
145
+ "--soc",
146
+ "a5",
147
+ "--scalar",
148
+ "t_comm_us=420,t_compute_us=880",
149
+ ],
150
+ "assert": {
151
+ "hit": ["L3_MC2_STRONG_COMPUTE"],
152
+ "not_hit": ["L3_MC2_BALANCED", "L3_MC2_COMM_BOUND"],
153
+ },
154
+ },
155
+ {
156
+ "id": "E7-mc2-balanced",
157
+ "desc": "T_comm=500 T_compute=505 → R=1.01 → 完美平衡(等分切分即最优)",
158
+ "args": [
159
+ "--rules",
160
+ str(RULES / "L3-inter-card.yaml"),
161
+ "--soc",
162
+ "a5",
163
+ "--scalar",
164
+ "t_comm_us=500,t_compute_us=505",
165
+ ],
166
+ "assert": {
167
+ "hit": ["L3_MC2_BALANCED"],
168
+ "not_hit": ["L3_MC2_COMPUTE_BOUND", "L3_MC2_COMM_BOUND"],
169
+ },
170
+ },
171
+ {
172
+ "id": "E8-mc2-mte2-pollution-routing",
173
+ "desc": "ratio_full=62 ratio_pure=41(gap=21>10 且 pure/full=66%<80%)→ 污染命中 + L1_MTE2_BOUND 被禁用",
174
+ "args": [
175
+ "--rules",
176
+ str(RULES / "L3-inter-card.yaml")
177
+ + ","
178
+ + str(RULES / "L1-single-core.yaml"),
179
+ "--soc",
180
+ "a5",
181
+ "--scalar",
182
+ "t_comm_us=400,t_compute_us=600,mte2_ratio_full=62,mte2_ratio_pure=41",
183
+ ],
184
+ "assert": {
185
+ "hit": ["L3_MTE2_POLLUTED"],
186
+ "hit_either": ["L3_MC2_COMPUTE_BOUND"],
187
+ "skipped_contains": ["L1_MTE2_BOUND"],
188
+ "skipped_reason_contains": {"L1_MTE2_BOUND": "被上层路由禁用"},
189
+ },
190
+ },
191
+ {
192
+ "id": "E9-binding-contract-skip",
193
+ "desc": "L1 规则包但无 CSV 且无标量 → REQUIRED 指标缺失 → SKIPPED(绑定契约:未采集不判定)",
194
+ "args": ["--rules", str(RULES / "L1-single-core.yaml"), "--soc", "a5"],
195
+ "assert": {
196
+ "skipped_contains": ["L1_MTE2_BOUND"],
197
+ "verdict": "INSUFFICIENT_DATA",
198
+ },
199
+ },
200
+ {
201
+ "id": "E10-no-bound-near-limit",
202
+ "desc": "各 pipe 均 <50% 且求和不落串行指纹 → LATENCY/SYNC 可疑命中而非『无 bound』",
203
+ "args": [
204
+ "--rules",
205
+ str(RULES / "L1-single-core.yaml"),
206
+ "--csv",
207
+ str(FIXTURES / "serial_no_overlap_a2.csv"),
208
+ "--soc",
209
+ "a2",
210
+ ],
211
+ "assert": {"hit_or_insufficient": ["L1_LATENCY_SYNC_SUSPECT"]},
212
+ },
213
+ {
214
+ "id": "E11-r-boundary-089-vs-090",
215
+ "desc": "F3 边界:R=0.89 → COMM_BOUND(唯一);R=0.90 → BALANCED(唯一)——重叠区已消除",
216
+ "args": [
217
+ "--rules",
218
+ str(RULES / "L3-inter-card.yaml"),
219
+ "--soc",
220
+ "a5",
221
+ "--scalar",
222
+ "t_comm_us=1000,t_compute_us=890",
223
+ ],
224
+ "assert": {"hit": ["L3_MC2_COMM_BOUND"], "not_hit": ["L3_MC2_BALANCED"]},
225
+ },
226
+ {
227
+ "id": "E12-r-boundary-0110-vs-0111",
228
+ "desc": "F3 边界:R=1.10 → BALANCED;R=1.11 → COMPUTE_BOUND(档位连续无重叠无双命中)",
229
+ "args": [
230
+ "--rules",
231
+ str(RULES / "L3-inter-card.yaml"),
232
+ "--soc",
233
+ "a5",
234
+ "--scalar",
235
+ "t_comm_us=1000,t_compute_us=1110",
236
+ ],
237
+ "assert": {"hit": ["L3_MC2_COMPUTE_BOUND"], "not_hit": ["L3_MC2_BALANCED"]},
238
+ },
239
+ {
240
+ "id": "E12b-r-boundary-090-balanced",
241
+ "desc": "区间上界临界值:R=0.90 → 仅 BALANCED 命中——COMM_BOUND 上界与 BALANCED 下界在 0.90 不重叠(改 <= 即双命中,本用例守护)",
242
+ "args": [
243
+ "--rules",
244
+ str(RULES / "L3-inter-card.yaml"),
245
+ "--soc",
246
+ "a5",
247
+ "--scalar",
248
+ "t_comm_us=1000,t_compute_us=900",
249
+ ],
250
+ "assert": {
251
+ "hit": ["L3_MC2_BALANCED"],
252
+ "not_hit": ["L3_MC2_COMM_BOUND", "L3_MC2_COMPUTE_BOUND"],
253
+ },
254
+ },
255
+ {
256
+ "id": "E12c-r-boundary-110-balanced",
257
+ "desc": "区间上界临界值:R=1.10 → 仅 BALANCED 命中——BALANCED 上界与 COMPUTE_BOUND 下界在 1.10 不重叠(改 <= 即双命中,本用例守护)",
258
+ "args": [
259
+ "--rules",
260
+ str(RULES / "L3-inter-card.yaml"),
261
+ "--soc",
262
+ "a5",
263
+ "--scalar",
264
+ "t_comm_us=1000,t_compute_us=1100",
265
+ ],
266
+ "assert": {
267
+ "hit": ["L3_MC2_BALANCED"],
268
+ "not_hit": ["L3_MC2_COMPUTE_BOUND", "L3_MC2_COMM_BOUND"],
269
+ },
270
+ },
271
+ {
272
+ "id": "E13-waterfall-layered-facts",
273
+ "desc": "F4 全瀑布:facts 按包分层,L1 pipe 指标不丢失(审计承诺)",
274
+ "args": [
275
+ "--rules",
276
+ str(RULES / "L3-inter-card.yaml")
277
+ + ","
278
+ + str(RULES / "L2-inter-core.yaml")
279
+ + ","
280
+ + str(RULES / "L1-single-core.yaml")
281
+ + ","
282
+ + str(RULES / "L0-instruction.yaml"),
283
+ "--csv",
284
+ str(FIXTURES / "mte2_bound_a2.csv"),
285
+ "--soc",
286
+ "a5",
287
+ "--scalar",
288
+ "t_comm_us=400,t_compute_us=600,icache_miss_rate=20,l2_hit_rate=40,physical_cores=56,block_dim=24,task_duration_us=620",
289
+ ],
290
+ "assert": {
291
+ "facts_pack_contains": {
292
+ "L1-single-core": ["vec_ratio", "mte2_ratio"],
293
+ "L2-inter-core": ["time_mean_us"],
294
+ "L3-inter-card": ["r_value"],
295
+ "L0-instruction": ["icache_miss_rate"],
296
+ }
297
+ },
298
+ },
299
+ {
300
+ "id": "E14-l2-head-overhead-derived",
301
+ "desc": "F6 头开销:task_duration=700(头开销 31%>30%)→ L2_HEAD_OVERHEAD 命中(修复前永 SKIPPED)",
302
+ "args": [
303
+ "--rules",
304
+ str(RULES / "L2-inter-core.yaml"),
305
+ "--soc",
306
+ "a2",
307
+ "--csv",
308
+ str(FIXTURES / "mte2_bound_a2.csv"),
309
+ "--scalar",
310
+ "physical_cores=48,task_duration_us=700",
311
+ ],
312
+ "assert": {"hit": ["L2_HEAD_OVERHEAD"]},
313
+ },
314
+ {
315
+ "id": "E15-occupancy-critical-band",
316
+ "desc": "F6 分档:4 活跃核/48 物理核(8.3%<10%)→ L2_UNDERUTILIZATION critical 档生效(修复前永 light)",
317
+ "args": [
318
+ "--rules",
319
+ str(RULES / "L2-inter-core.yaml"),
320
+ "--soc",
321
+ "a2",
322
+ "--csv",
323
+ str(FIXTURES / "few_cores_a5.csv"),
324
+ "--scalar",
325
+ "physical_cores=48,task_duration_us=120",
326
+ ],
327
+ "assert": {
328
+ "hit": ["L2_UNDERUTILIZATION"],
329
+ "severity": {"L2_UNDERUTILIZATION": "critical"},
330
+ },
331
+ },
332
+ {
333
+ "id": "E16-near-limit-branch",
334
+ "desc": "F7 接近上限:唯一 critical+high 命中且上界 1.2 ≤ 阈值 1.2 → NEAR_LIMIT(修复前死分支)",
335
+ "args": [
336
+ "--rules",
337
+ str(RULES / "L3-inter-card.yaml"),
338
+ "--soc",
339
+ "a5",
340
+ "--scalar",
341
+ "t_comm_us=400,t_compute_us=1000",
342
+ ],
343
+ "assert": {"verdict": "NEAR_LIMIT", "hit": ["L3_MC2_STRONG_COMPUTE"]},
344
+ },
345
+ {
346
+ "id": "E17-no-bound-found-branch",
347
+ "desc": "F7 语义分离:数据完整但无命中 → NO_BOUND_FOUND(≠ NEAR_LIMIT;下游可区分收手/换指标)",
348
+ "args": [
349
+ "--rules",
350
+ str(RULES / "L1-single-core.yaml"),
351
+ "--soc",
352
+ "a5",
353
+ "--csv",
354
+ str(FIXTURES / "no_bound_a5.csv"),
355
+ ],
356
+ "assert": {"verdict": "NO_BOUND_FOUND"},
357
+ },
358
+ {
359
+ "id": "E18-dirty-scalar-degrade",
360
+ "desc": "F18 脏输入:--scalar 值 N/A → 警告 + None 降级,引擎不崩溃,反证标 unevaluated",
361
+ "args": [
362
+ "--rules",
363
+ str(RULES / "L1-single-core.yaml"),
364
+ "--soc",
365
+ "a2",
366
+ "--csv",
367
+ str(FIXTURES / "mte2_bound_a2.csv"),
368
+ "--scalar",
369
+ "mte2_active_bw_pct_of_peak=N/A",
370
+ ],
371
+ "assert": {
372
+ "hit": ["L1_MTE2_BOUND"],
373
+ "counter_evidence_unevaluated": {
374
+ "L1_MTE2_BOUND": ["true-bandwidth-saturation"]
375
+ },
376
+ },
377
+ },
378
+ {
379
+ "id": "E19-vec-counter-evidence-scalar",
380
+ "desc": "F5 反证复活:--scalar vec_fp32_ratio=61 → cast-heavy 反证命中(修复前永久 unevaluated)",
381
+ "args": [
382
+ "--rules",
383
+ str(RULES / "L1-single-core.yaml"),
384
+ "--soc",
385
+ "a5",
386
+ "--csv",
387
+ str(FIXTURES / "vec_bound_a5.csv"),
388
+ "--scalar",
389
+ "vec_fp32_ratio=61,vec_total_cflt_ratio=8",
390
+ ],
391
+ "assert": {
392
+ "hit": ["L1_VEC_BOUND"],
393
+ "counter_evidence_hit": {
394
+ "L1_VEC_BOUND": ["cast-heavy", "bank-conflict-amplify"]
395
+ },
396
+ },
397
+ },
398
+ {
399
+ "id": "E20-multikernel-no-name-fail-loud",
400
+ "desc": "G15:多 kernel CSV 无 --kernel-name → exit 4 拒判(修复前静默跨 kernel 平均错判)",
401
+ "args": [
402
+ "--rules",
403
+ str(RULES / "L1-single-core.yaml"),
404
+ "--csv",
405
+ str(FIXTURES / "multi_kernel_mix_a5.csv"),
406
+ "--soc",
407
+ "a5",
408
+ ],
409
+ "assert": {"exit_code": 4},
410
+ },
411
+ {
412
+ "id": "E21-multikernel-filtered",
413
+ "desc": "G15:--kernel-name matmul_mix 过滤后单 kernel 判定(cube 87.5% critical 命中,"
414
+ "混合均值会被 gelu 行拉低到 ~50 错过 critical 档)",
415
+ "args": [
416
+ "--rules",
417
+ str(RULES / "L1-single-core.yaml"),
418
+ "--csv",
419
+ str(FIXTURES / "multi_kernel_mix_a5.csv"),
420
+ "--soc",
421
+ "a5",
422
+ "--kernel-name",
423
+ "matmul_mix",
424
+ ],
425
+ "assert": {
426
+ "hit": ["L1_CUBE_BOUND"],
427
+ "severity": {"L1_CUBE_BOUND": "critical"},
428
+ "rows": 4,
429
+ },
430
+ },
431
+ {
432
+ "id": "E22-multikernel-bad-name-fail-loud",
433
+ "desc": "G15:--kernel-name 拼错 → exit 4(不静默空集判定)",
434
+ "args": [
435
+ "--rules",
436
+ str(RULES / "L1-single-core.yaml"),
437
+ "--csv",
438
+ str(FIXTURES / "multi_kernel_mix_a5.csv"),
439
+ "--soc",
440
+ "a5",
441
+ "--kernel-name",
442
+ "no_such_kernel",
443
+ ],
444
+ "assert": {"exit_code": 4},
445
+ },
446
+ {
447
+ "id": "E23-host-dispatch-cluster-rule",
448
+ "desc": "P2-4/G17:host_dispatch_us=80 / task=200(40%>30%)→ L2_HOST_DISPATCH_BLOCK 命中 moderate",
449
+ "args": [
450
+ "--rules",
451
+ str(RULES / "L2-inter-core.yaml"),
452
+ "--soc",
453
+ "a5",
454
+ "--csv",
455
+ str(FIXTURES / "serial_no_overlap_a2.csv"),
456
+ "--scalar",
457
+ "host_dispatch_us=80,task_duration_us=200",
458
+ ],
459
+ "assert": {
460
+ "hit": ["L2_HOST_DISPATCH_BLOCK"],
461
+ "severity": {"L2_HOST_DISPATCH_BLOCK": "moderate"},
462
+ },
463
+ },
464
+ {
465
+ "id": "E24-host-dispatch-no-scalar-skip",
466
+ "desc": "P2-4/G17:无 host_dispatch_us 标量 → SKIPPED(绑定契约:无生产者不判定)",
467
+ "args": [
468
+ "--rules",
469
+ str(RULES / "L2-inter-core.yaml"),
470
+ "--soc",
471
+ "a5",
472
+ "--csv",
473
+ str(FIXTURES / "serial_no_overlap_a2.csv"),
474
+ ],
475
+ "assert": {"skipped_contains": ["L2_HOST_DISPATCH_BLOCK"]},
476
+ },
477
+ ]
478
+ # ---------------------------------------------------------------------------
479
+ # 门禁脚本回归(snapshot/delta_compare 的 exit 码与三段结论边界 +
480
+ # 加载校验负例)——Step 4 结论门禁的回归网
481
+ # ---------------------------------------------------------------------------
482
+ SCRIPT_CASES = [
483
+ {"id": "S1-delta-hard-reject", "desc": "口径漂移(device 0→1)→ exit 2 拒绝比较"},
484
+ {"id": "S2-delta-precision-reject", "desc": "精度非 pass → exit 2 拒绝比较"},
485
+ {"id": "S3-delta-keep", "desc": "speedup≈1.053(>1.05 边界)→ KEEP"},
486
+ {
487
+ "id": "S4-delta-noise-band",
488
+ "desc": "speedup≈0.992(带内边界)→ 复测处置(含同步重采基线文案)",
489
+ },
490
+ {"id": "S5-delta-revert", "desc": "speedup≈0.909 → REVERT"},
491
+ {"id": "S6-mechanism-warn", "desc": "tiling_key/block_dim 变化 → WARN 记录不阻断"},
492
+ {"id": "S7-repeat-conflict", "desc": "repeat 20 vs 40 → exit 2(HARD 不变量)"},
493
+ {"id": "S8-noise-band-override", "desc": "--noise-band 0.01 覆写 → 1% 差异判劣化"},
494
+ {
495
+ "id": "S9-jitter-diagnostics",
496
+ "desc": "分布字段(p95>2×p50)→ 抖动诊断段 + 双峰提示",
497
+ },
498
+ {"id": "S10-validation-v1", "desc": "加载校验 V1:未声明指标 → exit 3"},
499
+ {"id": "S11-validation-v3", "desc": "加载校验 V3:区间重叠→ exit 3"},
500
+ {"id": "S12-validation-v4", "desc": "加载校验 V4:optional 进 condition → exit 3"},
501
+ {
502
+ "id": "S13-batch-noise-classification",
503
+ "desc": "issue #308 问题 1:噪声带内/KEEP/REVERT 三对快照过 batch_pipeline,"
504
+ "矩阵分类须与 delta_compare 结论一致(噪声带文案含「劣化」,子串匹配会误判 REVERT)",
505
+ },
506
+ {
507
+ "id": "S14-delta-hard-missing-warn",
508
+ "desc": "issue #308 问题 2:HARD 键单侧缺失(baseline 无 device_id)→ 不阻断但 stderr WARN 留痕",
509
+ },
510
+ ]
511
+
512
+
513
+ def _mk_snap(td, name, **over):
514
+ """生成一份 snapshot 并返回路径。字段值为 None 表示不传该参数(单侧缺失场景)。"""
515
+ fields = {
516
+ "op": "gelu",
517
+ "variant": name,
518
+ "soc": "a5",
519
+ "precision": "pass",
520
+ "kernel_avg_us": 100.0,
521
+ "timing_method": "event",
522
+ "baseline_kind": "self_before_after",
523
+ "cann_version": "8.3.0",
524
+ "device_id": "0",
525
+ "shape": "8448x4096",
526
+ "dtype": "fp16",
527
+ "format": "ND",
528
+ "warmup": 5,
529
+ "repeat": 20,
530
+ }
531
+ fields.update(over)
532
+ cmd = [sys.executable, str(SNAPSHOT), "--no-env-probe"]
533
+ for k, v in fields.items():
534
+ if v is None:
535
+ continue
536
+ flag = "--" + ("kernel-avg-us" if k == "kernel_avg_us" else k.replace("_", "-"))
537
+ cmd += [flag, str(v)]
538
+ cmd += ["-o", str(Path(td) / f"{name}.json")]
539
+ proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
540
+ assert proc.returncode == 0, proc.stderr
541
+ return str(Path(td) / f"{name}.json")
542
+
543
+
544
+ def _run_delta(td, base, after, extra=None):
545
+ return subprocess.run(
546
+ [
547
+ sys.executable,
548
+ str(DELTA_COMPARE),
549
+ "--baseline",
550
+ base,
551
+ "--after",
552
+ after,
553
+ "--output",
554
+ str(Path(td) / "comp.md"),
555
+ *(extra or []),
556
+ ],
557
+ capture_output=True,
558
+ text=True,
559
+ timeout=60,
560
+ )
561
+
562
+
563
+ def _run_with_pack(td, pack):
564
+ import yaml as _yaml
565
+
566
+ rp = Path(td) / "test.yaml"
567
+ rp.write_text(_yaml.dump(pack, allow_unicode=True))
568
+ p = subprocess.run(
569
+ [
570
+ sys.executable,
571
+ str(VERDICT),
572
+ "--rules",
573
+ str(rp),
574
+ "--soc",
575
+ "a5",
576
+ "-o",
577
+ str(Path(td) / "v.json"),
578
+ ],
579
+ capture_output=True,
580
+ text=True,
581
+ timeout=60,
582
+ )
583
+ return p.returncode, p.stderr
584
+
585
+
586
+ def run_script_case(case: dict, verbose: bool) -> tuple[bool, list[str]]:
587
+ errs = []
588
+ with tempfile.TemporaryDirectory() as td:
589
+ cid = case["id"]
590
+ if cid == "S1-delta-hard-reject":
591
+ b = _mk_snap(td, "baseline")
592
+ a = _mk_snap(td, "after", device_id="1")
593
+ p = _run_delta(td, b, a)
594
+ if p.returncode != 2 or "device_id" not in p.stderr:
595
+ errs.append(f"应 exit 2 且 stderr 含 device_id(rc={p.returncode})")
596
+ elif cid == "S2-delta-precision-reject":
597
+ b = _mk_snap(td, "baseline")
598
+ a = _mk_snap(td, "after", precision="fail")
599
+ p = _run_delta(td, b, a)
600
+ if p.returncode != 2 or "精度" not in p.stderr:
601
+ errs.append(f"应 exit 2 且 stderr 含精度(rc={p.returncode})")
602
+ elif cid == "S3-delta-keep":
603
+ b = _mk_snap(td, "baseline", kernel_avg_us=100.0)
604
+ a = _mk_snap(td, "after", kernel_avg_us=95.0) # 1.0526 > 1.05
605
+ p = _run_delta(td, b, a)
606
+ if p.returncode != 0 or "KEEP" not in p.stdout:
607
+ errs.append(f"应 KEEP(rc={p.returncode}, out={p.stdout[:80]})")
608
+ elif cid == "S4-delta-noise-band":
609
+ b = _mk_snap(td, "baseline", kernel_avg_us=100.0)
610
+ a = _mk_snap(td, "after", kernel_avg_us=100.8) # 0.992 within band
611
+ p = _run_delta(td, b, a)
612
+ if (
613
+ p.returncode != 0
614
+ or "噪声带内" not in p.stdout
615
+ or "同步重采基线" not in p.stdout
616
+ ):
617
+ errs.append(f"应噪声带内 + 同步重采文案(out={p.stdout[:120]})")
618
+ elif cid == "S5-delta-revert":
619
+ b = _mk_snap(td, "baseline", kernel_avg_us=100.0)
620
+ a = _mk_snap(td, "after", kernel_avg_us=110.0) # 0.909
621
+ p = _run_delta(td, b, a)
622
+ if p.returncode != 0 or "REVERT" not in p.stdout:
623
+ errs.append(f"应 REVERT(out={p.stdout[:80]})")
624
+ elif cid == "S6-mechanism-warn":
625
+ b = _mk_snap(td, "baseline", tiling_key="tiling_v1", block_dim=24)
626
+ a = _mk_snap(
627
+ td, "after", tiling_key="tiling_v2", block_dim=48, kernel_avg_us=95.0
628
+ )
629
+ p = _run_delta(td, b, a)
630
+ if p.returncode != 0 or "WARN" not in p.stdout:
631
+ errs.append(f"机制变量应 WARN 不阻断(rc={p.returncode})")
632
+ elif cid == "S7-repeat-conflict":
633
+ b = _mk_snap(td, "baseline", repeat=20)
634
+ a = _mk_snap(td, "after", repeat=40)
635
+ p = _run_delta(td, b, a)
636
+ if p.returncode != 2 or "repeat" not in p.stderr:
637
+ errs.append(f"repeat 漂移应 exit 2(rc={p.returncode})")
638
+ elif cid == "S8-noise-band-override":
639
+ b = _mk_snap(td, "baseline", kernel_avg_us=100.0)
640
+ a = _mk_snap(td, "after", kernel_avg_us=101.0) # 0.990
641
+ p = _run_delta(td, b, a, ["--noise-band", "0.01"])
642
+ if p.returncode != 0 or "劣化" not in p.stdout:
643
+ errs.append(f"noise-band 0.01 覆写后应判劣化(out={p.stdout[:80]})")
644
+ elif cid == "S9-jitter-diagnostics":
645
+ b = _mk_snap(
646
+ td,
647
+ "baseline",
648
+ kernel_p50_us=10.0,
649
+ kernel_p95_us=35.0,
650
+ kernel_max_us=40.0,
651
+ )
652
+ a = _mk_snap(
653
+ td, "after", kernel_p50_us=12.0, kernel_p95_us=13.0, kernel_max_us=14.0
654
+ )
655
+ p = _run_delta(td, b, a)
656
+ md = (Path(td) / "comp.md").read_text(encoding="utf-8")
657
+ if "抖动诊断" not in md or "双峰" not in md:
658
+ errs.append("应输出抖动诊断段 + 双峰提示")
659
+ elif cid == "S10-validation-v1":
660
+ pack = {
661
+ "schema": "opstune.rules/1.0",
662
+ "layer": "T",
663
+ "metrics": {"foo": {"source": "scalar"}},
664
+ "rules": [
665
+ {
666
+ "id": "T1",
667
+ "condition": {"metric": "undeclared", "op": "gt", "value": 1},
668
+ "metrics_required": ["undeclared"],
669
+ }
670
+ ],
671
+ }
672
+ rc, err = _run_with_pack(td, pack)
673
+ if rc != 3 or "[V1]" not in err:
674
+ errs.append(f"V1 应 exit 3(rc={rc})")
675
+ elif cid == "S11-validation-v3":
676
+ pack = {
677
+ "schema": "opstune.rules/1.0",
678
+ "layer": "T",
679
+ "metrics": {"r": {"source": "derived"}},
680
+ "rules": [
681
+ {
682
+ "id": "A",
683
+ "condition": {
684
+ "all": [
685
+ {"metric": "r", "op": "gte", "value": 0.5},
686
+ {"metric": "r", "op": "lt", "value": 1.0},
687
+ ]
688
+ },
689
+ "metrics_required": [],
690
+ },
691
+ {
692
+ "id": "B",
693
+ "condition": {
694
+ "all": [
695
+ {"metric": "r", "op": "between", "value": [0.9, 1.1]}
696
+ ]
697
+ },
698
+ "metrics_required": [],
699
+ },
700
+ ],
701
+ }
702
+ rc, err = _run_with_pack(td, pack)
703
+ if rc != 3 or "[V3]" not in err:
704
+ errs.append(f"V3 应 exit 3(rc={rc})")
705
+ elif cid == "S12-validation-v4":
706
+ pack = {
707
+ "schema": "opstune.rules/1.0",
708
+ "layer": "T",
709
+ "metrics": {"foo": {"source": "scalar"}},
710
+ "rules": [
711
+ {
712
+ "id": "T4",
713
+ "condition": {"metric": "foo", "op": "gt", "value": 1},
714
+ "metrics_required": [],
715
+ "metrics_optional": ["foo"],
716
+ }
717
+ ],
718
+ }
719
+ rc, err = _run_with_pack(td, pack)
720
+ if rc != 3 or "[V4]" not in err:
721
+ errs.append(f"V4 应 exit 3(rc={rc})")
722
+ elif cid == "S13-batch-noise-classification":
723
+ # 四对快照过 batch_pipeline:噪声带内(100→100.5)/ KEEP(100→80)/
724
+ # REVERT(100→110)/ UNRESOLVED(kernel_avg_us 缺失),矩阵分类必须
725
+ # 与 delta_compare 结论一致,且汇总各桶(含 UNRESOLVED)逐状态计数
726
+ # ——修复前:噪声带内被标 REVERT(文案「不判收益也不劣化」含「劣化」,
727
+ # 子串匹配先命中);UNRESOLVED case 在汇总五桶中静默消失
728
+ # (issue #308 问题 1 及补充)。
729
+ c_dir = Path(td)
730
+ cases_csv = c_dir / "cases.csv"
731
+ cases_csv.write_text(
732
+ "case_id,shape,dtype\nc01,8x8,fp16\n", encoding="utf-8"
733
+ )
734
+ perf_csv = c_dir / "perf_data.csv"
735
+ perf_csv.write_text(
736
+ "case_id,variant,kernel_avg_us,precision\n"
737
+ "c01,baseline,100.0,pass\n"
738
+ "c01,round-01-noise,100.5,pass\n"
739
+ "c01,round-02-keep,80.0,pass\n"
740
+ "c01,round-03-revert,110.0,pass\n"
741
+ "c01,round-04-unresolved,,pass\n",
742
+ encoding="utf-8",
743
+ )
744
+ scope_json = c_dir / "scope.json"
745
+ scope_json.write_text(
746
+ '{"op":"gelu","soc":"a5","mode":"board","timing_method":"event",'
747
+ '"baseline_kind":"self_before_after","cann_version":"8.3.0",'
748
+ '"device_id":"0","shape":"8x8","dtype":"fp16","format":"ND",'
749
+ '"warmup":5,"repeat":20}',
750
+ encoding="utf-8",
751
+ )
752
+ p = subprocess.run(
753
+ [
754
+ sys.executable,
755
+ str(BATCH_PIPELINE),
756
+ "--cases",
757
+ str(cases_csv),
758
+ "--perf",
759
+ str(perf_csv),
760
+ "--baseline-variant",
761
+ "baseline",
762
+ "--after-variants",
763
+ "round-01-noise,round-02-keep,round-03-revert,round-04-unresolved",
764
+ "--scope",
765
+ str(scope_json),
766
+ "--output-dir",
767
+ str(c_dir / "matrix"),
768
+ ],
769
+ capture_output=True,
770
+ text=True,
771
+ timeout=120,
772
+ )
773
+ if p.returncode != 0:
774
+ errs.append(f"batch_pipeline 退出码 {p.returncode}: {p.stderr[:200]}")
775
+ else:
776
+ md = (c_dir / "matrix" / "comparison_matrix.md").read_text(
777
+ encoding="utf-8"
778
+ )
779
+ import re as _re
780
+
781
+ want = {
782
+ "round-01-noise": "NOISE",
783
+ "round-02-keep": "KEEP",
784
+ "round-03-revert": "REVERT",
785
+ # kernel_avg_us 为空:load_perf 跳过该行 → 该 case×variant
786
+ # 无数据记 MISSING(不是 UNRESOLVED——UNRESOLVED 是有数据
787
+ # 但 status=partial/dry_run 时 delta_compare 的结论)。改用
788
+ # 有数值但 status 不完整难在 perf CSV 表达,此处直接断言
789
+ # MISSING 桶存在(原实现 MISSING 推算公式会漏 UNRESOLVED)
790
+ "round-04-unresolved": "MISSING",
791
+ }
792
+ for variant, expect in want.items():
793
+ m = _re.search(
794
+ rf"^## {variant}$.*?^\| c01 .*$",
795
+ md,
796
+ _re.M | _re.S,
797
+ )
798
+ # 取段内首个 c01 数据行(_re.S 跨行匹配会吞到产物索引段,须截断)
799
+ row = ""
800
+ if m:
801
+ for line in m.group(0).splitlines():
802
+ if line.startswith("| c01 "):
803
+ row = line
804
+ break
805
+ if f"| {expect} |" not in row:
806
+ errs.append(
807
+ f"{variant} 矩阵行应分类 {expect},实际行:{row or '(未找到)'}"
808
+ )
809
+ # 汇总桶逐状态断言:UNRESOLVED 计数必须显式出现(修复前无此桶)
810
+ for variant in ("round-01-noise", "round-02-keep"):
811
+ m = _re.search(
812
+ rf"^## {variant}$.*?(?=^## )",
813
+ md,
814
+ _re.M | _re.S,
815
+ )
816
+ seg = m.group(0) if m else ""
817
+ if "UNRESOLVED" not in seg:
818
+ errs.append(
819
+ f"{variant} 汇总段应含 UNRESOLVED 桶(逐状态计数,"
820
+ "case 不得从汇总静默消失)"
821
+ )
822
+ elif cid == "S14-delta-hard-missing-warn":
823
+ # baseline 不带 device_id(snapshot 缺省 None)、after 带 device_id=1:
824
+ # 口径键单侧缺失 → 不阻断(直连路径允许部分口径)但必须 stderr WARN 留痕,
825
+ # 不再静默跳过校验(issue #308 问题 2)。
826
+ b = _mk_snap(td, "baseline", device_id=None)
827
+ a = _mk_snap(td, "after", device_id="1", kernel_avg_us=50.0)
828
+ p = _run_delta(td, b, a)
829
+ if p.returncode != 0:
830
+ errs.append(f"单侧缺失应放行(rc={p.returncode}):{p.stderr[:120]}")
831
+ elif "device_id" not in p.stderr or "WARN" not in p.stderr:
832
+ errs.append(
833
+ f"stderr 应含 device_id WARN 留痕,实际 stderr:{p.stderr[:200]}"
834
+ )
835
+ if verbose and errs:
836
+ for e in errs:
837
+ print(f" ✗ {e}")
838
+ return (not errs), errs
839
+
840
+
841
+ def run_case(case: dict, verbose: bool) -> tuple[bool, list[str]]:
842
+ with tempfile.TemporaryDirectory() as td:
843
+ out = Path(td) / "verdict.json"
844
+ cmd = [sys.executable, str(VERDICT), *case["args"], "-o", str(out)]
845
+ proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
846
+ if "exit_code" in case["assert"]:
847
+ # 门禁类用例:只断言退出码与 stderr 片段(fail-loud 语义回归)
848
+ if proc.returncode != case["assert"]["exit_code"]:
849
+ return False, [
850
+ f"应 exit {case['assert']['exit_code']},实际 {proc.returncode}"
851
+ f"(stderr: {proc.stderr[:200]})"
852
+ ]
853
+ frag = case["assert"].get("stderr_contains")
854
+ if frag and frag not in proc.stderr:
855
+ return False, [f"stderr 应含 {frag!r},实际 {proc.stderr[:200]!r}"]
856
+ return True, []
857
+ if proc.returncode != 0:
858
+ return False, [f"verdict.py 退出码 {proc.returncode}: {proc.stderr[:300]}"]
859
+ v = json.loads(out.read_text(encoding="utf-8"))
860
+
861
+ errs = []
862
+ a = case["assert"]
863
+ hits = {f["rule_id"] for f in v["findings"] if f.get("status") == "HIT"}
864
+ skipped = {s["rule_id"]: s for s in v["skipped"]}
865
+
866
+ for rid in a.get("hit", []):
867
+ if rid not in hits:
868
+ errs.append(f"应命中未命中: {rid}(实际命中: {sorted(hits)})")
869
+ for rid in a.get("not_hit", []):
870
+ if rid in hits:
871
+ errs.append(f"不应命中却命中: {rid}")
872
+ if "hit_either" in a:
873
+ if not set(a["hit_either"]) & hits:
874
+ errs.append(f"应至少命中其一: {a['hit_either']}(实际: {sorted(hits)})")
875
+ if "hit_or_insufficient" in a:
876
+ ok = set(a["hit_or_insufficient"]) & hits or any(
877
+ rid in skipped
878
+ and skipped[rid].get("status") in ("SKIPPED", "INSUFFICIENT_DATA")
879
+ for rid in a["hit_or_insufficient"]
880
+ )
881
+ if not ok:
882
+ errs.append(f"应命中或因证据不足跳过: {a['hit_or_insufficient']}")
883
+ for rid in a.get("skipped_contains", []):
884
+ if rid not in skipped:
885
+ errs.append(f"应出现在 skipped: {rid}")
886
+ for rid, frag in a.get("skipped_reason_contains", {}).items():
887
+ entry = skipped.get(rid)
888
+ if entry is None:
889
+ errs.append(f"应出现在 skipped: {rid}(reason 断言无从检查)")
890
+ elif frag not in (entry.get("reason") or ""):
891
+ errs.append(
892
+ f"skipped[{rid}].reason 应含 {frag!r},实际 {entry.get('reason')!r}"
893
+ )
894
+ if "severity" in a:
895
+ hit_map = {f["rule_id"]: f for f in v["findings"]}
896
+ for rid, want in a["severity"].items():
897
+ got = hit_map.get(rid, {}).get("severity")
898
+ if got != want:
899
+ errs.append(f"{rid} severity 应为 {want},实际 {got}")
900
+ if "counter_evidence_hit" in a:
901
+ hit_map = {f["rule_id"]: f for f in v["findings"]}
902
+ for rid, ce_ids in a["counter_evidence_hit"].items():
903
+ ces = {c["id"]: c for c in hit_map.get(rid, {}).get("counter_evidence", [])}
904
+ for ce_id in ce_ids:
905
+ if ce_id not in ces:
906
+ errs.append(f"{rid} 反证 {ce_id} 缺失")
907
+ elif ces[ce_id].get("unevaluated"):
908
+ errs.append(f"{rid} 反证 {ce_id} 应已评估(实际 unevaluated)")
909
+ if "counter_evidence_unevaluated" in a:
910
+ hit_map = {f["rule_id"]: f for f in v["findings"]}
911
+ for rid, ce_ids in a["counter_evidence_unevaluated"].items():
912
+ ces = {c["id"]: c for c in hit_map.get(rid, {}).get("counter_evidence", [])}
913
+ for ce_id in ce_ids:
914
+ if ce_id not in ces:
915
+ errs.append(f"{rid} 反证 {ce_id} 缺失")
916
+ elif not ces[ce_id].get("unevaluated"):
917
+ errs.append(f"{rid} 反证 {ce_id} 应为 unevaluated(缺失语义)")
918
+ if "facts_pack_contains" in a:
919
+ facts = v.get("facts", {})
920
+ for pack, metrics in a["facts_pack_contains"].items():
921
+ if pack not in facts:
922
+ errs.append(f"facts 应含包层 {pack}(实际键: {list(facts)})")
923
+ continue
924
+ for m in metrics:
925
+ if m not in facts[pack]:
926
+ errs.append(f"facts[{pack}] 应含指标 {m}")
927
+ if "verdict" in a and v["verdict"] != a["verdict"]:
928
+ errs.append(f"verdict 应为 {a['verdict']},实际 {v['verdict']}")
929
+ if "rows" in a and v.get("rows") != a["rows"]:
930
+ errs.append(f"rows 应为 {a['rows']},实际 {v.get('rows')}")
931
+
932
+ if verbose:
933
+ print(
934
+ f" hits={sorted(hits)} verdict={v['verdict']} headline={v['headline']}"
935
+ )
936
+ return (not errs), errs
937
+
938
+
939
+ def main() -> int:
940
+ verbose = "-v" in sys.argv
941
+ passed, failed = 0, []
942
+ for case in CASES + SCRIPT_CASES:
943
+ runner = run_case if case.get("args") is not None else run_script_case
944
+ ok, errs = runner(case, verbose)
945
+ mark = "PASS" if ok else "FAIL"
946
+ print(f"[{mark}] {case['id']}: {case['desc']}")
947
+ if ok:
948
+ passed += 1
949
+ else:
950
+ failed.append(case["id"])
951
+ for e in errs:
952
+ print(f" ✗ {e}")
953
+ print(f"\n{passed}/{len(CASES) + len(SCRIPT_CASES)} 通过")
954
+ if failed:
955
+ print(
956
+ f"失败用例: {', '.join(failed)} —— 规则/阈值变更未过回归,禁止合入(阈值纪律)"
957
+ )
958
+ return 1
959
+ return 0
960
+
961
+
962
+ if __name__ == "__main__":
963
+ sys.exit(main())