@vibecheckai/cli 3.0.4 → 3.0.7

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 (108) hide show
  1. package/bin/dev/run-v2-torture.js +30 -0
  2. package/bin/runners/context/index.js +1 -1
  3. package/bin/runners/lib/analyzers.js +38 -0
  4. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  5. package/bin/runners/lib/contracts/auth-contract.js +8 -0
  6. package/bin/runners/lib/contracts/env-contract.js +3 -0
  7. package/bin/runners/lib/contracts/external-contract.js +10 -2
  8. package/bin/runners/lib/contracts/route-contract.js +7 -0
  9. package/bin/runners/lib/contracts.js +804 -0
  10. package/bin/runners/lib/detectors-v2.js +703 -0
  11. package/bin/runners/lib/drift.js +425 -0
  12. package/bin/runners/lib/entitlements-v2.js +3 -1
  13. package/bin/runners/lib/entitlements.js +11 -3
  14. package/bin/runners/lib/env-resolver.js +417 -0
  15. package/bin/runners/lib/extractors/client-calls.js +990 -0
  16. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  17. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  18. package/bin/runners/lib/extractors/index.js +363 -0
  19. package/bin/runners/lib/extractors/next-routes.js +524 -0
  20. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  21. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  22. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  23. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  24. package/bin/runners/lib/findings-schema.js +281 -0
  25. package/bin/runners/lib/html-report.js +650 -0
  26. package/bin/runners/lib/missions/templates.js +45 -0
  27. package/bin/runners/lib/policy.js +295 -0
  28. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  29. package/bin/runners/lib/reality/index.js +318 -0
  30. package/bin/runners/lib/reality/request-hashing.js +416 -0
  31. package/bin/runners/lib/reality/request-mapper.js +453 -0
  32. package/bin/runners/lib/reality/safety-rails.js +463 -0
  33. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  34. package/bin/runners/lib/reality/toast-detector.js +393 -0
  35. package/bin/runners/lib/report-html.js +5 -0
  36. package/bin/runners/lib/report-templates.js +5 -0
  37. package/bin/runners/lib/report.js +135 -0
  38. package/bin/runners/lib/route-truth.js +10 -10
  39. package/bin/runners/lib/schema-validator.js +350 -0
  40. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  41. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  42. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  43. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  44. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  45. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  46. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  47. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  48. package/bin/runners/lib/schemas/validator.js +438 -0
  49. package/bin/runners/lib/ui.js +562 -0
  50. package/bin/runners/lib/verdict-engine.js +628 -0
  51. package/bin/runners/runAIAgent.js +228 -1
  52. package/bin/runners/runBadge.js +181 -1
  53. package/bin/runners/runCtx.js +7 -2
  54. package/bin/runners/runCtxDiff.js +301 -0
  55. package/bin/runners/runGuard.js +168 -0
  56. package/bin/runners/runInitGha.js +78 -15
  57. package/bin/runners/runLabs.js +341 -0
  58. package/bin/runners/runLaunch.js +180 -1
  59. package/bin/runners/runMdc.js +203 -1
  60. package/bin/runners/runProof.zip +0 -0
  61. package/bin/runners/runProve.js +23 -0
  62. package/bin/runners/runReplay.js +114 -84
  63. package/bin/runners/runScan.js +111 -32
  64. package/bin/runners/runShip.js +23 -2
  65. package/bin/runners/runTruthpack.js +9 -7
  66. package/bin/runners/runValidate.js +161 -1
  67. package/bin/vibecheck.js +416 -770
  68. package/mcp-server/.guardrail/audit/audit.log.jsonl +2 -0
  69. package/mcp-server/.specs/architecture.mdc +90 -0
  70. package/mcp-server/.specs/security.mdc +30 -0
  71. package/mcp-server/README.md +252 -0
  72. package/mcp-server/agent-checkpoint.js +364 -0
  73. package/mcp-server/architect-tools.js +707 -0
  74. package/mcp-server/audit-mcp.js +206 -0
  75. package/mcp-server/codebase-architect-tools.js +838 -0
  76. package/mcp-server/consolidated-tools.js +804 -0
  77. package/mcp-server/hygiene-tools.js +428 -0
  78. package/mcp-server/index-v1.js +698 -0
  79. package/mcp-server/index.js +2092 -0
  80. package/mcp-server/index.old.js +4137 -0
  81. package/mcp-server/intelligence-tools.js +664 -0
  82. package/mcp-server/intent-drift-tools.js +873 -0
  83. package/mcp-server/mdc-generator.js +298 -0
  84. package/mcp-server/package-lock.json +165 -0
  85. package/mcp-server/package.json +47 -0
  86. package/mcp-server/premium-tools.js +1275 -0
  87. package/mcp-server/test-mcp.js +108 -0
  88. package/mcp-server/test-tools.js +36 -0
  89. package/mcp-server/tier-auth.js +147 -0
  90. package/mcp-server/tools/index.js +72 -0
  91. package/mcp-server/tools-reorganized.ts +244 -0
  92. package/mcp-server/truth-context.js +581 -0
  93. package/mcp-server/truth-firewall-tools.js +1500 -0
  94. package/mcp-server/vibecheck-2.0-tools.js +748 -0
  95. package/mcp-server/vibecheck-tools.js +1075 -0
  96. package/package.json +10 -8
  97. package/bin/guardrail.js +0 -834
  98. package/bin/runners/runAudit.js +0 -2
  99. package/bin/runners/runAutopilot.js +0 -2
  100. package/bin/runners/runCertify.js +0 -2
  101. package/bin/runners/runDashboard.js +0 -10
  102. package/bin/runners/runEnhancedShip.js +0 -2
  103. package/bin/runners/runFixPacks.js +0 -2
  104. package/bin/runners/runNaturalLanguage.js +0 -3
  105. package/bin/runners/runProof.js +0 -2
  106. package/bin/runners/runRealitySniff.js +0 -2
  107. package/bin/runners/runUpgrade.js +0 -2
  108. package/bin/runners/runVerifyAgentOutput.js +0 -2
@@ -0,0 +1,206 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://vibecheck.dev/schemas/mission-pack.schema.json",
4
+ "title": "Vibecheck Mission Pack",
5
+ "description": "Fix missions generated from findings for AI agents or humans",
6
+ "type": "object",
7
+ "required": ["specVersion", "generatedAt", "fingerprint", "missions"],
8
+ "properties": {
9
+ "specVersion": {
10
+ "type": "string",
11
+ "const": "2.0"
12
+ },
13
+ "generatedAt": {
14
+ "type": "string",
15
+ "format": "date-time"
16
+ },
17
+ "projectRoot": {
18
+ "type": "string"
19
+ },
20
+ "fingerprint": {
21
+ "type": "string",
22
+ "pattern": "^sha256:[a-f0-9]{64}$"
23
+ },
24
+ "sourceReport": {
25
+ "type": "string",
26
+ "description": "Path to ship-report that generated this pack"
27
+ },
28
+ "missions": {
29
+ "type": "array",
30
+ "items": { "$ref": "#/$defs/mission" }
31
+ },
32
+ "summary": {
33
+ "$ref": "#/$defs/missionSummary"
34
+ },
35
+ "artifacts": {
36
+ "type": "array",
37
+ "items": { "$ref": "#/$defs/artifact" }
38
+ }
39
+ },
40
+ "$defs": {
41
+ "mission": {
42
+ "type": "object",
43
+ "required": ["id", "type", "findingId", "title", "priority", "status"],
44
+ "properties": {
45
+ "id": {
46
+ "type": "string",
47
+ "pattern": "^M_[A-Z0-9_]+_[A-F0-9]+$",
48
+ "description": "Mission ID: M_{TYPE}_{HASH}"
49
+ },
50
+ "type": {
51
+ "type": "string",
52
+ "enum": [
53
+ "ADD_ROUTE",
54
+ "REMOVE_ROUTE",
55
+ "FIX_AUTH",
56
+ "ADD_ENV",
57
+ "FIX_CLIENT_CALL",
58
+ "FIX_UI_BINDING",
59
+ "ADD_ERROR_HANDLING",
60
+ "FIX_TOAST",
61
+ "MANUAL_REVIEW"
62
+ ]
63
+ },
64
+ "findingId": {
65
+ "type": "string",
66
+ "description": "Source finding that generated this mission"
67
+ },
68
+ "title": {
69
+ "type": "string",
70
+ "maxLength": 200
71
+ },
72
+ "description": {
73
+ "type": "string",
74
+ "description": "Detailed description of what needs to be done"
75
+ },
76
+ "priority": {
77
+ "type": "string",
78
+ "enum": ["critical", "high", "medium", "low"]
79
+ },
80
+ "status": {
81
+ "type": "string",
82
+ "enum": ["pending", "in_progress", "completed", "skipped", "failed"]
83
+ },
84
+ "targetFile": {
85
+ "type": ["string", "null"],
86
+ "description": "Primary file to modify"
87
+ },
88
+ "targetLine": {
89
+ "type": ["integer", "null"]
90
+ },
91
+ "suggestedFix": {
92
+ "$ref": "#/$defs/suggestedFix"
93
+ },
94
+ "verification": {
95
+ "$ref": "#/$defs/verification"
96
+ },
97
+ "dependencies": {
98
+ "type": "array",
99
+ "items": { "type": "string" },
100
+ "description": "Mission IDs that must complete first"
101
+ },
102
+ "aiHints": {
103
+ "$ref": "#/$defs/aiHints"
104
+ }
105
+ }
106
+ },
107
+ "suggestedFix": {
108
+ "type": "object",
109
+ "properties": {
110
+ "type": {
111
+ "type": "string",
112
+ "enum": ["create_file", "edit_file", "delete_file", "add_import", "add_function", "wrap_code"]
113
+ },
114
+ "file": { "type": "string" },
115
+ "beforeSnippet": { "type": ["string", "null"] },
116
+ "afterSnippet": { "type": ["string", "null"] },
117
+ "insertAt": {
118
+ "type": "object",
119
+ "properties": {
120
+ "line": { "type": "integer" },
121
+ "position": { "type": "string", "enum": ["before", "after", "replace"] }
122
+ }
123
+ },
124
+ "confidence": {
125
+ "type": "string",
126
+ "enum": ["high", "medium", "low"]
127
+ }
128
+ }
129
+ },
130
+ "verification": {
131
+ "type": "object",
132
+ "properties": {
133
+ "type": {
134
+ "type": "string",
135
+ "enum": ["rerun_vibecheck", "run_test", "manual", "playwright_action"]
136
+ },
137
+ "command": { "type": ["string", "null"] },
138
+ "expectedOutcome": { "type": "string" },
139
+ "playwrightAction": {
140
+ "type": "object",
141
+ "properties": {
142
+ "selector": { "type": "string" },
143
+ "action": { "type": "string" },
144
+ "expectedSignal": { "type": "string" }
145
+ }
146
+ }
147
+ }
148
+ },
149
+ "aiHints": {
150
+ "type": "object",
151
+ "description": "Hints for AI agents processing this mission",
152
+ "properties": {
153
+ "context": {
154
+ "type": "array",
155
+ "items": { "type": "string" },
156
+ "description": "Files to read for context"
157
+ },
158
+ "patterns": {
159
+ "type": "array",
160
+ "items": { "type": "string" },
161
+ "description": "Patterns to follow from codebase"
162
+ },
163
+ "avoid": {
164
+ "type": "array",
165
+ "items": { "type": "string" },
166
+ "description": "Anti-patterns to avoid"
167
+ },
168
+ "testWith": {
169
+ "type": "array",
170
+ "items": { "type": "string" },
171
+ "description": "Test files to update/create"
172
+ }
173
+ }
174
+ },
175
+ "missionSummary": {
176
+ "type": "object",
177
+ "properties": {
178
+ "total": { "type": "integer" },
179
+ "byType": {
180
+ "type": "object",
181
+ "additionalProperties": { "type": "integer" }
182
+ },
183
+ "byPriority": {
184
+ "type": "object",
185
+ "additionalProperties": { "type": "integer" }
186
+ },
187
+ "byStatus": {
188
+ "type": "object",
189
+ "additionalProperties": { "type": "integer" }
190
+ },
191
+ "estimatedEffort": {
192
+ "type": "string",
193
+ "description": "Rough time estimate"
194
+ }
195
+ }
196
+ },
197
+ "artifact": {
198
+ "type": "object",
199
+ "required": ["path", "sha256"],
200
+ "properties": {
201
+ "path": { "type": "string" },
202
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
203
+ }
204
+ }
205
+ }
206
+ }
@@ -0,0 +1,176 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://vibecheck.dev/schemas/proof-graph.schema.json",
4
+ "title": "Vibecheck Proof Graph",
5
+ "description": "Graph linking UI actions to client calls to server routes with evidence",
6
+ "type": "object",
7
+ "required": ["specVersion", "generatedAt", "fingerprint", "nodes", "edges"],
8
+ "properties": {
9
+ "specVersion": {
10
+ "type": "string",
11
+ "const": "2.0"
12
+ },
13
+ "generatedAt": {
14
+ "type": "string",
15
+ "format": "date-time"
16
+ },
17
+ "fingerprint": {
18
+ "type": "string",
19
+ "pattern": "^sha256:[a-f0-9]{64}$"
20
+ },
21
+ "nodes": {
22
+ "type": "array",
23
+ "items": { "$ref": "#/$defs/node" },
24
+ "minItems": 0
25
+ },
26
+ "edges": {
27
+ "type": "array",
28
+ "items": { "$ref": "#/$defs/edge" },
29
+ "minItems": 0
30
+ },
31
+ "stats": {
32
+ "$ref": "#/$defs/graphStats"
33
+ },
34
+ "gaps": {
35
+ "type": "array",
36
+ "items": { "$ref": "#/$defs/proofGap" },
37
+ "description": "Nodes without required edges"
38
+ }
39
+ },
40
+ "$defs": {
41
+ "node": {
42
+ "type": "object",
43
+ "required": ["id", "type"],
44
+ "properties": {
45
+ "id": {
46
+ "type": "string",
47
+ "description": "Unique node ID matching source entity ID"
48
+ },
49
+ "type": {
50
+ "type": "string",
51
+ "enum": ["UI_BINDING", "CLIENT_CALL", "SERVER_ROUTE", "RUNTIME_REQUEST", "UI_SIGNAL"],
52
+ "description": "Node type determines required edges"
53
+ },
54
+ "label": {
55
+ "type": "string",
56
+ "description": "Human-readable label"
57
+ },
58
+ "file": { "type": ["string", "null"] },
59
+ "line": { "type": ["integer", "null"] },
60
+ "confidence": {
61
+ "type": "string",
62
+ "enum": ["high", "medium", "low"]
63
+ },
64
+ "source": {
65
+ "type": "string",
66
+ "enum": ["static", "runtime"],
67
+ "default": "static"
68
+ },
69
+ "metadata": {
70
+ "type": "object",
71
+ "description": "Type-specific metadata"
72
+ }
73
+ }
74
+ },
75
+ "edge": {
76
+ "type": "object",
77
+ "required": ["id", "type", "from", "to"],
78
+ "properties": {
79
+ "id": {
80
+ "type": "string",
81
+ "pattern": "^E_[A-F0-9]+$"
82
+ },
83
+ "type": {
84
+ "type": "string",
85
+ "enum": [
86
+ "TRIGGERS",
87
+ "CALLS",
88
+ "MATCHES",
89
+ "PRODUCES",
90
+ "VERIFIED_BY"
91
+ ],
92
+ "description": "Edge relationship type"
93
+ },
94
+ "from": {
95
+ "type": "string",
96
+ "description": "Source node ID"
97
+ },
98
+ "to": {
99
+ "type": "string",
100
+ "description": "Target node ID"
101
+ },
102
+ "confidence": {
103
+ "type": "string",
104
+ "enum": ["high", "medium", "low"]
105
+ },
106
+ "score": {
107
+ "type": "number",
108
+ "minimum": 0,
109
+ "maximum": 1,
110
+ "description": "Match score for fuzzy edges"
111
+ },
112
+ "evidence": {
113
+ "type": "array",
114
+ "items": { "type": "object" }
115
+ }
116
+ }
117
+ },
118
+ "graphStats": {
119
+ "type": "object",
120
+ "properties": {
121
+ "nodeCount": { "type": "integer", "minimum": 0 },
122
+ "edgeCount": { "type": "integer", "minimum": 0 },
123
+ "byNodeType": {
124
+ "type": "object",
125
+ "additionalProperties": { "type": "integer" }
126
+ },
127
+ "byEdgeType": {
128
+ "type": "object",
129
+ "additionalProperties": { "type": "integer" }
130
+ },
131
+ "coverage": {
132
+ "type": "object",
133
+ "properties": {
134
+ "uiBindingsWithTriggers": { "type": "number" },
135
+ "clientCallsWithMatches": { "type": "number" },
136
+ "serverRoutesWithCalls": { "type": "number" },
137
+ "runtimeRequestsMapped": { "type": "number" }
138
+ }
139
+ }
140
+ }
141
+ },
142
+ "proofGap": {
143
+ "type": "object",
144
+ "required": ["nodeId", "nodeType", "missingEdgeType"],
145
+ "properties": {
146
+ "nodeId": { "type": "string" },
147
+ "nodeType": { "type": "string" },
148
+ "missingEdgeType": { "type": "string" },
149
+ "severity": {
150
+ "type": "string",
151
+ "enum": ["BLOCK", "WARN", "INFO"]
152
+ },
153
+ "reason": { "type": "string" }
154
+ }
155
+ }
156
+ },
157
+ "x-edge-requirements": {
158
+ "description": "Minimum edge requirements by node type for proof completeness",
159
+ "UI_BINDING": {
160
+ "outgoing": ["TRIGGERS"],
161
+ "note": "UI binding should trigger at least one client call"
162
+ },
163
+ "CLIENT_CALL": {
164
+ "outgoing": ["MATCHES"],
165
+ "note": "Client call should match a server route"
166
+ },
167
+ "SERVER_ROUTE": {
168
+ "incoming": ["MATCHES"],
169
+ "note": "Server route should be called by at least one client call (or be dead)"
170
+ },
171
+ "RUNTIME_REQUEST": {
172
+ "outgoing": ["MATCHES"],
173
+ "note": "Runtime request should map to a client call"
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://vibecheck.dev/schemas/reality-report.schema.json",
4
+ "title": "Vibecheck Reality Report",
5
+ "description": "Runtime verification results from Playwright crawl",
6
+ "type": "object",
7
+ "required": ["meta", "actions", "requests", "signals"],
8
+ "properties": {
9
+ "meta": {
10
+ "type": "object",
11
+ "required": ["version", "generatedAt", "baseUrl"],
12
+ "properties": {
13
+ "version": { "type": "string", "const": "2.0.0" },
14
+ "generatedAt": { "type": "string", "format": "date-time" },
15
+ "baseUrl": { "type": "string", "format": "uri" },
16
+ "durationMs": { "type": "integer" },
17
+ "browser": { "type": "string" },
18
+ "viewport": {
19
+ "type": "object",
20
+ "properties": {
21
+ "width": { "type": "integer" },
22
+ "height": { "type": "integer" }
23
+ }
24
+ },
25
+ "passes": {
26
+ "type": "array",
27
+ "items": { "type": "string", "enum": ["anon", "auth"] }
28
+ }
29
+ }
30
+ },
31
+ "actions": {
32
+ "type": "array",
33
+ "items": { "$ref": "#/$defs/action" }
34
+ },
35
+ "requests": {
36
+ "type": "array",
37
+ "items": { "$ref": "#/$defs/request" }
38
+ },
39
+ "signals": {
40
+ "type": "array",
41
+ "items": { "$ref": "#/$defs/signal" }
42
+ },
43
+ "actionOutcomes": {
44
+ "type": "array",
45
+ "items": { "$ref": "#/$defs/actionOutcome" }
46
+ },
47
+ "coverage": {
48
+ "type": "object",
49
+ "properties": {
50
+ "routesHit": { "type": "array", "items": { "type": "string" } },
51
+ "routesMissed": { "type": "array", "items": { "type": "string" } },
52
+ "percent": { "type": "number" }
53
+ }
54
+ },
55
+ "auth": {
56
+ "type": "object",
57
+ "properties": {
58
+ "verified": { "type": "boolean" },
59
+ "protectedRoutesTestedAnon": { "type": "array", "items": { "type": "string" } },
60
+ "protectedRoutesTestedAuth": { "type": "array", "items": { "type": "string" } },
61
+ "bypassDetected": { "type": "array", "items": { "type": "string" } }
62
+ }
63
+ }
64
+ },
65
+ "$defs": {
66
+ "action": {
67
+ "type": "object",
68
+ "required": ["id", "type", "selector", "timestamp"],
69
+ "properties": {
70
+ "id": { "type": "string" },
71
+ "type": { "type": "string", "enum": ["click", "submit", "navigate", "type", "scroll"] },
72
+ "selector": { "type": "string" },
73
+ "labelHint": { "type": "string" },
74
+ "url": { "type": "string" },
75
+ "timestamp": { "type": "integer" },
76
+ "durationMs": { "type": "integer" },
77
+ "screenshot": { "type": "string" },
78
+ "requestIds": {
79
+ "type": "array",
80
+ "items": { "type": "string" }
81
+ },
82
+ "uiChange": { "$ref": "#/$defs/uiChange" }
83
+ }
84
+ },
85
+ "uiChange": {
86
+ "type": "object",
87
+ "required": ["score", "meaningful"],
88
+ "properties": {
89
+ "score": { "type": "number", "minimum": 0, "maximum": 1 },
90
+ "meaningful": { "type": "boolean" },
91
+ "reasons": {
92
+ "type": "array",
93
+ "items": { "type": "string" }
94
+ },
95
+ "beforeSemanticHash": { "type": "string" },
96
+ "afterSemanticHash": { "type": "string" },
97
+ "semanticDiffSummary": {
98
+ "type": "object",
99
+ "properties": {
100
+ "added": { "type": "array", "items": { "type": "string" } },
101
+ "removed": { "type": "array", "items": { "type": "string" } },
102
+ "changed": { "type": "array", "items": { "type": "string" } }
103
+ }
104
+ },
105
+ "routeChanged": { "type": "boolean" },
106
+ "dialogOpened": { "type": "boolean" },
107
+ "dialogClosed": { "type": "boolean" },
108
+ "errorsChanged": { "type": "boolean" }
109
+ }
110
+ },
111
+ "request": {
112
+ "type": "object",
113
+ "required": ["id", "method", "url", "timestamp"],
114
+ "properties": {
115
+ "id": { "type": "string" },
116
+ "method": { "type": "string" },
117
+ "url": { "type": "string" },
118
+ "normalizedPath": { "type": "string" },
119
+ "status": { "type": "integer" },
120
+ "timestamp": { "type": "integer" },
121
+ "durationMs": { "type": "integer" },
122
+ "triggeredBy": { "type": "string" },
123
+ "responseType": { "type": "string" },
124
+ "isApi": { "type": "boolean" },
125
+ "isMutation": { "type": "boolean" }
126
+ }
127
+ },
128
+ "signal": {
129
+ "type": "object",
130
+ "required": ["kind", "atMs"],
131
+ "properties": {
132
+ "kind": {
133
+ "type": "string",
134
+ "enum": ["toast_success", "toast_error", "toast_info", "toast_unknown", "alert_appeared", "dialog_opened", "dialog_closed", "spinner_started", "spinner_ended", "route_changed"]
135
+ },
136
+ "atMs": { "type": "integer" },
137
+ "libraryHint": { "type": "string" },
138
+ "message": { "type": "string" },
139
+ "selectorHint": { "type": "string" },
140
+ "screenshot": { "type": "string" },
141
+ "actionId": { "type": "string" }
142
+ }
143
+ },
144
+ "actionOutcome": {
145
+ "type": "object",
146
+ "required": ["actionId", "outcome"],
147
+ "properties": {
148
+ "actionId": { "type": "string" },
149
+ "actionType": { "type": "string" },
150
+ "selector": { "type": "string" },
151
+ "outcome": {
152
+ "type": "string",
153
+ "enum": ["success_confirmed", "success_silent", "mutation_failed", "toast_only", "error_shown", "no_effect", "ui_changed", "unknown"]
154
+ },
155
+ "uiChangeScore": { "type": "number" },
156
+ "toastKinds": { "type": "array", "items": { "type": "string" } },
157
+ "requestCount": { "type": "integer" },
158
+ "mutationCount": { "type": "integer" }
159
+ }
160
+ }
161
+ }
162
+ }