@dommaker/harness 1.9.0 → 1.11.0

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 (285) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +9 -12
  3. package/dist/cli/commands/check.d.ts +3 -3
  4. package/dist/cli/commands/check.d.ts.map +1 -1
  5. package/dist/cli/commands/check.js +41 -78
  6. package/dist/cli/commands/check.js.map +1 -1
  7. package/dist/cli/commands/constraints-report.d.ts +2 -10
  8. package/dist/cli/commands/constraints-report.d.ts.map +1 -1
  9. package/dist/cli/commands/constraints-report.js +4 -57
  10. package/dist/cli/commands/constraints-report.js.map +1 -1
  11. package/dist/cli/commands/constraints-retire.d.ts +9 -23
  12. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  13. package/dist/cli/commands/constraints-retire.js +39 -121
  14. package/dist/cli/commands/constraints-retire.js.map +1 -1
  15. package/dist/cli/commands/constraints.d.ts +3 -8
  16. package/dist/cli/commands/constraints.d.ts.map +1 -1
  17. package/dist/cli/commands/constraints.js +8 -23
  18. package/dist/cli/commands/constraints.js.map +1 -1
  19. package/dist/cli/commands/definitions.d.ts.map +1 -1
  20. package/dist/cli/commands/definitions.js +7 -12
  21. package/dist/cli/commands/definitions.js.map +1 -1
  22. package/dist/cli/commands/init.d.ts +0 -32
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +7 -149
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/report.d.ts.map +1 -1
  27. package/dist/cli/commands/report.js +14 -17
  28. package/dist/cli/commands/report.js.map +1 -1
  29. package/dist/cli/commands/scaffold-templates.d.ts +1 -3
  30. package/dist/cli/commands/scaffold-templates.d.ts.map +1 -1
  31. package/dist/cli/commands/scaffold-templates.js +2 -53
  32. package/dist/cli/commands/scaffold-templates.js.map +1 -1
  33. package/dist/cli/commands/scaffold.d.ts +0 -2
  34. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  35. package/dist/cli/commands/scaffold.js +0 -10
  36. package/dist/cli/commands/scaffold.js.map +1 -1
  37. package/dist/cli/commands/status.js +10 -10
  38. package/dist/cli/commands/status.js.map +1 -1
  39. package/dist/cli/commands/sync-docs/agents-syncer.d.ts +0 -2
  40. package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
  41. package/dist/cli/commands/sync-docs/agents-syncer.js +4 -23
  42. package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
  43. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  44. package/dist/core/constraints/capabilities-parser.js +16 -4
  45. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  46. package/dist/core/constraints/checker.d.ts +15 -24
  47. package/dist/core/constraints/checker.d.ts.map +1 -1
  48. package/dist/core/constraints/checker.js +33 -72
  49. package/dist/core/constraints/checker.js.map +1 -1
  50. package/dist/core/constraints/checkers/docs-freshness.js +1 -1
  51. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  52. package/dist/core/constraints/checkers/governance-presence.d.ts +2 -1
  53. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
  54. package/dist/core/constraints/checkers/governance-presence.js +4 -3
  55. package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
  56. package/dist/core/constraints/checkers/index.d.ts +1 -1
  57. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  58. package/dist/core/constraints/checkers/index.js +4 -8
  59. package/dist/core/constraints/checkers/index.js.map +1 -1
  60. package/dist/core/constraints/checkers/iron-flags.d.ts +3 -4
  61. package/dist/core/constraints/checkers/iron-flags.d.ts.map +1 -1
  62. package/dist/core/constraints/checkers/iron-flags.js +4 -5
  63. package/dist/core/constraints/checkers/iron-flags.js.map +1 -1
  64. package/dist/core/constraints/checkers/no-test-simplification.js +1 -1
  65. package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
  66. package/dist/core/constraints/checkers/types.d.ts +1 -1
  67. package/dist/core/constraints/checkers/types.js +1 -1
  68. package/dist/core/constraints/definitions/guidelines.d.ts +4 -4
  69. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  70. package/dist/core/constraints/definitions/guidelines.js +9 -25
  71. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  72. package/dist/core/constraints/definitions/iron-laws.d.ts +4 -4
  73. package/dist/core/constraints/definitions/iron-laws.d.ts.map +1 -1
  74. package/dist/core/constraints/definitions/iron-laws.js +10 -81
  75. package/dist/core/constraints/definitions/iron-laws.js.map +1 -1
  76. package/dist/core/constraints/definitions.d.ts +7 -9
  77. package/dist/core/constraints/definitions.d.ts.map +1 -1
  78. package/dist/core/constraints/definitions.js +13 -16
  79. package/dist/core/constraints/definitions.js.map +1 -1
  80. package/dist/core/constraints/index.d.ts +2 -5
  81. package/dist/core/constraints/index.d.ts.map +1 -1
  82. package/dist/core/constraints/index.js +3 -13
  83. package/dist/core/constraints/index.js.map +1 -1
  84. package/dist/core/constraints/injection-writer.d.ts +10 -38
  85. package/dist/core/constraints/injection-writer.d.ts.map +1 -1
  86. package/dist/core/constraints/injection-writer.js +17 -54
  87. package/dist/core/constraints/injection-writer.js.map +1 -1
  88. package/dist/core/constraints/run-env.d.ts +1 -10
  89. package/dist/core/constraints/run-env.d.ts.map +1 -1
  90. package/dist/core/constraints/run-env.js +1 -22
  91. package/dist/core/constraints/run-env.js.map +1 -1
  92. package/dist/core/constraints/usage-report.d.ts +6 -8
  93. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  94. package/dist/core/constraints/usage-report.js +6 -11
  95. package/dist/core/constraints/usage-report.js.map +1 -1
  96. package/dist/core/effective-constraints.d.ts +12 -22
  97. package/dist/core/effective-constraints.d.ts.map +1 -1
  98. package/dist/core/effective-constraints.js +13 -30
  99. package/dist/core/effective-constraints.js.map +1 -1
  100. package/dist/core/index.d.ts +2 -2
  101. package/dist/core/index.d.ts.map +1 -1
  102. package/dist/core/index.js +3 -9
  103. package/dist/core/index.js.map +1 -1
  104. package/dist/core/project-config-loader.d.ts +4 -42
  105. package/dist/core/project-config-loader.d.ts.map +1 -1
  106. package/dist/core/project-config-loader.js +16 -125
  107. package/dist/core/project-config-loader.js.map +1 -1
  108. package/dist/core/validators/passes-gate.d.ts +2 -2
  109. package/dist/core/validators/passes-gate.js +6 -6
  110. package/dist/core/validators/passes-gate.js.map +1 -1
  111. package/dist/index.d.ts +9 -10
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +21 -18
  114. package/dist/index.js.map +1 -1
  115. package/dist/knowledge/lint.d.ts +17 -0
  116. package/dist/knowledge/lint.d.ts.map +1 -1
  117. package/dist/knowledge/lint.js +52 -0
  118. package/dist/knowledge/lint.js.map +1 -1
  119. package/dist/knowledge/store.d.ts +7 -0
  120. package/dist/knowledge/store.d.ts.map +1 -1
  121. package/dist/knowledge/store.js +48 -13
  122. package/dist/knowledge/store.js.map +1 -1
  123. package/dist/knowledge/types.d.ts +5 -1
  124. package/dist/knowledge/types.d.ts.map +1 -1
  125. package/dist/knowledge/types.js +5 -1
  126. package/dist/knowledge/types.js.map +1 -1
  127. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  128. package/dist/monitoring/trace-analyzer.js +11 -12
  129. package/dist/monitoring/trace-analyzer.js.map +1 -1
  130. package/dist/monitoring/traces.d.ts +4 -4
  131. package/dist/monitoring/traces.d.ts.map +1 -1
  132. package/dist/monitoring/traces.js +8 -8
  133. package/dist/monitoring/traces.js.map +1 -1
  134. package/dist/presets/standard.d.ts +8 -10
  135. package/dist/presets/standard.d.ts.map +1 -1
  136. package/dist/presets/standard.js +10 -16
  137. package/dist/presets/standard.js.map +1 -1
  138. package/dist/types/constraint.d.ts +24 -35
  139. package/dist/types/constraint.d.ts.map +1 -1
  140. package/dist/types/constraint.js +8 -7
  141. package/dist/types/constraint.js.map +1 -1
  142. package/dist/types/passes-gate.d.ts +5 -5
  143. package/dist/types/passes-gate.d.ts.map +1 -1
  144. package/dist/types/project-config.d.ts +8 -66
  145. package/dist/types/project-config.d.ts.map +1 -1
  146. package/dist/types/project-config.js +3 -2
  147. package/dist/types/project-config.js.map +1 -1
  148. package/dist/types/trace.d.ts +8 -10
  149. package/dist/types/trace.d.ts.map +1 -1
  150. package/package.json +2 -2
  151. package/src/CONTEXT.md +2 -2
  152. package/src/__tests__/checker-extra.test.ts +37 -61
  153. package/src/__tests__/checker.test.ts +10 -115
  154. package/src/__tests__/effective-constraints.test.ts +18 -83
  155. package/src/__tests__/iron-laws.test.ts +71 -90
  156. package/src/__tests__/passes-gate-check.test.ts +2 -2
  157. package/src/__tests__/project-config-loader-extra.test.ts +22 -123
  158. package/src/__tests__/project-config-loader.test.ts +5 -33
  159. package/src/__tests__/public-exports.test.ts +8 -7
  160. package/src/__tests__/public-type-surface.test.ts +7 -5
  161. package/src/__tests__/public-value-surface.test.ts +1 -7
  162. package/src/__tests__/skip-semantics.test.ts +21 -37
  163. package/src/__tests__/trace-analyzer-extra.test.ts +14 -14
  164. package/src/__tests__/trace-analyzer.test.ts +21 -21
  165. package/src/__tests__/trace-collector.test.ts +22 -22
  166. package/src/__tests__/traces.test.ts +27 -28
  167. package/src/__tests__/usage-report-public-export.test.ts +21 -0
  168. package/src/cli/commands/CONTEXT.md +12 -12
  169. package/src/cli/commands/__tests__/check-read-count.test.ts +4 -15
  170. package/src/cli/commands/__tests__/check-skip-output.test.ts +14 -14
  171. package/src/cli/commands/__tests__/check.test.ts +14 -31
  172. package/src/cli/commands/__tests__/constraints-report-json-flag.test.ts +101 -0
  173. package/src/cli/commands/__tests__/constraints-report.test.ts +12 -80
  174. package/src/cli/commands/__tests__/constraints-retire.test.ts +42 -231
  175. package/src/cli/commands/__tests__/init-governance-io.test.ts +12 -58
  176. package/src/cli/commands/__tests__/init-ondisk.test.ts +13 -21
  177. package/src/cli/commands/__tests__/init.test.ts +1 -16
  178. package/src/cli/commands/__tests__/numeric-flag-assembly.test.ts +1 -1
  179. package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +1 -1
  180. package/src/cli/commands/__tests__/project-path-anchoring.test.ts +2 -2
  181. package/src/cli/commands/__tests__/registry.test.ts +1 -1
  182. package/src/cli/commands/__tests__/report-extra.test.ts +4 -4
  183. package/src/cli/commands/__tests__/report.test.ts +1 -1
  184. package/src/cli/commands/__tests__/scaffold.test.ts +4 -14
  185. package/src/cli/commands/__tests__/status-analysis-wiring.test.ts +3 -3
  186. package/src/cli/commands/__tests__/status-extra.test.ts +14 -14
  187. package/src/cli/commands/__tests__/status.test.ts +12 -12
  188. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +1 -1
  189. package/src/cli/commands/check.ts +43 -82
  190. package/src/cli/commands/constraints-report.ts +4 -59
  191. package/src/cli/commands/constraints-retire.ts +49 -154
  192. package/src/cli/commands/constraints.ts +11 -26
  193. package/src/cli/commands/definitions.ts +7 -12
  194. package/src/cli/commands/init.ts +8 -179
  195. package/src/cli/commands/report.ts +19 -23
  196. package/src/cli/commands/scaffold-templates.ts +1 -53
  197. package/src/cli/commands/scaffold.ts +0 -11
  198. package/src/cli/commands/status.ts +10 -10
  199. package/src/cli/commands/sync-docs/agents-syncer.ts +4 -25
  200. package/src/core/CONTEXT.md +9 -9
  201. package/src/core/constraints/__tests__/capability-counts.test.ts +5 -5
  202. package/src/core/constraints/__tests__/collect-constraints.test.ts +13 -8
  203. package/src/core/constraints/__tests__/git-evidence.test.ts +4 -7
  204. package/src/core/constraints/__tests__/injection-writer.test.ts +8 -61
  205. package/src/core/constraints/__tests__/run-env.test.ts +5 -34
  206. package/src/core/constraints/__tests__/trace-injection.test.ts +1 -1
  207. package/src/core/constraints/capabilities-parser.ts +17 -5
  208. package/src/core/constraints/checker.ts +39 -88
  209. package/src/core/constraints/checkers/__tests__/check-outcome.test.ts +5 -8
  210. package/src/core/constraints/checkers/__tests__/governance-presence.test.ts +1 -53
  211. package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +5 -25
  212. package/src/core/constraints/checkers/docs-freshness.ts +1 -1
  213. package/src/core/constraints/checkers/governance-presence.ts +4 -3
  214. package/src/core/constraints/checkers/index.ts +4 -10
  215. package/src/core/constraints/checkers/iron-flags.ts +3 -12
  216. package/src/core/constraints/checkers/no-test-simplification.ts +1 -1
  217. package/src/core/constraints/checkers/types.ts +1 -1
  218. package/src/core/constraints/definitions/guidelines.ts +8 -25
  219. package/src/core/constraints/definitions/iron-laws.ts +9 -82
  220. package/src/core/constraints/definitions.ts +14 -15
  221. package/src/core/constraints/index.ts +4 -19
  222. package/src/core/constraints/injection-writer.ts +16 -61
  223. package/src/core/constraints/run-env.ts +1 -33
  224. package/src/core/constraints/usage-report.ts +9 -16
  225. package/src/core/effective-constraints.ts +14 -45
  226. package/src/core/index.ts +3 -10
  227. package/src/core/project-config-loader.ts +20 -145
  228. package/src/core/validators/passes-gate.ts +6 -6
  229. package/src/failure/CONTEXT.md +1 -1
  230. package/src/hooks/__tests__/bootstrap.test.ts +3 -5
  231. package/src/index.ts +28 -18
  232. package/src/knowledge/CONTEXT.md +4 -3
  233. package/src/knowledge/__tests__/lint.test.ts +84 -0
  234. package/src/knowledge/__tests__/store.test.ts +70 -0
  235. package/src/knowledge/lint.ts +60 -1
  236. package/src/knowledge/store.ts +48 -11
  237. package/src/knowledge/types.ts +7 -1
  238. package/src/monitoring/CONTEXT.md +1 -1
  239. package/src/monitoring/__tests__/trace-file-anchoring.test.ts +1 -1
  240. package/src/monitoring/__tests__/traces.test.ts +22 -22
  241. package/src/monitoring/trace-analyzer.ts +12 -13
  242. package/src/monitoring/traces.ts +8 -8
  243. package/src/presets/__tests__/standard.test.ts +12 -16
  244. package/src/presets/standard.ts +14 -23
  245. package/src/types/__tests__/types.test.ts +3 -3
  246. package/src/types/constraint.ts +26 -40
  247. package/src/types/passes-gate.ts +5 -5
  248. package/src/types/project-config.ts +8 -77
  249. package/src/types/trace.ts +8 -11
  250. package/dist/cli/commands/posteval-plan.d.ts +0 -15
  251. package/dist/cli/commands/posteval-plan.d.ts.map +0 -1
  252. package/dist/cli/commands/posteval-plan.js +0 -86
  253. package/dist/cli/commands/posteval-plan.js.map +0 -1
  254. package/dist/core/constraints/agent-prompt-renderer.d.ts +0 -32
  255. package/dist/core/constraints/agent-prompt-renderer.d.ts.map +0 -1
  256. package/dist/core/constraints/agent-prompt-renderer.js +0 -55
  257. package/dist/core/constraints/agent-prompt-renderer.js.map +0 -1
  258. package/dist/core/constraints/checkers/no-bypass-checkpoint.d.ts +0 -6
  259. package/dist/core/constraints/checkers/no-bypass-checkpoint.d.ts.map +0 -1
  260. package/dist/core/constraints/checkers/no-bypass-checkpoint.js +0 -40
  261. package/dist/core/constraints/checkers/no-bypass-checkpoint.js.map +0 -1
  262. package/dist/core/constraints/definitions/prompts.d.ts +0 -12
  263. package/dist/core/constraints/definitions/prompts.d.ts.map +0 -1
  264. package/dist/core/constraints/definitions/prompts.js +0 -400
  265. package/dist/core/constraints/definitions/prompts.js.map +0 -1
  266. package/dist/core/constraints/injection-drift.d.ts +0 -61
  267. package/dist/core/constraints/injection-drift.d.ts.map +0 -1
  268. package/dist/core/constraints/injection-drift.js +0 -131
  269. package/dist/core/constraints/injection-drift.js.map +0 -1
  270. package/dist/core/constraints/injection-renderer.d.ts +0 -23
  271. package/dist/core/constraints/injection-renderer.d.ts.map +0 -1
  272. package/dist/core/constraints/injection-renderer.js +0 -44
  273. package/dist/core/constraints/injection-renderer.js.map +0 -1
  274. package/src/cli/commands/__tests__/check-drift.test.ts +0 -158
  275. package/src/cli/commands/__tests__/init-injection.test.ts +0 -466
  276. package/src/cli/commands/__tests__/posteval-plan.test.ts +0 -204
  277. package/src/cli/commands/posteval-plan.ts +0 -98
  278. package/src/core/constraints/__tests__/agent-prompt-renderer.test.ts +0 -129
  279. package/src/core/constraints/__tests__/injection-drift.test.ts +0 -247
  280. package/src/core/constraints/agent-prompt-renderer.ts +0 -67
  281. package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +0 -76
  282. package/src/core/constraints/checkers/no-bypass-checkpoint.ts +0 -40
  283. package/src/core/constraints/definitions/prompts.ts +0 -414
  284. package/src/core/constraints/injection-drift.ts +0 -142
  285. package/src/core/constraints/injection-renderer.ts +0 -44
@@ -41,8 +41,8 @@ describe('TraceAnalyzer - 补充覆盖', () => {
41
41
  describe('趋势计算', () => {
42
42
  it('少于 10 条记录应该返回 stable', () => {
43
43
  const traces: ExecutionTrace[] = [
44
- { constraintId: 'test', level: 'iron_law', timestamp: 1000, result: 'pass' },
45
- { constraintId: 'test', level: 'iron_law', timestamp: 2000, result: 'pass' },
44
+ { constraintId: 'test', severity: 'error', timestamp: 1000, result: 'pass' },
45
+ { constraintId: 'test', severity: 'error', timestamp: 2000, result: 'pass' },
46
46
  ];
47
47
 
48
48
  const summaries = analyzer.summarize(traces);
@@ -53,10 +53,10 @@ describe('TraceAnalyzer - 补充覆盖', () => {
53
53
  // 创建 15 条记录,前半段通过率低,后半段高 → rising
54
54
  const traces: ExecutionTrace[] = [];
55
55
  for (let i = 0; i < 8; i++) {
56
- traces.push({ constraintId: 'test', level: 'iron_law', timestamp: 1000 + i * 100, result: 'fail' });
56
+ traces.push({ constraintId: 'test', severity: 'error', timestamp: 1000 + i * 100, result: 'fail' });
57
57
  }
58
58
  for (let i = 8; i < 15; i++) {
59
- traces.push({ constraintId: 'test', level: 'iron_law', timestamp: 1000 + i * 100, result: 'pass' });
59
+ traces.push({ constraintId: 'test', severity: 'error', timestamp: 1000 + i * 100, result: 'pass' });
60
60
  }
61
61
 
62
62
  const summaries = analyzer.summarize(traces);
@@ -67,10 +67,10 @@ describe('TraceAnalyzer - 补充覆盖', () => {
67
67
  describe('compareWithPrevious', () => {
68
68
  it('应该计算环比变化', () => {
69
69
  const current: any[] = [
70
- { constraintId: 'test', passRate: 0.8, failRate: 0.2, level: 'iron_law' },
70
+ { constraintId: 'test', passRate: 0.8, failRate: 0.2, severity: 'error' },
71
71
  ];
72
72
  const previous: any[] = [
73
- { constraintId: 'test', passRate: 0.6, failRate: 0.4, level: 'iron_law' },
73
+ { constraintId: 'test', passRate: 0.6, failRate: 0.4, severity: 'error' },
74
74
  ];
75
75
 
76
76
  const result = analyzer.compareWithPrevious(current, previous);
@@ -81,7 +81,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
81
81
 
82
82
  it('无历史数据应该不设置变化', () => {
83
83
  const current: any[] = [
84
- { constraintId: 'new_test', passRate: 0.8, failRate: 0.2, level: 'iron_law' },
84
+ { constraintId: 'new_test', passRate: 0.8, failRate: 0.2, severity: 'error' },
85
85
  ];
86
86
  const previous: any[] = [];
87
87
 
@@ -94,7 +94,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
94
94
  describe('saveSummary/loadSummary', () => {
95
95
  it('应该保存和加载汇总', () => {
96
96
  const summaries: any[] = [
97
- { constraintId: 'test', passRate: 0.8, failRate: 0.2, level: 'iron_law', totalChecks: 10 },
97
+ { constraintId: 'test', passRate: 0.8, failRate: 0.2, severity: 'error', totalChecks: 10 },
98
98
  ];
99
99
 
100
100
  analyzer.saveSummary(summaries);
@@ -120,7 +120,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
120
120
  it('应该运行小时汇总', () => {
121
121
  // 写入一些 traces
122
122
  const traces: ExecutionTrace[] = [
123
- { constraintId: 'hourly_test', level: 'iron_law', timestamp: Date.now(), result: 'pass' },
123
+ { constraintId: 'hourly_test', severity: 'error', timestamp: Date.now(), result: 'pass' },
124
124
  ];
125
125
  collector.record(traces[0]);
126
126
 
@@ -137,7 +137,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
137
137
  for (let i = 0; i < 20; i++) {
138
138
  traces.push({
139
139
  constraintId: 'daily_test',
140
- level: 'iron_law',
140
+ severity: 'error',
141
141
  timestamp: Date.now() - i * 1000,
142
142
  result: i < 15 ? 'fail' : 'pass', // 75% 失败率
143
143
  });
@@ -155,7 +155,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
155
155
  const summaries: any[] = [
156
156
  {
157
157
  constraintId: 'report_test',
158
- level: 'iron_law',
158
+ severity: 'error',
159
159
  passRate: 0.8,
160
160
  failRate: 0.2,
161
161
  totalChecks: 100,
@@ -180,7 +180,7 @@ describe('TraceAnalyzer - 补充覆盖', () => {
180
180
  describe('analyzeConstraint', () => {
181
181
  it('应该分析特定约束', () => {
182
182
  const traces: ExecutionTrace[] = [
183
- { constraintId: 'specific_test', level: 'iron_law', timestamp: Date.now(), result: 'pass' },
183
+ { constraintId: 'specific_test', severity: 'error', timestamp: Date.now(), result: 'pass' },
184
184
  ];
185
185
  traces.forEach(t => collector.record(t));
186
186
 
@@ -201,10 +201,10 @@ describe('TraceAnalyzer - 补充覆盖', () => {
201
201
 
202
202
  const traces: ExecutionTrace[] = [];
203
203
  for (let i = 0; i < 6; i++) {
204
- traces.push({ constraintId: 'rising_fail', level: 'iron_law', timestamp: 1000 + i * 100, result: 'fail' });
204
+ traces.push({ constraintId: 'rising_fail', severity: 'error', timestamp: 1000 + i * 100, result: 'fail' });
205
205
  }
206
206
  for (let i = 6; i < 14; i++) {
207
- traces.push({ constraintId: 'rising_fail', level: 'iron_law', timestamp: 1000 + i * 100, result: 'pass' });
207
+ traces.push({ constraintId: 'rising_fail', severity: 'error', timestamp: 1000 + i * 100, result: 'pass' });
208
208
  }
209
209
 
210
210
  const summaries = customAnalyzer.summarize(traces);
@@ -39,9 +39,9 @@ describe('TraceAnalyzer', () => {
39
39
  describe('summarize', () => {
40
40
  it('应该生成统计汇总', () => {
41
41
  const traces: ExecutionTrace[] = [
42
- { constraintId: 'test1', level: 'iron_law', timestamp: 1000, result: 'pass' },
43
- { constraintId: 'test1', level: 'iron_law', timestamp: 2000, result: 'fail' },
44
- { constraintId: 'test2', level: 'guideline', timestamp: 3000, result: 'pass' },
42
+ { constraintId: 'test1', severity: 'error', timestamp: 1000, result: 'pass' },
43
+ { constraintId: 'test1', severity: 'error', timestamp: 2000, result: 'fail' },
44
+ { constraintId: 'test2', severity: 'warning', timestamp: 3000, result: 'pass' },
45
45
  ];
46
46
 
47
47
  const summaries = analyzer.summarize(traces);
@@ -51,9 +51,9 @@ describe('TraceAnalyzer', () => {
51
51
 
52
52
  it('应该计算通过率', () => {
53
53
  const traces: ExecutionTrace[] = [
54
- { constraintId: 'test', level: 'iron_law', timestamp: 1000, result: 'pass' },
55
- { constraintId: 'test', level: 'iron_law', timestamp: 2000, result: 'pass' },
56
- { constraintId: 'test', level: 'iron_law', timestamp: 3000, result: 'fail' },
54
+ { constraintId: 'test', severity: 'error', timestamp: 1000, result: 'pass' },
55
+ { constraintId: 'test', severity: 'error', timestamp: 2000, result: 'pass' },
56
+ { constraintId: 'test', severity: 'error', timestamp: 3000, result: 'fail' },
57
57
  ];
58
58
 
59
59
  const summaries = analyzer.summarize(traces);
@@ -64,8 +64,8 @@ describe('TraceAnalyzer', () => {
64
64
 
65
65
  it('应该计算失败率', () => {
66
66
  const traces: ExecutionTrace[] = [
67
- { constraintId: 'test', level: 'iron_law', timestamp: 1000, result: 'fail' },
68
- { constraintId: 'test', level: 'iron_law', timestamp: 2000, result: 'fail' },
67
+ { constraintId: 'test', severity: 'error', timestamp: 1000, result: 'fail' },
68
+ { constraintId: 'test', severity: 'error', timestamp: 2000, result: 'fail' },
69
69
  ];
70
70
 
71
71
  const summaries = analyzer.summarize(traces);
@@ -83,10 +83,10 @@ describe('TraceAnalyzer', () => {
83
83
  describe('detectAnomalies', () => {
84
84
  it('应该检测失败率异常', () => {
85
85
  const traces: ExecutionTrace[] = [
86
- { constraintId: 'test', level: 'guideline', timestamp: 1000, result: 'fail' },
87
- { constraintId: 'test', level: 'guideline', timestamp: 2000, result: 'fail' },
88
- { constraintId: 'test', level: 'guideline', timestamp: 3000, result: 'fail' },
89
- { constraintId: 'test', level: 'guideline', timestamp: 4000, result: 'pass' },
86
+ { constraintId: 'test', severity: 'warning', timestamp: 1000, result: 'fail' },
87
+ { constraintId: 'test', severity: 'warning', timestamp: 2000, result: 'fail' },
88
+ { constraintId: 'test', severity: 'warning', timestamp: 3000, result: 'fail' },
89
+ { constraintId: 'test', severity: 'warning', timestamp: 4000, result: 'pass' },
90
90
  ];
91
91
 
92
92
  const summaries = analyzer.summarize(traces);
@@ -97,8 +97,8 @@ describe('TraceAnalyzer', () => {
97
97
 
98
98
  it('正常数据应该无异常', () => {
99
99
  const traces: ExecutionTrace[] = [
100
- { constraintId: 'test', level: 'iron_law', timestamp: 1000, result: 'pass' },
101
- { constraintId: 'test', level: 'iron_law', timestamp: 2000, result: 'pass' },
100
+ { constraintId: 'test', severity: 'error', timestamp: 1000, result: 'pass' },
101
+ { constraintId: 'test', severity: 'error', timestamp: 2000, result: 'pass' },
102
102
  ];
103
103
 
104
104
  const summaries = analyzer.summarize(traces);
@@ -111,9 +111,9 @@ describe('TraceAnalyzer', () => {
111
111
  describe('groupByConstraint', () => {
112
112
  it('应该按约束 ID 分组', () => {
113
113
  const traces: ExecutionTrace[] = [
114
- { constraintId: 'a', level: 'iron_law', timestamp: 1000, result: 'pass' },
115
- { constraintId: 'b', level: 'iron_law', timestamp: 2000, result: 'pass' },
116
- { constraintId: 'a', level: 'iron_law', timestamp: 3000, result: 'pass' },
114
+ { constraintId: 'a', severity: 'error', timestamp: 1000, result: 'pass' },
115
+ { constraintId: 'b', severity: 'error', timestamp: 2000, result: 'pass' },
116
+ { constraintId: 'a', severity: 'error', timestamp: 3000, result: 'pass' },
117
117
  ];
118
118
 
119
119
  // 通过 summarize 间接验证分组
@@ -140,9 +140,9 @@ describe('TraceAnalyzer', () => {
140
140
  describe('模块级纯函数', () => {
141
141
  it('summarizeTraces 不构造 collector 即可汇总,skip 不进 pass/fail 分母', () => {
142
142
  const traces: ExecutionTrace[] = [
143
- { constraintId: 'pure', level: 'iron_law', timestamp: 1000, result: 'pass' },
144
- { constraintId: 'pure', level: 'iron_law', timestamp: 2000, result: 'fail' },
145
- { constraintId: 'pure', level: 'iron_law', timestamp: 3000, result: 'skip' },
143
+ { constraintId: 'pure', severity: 'error', timestamp: 1000, result: 'pass' },
144
+ { constraintId: 'pure', severity: 'error', timestamp: 2000, result: 'fail' },
145
+ { constraintId: 'pure', severity: 'error', timestamp: 3000, result: 'skip' },
146
146
  ];
147
147
 
148
148
  const summaries = summarizeTraces(traces);
@@ -160,7 +160,7 @@ describe('TraceAnalyzer', () => {
160
160
  // failRate 6/14 ≈ 0.43 且趋势上升:默认阈值 0.5 不触发,0.3 触发
161
161
  const summary: TraceSummary = {
162
162
  constraintId: 'param_threshold',
163
- level: 'iron_law',
163
+ severity: 'error',
164
164
  timeRange: { start: 1000, end: 2400 },
165
165
  totalChecks: 14,
166
166
  passCount: 8,
@@ -36,8 +36,8 @@ describe('TraceCollector', () => {
36
36
  describe('record', () => {
37
37
  it('应该记录 trace', () => {
38
38
  const trace: ExecutionTrace = {
39
- constraintId: 'no_bypass_checkpoint',
40
- level: 'iron_law',
39
+ constraintId: 'no_test_simplification',
40
+ severity: 'error',
41
41
  timestamp: Date.now(),
42
42
  result: 'pass',
43
43
  };
@@ -45,7 +45,7 @@ describe('TraceCollector', () => {
45
45
  collector.record(trace);
46
46
 
47
47
  const content = fs.readFileSync(traceFile, 'utf-8');
48
- expect(content).toContain('no_bypass_checkpoint');
48
+ expect(content).toContain('no_test_simplification');
49
49
  expect(content).toContain('pass');
50
50
  });
51
51
 
@@ -57,7 +57,7 @@ describe('TraceCollector', () => {
57
57
 
58
58
  disabledCollector.record({
59
59
  constraintId: 'test',
60
- level: 'iron_law',
60
+ severity: 'error',
61
61
  timestamp: Date.now(),
62
62
  result: 'pass',
63
63
  });
@@ -69,13 +69,13 @@ describe('TraceCollector', () => {
69
69
  it('应该追加多条记录', () => {
70
70
  collector.record({
71
71
  constraintId: 'test1',
72
- level: 'iron_law',
72
+ severity: 'error',
73
73
  timestamp: Date.now(),
74
74
  result: 'pass',
75
75
  });
76
76
  collector.record({
77
77
  constraintId: 'test2',
78
- level: 'guideline',
78
+ severity: 'warning',
79
79
  timestamp: Date.now(),
80
80
  result: 'fail',
81
81
  });
@@ -88,7 +88,7 @@ describe('TraceCollector', () => {
88
88
 
89
89
  describe('recordPass', () => {
90
90
  it('应该记录通过 trace', () => {
91
- collector.recordPass('no_bypass_checkpoint', 'iron_law');
91
+ collector.recordPass('no_test_simplification', 'error');
92
92
 
93
93
  const traces = collector.read();
94
94
  expect(traces.length).toBe(1);
@@ -98,7 +98,7 @@ describe('TraceCollector', () => {
98
98
 
99
99
  describe('recordFail', () => {
100
100
  it('应该记录失败 trace', () => {
101
- collector.recordFail('no_bypass_checkpoint', 'iron_law');
101
+ collector.recordFail('no_test_simplification', 'error');
102
102
 
103
103
  const traces = collector.read();
104
104
  expect(traces.length).toBe(1);
@@ -110,13 +110,13 @@ describe('TraceCollector', () => {
110
110
  it('应该返回所有 traces', () => {
111
111
  collector.record({
112
112
  constraintId: 'test1',
113
- level: 'iron_law',
113
+ severity: 'error',
114
114
  timestamp: 1000,
115
115
  result: 'pass',
116
116
  });
117
117
  collector.record({
118
118
  constraintId: 'test2',
119
- level: 'guideline',
119
+ severity: 'warning',
120
120
  timestamp: 2000,
121
121
  result: 'fail',
122
122
  });
@@ -128,19 +128,19 @@ describe('TraceCollector', () => {
128
128
  it('应该按时间范围过滤', () => {
129
129
  collector.record({
130
130
  constraintId: 'test1',
131
- level: 'iron_law',
131
+ severity: 'error',
132
132
  timestamp: 1000,
133
133
  result: 'pass',
134
134
  });
135
135
  collector.record({
136
136
  constraintId: 'test2',
137
- level: 'iron_law',
137
+ severity: 'error',
138
138
  timestamp: 2000,
139
139
  result: 'pass',
140
140
  });
141
141
  collector.record({
142
142
  constraintId: 'test3',
143
- level: 'iron_law',
143
+ severity: 'error',
144
144
  timestamp: 3000,
145
145
  result: 'pass',
146
146
  });
@@ -155,18 +155,18 @@ describe('TraceCollector', () => {
155
155
  it('应该按约束层级过滤', () => {
156
156
  collector.record({
157
157
  constraintId: 'test1',
158
- level: 'iron_law',
158
+ severity: 'error',
159
159
  timestamp: 1000,
160
160
  result: 'pass',
161
161
  });
162
162
  collector.record({
163
163
  constraintId: 'test2',
164
- level: 'guideline',
164
+ severity: 'warning',
165
165
  timestamp: 2000,
166
166
  result: 'pass',
167
167
  });
168
168
 
169
- const traces = collector.read({ level: 'iron_law' });
169
+ const traces = collector.read({ severity: 'error' });
170
170
  expect(traces.length).toBe(1);
171
171
  });
172
172
  });
@@ -176,13 +176,13 @@ describe('TraceCollector', () => {
176
176
  const now = Date.now();
177
177
  collector.record({
178
178
  constraintId: 'old',
179
- level: 'iron_law',
179
+ severity: 'error',
180
180
  timestamp: now - 25 * 60 * 60 * 1000, // 25 小时前
181
181
  result: 'pass',
182
182
  });
183
183
  collector.record({
184
184
  constraintId: 'recent',
185
- level: 'iron_law',
185
+ severity: 'error',
186
186
  timestamp: now - 1 * 60 * 60 * 1000, // 1 小时前
187
187
  result: 'pass',
188
188
  });
@@ -197,13 +197,13 @@ describe('TraceCollector', () => {
197
197
  it('应该按约束 ID 过滤', () => {
198
198
  collector.record({
199
199
  constraintId: 'no_bypass',
200
- level: 'iron_law',
200
+ severity: 'error',
201
201
  timestamp: 1000,
202
202
  result: 'pass',
203
203
  });
204
204
  collector.record({
205
205
  constraintId: 'other_constraint',
206
- level: 'guideline',
206
+ severity: 'warning',
207
207
  timestamp: 2000,
208
208
  result: 'pass',
209
209
  });
@@ -218,13 +218,13 @@ describe('TraceCollector', () => {
218
218
  it('应该返回统计信息', () => {
219
219
  collector.record({
220
220
  constraintId: 'test1',
221
- level: 'iron_law',
221
+ severity: 'error',
222
222
  timestamp: 1000,
223
223
  result: 'pass',
224
224
  });
225
225
  collector.record({
226
226
  constraintId: 'test2',
227
- level: 'iron_law',
227
+ severity: 'error',
228
228
  timestamp: 2000,
229
229
  result: 'fail',
230
230
  });
@@ -31,11 +31,10 @@ describe('TraceCollector', () => {
31
31
  test('should record a trace', () => {
32
32
  collector.record({
33
33
  constraintId: 'no_fix_without_root_cause',
34
- level: 'iron_law',
34
+ severity: 'error',
35
35
  timestamp: Date.now(),
36
36
  result: 'fail',
37
37
  operation: 'code_implementation',
38
- severity: 'error',
39
38
  });
40
39
 
41
40
  const traces = collector.read();
@@ -46,7 +45,7 @@ describe('TraceCollector', () => {
46
45
 
47
46
  test('should record multiple traces', () => {
48
47
  for (let i = 0; i < 5; i++) {
49
- collector.recordPass('test_constraint', 'guideline');
48
+ collector.recordPass('test_constraint', 'warning');
50
49
  }
51
50
 
52
51
  const traces = collector.read();
@@ -55,9 +54,9 @@ describe('TraceCollector', () => {
55
54
  });
56
55
 
57
56
  test('should filter traces by constraint ID', () => {
58
- collector.recordPass('constraint_a', 'iron_law');
59
- collector.recordFail('constraint_b', 'guideline');
60
- collector.recordFail('constraint_a', 'iron_law');
57
+ collector.recordPass('constraint_a', 'error');
58
+ collector.recordFail('constraint_b', 'warning');
59
+ collector.recordFail('constraint_a', 'error');
61
60
 
62
61
  const traces = collector.read({ constraintId: 'constraint_a' });
63
62
  expect(traces.length).toBe(2);
@@ -70,14 +69,14 @@ describe('TraceCollector', () => {
70
69
 
71
70
  collector.record({
72
71
  constraintId: 'old_trace',
73
- level: 'guideline',
72
+ severity: 'warning',
74
73
  timestamp: oneHourAgo - 1000, // 1小时前更早
75
74
  result: 'pass',
76
75
  });
77
76
 
78
77
  collector.record({
79
78
  constraintId: 'new_trace',
80
- level: 'guideline',
79
+ severity: 'warning',
81
80
  timestamp: now,
82
81
  result: 'pass',
83
82
  });
@@ -95,7 +94,7 @@ describe('TraceCollector', () => {
95
94
  for (let i = 0; i < 10; i++) {
96
95
  collector.record({
97
96
  constraintId: `constraint_${i}`,
98
- level: 'guideline',
97
+ severity: 'warning',
99
98
  timestamp: Date.now() - i * 60 * 1000, // 每分钟一个
100
99
  result: i % 2 === 0 ? 'pass' : 'fail',
101
100
  });
@@ -108,7 +107,7 @@ describe('TraceCollector', () => {
108
107
 
109
108
  test('should provide stats', () => {
110
109
  for (let i = 0; i < 10; i++) {
111
- collector.recordPass(`constraint_${i}`, 'guideline');
110
+ collector.recordPass(`constraint_${i}`, 'warning');
112
111
  }
113
112
 
114
113
  const stats = collector.getStats();
@@ -117,8 +116,8 @@ describe('TraceCollector', () => {
117
116
  });
118
117
 
119
118
  test('should filter traces by result', () => {
120
- collector.recordFail('constraint_a', 'guideline');
121
- collector.recordPass('constraint_b', 'guideline');
119
+ collector.recordFail('constraint_a', 'warning');
120
+ collector.recordPass('constraint_b', 'warning');
122
121
 
123
122
  const traces = collector.read({ result: 'fail' });
124
123
  expect(traces).toHaveLength(1);
@@ -127,12 +126,12 @@ describe('TraceCollector', () => {
127
126
 
128
127
  test('should filter traces by projectPath', () => {
129
128
  collector.record({
130
- constraintId: 'c1', level: 'guideline', timestamp: Date.now(),
131
- result: 'pass', projectPath: '/project/a', severity: 'info',
129
+ constraintId: 'c1', severity: 'warning', timestamp: Date.now(),
130
+ result: 'pass', projectPath: '/project/a',
132
131
  });
133
132
  collector.record({
134
- constraintId: 'c2', level: 'guideline', timestamp: Date.now(),
135
- result: 'pass', projectPath: '/project/b', severity: 'info',
133
+ constraintId: 'c2', severity: 'warning', timestamp: Date.now(),
134
+ result: 'pass', projectPath: '/project/b',
136
135
  });
137
136
 
138
137
  const traces = collector.read({ projectPath: '/project/a' });
@@ -142,12 +141,12 @@ describe('TraceCollector', () => {
142
141
 
143
142
  test('should filter traces by sessionId', () => {
144
143
  collector.record({
145
- constraintId: 'c1', level: 'guideline', timestamp: Date.now(),
146
- result: 'pass', sessionId: 'session-1', severity: 'info',
144
+ constraintId: 'c1', severity: 'warning', timestamp: Date.now(),
145
+ result: 'pass', sessionId: 'session-1',
147
146
  });
148
147
  collector.record({
149
- constraintId: 'c2', level: 'guideline', timestamp: Date.now(),
150
- result: 'pass', sessionId: 'session-2', severity: 'info',
148
+ constraintId: 'c2', severity: 'warning', timestamp: Date.now(),
149
+ result: 'pass', sessionId: 'session-2',
151
150
  });
152
151
 
153
152
  const traces = collector.read({ sessionId: 'session-2' });
@@ -215,7 +214,7 @@ describe('TraceAnalyzer', () => {
215
214
  for (let i = 0; i < 10; i++) {
216
215
  collector.record({
217
216
  constraintId: 'constraint_a',
218
- level: 'guideline',
217
+ severity: 'warning',
219
218
  timestamp: Date.now() - i * 60 * 1000,
220
219
  result: i < 7 ? 'pass' : 'fail',
221
220
  });
@@ -224,7 +223,7 @@ describe('TraceAnalyzer', () => {
224
223
  for (let i = 0; i < 5; i++) {
225
224
  collector.record({
226
225
  constraintId: 'constraint_b',
227
- level: 'iron_law',
226
+ severity: 'error',
228
227
  timestamp: Date.now() - i * 60 * 1000,
229
228
  result: i < 3 ? 'pass' : 'fail',
230
229
  });
@@ -253,7 +252,7 @@ describe('TraceAnalyzer', () => {
253
252
  for (let i = 0; i < 20; i++) {
254
253
  collector.record({
255
254
  constraintId: 'rising_fail_constraint',
256
- level: 'iron_law',
255
+ severity: 'error',
257
256
  timestamp: now - (40 - i) * 60 * 1000,
258
257
  result: 'pass',
259
258
  });
@@ -263,7 +262,7 @@ describe('TraceAnalyzer', () => {
263
262
  for (let i = 0; i < 20; i++) {
264
263
  collector.record({
265
264
  constraintId: 'rising_fail_constraint',
266
- level: 'iron_law',
265
+ severity: 'error',
267
266
  timestamp: now - i * 60 * 1000,
268
267
  result: i < 15 ? 'fail' : 'pass', // 75% 失败率
269
268
  });
@@ -284,7 +283,7 @@ describe('TraceAnalyzer', () => {
284
283
  for (let i = 0; i < 10; i++) {
285
284
  collector.record({
286
285
  constraintId: 'stable_constraint',
287
- level: 'guideline',
286
+ severity: 'warning',
288
287
  timestamp: now - i * 60 * 1000,
289
288
  result: 'pass',
290
289
  });
@@ -298,7 +297,7 @@ describe('TraceAnalyzer', () => {
298
297
 
299
298
  test('should save and load summary', () => {
300
299
  for (let i = 0; i < 5; i++) {
301
- collector.recordPass('test_constraint', 'guideline');
300
+ collector.recordPass('test_constraint', 'warning');
302
301
  }
303
302
 
304
303
  const summaries = analyzer.analyzeRecent(1);
@@ -312,8 +311,8 @@ describe('TraceAnalyzer', () => {
312
311
 
313
312
  test('should generate report', () => {
314
313
  for (let i = 0; i < 5; i++) {
315
- collector.recordPass('constraint_a', 'guideline');
316
- collector.recordFail('constraint_b', 'iron_law');
314
+ collector.recordPass('constraint_a', 'warning');
315
+ collector.recordFail('constraint_b', 'error');
317
316
  }
318
317
 
319
318
  const summaries = analyzer.analyzeRecent(1);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * studio#602 / E1 飞轮修复:usage-report 数据层公共导出守门。
3
+ *
4
+ * 背景:buildConstraintsUsageReport / diagnoseRetireCandidates 自 0.17.0 起存在于
5
+ * core/constraints/usage-report,但未从包公共入口导出(exports map 的 ./core 亦不含),
6
+ * studio E1 (a) 链路(约束退役候选 → 进化提案)无法消费。本测试钉住公共导出面,
7
+ * 防回归「加了实现忘加导出」。
8
+ */
9
+ import * as harness from '../index';
10
+
11
+ describe('usage-report public exports (studio#602)', () => {
12
+ it('buildConstraintsUsageReport / diagnoseRetireCandidates 从包根导出', () => {
13
+ expect(typeof (harness as Record<string, unknown>).buildConstraintsUsageReport).toBe('function');
14
+ expect(typeof (harness as Record<string, unknown>).diagnoseRetireCandidates).toBe('function');
15
+ });
16
+
17
+ it('CANDIDATE_KIND_LABEL 覆盖全部候选种类', () => {
18
+ const label = (harness as Record<string, unknown>).CANDIDATE_KIND_LABEL as Record<string, string>;
19
+ expect(Object.keys(label).sort()).toEqual(['high_noise', 'unevaluable', 'zero_intercept', 'zero_trigger']);
20
+ });
21
+ });