mustflow 2.85.4 → 2.99.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 (78) hide show
  1. package/dist/cli/commands/script-pack.js +10 -0
  2. package/dist/cli/i18n/en.js +183 -0
  3. package/dist/cli/i18n/es.js +183 -0
  4. package/dist/cli/i18n/fr.js +183 -0
  5. package/dist/cli/i18n/hi.js +183 -0
  6. package/dist/cli/i18n/ko.js +183 -0
  7. package/dist/cli/i18n/zh.js +183 -0
  8. package/dist/cli/lib/script-pack-registry.js +284 -1
  9. package/dist/cli/script-packs/code-change-impact.js +6 -0
  10. package/dist/cli/script-packs/code-import-cycle.js +193 -0
  11. package/dist/cli/script-packs/docs-link-integrity.js +145 -0
  12. package/dist/cli/script-packs/repo-approval-gate.js +100 -0
  13. package/dist/cli/script-packs/repo-git-ignore-audit.js +119 -0
  14. package/dist/cli/script-packs/repo-manifest-lock-drift.js +122 -0
  15. package/dist/cli/script-packs/repo-merge-conflict-scan.js +123 -0
  16. package/dist/cli/script-packs/repo-skill-route-audit.js +86 -0
  17. package/dist/cli/script-packs/repo-version-source.js +92 -0
  18. package/dist/cli/script-packs/test-performance-report.js +247 -0
  19. package/dist/cli/script-packs/test-regression-selector.js +167 -0
  20. package/dist/core/change-impact.js +23 -51
  21. package/dist/core/change-surface-classification.js +198 -0
  22. package/dist/core/docs-link-integrity.js +443 -0
  23. package/dist/core/import-cycle.js +152 -0
  24. package/dist/core/public-json-contracts.js +116 -0
  25. package/dist/core/repo-approval-gate.js +116 -0
  26. package/dist/core/repo-git-ignore-audit.js +302 -0
  27. package/dist/core/repo-manifest-lock-drift.js +321 -0
  28. package/dist/core/repo-merge-conflict-scan.js +335 -0
  29. package/dist/core/repo-version-source.js +82 -0
  30. package/dist/core/script-pack-suggestions.js +77 -1
  31. package/dist/core/skill-route-audit.js +354 -0
  32. package/dist/core/test-performance-report.js +697 -0
  33. package/dist/core/test-regression-selector.js +335 -0
  34. package/package.json +1 -1
  35. package/schemas/README.md +40 -2
  36. package/schemas/change-impact-report.schema.json +35 -1
  37. package/schemas/import-cycle-report.schema.json +157 -0
  38. package/schemas/link-integrity-report.schema.json +176 -0
  39. package/schemas/repo-approval-gate-report.schema.json +115 -0
  40. package/schemas/repo-git-ignore-audit-report.schema.json +201 -0
  41. package/schemas/repo-manifest-lock-drift-report.schema.json +202 -0
  42. package/schemas/repo-merge-conflict-scan-report.schema.json +169 -0
  43. package/schemas/repo-version-source-report.schema.json +127 -0
  44. package/schemas/skill-route-audit-report.schema.json +144 -0
  45. package/schemas/test-performance-report.schema.json +319 -0
  46. package/schemas/test-regression-selector-report.schema.json +187 -0
  47. package/templates/default/i18n.toml +66 -18
  48. package/templates/default/locales/en/.mustflow/skills/INDEX.md +45 -8
  49. package/templates/default/locales/en/.mustflow/skills/api-access-control-review/SKILL.md +48 -27
  50. package/templates/default/locales/en/.mustflow/skills/api-failure-triage/SKILL.md +270 -0
  51. package/templates/default/locales/en/.mustflow/skills/auth-flow-triage/SKILL.md +192 -0
  52. package/templates/default/locales/en/.mustflow/skills/auth-permission-change/SKILL.md +59 -13
  53. package/templates/default/locales/en/.mustflow/skills/backend-log-evidence-review/SKILL.md +14 -5
  54. package/templates/default/locales/en/.mustflow/skills/cache-integrity-review/SKILL.md +30 -15
  55. package/templates/default/locales/en/.mustflow/skills/change-blast-radius-review/SKILL.md +45 -32
  56. package/templates/default/locales/en/.mustflow/skills/ci-pipeline-triage/SKILL.md +200 -0
  57. package/templates/default/locales/en/.mustflow/skills/clarifying-question-gate/SKILL.md +87 -13
  58. package/templates/default/locales/en/.mustflow/skills/docker-runtime-triage/SKILL.md +191 -0
  59. package/templates/default/locales/en/.mustflow/skills/go-code-change/SKILL.md +18 -13
  60. package/templates/default/locales/en/.mustflow/skills/line-ending-hygiene/SKILL.md +18 -10
  61. package/templates/default/locales/en/.mustflow/skills/llm-hallucination-control-review/SKILL.md +4 -1
  62. package/templates/default/locales/en/.mustflow/skills/motion-system-contract-review/SKILL.md +155 -0
  63. package/templates/default/locales/en/.mustflow/skills/next-action-menu/SKILL.md +177 -0
  64. package/templates/default/locales/en/.mustflow/skills/observability-debuggability-review/SKILL.md +15 -7
  65. package/templates/default/locales/en/.mustflow/skills/payment-integrity-review/SKILL.md +59 -35
  66. package/templates/default/locales/en/.mustflow/skills/powershell-code-change/SKILL.md +16 -6
  67. package/templates/default/locales/en/.mustflow/skills/prompt-contract-quality-review/SKILL.md +4 -1
  68. package/templates/default/locales/en/.mustflow/skills/python-code-change/SKILL.md +19 -10
  69. package/templates/default/locales/en/.mustflow/skills/rag-pipeline-triage/SKILL.md +206 -0
  70. package/templates/default/locales/en/.mustflow/skills/routes.toml +54 -0
  71. package/templates/default/locales/en/.mustflow/skills/rust-code-change/SKILL.md +10 -4
  72. package/templates/default/locales/en/.mustflow/skills/search-index-integrity-review/SKILL.md +181 -0
  73. package/templates/default/locales/en/.mustflow/skills/service-boundary-architecture/SKILL.md +37 -23
  74. package/templates/default/locales/en/.mustflow/skills/test-suite-performance-review/SKILL.md +9 -0
  75. package/templates/default/locales/en/.mustflow/skills/typescript-code-change/SKILL.md +14 -9
  76. package/templates/default/locales/en/.mustflow/skills/vector-search-integrity-review/SKILL.md +209 -0
  77. package/templates/default/locales/en/.mustflow/skills/version-freshness-check/SKILL.md +16 -14
  78. package/templates/default/manifest.toml +64 -1
@@ -0,0 +1,319 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/test-performance-report.schema.json",
4
+ "title": "mustflow test performance report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "pack_id",
11
+ "script_id",
12
+ "script_ref",
13
+ "action",
14
+ "status",
15
+ "ok",
16
+ "mustflow_root",
17
+ "policy",
18
+ "input_hash",
19
+ "evidence_sources",
20
+ "summary",
21
+ "intents",
22
+ "phases",
23
+ "test_files",
24
+ "recent_samples",
25
+ "truncated",
26
+ "findings",
27
+ "next_actions",
28
+ "issues"
29
+ ],
30
+ "properties": {
31
+ "schema_version": { "const": "1" },
32
+ "command": { "const": "script-pack" },
33
+ "pack_id": { "const": "test" },
34
+ "script_id": { "const": "performance-report" },
35
+ "script_ref": { "const": "test/performance-report" },
36
+ "action": { "const": "summarize" },
37
+ "status": { "enum": ["passed", "failed", "error"] },
38
+ "ok": { "type": "boolean" },
39
+ "mustflow_root": { "type": "string" },
40
+ "policy": { "$ref": "#/$defs/policy" },
41
+ "input_hash": { "$ref": "#/$defs/sha256" },
42
+ "evidence_sources": {
43
+ "type": "array",
44
+ "items": { "$ref": "#/$defs/evidenceSource" }
45
+ },
46
+ "summary": { "$ref": "#/$defs/summary" },
47
+ "intents": {
48
+ "type": "array",
49
+ "items": { "$ref": "#/$defs/intentSummary" }
50
+ },
51
+ "phases": {
52
+ "type": "array",
53
+ "items": { "$ref": "#/$defs/phaseSummary" }
54
+ },
55
+ "test_files": {
56
+ "type": "array",
57
+ "items": { "$ref": "#/$defs/testFileSummary" }
58
+ },
59
+ "recent_samples": {
60
+ "type": "array",
61
+ "items": { "$ref": "#/$defs/sample" }
62
+ },
63
+ "truncated": { "type": "boolean" },
64
+ "findings": {
65
+ "type": "array",
66
+ "items": { "$ref": "#/$defs/finding" }
67
+ },
68
+ "next_actions": {
69
+ "type": "array",
70
+ "items": { "$ref": "#/$defs/nextAction" }
71
+ },
72
+ "issues": {
73
+ "type": "array",
74
+ "items": { "type": "string" }
75
+ }
76
+ },
77
+ "$defs": {
78
+ "sha256": {
79
+ "type": "string",
80
+ "pattern": "^sha256:[a-f0-9]{64}$"
81
+ },
82
+ "policy": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "required": [
86
+ "max_samples",
87
+ "max_intents",
88
+ "max_test_files",
89
+ "max_findings",
90
+ "slow_sample_threshold_ms",
91
+ "high_timeout_ratio",
92
+ "phase_bottleneck_threshold_ms"
93
+ ],
94
+ "properties": {
95
+ "max_samples": { "type": "integer", "minimum": 1 },
96
+ "max_intents": { "type": "integer", "minimum": 1 },
97
+ "max_test_files": { "type": "integer", "minimum": 1 },
98
+ "max_findings": { "type": "integer", "minimum": 1 },
99
+ "slow_sample_threshold_ms": { "type": "integer", "minimum": 1 },
100
+ "high_timeout_ratio": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 },
101
+ "phase_bottleneck_threshold_ms": { "type": "integer", "minimum": 1 }
102
+ }
103
+ },
104
+ "evidenceKind": {
105
+ "enum": ["latest_run_receipt", "latest_run_profile", "performance_samples", "performance_summary"]
106
+ },
107
+ "evidenceSource": {
108
+ "type": "object",
109
+ "additionalProperties": false,
110
+ "required": ["path", "kind", "exists", "readable", "issue"],
111
+ "properties": {
112
+ "path": { "type": "string" },
113
+ "kind": { "$ref": "#/$defs/evidenceKind" },
114
+ "exists": { "type": "boolean" },
115
+ "readable": { "type": "boolean" },
116
+ "issue": { "type": ["string", "null"] }
117
+ }
118
+ },
119
+ "summary": {
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "required": [
123
+ "evidence_source_count",
124
+ "sample_count",
125
+ "intent_count",
126
+ "test_file_count",
127
+ "finding_count",
128
+ "latest_run_intent",
129
+ "latest_run_status",
130
+ "latest_run_duration_ms",
131
+ "latest_profile_phase_count",
132
+ "latest_profile_test_file_count",
133
+ "latest_profile_declared_test_file_count",
134
+ "latest_profile_generated_at",
135
+ "latest_profile_age_ms",
136
+ "latest_profile_test_file_coverage_ratio",
137
+ "latest_profile_test_files_truncated",
138
+ "retained_summary_intent_count"
139
+ ],
140
+ "properties": {
141
+ "evidence_source_count": { "type": "integer", "minimum": 0 },
142
+ "sample_count": { "type": "integer", "minimum": 0 },
143
+ "intent_count": { "type": "integer", "minimum": 0 },
144
+ "test_file_count": { "type": "integer", "minimum": 0 },
145
+ "finding_count": { "type": "integer", "minimum": 0 },
146
+ "latest_run_intent": { "type": ["string", "null"] },
147
+ "latest_run_status": { "type": ["string", "null"] },
148
+ "latest_run_duration_ms": { "type": ["integer", "null"], "minimum": 0 },
149
+ "latest_profile_phase_count": { "type": "integer", "minimum": 0 },
150
+ "latest_profile_test_file_count": { "type": "integer", "minimum": 0 },
151
+ "latest_profile_declared_test_file_count": { "type": ["integer", "null"], "minimum": 0 },
152
+ "latest_profile_generated_at": { "type": ["string", "null"] },
153
+ "latest_profile_age_ms": { "type": ["integer", "null"], "minimum": 0 },
154
+ "latest_profile_test_file_coverage_ratio": { "type": ["number", "null"], "minimum": 0, "maximum": 1 },
155
+ "latest_profile_test_files_truncated": { "type": "boolean" },
156
+ "retained_summary_intent_count": { "type": ["integer", "null"], "minimum": 0 }
157
+ }
158
+ },
159
+ "sample": {
160
+ "type": "object",
161
+ "additionalProperties": false,
162
+ "required": [
163
+ "source",
164
+ "observed_day",
165
+ "intent",
166
+ "status",
167
+ "duration_ms",
168
+ "timeout_ratio",
169
+ "runner_bucket",
170
+ "phase_count",
171
+ "selection_strategy",
172
+ "changed_file_count",
173
+ "selected_target_count",
174
+ "fallback_used"
175
+ ],
176
+ "properties": {
177
+ "source": { "enum": ["history", "latest_run"] },
178
+ "observed_day": { "type": "string" },
179
+ "intent": { "type": "string" },
180
+ "status": { "enum": ["passed", "failed"] },
181
+ "duration_ms": { "type": "number", "minimum": 0 },
182
+ "timeout_ratio": { "type": "number", "minimum": 0 },
183
+ "runner_bucket": { "type": ["string", "null"] },
184
+ "phase_count": { "type": "integer", "minimum": 0 },
185
+ "selection_strategy": { "type": ["string", "null"] },
186
+ "changed_file_count": { "type": ["integer", "null"], "minimum": 0 },
187
+ "selected_target_count": { "type": ["integer", "null"], "minimum": 0 },
188
+ "fallback_used": { "type": ["boolean", "null"] }
189
+ }
190
+ },
191
+ "phaseSummary": {
192
+ "type": "object",
193
+ "additionalProperties": false,
194
+ "required": ["name", "sample_count", "total_duration_ms", "max_duration_ms", "p95_duration_ms"],
195
+ "properties": {
196
+ "name": { "type": "string" },
197
+ "sample_count": { "type": "integer", "minimum": 0 },
198
+ "total_duration_ms": { "type": "number", "minimum": 0 },
199
+ "max_duration_ms": { "type": "number", "minimum": 0 },
200
+ "p95_duration_ms": { "type": "number", "minimum": 0 }
201
+ }
202
+ },
203
+ "intentSummary": {
204
+ "type": "object",
205
+ "additionalProperties": false,
206
+ "required": [
207
+ "intent",
208
+ "sample_count",
209
+ "success_count",
210
+ "failure_count",
211
+ "fallback_count",
212
+ "latest_duration_ms",
213
+ "min_duration_ms",
214
+ "p50_duration_ms",
215
+ "p95_duration_ms",
216
+ "max_duration_ms",
217
+ "max_timeout_ratio",
218
+ "selected_target_count_max",
219
+ "slowest_phase"
220
+ ],
221
+ "properties": {
222
+ "intent": { "type": "string" },
223
+ "sample_count": { "type": "integer", "minimum": 0 },
224
+ "success_count": { "type": "integer", "minimum": 0 },
225
+ "failure_count": { "type": "integer", "minimum": 0 },
226
+ "fallback_count": { "type": "integer", "minimum": 0 },
227
+ "latest_duration_ms": { "type": "number", "minimum": 0 },
228
+ "min_duration_ms": { "type": "number", "minimum": 0 },
229
+ "p50_duration_ms": { "type": "number", "minimum": 0 },
230
+ "p95_duration_ms": { "type": "number", "minimum": 0 },
231
+ "max_duration_ms": { "type": "number", "minimum": 0 },
232
+ "max_timeout_ratio": { "type": "number", "minimum": 0 },
233
+ "selected_target_count_max": { "type": ["integer", "null"], "minimum": 0 },
234
+ "slowest_phase": {
235
+ "anyOf": [
236
+ { "$ref": "#/$defs/phaseSummary" },
237
+ { "type": "null" }
238
+ ]
239
+ }
240
+ }
241
+ },
242
+ "testFileSummary": {
243
+ "type": "object",
244
+ "additionalProperties": false,
245
+ "required": ["path", "intent", "status", "duration_ms", "source"],
246
+ "properties": {
247
+ "path": { "type": "string" },
248
+ "intent": { "type": "string" },
249
+ "status": { "enum": ["passed", "failed"] },
250
+ "duration_ms": { "type": "number", "minimum": 0 },
251
+ "source": { "const": "latest_profile" }
252
+ }
253
+ },
254
+ "finding": {
255
+ "type": "object",
256
+ "additionalProperties": false,
257
+ "required": ["code", "severity", "message"],
258
+ "properties": {
259
+ "code": {
260
+ "enum": [
261
+ "test_performance_no_evidence",
262
+ "test_performance_unreadable_evidence",
263
+ "test_performance_previous_failure",
264
+ "test_performance_slow_sample",
265
+ "test_performance_slow_test_file",
266
+ "test_performance_high_timeout_ratio",
267
+ "test_performance_selection_fallback",
268
+ "test_performance_phase_bottleneck"
269
+ ]
270
+ },
271
+ "severity": { "enum": ["low", "medium", "high", "critical"] },
272
+ "message": { "type": "string" },
273
+ "path": { "type": "string" },
274
+ "intent": { "type": "string" },
275
+ "phase": { "type": "string" },
276
+ "json_pointer": { "type": ["string", "null"] },
277
+ "metric": { "type": ["string", "null"] },
278
+ "actual": { "type": ["number", "null"] },
279
+ "expected": { "type": ["number", "null"] }
280
+ }
281
+ },
282
+ "nextActionCode": {
283
+ "enum": [
284
+ "collect_profile_evidence",
285
+ "investigate_previous_failure",
286
+ "inspect_slowest_intents",
287
+ "inspect_slowest_test_files",
288
+ "review_timeout_budget",
289
+ "review_selection_fallback"
290
+ ]
291
+ },
292
+ "nextAction": {
293
+ "type": "object",
294
+ "additionalProperties": false,
295
+ "required": ["code", "message", "command_intent", "run_hint", "finding_codes"],
296
+ "properties": {
297
+ "code": { "$ref": "#/$defs/nextActionCode" },
298
+ "message": { "type": "string" },
299
+ "command_intent": { "type": ["string", "null"] },
300
+ "run_hint": { "type": ["string", "null"] },
301
+ "finding_codes": {
302
+ "type": "array",
303
+ "items": {
304
+ "enum": [
305
+ "test_performance_no_evidence",
306
+ "test_performance_unreadable_evidence",
307
+ "test_performance_previous_failure",
308
+ "test_performance_slow_sample",
309
+ "test_performance_slow_test_file",
310
+ "test_performance_high_timeout_ratio",
311
+ "test_performance_selection_fallback",
312
+ "test_performance_phase_bottleneck"
313
+ ]
314
+ }
315
+ }
316
+ }
317
+ }
318
+ }
319
+ }
@@ -0,0 +1,187 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/test-regression-selector-report.schema.json",
4
+ "title": "mustflow test regression selector report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "pack_id",
11
+ "script_id",
12
+ "script_ref",
13
+ "action",
14
+ "status",
15
+ "ok",
16
+ "mustflow_root",
17
+ "policy",
18
+ "input_hash",
19
+ "summary",
20
+ "changed_files",
21
+ "selected_tests",
22
+ "missing_candidates",
23
+ "fallbacks",
24
+ "run_hint",
25
+ "truncated",
26
+ "findings",
27
+ "issues"
28
+ ],
29
+ "properties": {
30
+ "schema_version": { "const": "1" },
31
+ "command": { "const": "script-pack" },
32
+ "pack_id": { "const": "test" },
33
+ "script_id": { "const": "regression-selector" },
34
+ "script_ref": { "const": "test/regression-selector" },
35
+ "action": { "const": "select" },
36
+ "status": { "enum": ["passed", "failed", "error"] },
37
+ "ok": { "type": "boolean" },
38
+ "mustflow_root": { "type": "string" },
39
+ "policy": { "$ref": "#/$defs/policy" },
40
+ "input_hash": { "$ref": "#/$defs/sha256" },
41
+ "summary": { "$ref": "#/$defs/summary" },
42
+ "changed_files": { "type": "array", "items": { "$ref": "#/$defs/changedFile" } },
43
+ "selected_tests": { "type": "array", "items": { "$ref": "#/$defs/testCandidate" } },
44
+ "missing_candidates": { "type": "array", "items": { "$ref": "#/$defs/testCandidate" } },
45
+ "fallbacks": { "type": "array", "items": { "$ref": "#/$defs/fallback" } },
46
+ "run_hint": { "type": ["string", "null"] },
47
+ "truncated": { "type": "boolean" },
48
+ "findings": { "type": "array", "items": { "$ref": "#/$defs/finding" } },
49
+ "issues": { "type": "array", "items": { "type": "string" } }
50
+ },
51
+ "$defs": {
52
+ "sha256": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
53
+ "surface": {
54
+ "enum": ["source", "test", "docs", "schema", "config", "package", "template", "workflow", "i18n", "unknown"]
55
+ },
56
+ "fileStatus": {
57
+ "enum": ["added", "modified", "deleted", "renamed", "type_changed", "untracked"]
58
+ },
59
+ "selectorReason": {
60
+ "enum": [
61
+ "changed_test",
62
+ "sibling_test",
63
+ "importer_sibling_test",
64
+ "fallback_lockfile",
65
+ "fallback_package_metadata",
66
+ "fallback_template",
67
+ "fallback_compiler_or_runner_config",
68
+ "fallback_shared_test_fixture",
69
+ "fallback_migration_or_database",
70
+ "fallback_generated_contract",
71
+ "fallback_ci_workflow",
72
+ "fallback_mustflow_workflow",
73
+ "fallback_deleted",
74
+ "fallback_renamed",
75
+ "fallback_type_changed",
76
+ "fallback_package_or_template",
77
+ "fallback_schema",
78
+ "fallback_workflow_or_config",
79
+ "fallback_deleted_or_renamed",
80
+ "fallback_unknown",
81
+ "fallback_truncated",
82
+ "no_changed_files"
83
+ ]
84
+ },
85
+ "policy": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "required": ["base_ref", "head_ref", "compare_worktree", "max_files", "max_tests", "path_filters"],
89
+ "properties": {
90
+ "base_ref": { "type": "string" },
91
+ "head_ref": { "type": ["string", "null"] },
92
+ "compare_worktree": { "type": "boolean" },
93
+ "max_files": { "type": "integer", "minimum": 1 },
94
+ "max_tests": { "type": "integer", "minimum": 1 },
95
+ "path_filters": { "type": "array", "items": { "type": "string" } }
96
+ }
97
+ },
98
+ "summary": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": [
102
+ "changed_file_count",
103
+ "selected_test_count",
104
+ "missing_candidate_count",
105
+ "fallback_count",
106
+ "selection_status",
107
+ "confidence",
108
+ "recommended_intent"
109
+ ],
110
+ "properties": {
111
+ "changed_file_count": { "type": "integer", "minimum": 0 },
112
+ "selected_test_count": { "type": "integer", "minimum": 0 },
113
+ "missing_candidate_count": { "type": "integer", "minimum": 0 },
114
+ "fallback_count": { "type": "integer", "minimum": 0 },
115
+ "selection_status": { "enum": ["selected", "fallback", "empty"] },
116
+ "confidence": { "enum": ["high", "medium", "low"] },
117
+ "recommended_intent": { "type": "string" }
118
+ }
119
+ },
120
+ "changedFile": {
121
+ "type": "object",
122
+ "additionalProperties": false,
123
+ "required": ["path", "previous_path", "status", "surface"],
124
+ "properties": {
125
+ "path": { "type": "string" },
126
+ "previous_path": { "type": ["string", "null"] },
127
+ "status": { "$ref": "#/$defs/fileStatus" },
128
+ "surface": { "$ref": "#/$defs/surface" }
129
+ }
130
+ },
131
+ "testCandidate": {
132
+ "type": "object",
133
+ "additionalProperties": false,
134
+ "required": ["path", "exists", "reason", "source_path", "confidence"],
135
+ "properties": {
136
+ "path": { "type": "string" },
137
+ "exists": { "type": "boolean" },
138
+ "reason": { "$ref": "#/$defs/selectorReason" },
139
+ "reasons": {
140
+ "type": "array",
141
+ "items": { "$ref": "#/$defs/selectorReason" },
142
+ "minItems": 1
143
+ },
144
+ "source_path": { "type": "string" },
145
+ "source_paths": {
146
+ "type": "array",
147
+ "items": { "type": "string" },
148
+ "minItems": 1
149
+ },
150
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
151
+ }
152
+ },
153
+ "fallback": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "required": ["reason", "path", "message", "recommended_intent"],
157
+ "properties": {
158
+ "reason": { "$ref": "#/$defs/selectorReason" },
159
+ "path": { "type": "string" },
160
+ "message": { "type": "string" },
161
+ "recommended_intent": { "type": "string" }
162
+ }
163
+ },
164
+ "finding": {
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "required": ["code", "severity", "message", "path"],
168
+ "properties": {
169
+ "code": {
170
+ "enum": [
171
+ "test_regression_selector_git_unavailable",
172
+ "test_regression_selector_invalid_ref",
173
+ "test_regression_selector_max_files_exceeded",
174
+ "test_regression_selector_max_tests_exceeded"
175
+ ]
176
+ },
177
+ "severity": { "enum": ["low", "medium", "high", "critical"] },
178
+ "message": { "type": "string" },
179
+ "path": { "type": "string" },
180
+ "json_pointer": { "type": ["string", "null"] },
181
+ "metric": { "type": ["string", "null"] },
182
+ "actual": { "type": ["number", "null"] },
183
+ "expected": { "type": ["number", "null"] }
184
+ }
185
+ }
186
+ }
187
+ }