@probelabs/visor 0.1.124 → 0.1.126

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 (195) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/docs/DEPLOYMENT.md +117 -11
  3. package/dist/docs/GITHUB_CHECKS.md +18 -4
  4. package/dist/docs/NPM_USAGE.md +112 -39
  5. package/dist/docs/action-reference.md +63 -9
  6. package/dist/docs/advanced-ai.md +58 -51
  7. package/dist/docs/ai-configuration.md +99 -11
  8. package/dist/docs/ai-custom-tools-usage.md +70 -33
  9. package/dist/docs/ai-custom-tools.md +50 -27
  10. package/dist/docs/architecture.md +1232 -0
  11. package/dist/docs/bot-transports-rfc.md +13 -3
  12. package/dist/docs/ci-cli-mode.md +116 -8
  13. package/dist/docs/claude-code.md +111 -41
  14. package/dist/docs/command-provider.md +37 -15
  15. package/dist/docs/commands.md +252 -6
  16. package/dist/docs/configuration.md +138 -4
  17. package/dist/docs/contributing.md +737 -0
  18. package/dist/docs/custom-tools.md +39 -8
  19. package/dist/docs/dashboards/README.md +33 -19
  20. package/dist/docs/debug-visualizer-progress.md +14 -13
  21. package/dist/docs/debug-visualizer-rfc.md +14 -13
  22. package/dist/docs/debug-visualizer.md +30 -5
  23. package/dist/docs/debugging.md +73 -8
  24. package/dist/docs/default-output-schema.md +24 -20
  25. package/dist/docs/dependencies.md +75 -21
  26. package/dist/docs/dev-playbook.md +85 -9
  27. package/dist/docs/engine-pause-resume-rfc.md +11 -11
  28. package/dist/docs/engine-state-machine-plan.md +10 -3
  29. package/dist/docs/event-driven-github-integration-rfc.md +20 -11
  30. package/dist/docs/event-triggers.md +95 -6
  31. package/dist/docs/execution-statistics-rfc.md +16 -4
  32. package/dist/docs/fact-validator-gap-analysis.md +12 -1
  33. package/dist/docs/fact-validator-implementation-plan.md +19 -11
  34. package/dist/docs/fail-if.md +116 -11
  35. package/dist/docs/failure-conditions-implementation.md +40 -6
  36. package/dist/docs/failure-conditions-schema.md +243 -87
  37. package/dist/docs/failure-routing-rfc.md +43 -18
  38. package/dist/docs/failure-routing.md +80 -23
  39. package/dist/docs/faq.md +836 -0
  40. package/dist/docs/foreach-dependency-propagation.md +32 -15
  41. package/dist/docs/github-ops.md +6 -5
  42. package/dist/docs/glossary.md +322 -0
  43. package/dist/docs/goto-forward-run-plan.md +23 -10
  44. package/dist/docs/guides/criticality-modes.md +15 -13
  45. package/dist/docs/guides/fault-management-and-contracts.md +8 -5
  46. package/dist/docs/guides/workflow-style-guide.md +17 -8
  47. package/dist/docs/http.md +102 -3
  48. package/dist/docs/human-input-provider.md +20 -36
  49. package/dist/docs/index.md +206 -0
  50. package/dist/docs/lifecycle-hooks.md +322 -2
  51. package/dist/docs/limits.md +20 -5
  52. package/dist/docs/liquid-templates.md +86 -14
  53. package/dist/docs/loop-routing-refactor.md +4 -2
  54. package/dist/docs/mcp-provider.md +53 -19
  55. package/dist/docs/mcp.md +27 -1
  56. package/dist/docs/memory.md +7 -2
  57. package/dist/docs/migration.md +596 -0
  58. package/dist/docs/observability.md +227 -6
  59. package/dist/docs/output-formats.md +388 -9
  60. package/dist/docs/output-history.md +36 -6
  61. package/dist/docs/performance.md +510 -4
  62. package/dist/docs/pluggable.md +95 -4
  63. package/dist/docs/proposals/snapshot-scope-execution.md +6 -5
  64. package/dist/docs/providers/git-checkout.md +16 -14
  65. package/dist/docs/providers/noop.md +696 -0
  66. package/dist/docs/recipes.md +8 -9
  67. package/dist/docs/rfc/git-checkout-step.md +3 -1
  68. package/dist/docs/rfc/on_init-hook.md +18 -5
  69. package/dist/docs/rfc/workspace-isolation.md +16 -0
  70. package/dist/docs/roadmap/criticality-implementation-tasks.md +27 -27
  71. package/dist/docs/router-patterns.md +155 -43
  72. package/dist/docs/schema-templates.md +51 -15
  73. package/dist/docs/script.md +162 -13
  74. package/dist/docs/sdk.md +46 -12
  75. package/dist/docs/security.md +464 -5
  76. package/dist/docs/slack-integration.md +481 -0
  77. package/dist/docs/tag-filtering.md +60 -20
  78. package/dist/docs/telemetry-setup.md +157 -46
  79. package/dist/docs/test-framework-rfc.md +37 -36
  80. package/dist/docs/testing/assertions.md +92 -4
  81. package/dist/docs/testing/ci.md +56 -7
  82. package/dist/docs/testing/cli.md +57 -15
  83. package/dist/docs/testing/cookbook.md +53 -20
  84. package/dist/docs/testing/dsl-reference.md +110 -9
  85. package/dist/docs/testing/fixtures-and-mocks.md +28 -3
  86. package/dist/docs/testing/flows.md +59 -4
  87. package/dist/docs/testing/getting-started.md +14 -13
  88. package/dist/docs/testing/troubleshooting.md +39 -2
  89. package/dist/docs/timeouts.md +174 -18
  90. package/dist/docs/troubleshooting.md +176 -6
  91. package/dist/docs/workflow-creation-guide.md +101 -3
  92. package/dist/docs/workflows.md +138 -41
  93. package/dist/examples/README.md +169 -4
  94. package/dist/examples/ai-custom-tools-simple.yaml +2 -3
  95. package/dist/examples/cron-webhook-config.yaml +15 -0
  96. package/dist/examples/forEach-example.yaml +6 -0
  97. package/dist/examples/git-checkout-basic.yaml +4 -0
  98. package/dist/examples/git-checkout-compare.yaml +6 -0
  99. package/dist/examples/git-checkout-cross-repo.yaml +7 -0
  100. package/dist/examples/http-integration-config.yaml +30 -0
  101. package/dist/examples/https-server-config.yaml +15 -0
  102. package/dist/examples/mcp-provider-example.yaml +10 -10
  103. package/dist/examples/transform-example.yaml +3 -0
  104. package/dist/examples/webhook-pipeline-config.yaml +18 -0
  105. package/dist/examples/workflows/workflow-composition-example.yaml +4 -0
  106. package/dist/frontends/slack-frontend.d.ts +2 -0
  107. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  108. package/dist/generated/config-schema.d.ts +11 -7
  109. package/dist/generated/config-schema.d.ts.map +1 -1
  110. package/dist/generated/config-schema.json +11 -7
  111. package/dist/index.js +3127 -974
  112. package/dist/output/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
  113. package/dist/output/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
  114. package/dist/providers/ai-check-provider.d.ts +9 -2
  115. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  116. package/dist/providers/command-check-provider.d.ts.map +1 -1
  117. package/dist/providers/mcp-custom-sse-server.d.ts +17 -1
  118. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  119. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  120. package/dist/providers/workflow-tool-executor.d.ts +68 -0
  121. package/dist/providers/workflow-tool-executor.d.ts.map +1 -0
  122. package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs → check-provider-registry-3KI5RKXT.mjs} +6 -5
  123. package/dist/sdk/check-provider-registry-IYILYY35.mjs +28 -0
  124. package/dist/sdk/chunk-2CPMMNIX.mjs +1459 -0
  125. package/dist/sdk/chunk-2CPMMNIX.mjs.map +1 -0
  126. package/dist/sdk/chunk-5LI6T4O3.mjs +3600 -0
  127. package/dist/sdk/chunk-5LI6T4O3.mjs.map +1 -0
  128. package/dist/sdk/{chunk-YLQ4UN62.mjs → chunk-A4PGHURG.mjs} +6838 -6257
  129. package/dist/sdk/chunk-A4PGHURG.mjs.map +1 -0
  130. package/dist/sdk/chunk-EXFGO4FX.mjs +147 -0
  131. package/dist/sdk/chunk-EXFGO4FX.mjs.map +1 -0
  132. package/dist/sdk/chunk-PJ7K5UFC.mjs +17732 -0
  133. package/dist/sdk/chunk-PJ7K5UFC.mjs.map +1 -0
  134. package/dist/sdk/{chunk-BHZ4CKUS.mjs → chunk-PXFIALUH.mjs} +77 -8
  135. package/dist/sdk/chunk-PXFIALUH.mjs.map +1 -0
  136. package/dist/sdk/{chunk-PVITVJ6J.mjs → chunk-RTKJXNZS.mjs} +32 -9
  137. package/dist/sdk/chunk-RTKJXNZS.mjs.map +1 -0
  138. package/dist/sdk/chunk-VW2GBXQT.mjs +606 -0
  139. package/dist/sdk/chunk-VW2GBXQT.mjs.map +1 -0
  140. package/dist/sdk/{config-RQQPMLRD.mjs → config-5AUYQFHE.mjs} +2 -2
  141. package/dist/sdk/config-6CUVEH7H.mjs +16 -0
  142. package/dist/sdk/config-6CUVEH7H.mjs.map +1 -0
  143. package/dist/sdk/{github-frontend-6Q4BISZX.mjs → github-frontend-BZ4N3BFZ.mjs} +7 -3
  144. package/dist/sdk/github-frontend-BZ4N3BFZ.mjs.map +1 -0
  145. package/dist/sdk/host-4MT3EW2I.mjs +52 -0
  146. package/dist/sdk/{host-P5NQICP7.mjs → host-NYWXLIFC.mjs} +2 -2
  147. package/dist/sdk/host-NYWXLIFC.mjs.map +1 -0
  148. package/dist/sdk/{routing-DEY2AIXM.mjs → routing-6R42GXUO.mjs} +2 -2
  149. package/dist/sdk/routing-6R42GXUO.mjs.map +1 -0
  150. package/dist/sdk/routing-7FXPULTO.mjs +24 -0
  151. package/dist/sdk/routing-7FXPULTO.mjs.map +1 -0
  152. package/dist/sdk/sdk.d.mts +3 -1
  153. package/dist/sdk/sdk.d.ts +3 -1
  154. package/dist/sdk/sdk.js +12163 -11204
  155. package/dist/sdk/sdk.js.map +1 -1
  156. package/dist/sdk/sdk.mjs +14 -10
  157. package/dist/sdk/sdk.mjs.map +1 -1
  158. package/dist/sdk/slack-frontend-JUT3TYVC.mjs +821 -0
  159. package/dist/sdk/slack-frontend-JUT3TYVC.mjs.map +1 -0
  160. package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs +28 -0
  161. package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs.map +1 -0
  162. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs +28 -0
  163. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs.map +1 -0
  164. package/dist/sdk/workflow-registry-KFWSDSLM.mjs +12 -0
  165. package/dist/sdk/workflow-registry-KFWSDSLM.mjs.map +1 -0
  166. package/dist/slack/socket-runner.d.ts +2 -0
  167. package/dist/slack/socket-runner.d.ts.map +1 -1
  168. package/dist/state-machine/context/workflow-inputs.d.ts +20 -0
  169. package/dist/state-machine/context/workflow-inputs.d.ts.map +1 -0
  170. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  171. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
  172. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
  173. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  174. package/dist/state-machine/states/routing.d.ts +2 -1
  175. package/dist/state-machine/states/routing.d.ts.map +1 -1
  176. package/dist/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
  177. package/dist/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
  178. package/dist/types/config.d.ts +3 -1
  179. package/dist/types/config.d.ts.map +1 -1
  180. package/dist/utils/human-id.d.ts +12 -0
  181. package/dist/utils/human-id.d.ts.map +1 -0
  182. package/dist/utils/worktree-manager.d.ts +3 -0
  183. package/dist/utils/worktree-manager.d.ts.map +1 -1
  184. package/dist/workflow-executor.d.ts.map +1 -1
  185. package/dist/workflow-registry.d.ts +1 -0
  186. package/dist/workflow-registry.d.ts.map +1 -1
  187. package/package.json +2 -2
  188. package/dist/sdk/chunk-BHZ4CKUS.mjs.map +0 -1
  189. package/dist/sdk/chunk-PVITVJ6J.mjs.map +0 -1
  190. package/dist/sdk/chunk-YLQ4UN62.mjs.map +0 -1
  191. package/dist/sdk/github-frontend-6Q4BISZX.mjs.map +0 -1
  192. /package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs.map → check-provider-registry-3KI5RKXT.mjs.map} +0 -0
  193. /package/dist/sdk/{config-RQQPMLRD.mjs.map → check-provider-registry-IYILYY35.mjs.map} +0 -0
  194. /package/dist/sdk/{routing-DEY2AIXM.mjs.map → config-5AUYQFHE.mjs.map} +0 -0
  195. /package/dist/sdk/{host-P5NQICP7.mjs.map → host-4MT3EW2I.mjs.map} +0 -0
@@ -0,0 +1,696 @@
1
+ # Noop Provider
2
+
3
+ The `noop` (no-operation) provider is a utility provider that does not perform any analysis or execution. It is designed for workflow orchestration, flow control, and dependency coordination.
4
+
5
+ ## Overview
6
+
7
+ The noop provider serves as a structural element in workflows where you need:
8
+
9
+ - **Command orchestration**: Trigger multiple checks through dependencies without performing analysis
10
+ - **Flow control hubs**: Create synchronization points in complex workflows
11
+ - **Conditional routing**: Make routing decisions based on upstream outputs
12
+ - **Output aggregation**: Wait for multiple parallel checks to complete before continuing
13
+ - **Quality gates**: Validate workflow state and fail conditionally
14
+
15
+ Since noop checks always succeed (unless `fail_if` is specified), they are ideal for control flow without side effects.
16
+
17
+ ## Configuration
18
+
19
+ ### Basic Usage
20
+
21
+ ```yaml
22
+ steps:
23
+ sync-point:
24
+ type: noop
25
+ depends_on: [check-a, check-b, check-c]
26
+ ```
27
+
28
+ ### Full Configuration Options
29
+
30
+ ```yaml
31
+ steps:
32
+ orchestration-hub:
33
+ type: noop
34
+
35
+ # Standard check options
36
+ depends_on: [upstream-check-1, upstream-check-2]
37
+ on: [pr_opened, pr_updated]
38
+ if: "conditions.are_met"
39
+ group: orchestration
40
+ tags: ["workflow", "sync"]
41
+
42
+ # Conditional failure
43
+ fail_if: |
44
+ // JavaScript expression returning boolean
45
+ return outputs['upstream-check'].failed === true;
46
+
47
+ # Lifecycle hooks for routing
48
+ on_success:
49
+ run: [next-step-1, next-step-2]
50
+ goto: previous-step
51
+ goto_event: pr_updated
52
+ goto_js: |
53
+ return outputs.history['sync-point'].length === 1 ? 'start' : null;
54
+ transitions:
55
+ - when: "outputs['score'].value >= 90"
56
+ to: fast-path
57
+ - when: "true"
58
+ to: standard-path
59
+
60
+ on_fail:
61
+ run: [error-handler]
62
+ retry:
63
+ max: 2
64
+ backoff:
65
+ mode: exponential
66
+ delay_ms: 1000
67
+ ```
68
+
69
+ ### Supported Configuration Keys
70
+
71
+ | Key | Type | Description |
72
+ |-----|------|-------------|
73
+ | `type` | string | Must be `"noop"` |
74
+ | `command` | string | Optional command trigger (e.g., `/review`) |
75
+ | `depends_on` | array | Steps that must complete before this runs |
76
+ | `on` | array | Events that trigger this check |
77
+ | `if` | string | Conditional expression for execution |
78
+ | `fail_if` | string | JavaScript expression that causes failure when true |
79
+ | `group` | string | Group for output organization |
80
+ | `tags` | array | Tags for filtering and categorization |
81
+ | `on_success` | object | Routing actions when check succeeds |
82
+ | `on_fail` | object | Routing actions when check fails |
83
+
84
+ ## Use Cases
85
+
86
+ ### 1. Flow Control Hub
87
+
88
+ Create a synchronization point that waits for multiple parallel checks to complete:
89
+
90
+ ```yaml
91
+ steps:
92
+ # Parallel checks
93
+ security-scan:
94
+ type: ai
95
+ prompt: Scan for security issues
96
+
97
+ performance-check:
98
+ type: ai
99
+ prompt: Analyze performance
100
+
101
+ style-review:
102
+ type: ai
103
+ prompt: Check code style
104
+
105
+ # Synchronization point - waits for all parallel checks
106
+ all-checks-complete:
107
+ type: noop
108
+ depends_on: [security-scan, performance-check, style-review]
109
+
110
+ # Continues after all checks complete
111
+ generate-summary:
112
+ type: ai
113
+ depends_on: [all-checks-complete]
114
+ prompt: |
115
+ Summarize findings from:
116
+ - Security: {{ outputs['security-scan'] | json }}
117
+ - Performance: {{ outputs['performance-check'] | json }}
118
+ - Style: {{ outputs['style-review'] | json }}
119
+ ```
120
+
121
+ ### 2. Conditional Routing
122
+
123
+ Use noop with `on_success.transitions` for declarative routing decisions:
124
+
125
+ ```yaml
126
+ steps:
127
+ analyze-pr:
128
+ type: ai
129
+ prompt: Analyze this PR and provide a risk score (0-100)
130
+ transform_js: "JSON.parse(output)"
131
+
132
+ route-by-risk:
133
+ type: noop
134
+ depends_on: [analyze-pr]
135
+ on_success:
136
+ transitions:
137
+ - when: "outputs['analyze-pr'].risk_score >= 80"
138
+ to: detailed-security-review
139
+ - when: "outputs['analyze-pr'].risk_score >= 50"
140
+ to: standard-review
141
+ - when: "true"
142
+ to: quick-approve
143
+
144
+ detailed-security-review:
145
+ type: ai
146
+ prompt: Perform detailed security analysis
147
+ on: [] # Only triggered via routing
148
+
149
+ standard-review:
150
+ type: ai
151
+ prompt: Perform standard code review
152
+ on: []
153
+
154
+ quick-approve:
155
+ type: command
156
+ exec: echo "Low risk - approved"
157
+ on: []
158
+ ```
159
+
160
+ ### 3. Output Aggregation
161
+
162
+ Collect results from multiple sources before proceeding:
163
+
164
+ ```yaml
165
+ steps:
166
+ # Multiple analysis checks run in parallel
167
+ lint-js:
168
+ type: command
169
+ exec: eslint src/ --format json
170
+ transform_js: JSON.parse(output)
171
+
172
+ lint-css:
173
+ type: command
174
+ exec: stylelint "**/*.css" --formatter json
175
+ transform_js: JSON.parse(output)
176
+
177
+ type-check:
178
+ type: command
179
+ exec: tsc --noEmit --pretty false
180
+
181
+ # Aggregation point
182
+ aggregate-lint-results:
183
+ type: noop
184
+ depends_on: [lint-js, lint-css, type-check]
185
+
186
+ # Access all results through outputs
187
+ report-issues:
188
+ type: log
189
+ depends_on: [aggregate-lint-results]
190
+ message: |
191
+ ## Lint Results
192
+
193
+ **JavaScript Issues:** {{ outputs['lint-js'] | size }}
194
+ **CSS Issues:** {{ outputs['lint-css'] | size }}
195
+ **Type Errors:** {{ outputs['type-check'].exitCode == 0 | default: "None" }}
196
+ ```
197
+
198
+ ### 4. Workflow Synchronization Points
199
+
200
+ Create named synchronization points for complex multi-stage workflows:
201
+
202
+ ```yaml
203
+ steps:
204
+ # Stage 1: Setup
205
+ checkout:
206
+ type: git-checkout
207
+ ref: "{{ pr.head }}"
208
+
209
+ install-deps:
210
+ type: command
211
+ depends_on: [checkout]
212
+ exec: npm ci
213
+ working_directory: "{{ outputs.checkout.path }}"
214
+
215
+ stage-1-complete:
216
+ type: noop
217
+ depends_on: [install-deps]
218
+ tags: ["stage", "setup"]
219
+
220
+ # Stage 2: Build & Test (parallel)
221
+ build:
222
+ type: command
223
+ depends_on: [stage-1-complete]
224
+ exec: npm run build
225
+
226
+ test-unit:
227
+ type: command
228
+ depends_on: [stage-1-complete]
229
+ exec: npm test
230
+
231
+ test-integration:
232
+ type: command
233
+ depends_on: [stage-1-complete]
234
+ exec: npm run test:integration
235
+
236
+ stage-2-complete:
237
+ type: noop
238
+ depends_on: [build, test-unit, test-integration]
239
+ tags: ["stage", "build-test"]
240
+
241
+ # Stage 3: Deploy
242
+ deploy:
243
+ type: command
244
+ depends_on: [stage-2-complete]
245
+ exec: npm run deploy
246
+ ```
247
+
248
+ ### 5. Quality Gates with fail_if
249
+
250
+ Use noop to enforce quality gates by failing based on upstream results:
251
+
252
+ ```yaml
253
+ steps:
254
+ run-tests:
255
+ type: command
256
+ exec: npm test -- --coverage --json
257
+ transform_js: JSON.parse(output)
258
+
259
+ check-coverage:
260
+ type: script
261
+ depends_on: [run-tests]
262
+ content: |
263
+ const coverage = outputs['run-tests'].coveragePercentage;
264
+ return { coverage, threshold: 80 };
265
+
266
+ coverage-gate:
267
+ type: noop
268
+ depends_on: [check-coverage]
269
+ fail_if: |
270
+ const result = outputs['check-coverage'];
271
+ return result.coverage < result.threshold;
272
+
273
+ # Only runs if coverage gate passes
274
+ deploy-preview:
275
+ type: command
276
+ depends_on: [coverage-gate]
277
+ exec: npm run deploy:preview
278
+ ```
279
+
280
+ ### 6. Retry Logic with Memory
281
+
282
+ Combine noop with memory to implement custom retry logic:
283
+
284
+ ```yaml
285
+ steps:
286
+ init-retry:
287
+ type: memory
288
+ operation: set
289
+ key: retry_count
290
+ value: 0
291
+
292
+ flaky-operation:
293
+ type: command
294
+ depends_on: [init-retry]
295
+ exec: ./flaky-script.sh
296
+ on_fail:
297
+ run: [increment-retry, check-retry-limit]
298
+
299
+ increment-retry:
300
+ type: memory
301
+ operation: set
302
+ key: retry_count
303
+ value_js: "memory.get('retry_count') + 1"
304
+
305
+ check-retry-limit:
306
+ type: noop
307
+ depends_on: [increment-retry]
308
+ on_success:
309
+ goto_js: |
310
+ const retries = memory.get('retry_count');
311
+ log('Retry attempt:', retries);
312
+ return retries < 3 ? 'flaky-operation' : null;
313
+ ```
314
+
315
+ ### 7. Command Orchestration
316
+
317
+ Use noop to create command-triggered workflows:
318
+
319
+ ```yaml
320
+ steps:
321
+ # Triggered by /review comment
322
+ review-command:
323
+ type: noop
324
+ command: /review
325
+ on: [issue_comment]
326
+ on_success:
327
+ run: [security-check, performance-check, style-check]
328
+
329
+ security-check:
330
+ type: ai
331
+ prompt: Security analysis
332
+ on: [] # Only via routing
333
+
334
+ performance-check:
335
+ type: ai
336
+ prompt: Performance analysis
337
+ on: []
338
+
339
+ style-check:
340
+ type: ai
341
+ prompt: Style analysis
342
+ on: []
343
+ ```
344
+
345
+ ### 8. Error Collection and Final Validation
346
+
347
+ Use noop to validate collected errors at the end of a workflow:
348
+
349
+ ```yaml
350
+ steps:
351
+ init-errors:
352
+ type: memory
353
+ operation: set
354
+ key: errors
355
+ value: []
356
+
357
+ lint:
358
+ type: command
359
+ depends_on: [init-errors]
360
+ exec: npm run lint
361
+ on_fail:
362
+ run: [collect-lint-error]
363
+
364
+ collect-lint-error:
365
+ type: memory
366
+ operation: append
367
+ key: errors
368
+ value:
369
+ check: lint
370
+ message: "{{ outputs['lint'].stderr }}"
371
+
372
+ test:
373
+ type: command
374
+ depends_on: [init-errors]
375
+ exec: npm test
376
+ on_fail:
377
+ run: [collect-test-error]
378
+
379
+ collect-test-error:
380
+ type: memory
381
+ operation: append
382
+ key: errors
383
+ value:
384
+ check: test
385
+ message: "{{ outputs['test'].stderr }}"
386
+
387
+ # Final validation - fail if any errors collected
388
+ validate-no-errors:
389
+ type: noop
390
+ depends_on: [lint, test]
391
+ fail_if: |
392
+ const errors = memory.get('errors') || [];
393
+ return errors.length > 0;
394
+ ```
395
+
396
+ ## Integration with Routing
397
+
398
+ The noop provider integrates seamlessly with Visor's routing system. Since it always succeeds (unless `fail_if` triggers), it's ideal for making routing decisions.
399
+
400
+ ### Using goto for Re-execution
401
+
402
+ ```yaml
403
+ steps:
404
+ generate:
405
+ type: ai
406
+ prompt: Generate code
407
+
408
+ validate:
409
+ type: ai
410
+ depends_on: [generate]
411
+ prompt: Validate the generated code
412
+ transform_js: JSON.parse(output)
413
+
414
+ decide-retry:
415
+ type: noop
416
+ depends_on: [validate]
417
+ on_success:
418
+ goto_js: |
419
+ const result = outputs['validate'];
420
+ const attempts = outputs.history['generate'].length;
421
+
422
+ // Retry up to 3 times if validation fails
423
+ if (!result.valid && attempts < 3) {
424
+ return 'generate';
425
+ }
426
+ return null;
427
+ ```
428
+
429
+ ### Using transitions for Declarative Routing
430
+
431
+ ```yaml
432
+ steps:
433
+ score-pr:
434
+ type: ai
435
+ prompt: Score this PR from 0-100
436
+ transform_js: "({ score: parseInt(output) })"
437
+
438
+ route-by-score:
439
+ type: noop
440
+ depends_on: [score-pr]
441
+ on_success:
442
+ transitions:
443
+ - when: "outputs['score-pr'].score >= 90"
444
+ to: auto-approve
445
+ - when: "outputs['score-pr'].score >= 70"
446
+ to: request-review
447
+ - when: "outputs['score-pr'].score >= 50"
448
+ to: request-changes
449
+ - when: "true"
450
+ to: block-merge
451
+ ```
452
+
453
+ ### Using run for Triggering Multiple Steps
454
+
455
+ ```yaml
456
+ steps:
457
+ analyze:
458
+ type: ai
459
+ prompt: Analyze code and categorize issues
460
+ transform_js: JSON.parse(output)
461
+
462
+ dispatch-handlers:
463
+ type: noop
464
+ depends_on: [analyze]
465
+ on_success:
466
+ run_js: |
467
+ const analysis = outputs['analyze'];
468
+ const handlers = [];
469
+
470
+ if (analysis.hasSecurityIssues) handlers.push('handle-security');
471
+ if (analysis.hasPerformanceIssues) handlers.push('handle-performance');
472
+ if (analysis.hasStyleIssues) handlers.push('handle-style');
473
+
474
+ return handlers;
475
+
476
+ handle-security:
477
+ type: ai
478
+ prompt: Detail security issues
479
+ on: []
480
+
481
+ handle-performance:
482
+ type: ai
483
+ prompt: Detail performance issues
484
+ on: []
485
+
486
+ handle-style:
487
+ type: ai
488
+ prompt: Detail style issues
489
+ on: []
490
+ ```
491
+
492
+ ## Integration with Lifecycle Hooks
493
+
494
+ Noop checks support all lifecycle hooks:
495
+
496
+ ### on_init
497
+
498
+ ```yaml
499
+ steps:
500
+ orchestrator:
501
+ type: noop
502
+ on_init:
503
+ run:
504
+ - tool: fetch-config
505
+ as: config
506
+ on_success:
507
+ run_js: |
508
+ const config = outputs['config'];
509
+ return config.enabledChecks || [];
510
+ ```
511
+
512
+ ### on_success / on_fail
513
+
514
+ ```yaml
515
+ steps:
516
+ quality-gate:
517
+ type: noop
518
+ depends_on: [all-checks]
519
+ fail_if: "outputs['all-checks'].failed"
520
+
521
+ on_success:
522
+ run: [notify-success, deploy]
523
+
524
+ on_fail:
525
+ run: [notify-failure]
526
+ goto: retry-point
527
+ ```
528
+
529
+ ## Best Practices
530
+
531
+ ### 1. Use Descriptive Names
532
+
533
+ Name noop checks to describe their purpose in the workflow:
534
+
535
+ ```yaml
536
+ steps:
537
+ # Good - describes the purpose
538
+ all-validations-complete:
539
+ type: noop
540
+
541
+ quality-gate-passed:
542
+ type: noop
543
+
544
+ # Avoid generic names
545
+ sync:
546
+ type: noop
547
+ ```
548
+
549
+ ### 2. Use Tags for Organization
550
+
551
+ Tag noop checks for filtering and documentation:
552
+
553
+ ```yaml
554
+ steps:
555
+ stage-1-complete:
556
+ type: noop
557
+ tags: ["stage", "setup", "sync-point"]
558
+
559
+ stage-2-complete:
560
+ type: noop
561
+ tags: ["stage", "build", "sync-point"]
562
+ ```
563
+
564
+ ### 3. Document Complex Routing Logic
565
+
566
+ Add comments explaining routing decisions:
567
+
568
+ ```yaml
569
+ steps:
570
+ route-decision:
571
+ type: noop
572
+ depends_on: [analysis]
573
+ on_success:
574
+ # Route based on risk level:
575
+ # - High risk (>=80): Full security review
576
+ # - Medium risk (50-79): Standard review
577
+ # - Low risk (<50): Auto-approve
578
+ transitions:
579
+ - when: "outputs['analysis'].risk >= 80"
580
+ to: security-review
581
+ - when: "outputs['analysis'].risk >= 50"
582
+ to: standard-review
583
+ - when: "true"
584
+ to: auto-approve
585
+ ```
586
+
587
+ ### 4. Keep fail_if Expressions Simple
588
+
589
+ Complex validation logic should be in a script check:
590
+
591
+ ```yaml
592
+ steps:
593
+ # Good - simple fail_if
594
+ gate:
595
+ type: noop
596
+ fail_if: "outputs['validate'].passed === false"
597
+
598
+ # Better for complex logic - use script
599
+ complex-validation:
600
+ type: script
601
+ content: |
602
+ const results = outputs['checks'];
603
+ const hasBlockers = results.some(r => r.severity === 'blocker');
604
+ const failCount = results.filter(r => !r.passed).length;
605
+ return { shouldFail: hasBlockers || failCount > 5 };
606
+
607
+ gate:
608
+ type: noop
609
+ depends_on: [complex-validation]
610
+ fail_if: "outputs['complex-validation'].shouldFail"
611
+ ```
612
+
613
+ ### 5. Use noop for Aggregation Points in Workflows
614
+
615
+ When creating reusable workflows, use noop to define clear aggregation points:
616
+
617
+ ```yaml
618
+ # In workflow file
619
+ steps:
620
+ check-1:
621
+ type: ai
622
+ prompt: First check
623
+
624
+ check-2:
625
+ type: ai
626
+ prompt: Second check
627
+
628
+ check-3:
629
+ type: ai
630
+ prompt: Third check
631
+
632
+ # Clear aggregation point for workflow consumers
633
+ aggregate-results:
634
+ type: noop
635
+ depends_on: [check-1, check-2, check-3]
636
+ # Workflow outputs reference this point
637
+
638
+ outputs:
639
+ - name: all_complete
640
+ value_js: "true" # Signals all checks completed
641
+ ```
642
+
643
+ ## Troubleshooting
644
+
645
+ ### Problem: Noop Check Not Running
646
+
647
+ **Solution**: Check that dependencies are met and event triggers match:
648
+
649
+ ```yaml
650
+ steps:
651
+ my-noop:
652
+ type: noop
653
+ depends_on: [upstream] # Ensure upstream exists and succeeds
654
+ on: [pr_opened] # Ensure event matches
655
+ if: "true" # Check conditional
656
+ ```
657
+
658
+ ### Problem: fail_if Not Triggering
659
+
660
+ **Solution**: Verify the JavaScript expression and output access:
661
+
662
+ ```yaml
663
+ steps:
664
+ debug-gate:
665
+ type: noop
666
+ fail_if: |
667
+ // Add logging to debug
668
+ log('Outputs:', JSON.stringify(outputs['check']));
669
+ return outputs['check']?.failed === true;
670
+ ```
671
+
672
+ ### Problem: Routing Not Working
673
+
674
+ **Solution**: Check that target steps have `on: []` to be routing-only:
675
+
676
+ ```yaml
677
+ steps:
678
+ router:
679
+ type: noop
680
+ on_success:
681
+ run: [target-step]
682
+
683
+ target-step:
684
+ type: command
685
+ exec: echo "routed"
686
+ on: [] # Required for routing-only steps
687
+ ```
688
+
689
+ ## Related Documentation
690
+
691
+ - [Lifecycle Hooks](../lifecycle-hooks.md) - on_init, on_success, on_fail, on_finish hooks
692
+ - [Failure Routing](../failure-routing.md) - Routing and retry configuration
693
+ - [Workflows](../workflows.md) - Creating reusable workflows
694
+ - [Memory](../memory.md) - Persistent state across checks
695
+ - [Dependencies](../dependencies.md) - Dependency configuration
696
+ - [Configuration](../configuration.md) - Full configuration reference