mustflow 1.30.0 → 1.31.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 (44) hide show
  1. package/README.md +12 -2
  2. package/dist/cli/commands/run.js +221 -48
  3. package/dist/cli/commands/upgrade.js +65 -0
  4. package/dist/cli/commands/verify.js +79 -7
  5. package/dist/cli/i18n/en.js +12 -0
  6. package/dist/cli/i18n/es.js +12 -0
  7. package/dist/cli/i18n/fr.js +12 -0
  8. package/dist/cli/i18n/hi.js +12 -0
  9. package/dist/cli/i18n/ko.js +12 -0
  10. package/dist/cli/i18n/zh.js +12 -0
  11. package/dist/cli/index.js +27 -46
  12. package/dist/cli/lib/command-registry.js +5 -0
  13. package/dist/cli/lib/dashboard-html.js +1 -1
  14. package/dist/cli/lib/local-index.js +11 -8
  15. package/dist/cli/lib/reporter.js +6 -0
  16. package/dist/cli/lib/run-plan.js +20 -3
  17. package/dist/cli/lib/validation.js +110 -1
  18. package/dist/core/bounded-output.js +38 -0
  19. package/dist/core/change-classification.js +6 -2
  20. package/dist/core/change-verification.js +240 -6
  21. package/dist/core/check-issues.js +6 -0
  22. package/dist/core/command-contract-validation.js +20 -0
  23. package/dist/core/command-effects.js +13 -0
  24. package/dist/core/contract-lint.js +95 -1
  25. package/dist/core/dashboard-verification.js +8 -0
  26. package/dist/core/public-json-contracts.js +7 -0
  27. package/dist/core/run-performance-history.js +307 -0
  28. package/dist/core/run-profile.js +87 -0
  29. package/dist/core/run-receipt.js +171 -4
  30. package/dist/core/run-write-drift.js +18 -2
  31. package/dist/core/skill-route-alignment.js +90 -0
  32. package/dist/core/test-selection.js +224 -0
  33. package/dist/core/verification-decision-graph.js +67 -0
  34. package/dist/core/verification-scheduler.js +96 -2
  35. package/package.json +1 -1
  36. package/schemas/README.md +6 -2
  37. package/schemas/change-verification-report.schema.json +153 -3
  38. package/schemas/commands.schema.json +47 -1
  39. package/schemas/contract-lint-report.schema.json +51 -0
  40. package/schemas/dashboard-export.schema.json +273 -0
  41. package/schemas/explain-report.schema.json +2 -0
  42. package/schemas/run-receipt.schema.json +109 -0
  43. package/templates/default/common/.mustflow/config/commands.toml +1 -1
  44. package/templates/default/manifest.toml +1 -1
@@ -51,6 +51,9 @@
51
51
  },
52
52
  "decision_graph": {
53
53
  "$ref": "#/$defs/verificationDecisionGraph"
54
+ },
55
+ "test_selection": {
56
+ "$ref": "#/$defs/testSelectionReport"
54
57
  }
55
58
  },
56
59
  "$defs": {
@@ -272,6 +275,15 @@
272
275
  },
273
276
  "detail": {
274
277
  "type": ["string", "null"]
278
+ },
279
+ "candidateState": {
280
+ "enum": ["candidate", "gap"]
281
+ },
282
+ "eligibilityState": {
283
+ "enum": ["eligible", "ineligible", "missing"]
284
+ },
285
+ "selectionState": {
286
+ "enum": ["selected", "not_selected", "not_applicable"]
275
287
  }
276
288
  }
277
289
  },
@@ -294,6 +306,113 @@
294
306
  }
295
307
  }
296
308
  },
309
+ "testSelectionReport": {
310
+ "type": "object",
311
+ "additionalProperties": false,
312
+ "required": [
313
+ "source",
314
+ "status",
315
+ "configPath",
316
+ "authority",
317
+ "commandAuthority",
318
+ "grantsCommandAuthority",
319
+ "matches",
320
+ "selected",
321
+ "notes"
322
+ ],
323
+ "properties": {
324
+ "source": {
325
+ "const": "test-selection.toml"
326
+ },
327
+ "status": {
328
+ "enum": ["missing", "matched", "unmatched", "invalid"]
329
+ },
330
+ "configPath": {
331
+ "const": ".mustflow/config/test-selection.toml"
332
+ },
333
+ "authority": {
334
+ "const": ".mustflow/config/test-selection.toml"
335
+ },
336
+ "commandAuthority": {
337
+ "const": ".mustflow/config/commands.toml"
338
+ },
339
+ "grantsCommandAuthority": {
340
+ "const": false
341
+ },
342
+ "matches": {
343
+ "type": "array",
344
+ "items": {
345
+ "$ref": "#/$defs/testSelectionRuleMatch"
346
+ }
347
+ },
348
+ "selected": {
349
+ "type": "array",
350
+ "items": {
351
+ "$ref": "#/$defs/testSelectionCandidate"
352
+ }
353
+ },
354
+ "notes": {
355
+ "$ref": "#/$defs/stringArray"
356
+ }
357
+ }
358
+ },
359
+ "testSelectionRuleMatch": {
360
+ "type": "object",
361
+ "additionalProperties": false,
362
+ "required": [
363
+ "ruleId",
364
+ "risk",
365
+ "reason",
366
+ "files",
367
+ "surfaces",
368
+ "intent",
369
+ "fallbackIntent",
370
+ "testTargets"
371
+ ],
372
+ "properties": {
373
+ "ruleId": { "type": "string" },
374
+ "risk": { "type": "string" },
375
+ "reason": { "type": "string" },
376
+ "files": { "$ref": "#/$defs/stringArray" },
377
+ "surfaces": { "$ref": "#/$defs/stringArray" },
378
+ "intent": { "type": "string" },
379
+ "fallbackIntent": { "type": "string" },
380
+ "testTargets": { "$ref": "#/$defs/stringArray" }
381
+ }
382
+ },
383
+ "testSelectionCandidate": {
384
+ "type": "object",
385
+ "additionalProperties": false,
386
+ "required": [
387
+ "ruleId",
388
+ "reason",
389
+ "intent",
390
+ "role",
391
+ "status",
392
+ "skipReason",
393
+ "detail",
394
+ "testTargets",
395
+ "appliedTestTargets",
396
+ "testTargetsApplied"
397
+ ],
398
+ "properties": {
399
+ "ruleId": { "type": "string" },
400
+ "reason": { "type": "string" },
401
+ "intent": { "type": "string" },
402
+ "role": { "enum": ["primary", "fallback"] },
403
+ "status": { "enum": ["runnable", "skipped"] },
404
+ "skipReason": {
405
+ "anyOf": [
406
+ { "$ref": "#/$defs/skipReason" },
407
+ { "type": "null" }
408
+ ]
409
+ },
410
+ "detail": { "type": ["string", "null"] },
411
+ "testTargets": { "$ref": "#/$defs/stringArray" },
412
+ "appliedTestTargets": { "$ref": "#/$defs/stringArray" },
413
+ "testTargetsApplied": { "type": "boolean" }
414
+ }
415
+ },
297
416
  "verificationScheduleEffect": {
298
417
  "type": "object",
299
418
  "additionalProperties": false,
@@ -312,7 +431,7 @@
312
431
  "enum": ["read", "write", "append", "replace", "delete_recreate"]
313
432
  },
314
433
  "path": {
315
- "type": "string"
434
+ "type": ["string", "null"]
316
435
  },
317
436
  "lock": {
318
437
  "type": "string"
@@ -344,7 +463,7 @@
344
463
  "verificationScheduleEntry": {
345
464
  "type": "object",
346
465
  "additionalProperties": false,
347
- "required": ["intent", "status", "effects", "locks", "conflicts"],
466
+ "required": ["intent", "status", "parallelEligible", "parallelReason", "effects", "locks", "conflicts"],
348
467
  "properties": {
349
468
  "intent": {
350
469
  "type": "string"
@@ -352,6 +471,12 @@
352
471
  "status": {
353
472
  "const": "runnable"
354
473
  },
474
+ "parallelEligible": {
475
+ "type": "boolean"
476
+ },
477
+ "parallelReason": {
478
+ "enum": ["explicit_effects", "missing_explicit_effects", "undeclared_write_drift"]
479
+ },
355
480
  "effects": {
356
481
  "type": "array",
357
482
  "items": {
@@ -497,11 +622,14 @@
497
622
  "verificationSchedule": {
498
623
  "type": "object",
499
624
  "additionalProperties": false,
500
- "required": ["runner", "batches", "entries", "notes"],
625
+ "required": ["runner", "failurePolicy", "batches", "entries", "notes"],
501
626
  "properties": {
502
627
  "runner": {
503
628
  "const": "serial_mf_run_receipts"
504
629
  },
630
+ "failurePolicy": {
631
+ "$ref": "#/$defs/verificationScheduleFailurePolicy"
632
+ },
505
633
  "batches": {
506
634
  "type": "array",
507
635
  "items": {
@@ -519,6 +647,22 @@
519
647
  }
520
648
  }
521
649
  },
650
+ "verificationScheduleFailurePolicy": {
651
+ "type": "object",
652
+ "additionalProperties": false,
653
+ "required": ["mode", "startedBatch", "nextBatch"],
654
+ "properties": {
655
+ "mode": {
656
+ "const": "batch_boundary"
657
+ },
658
+ "startedBatch": {
659
+ "const": "wait_for_completion"
660
+ },
661
+ "nextBatch": {
662
+ "const": "stop_on_failure"
663
+ }
664
+ }
665
+ },
522
666
  "verificationDecisionGraph": {
523
667
  "type": "object",
524
668
  "additionalProperties": false,
@@ -582,6 +726,12 @@
582
726
  "unknown": {
583
727
  "type": "integer"
584
728
  },
729
+ "selected": {
730
+ "type": "integer"
731
+ },
732
+ "not_selected": {
733
+ "type": "integer"
734
+ },
585
735
  "gapCount": {
586
736
  "type": "integer"
587
737
  }
@@ -60,7 +60,7 @@
60
60
  "type": "object",
61
61
  "additionalProperties": false,
62
62
  "properties": {
63
- "type": { "enum": ["path"] },
63
+ "type": { "enum": ["path", "cache", "database", "service", "port", "gpu", "resource"] },
64
64
  "paths": { "$ref": "#/$defs/stringArray" },
65
65
  "concurrency": { "enum": ["shared_reader", "exclusive_writer", "exclusive"] },
66
66
  "description": { "type": "string" }
@@ -78,6 +78,48 @@
78
78
  "concurrency": { "enum": ["shared", "exclusive"] }
79
79
  }
80
80
  },
81
+ "coverageHints": {
82
+ "type": "object",
83
+ "additionalProperties": false,
84
+ "properties": {
85
+ "reasons": { "$ref": "#/$defs/stringArray" },
86
+ "surfaces": { "$ref": "#/$defs/stringArray" },
87
+ "paths": { "$ref": "#/$defs/stringArray" },
88
+ "contracts": { "$ref": "#/$defs/stringArray" }
89
+ }
90
+ },
91
+ "selectionHints": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "properties": {
95
+ "coverage_level": { "type": "string" },
96
+ "coverage_confidence": { "type": "string" },
97
+ "accepts_changed_files": { "type": "string" },
98
+ "accepts_test_targets": { "type": "boolean" },
99
+ "fallback_intents": { "$ref": "#/$defs/stringArray" },
100
+ "escalate_to": { "$ref": "#/$defs/stringArray" }
101
+ }
102
+ },
103
+ "costHints": {
104
+ "type": "object",
105
+ "additionalProperties": false,
106
+ "properties": {
107
+ "expected_seconds": { "type": "integer", "minimum": 0 },
108
+ "cold_start_seconds": { "type": "integer", "minimum": 0 },
109
+ "timeout_ratio_expectation": { "type": "number", "minimum": 0 },
110
+ "cost_tier": { "type": "string" }
111
+ }
112
+ },
113
+ "relationHints": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "properties": {
117
+ "subsumes": { "$ref": "#/$defs/stringArray" },
118
+ "subsumed_by": { "$ref": "#/$defs/stringArray" },
119
+ "requires_with": { "$ref": "#/$defs/stringArray" },
120
+ "escalate_to": { "$ref": "#/$defs/stringArray" }
121
+ }
122
+ },
81
123
  "intent": {
82
124
  "type": "object",
83
125
  "additionalProperties": false,
@@ -115,6 +157,10 @@
115
157
  "type": "array",
116
158
  "items": { "type": "string" }
117
159
  },
160
+ "covers": { "$ref": "#/$defs/coverageHints" },
161
+ "selection": { "$ref": "#/$defs/selectionHints" },
162
+ "cost": { "$ref": "#/$defs/costHints" },
163
+ "relations": { "$ref": "#/$defs/relationHints" },
118
164
  "reason": { "type": "string" },
119
165
  "agent_action": { "type": "string" }
120
166
  }
@@ -82,6 +82,57 @@
82
82
  "type": "array",
83
83
  "items": { "type": "string" }
84
84
  },
85
+ "matrix": {
86
+ "type": "array",
87
+ "items": {
88
+ "type": "object",
89
+ "additionalProperties": false,
90
+ "required": ["reason", "source", "intents", "gaps", "relatedSkills", "relatedDocs"],
91
+ "properties": {
92
+ "reason": { "type": "string" },
93
+ "source": { "enum": ["classification", "documented", "required_after"] },
94
+ "intents": {
95
+ "type": "array",
96
+ "items": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": ["intent", "status", "runnable", "detail"],
100
+ "properties": {
101
+ "intent": { "type": "string" },
102
+ "status": {
103
+ "enum": [
104
+ "ok",
105
+ "intent_not_table",
106
+ "status_not_configured",
107
+ "lifecycle_not_oneshot",
108
+ "run_policy_not_agent_allowed",
109
+ "stdin_not_closed",
110
+ "missing_timeout",
111
+ "missing_command_source",
112
+ "unsafe_intent_name",
113
+ "blocked_shell_background_pattern"
114
+ ]
115
+ },
116
+ "runnable": { "type": "boolean" },
117
+ "detail": { "type": ["string", "null"] }
118
+ }
119
+ }
120
+ },
121
+ "gaps": {
122
+ "type": "array",
123
+ "items": { "type": "string" }
124
+ },
125
+ "relatedSkills": {
126
+ "type": "array",
127
+ "items": { "type": "string" }
128
+ },
129
+ "relatedDocs": {
130
+ "type": "array",
131
+ "items": { "type": "string" }
132
+ }
133
+ }
134
+ }
135
+ },
85
136
  "findings": {
86
137
  "type": "array",
87
138
  "items": {
@@ -0,0 +1,273 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/dashboard-export.schema.json",
4
+ "title": "mustflow dashboard export",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "format",
11
+ "generated_at",
12
+ "mustflow_root",
13
+ "output_policy",
14
+ "limits",
15
+ "preferences",
16
+ "status",
17
+ "docs_review",
18
+ "harness_report"
19
+ ],
20
+ "properties": {
21
+ "schema_version": { "const": "1" },
22
+ "command": { "const": "dashboard export" },
23
+ "format": { "enum": ["html", "json"] },
24
+ "generated_at": { "type": "string" },
25
+ "mustflow_root": { "type": "string" },
26
+ "output_policy": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": [
30
+ "bounded_to_mustflow_root",
31
+ "starts_server",
32
+ "static_html",
33
+ "contains_mutation_controls",
34
+ "omits_dashboard_token",
35
+ "omits_raw_run_output",
36
+ "redacts_secret_like_values"
37
+ ],
38
+ "properties": {
39
+ "bounded_to_mustflow_root": { "const": true },
40
+ "starts_server": { "const": false },
41
+ "static_html": { "type": "boolean" },
42
+ "contains_mutation_controls": { "const": false },
43
+ "omits_dashboard_token": { "const": true },
44
+ "omits_raw_run_output": { "const": true },
45
+ "redacts_secret_like_values": { "const": true }
46
+ }
47
+ },
48
+ "limits": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": [
52
+ "max_string_bytes",
53
+ "max_array_items",
54
+ "max_depth",
55
+ "truncated_fields",
56
+ "omitted_fields",
57
+ "redacted_fields",
58
+ "redaction_count",
59
+ "redaction_kinds"
60
+ ],
61
+ "properties": {
62
+ "max_string_bytes": { "type": "integer" },
63
+ "max_array_items": { "type": "integer" },
64
+ "max_depth": { "type": "integer" },
65
+ "truncated_fields": {
66
+ "type": "array",
67
+ "items": { "type": "string" }
68
+ },
69
+ "omitted_fields": {
70
+ "type": "array",
71
+ "items": { "type": "string" }
72
+ },
73
+ "redacted_fields": {
74
+ "type": "array",
75
+ "items": { "type": "string" }
76
+ },
77
+ "redaction_count": { "type": "integer" },
78
+ "redaction_kinds": {
79
+ "type": "array",
80
+ "items": { "type": "string" }
81
+ }
82
+ }
83
+ },
84
+ "preferences": {
85
+ "type": "object",
86
+ "additionalProperties": true
87
+ },
88
+ "status": {
89
+ "type": "object",
90
+ "additionalProperties": true
91
+ },
92
+ "docs_review": {
93
+ "type": "object",
94
+ "additionalProperties": true
95
+ },
96
+ "harness_report": { "$ref": "#/$defs/harnessReport" }
97
+ },
98
+ "$defs": {
99
+ "stringArray": {
100
+ "type": "array",
101
+ "items": { "type": "string" }
102
+ },
103
+ "decisionGraphSummary": {
104
+ "type": "object",
105
+ "additionalProperties": false,
106
+ "required": [
107
+ "root",
108
+ "node_count",
109
+ "edge_count",
110
+ "runnable",
111
+ "skipped",
112
+ "blocked",
113
+ "manual_only",
114
+ "unknown",
115
+ "gap_count"
116
+ ],
117
+ "properties": {
118
+ "root": { "const": "verification_decision" },
119
+ "node_count": { "type": "integer" },
120
+ "edge_count": { "type": "integer" },
121
+ "runnable": { "type": "integer" },
122
+ "skipped": { "type": "integer" },
123
+ "blocked": { "type": "integer" },
124
+ "manual_only": { "type": "integer" },
125
+ "unknown": { "type": "integer" },
126
+ "gap_count": { "type": "integer" }
127
+ }
128
+ },
129
+ "verificationGap": {
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "required": ["kind", "intent", "reason", "detail", "files", "surfaces"],
133
+ "properties": {
134
+ "kind": { "enum": ["manual_only", "blocked", "unknown", "missing"] },
135
+ "intent": { "type": ["string", "null"] },
136
+ "reason": { "type": ["string", "null"] },
137
+ "detail": { "type": ["string", "null"] },
138
+ "files": { "$ref": "#/$defs/stringArray" },
139
+ "surfaces": { "$ref": "#/$defs/stringArray" }
140
+ }
141
+ },
142
+ "remainingRisk": {
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "required": ["code", "severity", "detail"],
146
+ "properties": {
147
+ "code": { "type": "string" },
148
+ "severity": { "enum": ["info", "warning", "error"] },
149
+ "detail": { "type": "string" },
150
+ "count": { "type": "integer" },
151
+ "paths": { "$ref": "#/$defs/stringArray" }
152
+ }
153
+ },
154
+ "harnessReport": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": [
158
+ "schema_version",
159
+ "generated_from",
160
+ "install",
161
+ "verification",
162
+ "run_history",
163
+ "docs_review",
164
+ "remaining_risks"
165
+ ],
166
+ "properties": {
167
+ "schema_version": { "const": "1" },
168
+ "generated_from": { "const": "dashboard_status_snapshot" },
169
+ "install": {
170
+ "type": "object",
171
+ "additionalProperties": false,
172
+ "required": ["installed", "manifest_lock", "tracked_files", "changed_files", "missing_files", "issues"],
173
+ "properties": {
174
+ "installed": { "type": "boolean" },
175
+ "manifest_lock": { "type": "string" },
176
+ "tracked_files": { "type": "integer" },
177
+ "changed_files": { "type": "integer" },
178
+ "missing_files": { "type": "integer" },
179
+ "issues": { "type": "integer" }
180
+ }
181
+ },
182
+ "verification": {
183
+ "type": "object",
184
+ "additionalProperties": false,
185
+ "required": [
186
+ "changed_file_count",
187
+ "changed_surfaces",
188
+ "decision_graph_summary",
189
+ "runnable_intents",
190
+ "skipped_intents",
191
+ "gaps"
192
+ ],
193
+ "properties": {
194
+ "changed_file_count": { "type": "integer" },
195
+ "changed_surfaces": { "$ref": "#/$defs/stringArray" },
196
+ "decision_graph_summary": {
197
+ "type": ["object", "null"],
198
+ "properties": {
199
+ "root": { "const": "verification_decision" },
200
+ "node_count": { "type": "integer" },
201
+ "edge_count": { "type": "integer" },
202
+ "runnable": { "type": "integer" },
203
+ "skipped": { "type": "integer" },
204
+ "blocked": { "type": "integer" },
205
+ "manual_only": { "type": "integer" },
206
+ "unknown": { "type": "integer" },
207
+ "gap_count": { "type": "integer" }
208
+ }
209
+ },
210
+ "runnable_intents": { "$ref": "#/$defs/stringArray" },
211
+ "skipped_intents": {
212
+ "type": "array",
213
+ "items": {
214
+ "type": "object",
215
+ "additionalProperties": false,
216
+ "required": ["intent", "reason_key"],
217
+ "properties": {
218
+ "intent": { "type": "string" },
219
+ "reason_key": { "type": "string" }
220
+ }
221
+ }
222
+ },
223
+ "gaps": {
224
+ "type": "array",
225
+ "items": { "$ref": "#/$defs/verificationGap" }
226
+ }
227
+ }
228
+ },
229
+ "run_history": {
230
+ "type": "object",
231
+ "additionalProperties": false,
232
+ "required": [
233
+ "path",
234
+ "exists",
235
+ "valid",
236
+ "intent",
237
+ "status",
238
+ "exit_code",
239
+ "timed_out",
240
+ "finished_at",
241
+ "duration_ms",
242
+ "receipt_path"
243
+ ],
244
+ "properties": {
245
+ "path": { "type": "string" },
246
+ "exists": { "type": "boolean" },
247
+ "valid": { "type": "boolean" },
248
+ "intent": { "type": ["string", "null"] },
249
+ "status": { "type": ["string", "null"] },
250
+ "exit_code": { "type": ["integer", "null"] },
251
+ "timed_out": { "type": ["boolean", "null"] },
252
+ "finished_at": { "type": ["string", "null"] },
253
+ "duration_ms": { "type": ["number", "null"] },
254
+ "receipt_path": { "type": ["string", "null"] }
255
+ }
256
+ },
257
+ "docs_review": {
258
+ "type": "object",
259
+ "additionalProperties": false,
260
+ "required": ["ledger_path", "active_documents"],
261
+ "properties": {
262
+ "ledger_path": { "type": "string" },
263
+ "active_documents": { "type": "integer" }
264
+ }
265
+ },
266
+ "remaining_risks": {
267
+ "type": "array",
268
+ "items": { "$ref": "#/$defs/remainingRisk" }
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
@@ -567,6 +567,8 @@
567
567
  "blocked": { "type": "integer" },
568
568
  "manual_only": { "type": "integer" },
569
569
  "unknown": { "type": "integer" },
570
+ "selected": { "type": "integer" },
571
+ "not_selected": { "type": "integer" },
570
572
  "gapCount": { "type": "integer" }
571
573
  }
572
574
  },