@exaudeus/workrail 3.4.0 → 3.6.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.
- package/dist/application/services/validation-engine.js +50 -0
- package/dist/config/feature-flags.js +8 -0
- package/dist/engine/engine-factory.js +4 -2
- package/dist/manifest.json +100 -52
- package/dist/mcp/handler-factory.js +21 -4
- package/dist/mcp/handlers/v2-execution/continue-rehydrate.d.ts +6 -1
- package/dist/mcp/handlers/v2-execution/continue-rehydrate.js +22 -4
- package/dist/mcp/handlers/v2-execution/index.d.ts +6 -1
- package/dist/mcp/handlers/v2-execution/index.js +13 -3
- package/dist/mcp/handlers/v2-execution/start.d.ts +9 -1
- package/dist/mcp/handlers/v2-execution/start.js +74 -36
- package/dist/mcp/handlers/v2-execution-helpers.d.ts +2 -0
- package/dist/mcp/handlers/v2-execution-helpers.js +2 -0
- package/dist/mcp/handlers/v2-reference-resolver.d.ts +14 -0
- package/dist/mcp/handlers/v2-reference-resolver.js +112 -0
- package/dist/mcp/handlers/v2-resolve-refs-envelope.d.ts +5 -0
- package/dist/mcp/handlers/v2-resolve-refs-envelope.js +17 -0
- package/dist/mcp/handlers/v2-workflow.js +2 -0
- package/dist/mcp/output-schemas.d.ts +38 -0
- package/dist/mcp/output-schemas.js +8 -0
- package/dist/mcp/render-envelope.d.ts +21 -0
- package/dist/mcp/render-envelope.js +59 -0
- package/dist/mcp/response-supplements.d.ts +17 -0
- package/dist/mcp/response-supplements.js +58 -0
- package/dist/mcp/step-content-envelope.d.ts +32 -0
- package/dist/mcp/step-content-envelope.js +13 -0
- package/dist/mcp/v2-response-formatter.d.ts +11 -1
- package/dist/mcp/v2-response-formatter.js +168 -1
- package/dist/mcp/workflow-protocol-contracts.js +9 -7
- package/dist/types/workflow-definition.d.ts +16 -0
- package/dist/types/workflow-definition.js +1 -0
- package/dist/utils/condition-evaluator.d.ts +1 -0
- package/dist/utils/condition-evaluator.js +7 -0
- package/dist/v2/durable-core/domain/context-template-resolver.d.ts +2 -0
- package/dist/v2/durable-core/domain/context-template-resolver.js +26 -0
- package/dist/v2/durable-core/domain/prompt-renderer.d.ts +2 -0
- package/dist/v2/durable-core/domain/prompt-renderer.js +93 -15
- package/dist/v2/durable-core/schemas/compiled-workflow/index.d.ts +256 -0
- package/dist/v2/durable-core/schemas/compiled-workflow/index.js +30 -0
- package/package.json +4 -1
- package/spec/authoring-spec.json +1373 -0
- package/spec/authoring-spec.provenance.json +77 -0
- package/spec/authoring-spec.schema.json +370 -0
- package/spec/workflow.schema.json +88 -2
- package/workflows/coding-task-workflow-agentic.lean.v2.json +132 -30
- package/workflows/cross-platform-code-conversion.v2.json +199 -0
- package/workflows/routines/parallel-work-partitioning.json +43 -0
- package/workflows/workflow-for-workflows.json +27 -1
- package/workflows/workflow-for-workflows.v2.json +186 -0
|
@@ -0,0 +1,1373 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./authoring-spec.schema.json",
|
|
3
|
+
"version": 3,
|
|
4
|
+
"title": "WorkRail Authoring Rules",
|
|
5
|
+
"purpose": "Canonical current rules for authoring good WorkRail workflows. workflow.schema.json remains the source of truth for legal structure.",
|
|
6
|
+
"lastReviewed": "2026-03-21",
|
|
7
|
+
"principles": [
|
|
8
|
+
"Schema defines what is valid. These rules define what is good.",
|
|
9
|
+
"Prefer current authoring rules over design rationale or historical notes.",
|
|
10
|
+
"Keep prompts user-voiced without losing explicit protocol requirements.",
|
|
11
|
+
"Keep boundary-owned response supplements separate from workflow-authored prompt text."
|
|
12
|
+
],
|
|
13
|
+
"consumedBy": [
|
|
14
|
+
"docs",
|
|
15
|
+
"tooling",
|
|
16
|
+
"workflow-for-workflows",
|
|
17
|
+
"future-linting"
|
|
18
|
+
],
|
|
19
|
+
"changeProtocol": [
|
|
20
|
+
"When a workflow feature lands or changes, update the schema and runtime first.",
|
|
21
|
+
"Then update this authoring spec so guidance matches the shipped behavior.",
|
|
22
|
+
"Then regenerate or update human-facing docs and examples derived from this spec.",
|
|
23
|
+
"Do not leave authoring guidance behind the runtime."
|
|
24
|
+
],
|
|
25
|
+
"ruleModel": {
|
|
26
|
+
"levels": [
|
|
27
|
+
"required",
|
|
28
|
+
"recommended",
|
|
29
|
+
"discouraged"
|
|
30
|
+
],
|
|
31
|
+
"statuses": [
|
|
32
|
+
"active",
|
|
33
|
+
"experimental",
|
|
34
|
+
"planned",
|
|
35
|
+
"deprecated"
|
|
36
|
+
],
|
|
37
|
+
"enforcementModes": [
|
|
38
|
+
"runtime",
|
|
39
|
+
"validator",
|
|
40
|
+
"ci",
|
|
41
|
+
"advisory",
|
|
42
|
+
"planned"
|
|
43
|
+
],
|
|
44
|
+
"scopeStyle": "Use small, stable scope strings tied to obvious workflow surfaces."
|
|
45
|
+
},
|
|
46
|
+
"scopeCatalog": [
|
|
47
|
+
{
|
|
48
|
+
"id": "workflow.definition",
|
|
49
|
+
"description": "Whole-workflow authored shape"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "workflow.description",
|
|
53
|
+
"description": "Top-level workflow description text"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "workflow.meta-guidance",
|
|
57
|
+
"description": "Workflow-level meta guidance"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "workflow.extension-points",
|
|
61
|
+
"description": "Workflow-level extension point declarations and binding slots"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "workflow.features",
|
|
65
|
+
"description": "Compiler feature declarations (closed-set middleware injected at compile time)"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "step.prompt",
|
|
69
|
+
"description": "Primary step prompt text"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "step.prompt-fragment",
|
|
73
|
+
"description": "Conditional prompt fragment text"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "step.prompt-blocks",
|
|
77
|
+
"description": "Structured prompt blocks or shared prompt composition structures"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "step.output-requirements",
|
|
81
|
+
"description": "Explicit artifact or output requirements in a step"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "step.context-capture",
|
|
85
|
+
"description": "Explicit context values a step must capture"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "step.self-audit",
|
|
89
|
+
"description": "A step asking the agent to assess its own understanding or confidence"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "step.delegation-checkpoint",
|
|
93
|
+
"description": "A step that explicitly fans out to subagents and later synthesizes"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "step.confirmation",
|
|
97
|
+
"description": "A step that deliberately pauses for human confirmation"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "loop.step",
|
|
101
|
+
"description": "The loop construct itself"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "loop.pre-check",
|
|
105
|
+
"description": "Checks done before entering a loop or another pass"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "loop.decision.prompt",
|
|
109
|
+
"description": "Prompt that decides whether a loop continues or stops"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": "loop.decision",
|
|
113
|
+
"description": "The loop decision checkpoint as a whole"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "loop.decision.output-example",
|
|
117
|
+
"description": "Example artifact or output shape shown in a loop decision step"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "workflow.rigor-policy",
|
|
121
|
+
"description": "Rules that differ by QUICK, STANDARD, or THOROUGH rigor"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "prompt.composition",
|
|
125
|
+
"description": "Prompt assembly strategy including fragments, templates, and shared structure"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": "prompt.templates",
|
|
129
|
+
"description": "Context variable templates and prompt-time substitution"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "response.supplement",
|
|
133
|
+
"description": "Boundary-owned supplemental instructions delivered alongside a workflow step"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "synthesis.design",
|
|
137
|
+
"description": "Design synthesis after delegated or external review"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "synthesis.plan-audit",
|
|
141
|
+
"description": "Plan-audit synthesis after delegated review"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"id": "synthesis.slice-verification",
|
|
145
|
+
"description": "Slice verification synthesis after delegated review"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "synthesis.final-verification",
|
|
149
|
+
"description": "Final verification synthesis after delegated review"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"id": "synthesis.claim-adoption",
|
|
153
|
+
"description": "Rules for adopting or rejecting subagent claims"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"id": "workflow.authoring",
|
|
157
|
+
"description": "General workflow authoring behavior"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "tooling.workflow-authoring",
|
|
161
|
+
"description": "Authoring helpers, generation tools, or workflow-for-workflows logic"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"id": "documentation.authoring",
|
|
165
|
+
"description": "Human-facing authoring documentation"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"id": "documentation.validation",
|
|
169
|
+
"description": "Validation-focused documentation"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "validator.implementation",
|
|
173
|
+
"description": "Workflow validator implementation and behavior"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"id": "ci.validation",
|
|
177
|
+
"description": "CI validation surfaces for workflows"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "artifact.plan",
|
|
181
|
+
"description": "Implementation-planning artifacts"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "artifact.spec",
|
|
185
|
+
"description": "Behavior/specification artifacts"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "artifact.verification",
|
|
189
|
+
"description": "Verification or handoff artifacts"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "delegation.context-packet",
|
|
193
|
+
"description": "Structured context passed to subagents"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "delegation.result-envelope",
|
|
197
|
+
"description": "Structured result shape returned by subagents"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"id": "legacy.patterns",
|
|
201
|
+
"description": "Older authoring patterns that should now be discouraged or avoided"
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
"topics": [
|
|
205
|
+
{
|
|
206
|
+
"id": "structure",
|
|
207
|
+
"title": "Workflow structure",
|
|
208
|
+
"rules": [
|
|
209
|
+
{
|
|
210
|
+
"id": "schema-is-legal-truth",
|
|
211
|
+
"status": "active",
|
|
212
|
+
"level": "required",
|
|
213
|
+
"scope": [
|
|
214
|
+
"workflow.definition",
|
|
215
|
+
"documentation.authoring",
|
|
216
|
+
"tooling.workflow-authoring"
|
|
217
|
+
],
|
|
218
|
+
"rule": "Treat workflow.schema.json as the source of truth for legal structure.",
|
|
219
|
+
"why": "A second schema will drift.",
|
|
220
|
+
"enforcement": [
|
|
221
|
+
"advisory"
|
|
222
|
+
],
|
|
223
|
+
"sourceRefs": [
|
|
224
|
+
{
|
|
225
|
+
"kind": "schema",
|
|
226
|
+
"path": "spec/workflow.schema.json",
|
|
227
|
+
"note": "Legal workflow structure lives here."
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
"checks": [
|
|
231
|
+
"Do not restate field legality unless the point is authoring quality rather than legality.",
|
|
232
|
+
"If this spec mentions a field shape, it should be guidance, not a competing schema."
|
|
233
|
+
],
|
|
234
|
+
"antiPatterns": [
|
|
235
|
+
"Encoding field legality in multiple docs or specs",
|
|
236
|
+
"Treating prose docs as authoritative over schema"
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "runtime-behavior-beats-prose",
|
|
241
|
+
"status": "active",
|
|
242
|
+
"level": "required",
|
|
243
|
+
"scope": [
|
|
244
|
+
"documentation.authoring",
|
|
245
|
+
"documentation.validation",
|
|
246
|
+
"tooling.workflow-authoring"
|
|
247
|
+
],
|
|
248
|
+
"rule": "When docs and runtime behavior disagree, update the docs to match runtime or fix runtime immediately.",
|
|
249
|
+
"why": "Authors need one trustworthy mental model.",
|
|
250
|
+
"enforcement": [
|
|
251
|
+
"advisory"
|
|
252
|
+
],
|
|
253
|
+
"sourceRefs": [
|
|
254
|
+
{
|
|
255
|
+
"kind": "runtime",
|
|
256
|
+
"path": "src/application/services/validation-engine.ts",
|
|
257
|
+
"note": "Structural authoring invariants enforced by runtime validation."
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"kind": "runtime",
|
|
261
|
+
"path": "src/v2/durable-core/domain/prompt-renderer.ts",
|
|
262
|
+
"note": "Prompt rendering and runtime prompt behavior."
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
"checks": [
|
|
266
|
+
"Compare guidance against validator and renderer behavior before declaring a rule canonical.",
|
|
267
|
+
"Do not leave known mismatches unresolved."
|
|
268
|
+
],
|
|
269
|
+
"antiPatterns": [
|
|
270
|
+
"Documented behavior that runtime no longer supports",
|
|
271
|
+
"Validator behavior that contradicts authoring guidance without a tracked fix"
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "authoring-journey",
|
|
278
|
+
"title": "Authoring journey",
|
|
279
|
+
"rules": [
|
|
280
|
+
{
|
|
281
|
+
"id": "start-from-real-sources",
|
|
282
|
+
"status": "active",
|
|
283
|
+
"level": "required",
|
|
284
|
+
"scope": [
|
|
285
|
+
"workflow.authoring",
|
|
286
|
+
"documentation.authoring",
|
|
287
|
+
"tooling.workflow-authoring"
|
|
288
|
+
],
|
|
289
|
+
"rule": "When authoring a workflow from scratch, start from the schema, current runtime behavior, and modern example workflows before drafting prompts.",
|
|
290
|
+
"why": "Good workflow authoring starts from how WorkRail actually works, not from stale habits or isolated docs.",
|
|
291
|
+
"enforcement": [
|
|
292
|
+
"advisory"
|
|
293
|
+
],
|
|
294
|
+
"sourceRefs": [
|
|
295
|
+
{
|
|
296
|
+
"kind": "schema",
|
|
297
|
+
"path": "spec/workflow.schema.json",
|
|
298
|
+
"note": "Legal structure and supported fields."
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"kind": "runtime",
|
|
302
|
+
"path": "src/application/services/validation-engine.ts",
|
|
303
|
+
"note": "Validator-enforced authoring rules."
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"kind": "example",
|
|
307
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
308
|
+
"note": "Current modern example."
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
"checks": [
|
|
312
|
+
"Read the schema and at least one modern workflow before drafting.",
|
|
313
|
+
"Do not rely on outdated workflow patterns as the starting point."
|
|
314
|
+
],
|
|
315
|
+
"antiPatterns": [
|
|
316
|
+
"Drafting a workflow from memory without checking current schema or examples"
|
|
317
|
+
]
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"id": "validate-early-and-often",
|
|
321
|
+
"status": "active",
|
|
322
|
+
"level": "required",
|
|
323
|
+
"scope": [
|
|
324
|
+
"workflow.authoring",
|
|
325
|
+
"ci.validation",
|
|
326
|
+
"validator.implementation"
|
|
327
|
+
],
|
|
328
|
+
"rule": "Validate early while authoring, not only at the end.",
|
|
329
|
+
"why": "Small validation loops catch structural mistakes before they accumulate into major rework.",
|
|
330
|
+
"enforcement": [
|
|
331
|
+
"validator",
|
|
332
|
+
"ci",
|
|
333
|
+
"advisory"
|
|
334
|
+
],
|
|
335
|
+
"sourceRefs": [
|
|
336
|
+
{
|
|
337
|
+
"kind": "documentation",
|
|
338
|
+
"path": "docs/workflow-validation.md",
|
|
339
|
+
"note": "Validation workflow for authors."
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"kind": "validator",
|
|
343
|
+
"path": "scripts/validate-workflows-registry.ts",
|
|
344
|
+
"note": "Registry validation surface."
|
|
345
|
+
}
|
|
346
|
+
],
|
|
347
|
+
"checks": [
|
|
348
|
+
"Run real validators while drafting and after major structural changes.",
|
|
349
|
+
"Use generated docs or examples only after the spec itself validates."
|
|
350
|
+
],
|
|
351
|
+
"antiPatterns": [
|
|
352
|
+
"Only validating after a large authoring session is finished"
|
|
353
|
+
]
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"id": "author-in-phases",
|
|
357
|
+
"status": "active",
|
|
358
|
+
"level": "recommended",
|
|
359
|
+
"scope": [
|
|
360
|
+
"workflow.authoring",
|
|
361
|
+
"tooling.workflow-authoring"
|
|
362
|
+
],
|
|
363
|
+
"rule": "Author workflows in phases: define shape first, then prompts, then validation/refinement.",
|
|
364
|
+
"why": "Separating structure, prompt design, and validation makes workflows easier to reason about and revise.",
|
|
365
|
+
"enforcement": [
|
|
366
|
+
"advisory"
|
|
367
|
+
],
|
|
368
|
+
"checks": [
|
|
369
|
+
"Get step/loop structure right before polishing prompt voice.",
|
|
370
|
+
"Use validation as a dedicated pass, not just a cleanup afterthought."
|
|
371
|
+
],
|
|
372
|
+
"antiPatterns": [
|
|
373
|
+
"Polishing prompt wording before the workflow structure is stable"
|
|
374
|
+
]
|
|
375
|
+
}
|
|
376
|
+
]
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"id": "prompt-voice",
|
|
380
|
+
"title": "Prompt voice",
|
|
381
|
+
"rules": [
|
|
382
|
+
{
|
|
383
|
+
"id": "user-voiced-prompts",
|
|
384
|
+
"status": "active",
|
|
385
|
+
"level": "recommended",
|
|
386
|
+
"scope": [
|
|
387
|
+
"workflow.description",
|
|
388
|
+
"step.prompt",
|
|
389
|
+
"step.prompt-fragment"
|
|
390
|
+
],
|
|
391
|
+
"rule": "Write prompts as direct user intent rather than workflow-engine narration.",
|
|
392
|
+
"why": "Agents follow user-voiced instructions more naturally than middleware prose.",
|
|
393
|
+
"enforcement": [
|
|
394
|
+
"advisory"
|
|
395
|
+
],
|
|
396
|
+
"checks": [
|
|
397
|
+
"The opening sentence should sound like a direct ask, not system narration.",
|
|
398
|
+
"The step should still be understandable without workflow-internal jargon."
|
|
399
|
+
],
|
|
400
|
+
"antiPatterns": [
|
|
401
|
+
"Provide a loop control artifact.",
|
|
402
|
+
"Input contract: ...",
|
|
403
|
+
"Part A / Part B / Rules: ... when the structure adds ceremony rather than clarity"
|
|
404
|
+
],
|
|
405
|
+
"exampleRefs": [
|
|
406
|
+
{
|
|
407
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
408
|
+
"note": "See the sharpened user-voiced prompts in the current lean coding workflow."
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"id": "protocol-footers-stay-explicit",
|
|
414
|
+
"status": "active",
|
|
415
|
+
"level": "required",
|
|
416
|
+
"scope": [
|
|
417
|
+
"step.output-requirements",
|
|
418
|
+
"step.context-capture",
|
|
419
|
+
"loop.decision.prompt"
|
|
420
|
+
],
|
|
421
|
+
"rule": "Keep exact protocol requirements explicit when the engine needs a specific output shape, artifact, or context capture.",
|
|
422
|
+
"why": "Voice improvements must not make the workflow ambiguous or unrunnable.",
|
|
423
|
+
"enforcement": [
|
|
424
|
+
"advisory"
|
|
425
|
+
],
|
|
426
|
+
"sourceRefs": [
|
|
427
|
+
{
|
|
428
|
+
"kind": "example",
|
|
429
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
430
|
+
"note": "Uses explicit capture footers and shape-preserving loop outputs."
|
|
431
|
+
}
|
|
432
|
+
],
|
|
433
|
+
"checks": [
|
|
434
|
+
"If the step must emit a specific artifact or capture specific context, say that plainly.",
|
|
435
|
+
"Do not hide exact output requirements behind prose-only wording."
|
|
436
|
+
],
|
|
437
|
+
"antiPatterns": [
|
|
438
|
+
"Removing explicit output shape because it sounds too workflow-y",
|
|
439
|
+
"Replacing exact capture requirements with vague summary prose"
|
|
440
|
+
],
|
|
441
|
+
"exampleRefs": [
|
|
442
|
+
{
|
|
443
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
444
|
+
"note": "Uses compact Capture footers and explicit loop-control wording."
|
|
445
|
+
}
|
|
446
|
+
]
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"id": "prompt-composition",
|
|
452
|
+
"title": "Prompt composition",
|
|
453
|
+
"rules": [
|
|
454
|
+
{
|
|
455
|
+
"id": "prefer-structured-prompt-composition",
|
|
456
|
+
"status": "active",
|
|
457
|
+
"level": "recommended",
|
|
458
|
+
"scope": [
|
|
459
|
+
"prompt.composition",
|
|
460
|
+
"step.prompt",
|
|
461
|
+
"step.prompt-fragment",
|
|
462
|
+
"prompt.templates"
|
|
463
|
+
],
|
|
464
|
+
"rule": "Prefer structured prompt composition over duplicating large prompt branches inline.",
|
|
465
|
+
"why": "Shared structure is easier to maintain and easier for agents to reason about than repeated prose branches.",
|
|
466
|
+
"enforcement": [
|
|
467
|
+
"advisory"
|
|
468
|
+
],
|
|
469
|
+
"sourceRefs": [
|
|
470
|
+
{
|
|
471
|
+
"kind": "documentation",
|
|
472
|
+
"path": "docs/authoring.md",
|
|
473
|
+
"note": "Documents context templates and prompt fragments."
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"kind": "example",
|
|
477
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
478
|
+
"note": "Uses prompt fragments to slim mode-specific prompt branches."
|
|
479
|
+
}
|
|
480
|
+
],
|
|
481
|
+
"checks": [
|
|
482
|
+
"Use prompt fragments for conditional branches instead of repeating near-identical prompt blocks.",
|
|
483
|
+
"Use context templates for small runtime substitutions, not for complex logic.",
|
|
484
|
+
"Keep the base prompt readable without forcing readers to mentally diff three branches."
|
|
485
|
+
],
|
|
486
|
+
"antiPatterns": [
|
|
487
|
+
"Copy-pasting QUICK, STANDARD, and THOROUGH branches inline when only a few lines differ",
|
|
488
|
+
"Encoding runtime logic in prose when promptFragments or templates are the right mechanism"
|
|
489
|
+
],
|
|
490
|
+
"exampleRefs": [
|
|
491
|
+
{
|
|
492
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
493
|
+
"note": "Uses prompt fragments and context templates to keep prompts slimmer at render time."
|
|
494
|
+
}
|
|
495
|
+
]
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"id": "templates-are-for-simple-substitution",
|
|
499
|
+
"status": "active",
|
|
500
|
+
"level": "recommended",
|
|
501
|
+
"scope": [
|
|
502
|
+
"prompt.templates",
|
|
503
|
+
"step.prompt",
|
|
504
|
+
"step.prompt-fragment"
|
|
505
|
+
],
|
|
506
|
+
"rule": "Use context variable templates for simple substitution, not for hidden control flow or expression-heavy prompt logic.",
|
|
507
|
+
"why": "Templates are easy to read when they substitute concrete values and hard to trust when they become a second programming language.",
|
|
508
|
+
"enforcement": [
|
|
509
|
+
"advisory"
|
|
510
|
+
],
|
|
511
|
+
"sourceRefs": [
|
|
512
|
+
{
|
|
513
|
+
"kind": "runtime",
|
|
514
|
+
"path": "src/v2/durable-core/domain/context-template-resolver.ts",
|
|
515
|
+
"note": "Runtime template resolution only handles simple identifier dot-paths."
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"kind": "runtime",
|
|
519
|
+
"path": "src/v2/durable-core/domain/prompt-renderer.ts",
|
|
520
|
+
"note": "Templates are resolved at prompt render time."
|
|
521
|
+
}
|
|
522
|
+
],
|
|
523
|
+
"checks": [
|
|
524
|
+
"A template token should read like a variable lookup, not a mini expression engine.",
|
|
525
|
+
"If the prompt logic branches, prefer prompt fragments or explicit workflow control flow."
|
|
526
|
+
],
|
|
527
|
+
"antiPatterns": [
|
|
528
|
+
"Expression-heavy template syntax inside prompts",
|
|
529
|
+
"Using templates to hide control-flow decisions that should be explicit in the workflow"
|
|
530
|
+
]
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"id": "prompt-fragments-for-conditional-variants",
|
|
534
|
+
"status": "active",
|
|
535
|
+
"level": "recommended",
|
|
536
|
+
"scope": [
|
|
537
|
+
"prompt.composition",
|
|
538
|
+
"step.prompt-fragment",
|
|
539
|
+
"step.prompt"
|
|
540
|
+
],
|
|
541
|
+
"rule": "Use prompt fragments for conditional prompt variants when the base prompt stays the same and only focused instructions differ.",
|
|
542
|
+
"why": "Prompt fragments keep authored prompts smaller and make render-time differences explicit.",
|
|
543
|
+
"enforcement": [
|
|
544
|
+
"advisory"
|
|
545
|
+
],
|
|
546
|
+
"sourceRefs": [
|
|
547
|
+
{
|
|
548
|
+
"kind": "documentation",
|
|
549
|
+
"path": "docs/authoring.md",
|
|
550
|
+
"note": "Conditional prompt fragments are documented explicitly."
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
"kind": "runtime",
|
|
554
|
+
"path": "src/v2/durable-core/domain/prompt-renderer.ts",
|
|
555
|
+
"note": "Prompt fragments are assembled at render time."
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
"kind": "validator",
|
|
559
|
+
"path": "src/application/services/validation-engine.ts",
|
|
560
|
+
"note": "Prompt fragment structure is validated."
|
|
561
|
+
}
|
|
562
|
+
],
|
|
563
|
+
"checks": [
|
|
564
|
+
"Keep the base prompt readable and put conditional additions into fragments.",
|
|
565
|
+
"Do not move the entire prompt into fragments if most of it is always present."
|
|
566
|
+
],
|
|
567
|
+
"antiPatterns": [
|
|
568
|
+
"Repeating an entire prompt three times for small rigor-mode differences",
|
|
569
|
+
"Using fragments when there is no stable base prompt"
|
|
570
|
+
]
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"id": "extension-points-over-hardcoded-binding-slots",
|
|
574
|
+
"status": "active",
|
|
575
|
+
"level": "recommended",
|
|
576
|
+
"scope": [
|
|
577
|
+
"workflow.extension-points",
|
|
578
|
+
"prompt.composition",
|
|
579
|
+
"workflow.definition"
|
|
580
|
+
],
|
|
581
|
+
"rule": "Use extension points when a workflow wants stable customization slots rather than hardcoding routine or binding references inline.",
|
|
582
|
+
"why": "Extension points make customization explicit, inspectable, and project-overridable.",
|
|
583
|
+
"enforcement": [
|
|
584
|
+
"advisory"
|
|
585
|
+
],
|
|
586
|
+
"sourceRefs": [
|
|
587
|
+
{
|
|
588
|
+
"kind": "documentation",
|
|
589
|
+
"path": "docs/authoring.md",
|
|
590
|
+
"note": "Extension points are documented for workflow authors."
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
"kind": "runtime",
|
|
594
|
+
"path": "src/application/services/compiler/resolve-bindings.ts",
|
|
595
|
+
"note": "Binding resolution depends on declared extension points."
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"kind": "validator",
|
|
599
|
+
"path": "src/application/services/validation-engine.ts",
|
|
600
|
+
"note": "Extension point declarations and binding-token usage are validated."
|
|
601
|
+
}
|
|
602
|
+
],
|
|
603
|
+
"checks": [
|
|
604
|
+
"Declare extension points at the workflow level when bindings are part of the contract.",
|
|
605
|
+
"Avoid hidden or undocumented binding slots in prompts."
|
|
606
|
+
],
|
|
607
|
+
"antiPatterns": [
|
|
608
|
+
"Hardcoding team-customizable routine names in prompt text without an extension-point declaration",
|
|
609
|
+
"Using `{{wr.bindings.*}}` tokens in a workflow that declares no extension points"
|
|
610
|
+
]
|
|
611
|
+
}
|
|
612
|
+
]
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"id": "features",
|
|
616
|
+
"title": "Compiler features (middleware)",
|
|
617
|
+
"rules": [
|
|
618
|
+
{
|
|
619
|
+
"id": "declare-features-for-cross-cutting-concerns",
|
|
620
|
+
"status": "active",
|
|
621
|
+
"level": "recommended",
|
|
622
|
+
"scope": [
|
|
623
|
+
"workflow.features",
|
|
624
|
+
"workflow.definition"
|
|
625
|
+
],
|
|
626
|
+
"rule": "Declare compiler features when a workflow uses cross-cutting capabilities that benefit from systematic injection across all steps.",
|
|
627
|
+
"why": "Features inject constraints, procedure steps, and verification checks at compile time. Declaring them ensures consistent behavior across every step without repeating guidance in each prompt.",
|
|
628
|
+
"enforcement": [
|
|
629
|
+
"advisory"
|
|
630
|
+
],
|
|
631
|
+
"sourceRefs": [
|
|
632
|
+
{
|
|
633
|
+
"kind": "runtime",
|
|
634
|
+
"path": "src/application/services/compiler/feature-registry.ts",
|
|
635
|
+
"note": "Canonical closed-set feature definitions and injection logic."
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"kind": "schema",
|
|
639
|
+
"path": "spec/workflow.schema.json",
|
|
640
|
+
"note": "The features array field on the workflow definition."
|
|
641
|
+
}
|
|
642
|
+
],
|
|
643
|
+
"checks": [
|
|
644
|
+
"If the workflow delegates work to subagents, declare `wr.features.subagent_guidance`.",
|
|
645
|
+
"If the workflow uses Memory MCP for context recall or persistence, declare `wr.features.memory_context`.",
|
|
646
|
+
"Do not duplicate feature-injected guidance in metaGuidance or step prompts. Let the compiler handle it."
|
|
647
|
+
],
|
|
648
|
+
"antiPatterns": [
|
|
649
|
+
"Hand-writing delegation discipline rules in metaGuidance when `wr.features.subagent_guidance` would inject them systematically",
|
|
650
|
+
"Repeating Memory MCP usage instructions in every step instead of declaring `wr.features.memory_context`",
|
|
651
|
+
"Declaring features the workflow does not actually use"
|
|
652
|
+
]
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"id": "features-are-closed-set",
|
|
656
|
+
"status": "active",
|
|
657
|
+
"level": "required",
|
|
658
|
+
"scope": [
|
|
659
|
+
"workflow.features"
|
|
660
|
+
],
|
|
661
|
+
"rule": "Only declare features from the closed set owned by WorkRail. Do not invent feature IDs.",
|
|
662
|
+
"why": "Features modify compiled content that becomes part of the workflow hash. User-defined features would break deterministic compilation.",
|
|
663
|
+
"enforcement": [
|
|
664
|
+
"runtime",
|
|
665
|
+
"validator"
|
|
666
|
+
],
|
|
667
|
+
"sourceRefs": [
|
|
668
|
+
{
|
|
669
|
+
"kind": "runtime",
|
|
670
|
+
"path": "src/application/services/compiler/feature-registry.ts",
|
|
671
|
+
"note": "The registry rejects unknown feature IDs at compile time."
|
|
672
|
+
}
|
|
673
|
+
],
|
|
674
|
+
"checks": [
|
|
675
|
+
"Every feature ID in the `features` array must resolve in the feature registry.",
|
|
676
|
+
"Unknown feature IDs cause a compile-time error.",
|
|
677
|
+
"Known features: `wr.features.subagent_guidance` (delegation discipline for workflows that spawn subagents), `wr.features.memory_context` (Memory MCP usage constraints for cross-step/cross-session recall)."
|
|
678
|
+
],
|
|
679
|
+
"antiPatterns": [
|
|
680
|
+
"Inventing feature IDs like `wr.features.my_custom_thing`"
|
|
681
|
+
]
|
|
682
|
+
}
|
|
683
|
+
]
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"id": "response-supplements",
|
|
687
|
+
"title": "Response supplements and delivery-owned guidance",
|
|
688
|
+
"rules": [
|
|
689
|
+
{
|
|
690
|
+
"id": "keep-boundary-owned-guidance-out-of-step-prompts",
|
|
691
|
+
"status": "active",
|
|
692
|
+
"level": "recommended",
|
|
693
|
+
"scope": [
|
|
694
|
+
"response.supplement",
|
|
695
|
+
"step.prompt",
|
|
696
|
+
"prompt.composition",
|
|
697
|
+
"documentation.authoring",
|
|
698
|
+
"tooling.workflow-authoring"
|
|
699
|
+
],
|
|
700
|
+
"rule": "Use response supplements for short, boundary-owned guidance that should stay structurally separate from the workflow-authored step prompt.",
|
|
701
|
+
"why": "Mixing delivery-owned instructions into the main prompt weakens user voice and makes it harder for agents to distinguish the core task from WorkRail logistics.",
|
|
702
|
+
"enforcement": [
|
|
703
|
+
"advisory"
|
|
704
|
+
],
|
|
705
|
+
"sourceRefs": [
|
|
706
|
+
{
|
|
707
|
+
"kind": "runtime",
|
|
708
|
+
"path": "src/mcp/response-supplements.ts",
|
|
709
|
+
"note": "Canonical supplement policy lives here."
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
"kind": "runtime",
|
|
713
|
+
"path": "src/mcp/v2-response-formatter.ts",
|
|
714
|
+
"note": "Supplements are rendered as separate MCP content items here."
|
|
715
|
+
}
|
|
716
|
+
],
|
|
717
|
+
"checks": [
|
|
718
|
+
"If the text is system-owned or delivery-owned rather than part of the workflow author's actual step instruction, prefer a response supplement.",
|
|
719
|
+
"If the text should appear only at start or resume, prefer a response supplement over repeating it in every authored prompt.",
|
|
720
|
+
"Keep the main step prompt readable as a direct user ask even without the supplement."
|
|
721
|
+
],
|
|
722
|
+
"antiPatterns": [
|
|
723
|
+
"Inlining notes onboarding into every step prompt",
|
|
724
|
+
"Mixing WorkRail delivery framing directly into workflow-authored instructions",
|
|
725
|
+
"Treating boundary logistics as normal step prose"
|
|
726
|
+
]
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"id": "one-time-supplements-are-policy-not-durable-state",
|
|
730
|
+
"status": "active",
|
|
731
|
+
"level": "recommended",
|
|
732
|
+
"scope": [
|
|
733
|
+
"response.supplement",
|
|
734
|
+
"documentation.authoring",
|
|
735
|
+
"tooling.workflow-authoring"
|
|
736
|
+
],
|
|
737
|
+
"rule": "Model one-time response supplements as delivery policy unless exact display history is part of workflow semantics.",
|
|
738
|
+
"why": "Presentation rules should not leak into durable execution state unless the system truly needs to remember delivery history as part of execution correctness.",
|
|
739
|
+
"enforcement": [
|
|
740
|
+
"advisory"
|
|
741
|
+
],
|
|
742
|
+
"sourceRefs": [
|
|
743
|
+
{
|
|
744
|
+
"kind": "runtime",
|
|
745
|
+
"path": "src/mcp/response-supplements.ts",
|
|
746
|
+
"note": "Defines per_lifecycle vs once_per_session delivery semantics."
|
|
747
|
+
}
|
|
748
|
+
],
|
|
749
|
+
"checks": [
|
|
750
|
+
"Use per_lifecycle when the guidance should appear on every eligible lifecycle.",
|
|
751
|
+
"Use once_per_session with an explicit emitOn lifecycle when one lifecycle should own the message.",
|
|
752
|
+
"Do not persist shown/not-shown state unless exact delivery history becomes a real execution requirement."
|
|
753
|
+
],
|
|
754
|
+
"antiPatterns": [
|
|
755
|
+
"Adding durable session state for purely presentational guidance",
|
|
756
|
+
"Calling something once_per_session while still emitting it on multiple lifecycles",
|
|
757
|
+
"Treating supplement delivery history as part of core workflow meaning when it is only presentation policy"
|
|
758
|
+
]
|
|
759
|
+
}
|
|
760
|
+
]
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
"id": "loops",
|
|
764
|
+
"title": "Loops and control flow",
|
|
765
|
+
"rules": [
|
|
766
|
+
{
|
|
767
|
+
"id": "loop-control-semantic-correctness",
|
|
768
|
+
"status": "active",
|
|
769
|
+
"level": "required",
|
|
770
|
+
"scope": [
|
|
771
|
+
"loop.decision.prompt",
|
|
772
|
+
"loop.decision.output-example"
|
|
773
|
+
],
|
|
774
|
+
"rule": "Loop decision prompts must allow both `continue` and `stop` semantically and in the output example.",
|
|
775
|
+
"why": "Hardcoding `continue` in the example artifact creates contradictory instructions.",
|
|
776
|
+
"enforcement": [
|
|
777
|
+
"validator",
|
|
778
|
+
"ci",
|
|
779
|
+
"advisory"
|
|
780
|
+
],
|
|
781
|
+
"sourceRefs": [
|
|
782
|
+
{
|
|
783
|
+
"kind": "validator",
|
|
784
|
+
"path": "scripts/validate-workflows-registry.ts",
|
|
785
|
+
"note": "Registry validation should preserve semantically correct discoverable workflows."
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
"kind": "example",
|
|
789
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
790
|
+
"note": "Current loop decision prompts show shape-only output examples."
|
|
791
|
+
}
|
|
792
|
+
],
|
|
793
|
+
"checks": [
|
|
794
|
+
"Prompt text allows both outcomes.",
|
|
795
|
+
"Example output shows the required shape without forcing one decision."
|
|
796
|
+
],
|
|
797
|
+
"antiPatterns": [
|
|
798
|
+
"Output exactly ... `decision`: `continue`",
|
|
799
|
+
"Prompt text says to stop, but the example output only permits continue"
|
|
800
|
+
],
|
|
801
|
+
"exampleRefs": [
|
|
802
|
+
{
|
|
803
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
804
|
+
"note": "Current loop decision steps show shape-only output examples."
|
|
805
|
+
}
|
|
806
|
+
]
|
|
807
|
+
},
|
|
808
|
+
{
|
|
809
|
+
"id": "loops-need-real-exit-rules",
|
|
810
|
+
"status": "active",
|
|
811
|
+
"level": "required",
|
|
812
|
+
"scope": [
|
|
813
|
+
"loop.step",
|
|
814
|
+
"loop.decision"
|
|
815
|
+
],
|
|
816
|
+
"rule": "Loops must have explicit exit rules, bounded iterations, and a clear reason for another pass.",
|
|
817
|
+
"why": "Unclear loops invite runaway iteration or ceremonial extra passes.",
|
|
818
|
+
"enforcement": [
|
|
819
|
+
"validator",
|
|
820
|
+
"ci",
|
|
821
|
+
"advisory"
|
|
822
|
+
],
|
|
823
|
+
"checks": [
|
|
824
|
+
"The loop has a max iteration bound.",
|
|
825
|
+
"The decision step explains why another pass is or is not needed.",
|
|
826
|
+
"The loop does not rely on vibes-only continuation criteria."
|
|
827
|
+
],
|
|
828
|
+
"antiPatterns": [
|
|
829
|
+
"Retry until it feels done",
|
|
830
|
+
"Continue while confidence is low without defining how confidence is evaluated"
|
|
831
|
+
]
|
|
832
|
+
},
|
|
833
|
+
{
|
|
834
|
+
"id": "forced-self-audit-over-vibes",
|
|
835
|
+
"status": "active",
|
|
836
|
+
"level": "recommended",
|
|
837
|
+
"scope": [
|
|
838
|
+
"step.self-audit",
|
|
839
|
+
"loop.pre-check"
|
|
840
|
+
],
|
|
841
|
+
"rule": "When a workflow needs a self-audit, use concrete rubric-driven checks rather than vibes-only booleans.",
|
|
842
|
+
"why": "Agents will often take the easy path if the workflow lets them self-certify confidence without evidence.",
|
|
843
|
+
"enforcement": [
|
|
844
|
+
"advisory"
|
|
845
|
+
],
|
|
846
|
+
"checks": [
|
|
847
|
+
"Score concrete dimensions instead of asking whether the agent still feels fuzzy.",
|
|
848
|
+
"Require brief evidence for each scored dimension when the audit matters."
|
|
849
|
+
],
|
|
850
|
+
"antiPatterns": [
|
|
851
|
+
"`stillFuzzy = true|false`",
|
|
852
|
+
"`contextAuditNeeded = true|false` without an explicit rubric"
|
|
853
|
+
],
|
|
854
|
+
"exampleRefs": [
|
|
855
|
+
{
|
|
856
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
857
|
+
"note": "Phase 0 uses a context-clarity rubric instead of a vibes-only confidence flag."
|
|
858
|
+
}
|
|
859
|
+
]
|
|
860
|
+
}
|
|
861
|
+
]
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
"id": "confirmation",
|
|
865
|
+
"title": "Confirmation discipline",
|
|
866
|
+
"rules": [
|
|
867
|
+
{
|
|
868
|
+
"id": "confirm-only-for-real-human-decisions",
|
|
869
|
+
"status": "active",
|
|
870
|
+
"level": "recommended",
|
|
871
|
+
"scope": [
|
|
872
|
+
"step.confirmation",
|
|
873
|
+
"workflow.rigor-policy",
|
|
874
|
+
"workflow.authoring"
|
|
875
|
+
],
|
|
876
|
+
"rule": "Use confirmation gates for real human decisions or review barriers, not as routine ceremony.",
|
|
877
|
+
"why": "Unnecessary confirmations slow workflows down and teach agents to interrupt instead of act.",
|
|
878
|
+
"enforcement": [
|
|
879
|
+
"advisory"
|
|
880
|
+
],
|
|
881
|
+
"sourceRefs": [
|
|
882
|
+
{
|
|
883
|
+
"kind": "example",
|
|
884
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
885
|
+
"note": "Uses confirmation for real review barriers like MultiPR checkpoints."
|
|
886
|
+
}
|
|
887
|
+
],
|
|
888
|
+
"checks": [
|
|
889
|
+
"A confirmation step should protect a genuine human choice, review checkpoint, or PR boundary.",
|
|
890
|
+
"Do not require confirmation just because a step modified a file or finished a phase."
|
|
891
|
+
],
|
|
892
|
+
"antiPatterns": [
|
|
893
|
+
"Confirming every draft or artifact creation by default",
|
|
894
|
+
"Using requireConfirmation as a substitute for clear loop or rigor policy"
|
|
895
|
+
]
|
|
896
|
+
}
|
|
897
|
+
]
|
|
898
|
+
},
|
|
899
|
+
{
|
|
900
|
+
"id": "delegation",
|
|
901
|
+
"title": "Delegation and subagents",
|
|
902
|
+
"rules": [
|
|
903
|
+
{
|
|
904
|
+
"id": "bounded-delegation",
|
|
905
|
+
"status": "active",
|
|
906
|
+
"level": "required",
|
|
907
|
+
"scope": [
|
|
908
|
+
"workflow.meta-guidance",
|
|
909
|
+
"step.delegation-checkpoint"
|
|
910
|
+
],
|
|
911
|
+
"rule": "Delegate bounded cognitive routines, not ownership of the full workflow or task.",
|
|
912
|
+
"why": "Main-agent ownership preserves context, accountability, and synthesis quality.",
|
|
913
|
+
"enforcement": [
|
|
914
|
+
"advisory"
|
|
915
|
+
],
|
|
916
|
+
"sourceRefs": [
|
|
917
|
+
{
|
|
918
|
+
"kind": "example",
|
|
919
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
920
|
+
"note": "Delegation checkpoints keep the main agent as the synthesizer and decision-maker."
|
|
921
|
+
}
|
|
922
|
+
],
|
|
923
|
+
"checks": [
|
|
924
|
+
"Subagents have a bounded mission.",
|
|
925
|
+
"The main agent still owns strategy, synthesis, and final decisions."
|
|
926
|
+
],
|
|
927
|
+
"antiPatterns": [
|
|
928
|
+
"Handing the full task to a subagent and accepting its result wholesale",
|
|
929
|
+
"Treating named builder or researcher roles as alternate owners"
|
|
930
|
+
]
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"id": "batched-checkpoints-over-ad-hoc-optionality",
|
|
934
|
+
"status": "active",
|
|
935
|
+
"level": "recommended",
|
|
936
|
+
"scope": [
|
|
937
|
+
"step.delegation-checkpoint",
|
|
938
|
+
"workflow.rigor-policy"
|
|
939
|
+
],
|
|
940
|
+
"rule": "Prefer a few explicit fan-out and fan-in checkpoints over many optional one-off subagent calls.",
|
|
941
|
+
"why": "This is easier to reason about, fits the runtime cost model better, and reduces agent corner-cutting.",
|
|
942
|
+
"enforcement": [
|
|
943
|
+
"advisory"
|
|
944
|
+
],
|
|
945
|
+
"checks": [
|
|
946
|
+
"Use delegation at deliberate review barriers rather than sprinkling optional single calls everywhere.",
|
|
947
|
+
"Use rigor or trigger rules to determine when a batch is mandatory."
|
|
948
|
+
],
|
|
949
|
+
"antiPatterns": [
|
|
950
|
+
"If it helps, maybe run one subagent",
|
|
951
|
+
"Optional challenge wording at high-value decision points"
|
|
952
|
+
],
|
|
953
|
+
"exampleRefs": [
|
|
954
|
+
{
|
|
955
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
956
|
+
"note": "Uses explicit challenge, audit, and verification barriers."
|
|
957
|
+
}
|
|
958
|
+
]
|
|
959
|
+
}
|
|
960
|
+
]
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"id": "subagent-synthesis",
|
|
964
|
+
"title": "Subagent synthesis and claim adoption",
|
|
965
|
+
"rules": [
|
|
966
|
+
{
|
|
967
|
+
"id": "subagent-output-is-evidence",
|
|
968
|
+
"status": "active",
|
|
969
|
+
"level": "required",
|
|
970
|
+
"scope": [
|
|
971
|
+
"synthesis.design",
|
|
972
|
+
"synthesis.plan-audit",
|
|
973
|
+
"synthesis.slice-verification",
|
|
974
|
+
"synthesis.final-verification"
|
|
975
|
+
],
|
|
976
|
+
"rule": "Treat subagent output as evidence, not truth or authority.",
|
|
977
|
+
"why": "Delegation improves perspective, but the main agent still owns judgment.",
|
|
978
|
+
"enforcement": [
|
|
979
|
+
"advisory"
|
|
980
|
+
],
|
|
981
|
+
"checks": [
|
|
982
|
+
"The main agent states what it agrees with, rejects, or still doubts.",
|
|
983
|
+
"The workflow does not let subagent output silently become the decision."
|
|
984
|
+
],
|
|
985
|
+
"antiPatterns": [
|
|
986
|
+
"Accepting subagent conclusions wholesale",
|
|
987
|
+
"Treating multiple subagent agreement as automatic truth"
|
|
988
|
+
]
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
"id": "verify-high-impact-claims",
|
|
992
|
+
"status": "active",
|
|
993
|
+
"level": "required",
|
|
994
|
+
"scope": [
|
|
995
|
+
"synthesis.claim-adoption"
|
|
996
|
+
],
|
|
997
|
+
"rule": "Any subagent finding that changes a decision must be classified as `Confirmed`, `Plausible`, or `Rejected`.",
|
|
998
|
+
"why": "Decision-driving claims need explicit handling rather than vague agreement.",
|
|
999
|
+
"enforcement": [
|
|
1000
|
+
"advisory"
|
|
1001
|
+
],
|
|
1002
|
+
"sourceRefs": [
|
|
1003
|
+
{
|
|
1004
|
+
"kind": "example",
|
|
1005
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
1006
|
+
"note": "Major synthesis checkpoints use Confirmed / Plausible / Rejected for adopted claims."
|
|
1007
|
+
}
|
|
1008
|
+
],
|
|
1009
|
+
"checks": [
|
|
1010
|
+
"`Confirmed` claims cite primary evidence such as code, artifacts, spec, tests/build, or direct workflow context.",
|
|
1011
|
+
"`Plausible` claims do not drive the decision until verified.",
|
|
1012
|
+
"`Rejected` claims say why they failed against fuller context or direct evidence."
|
|
1013
|
+
],
|
|
1014
|
+
"antiPatterns": [
|
|
1015
|
+
"Subagent agreement alone is enough for `Confirmed`",
|
|
1016
|
+
"Using delegated findings as blockers or green lights without verification"
|
|
1017
|
+
],
|
|
1018
|
+
"exampleRefs": [
|
|
1019
|
+
{
|
|
1020
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
1021
|
+
"note": "Major synthesis checkpoints use Confirmed / Plausible / Rejected for decision-driving findings."
|
|
1022
|
+
}
|
|
1023
|
+
]
|
|
1024
|
+
}
|
|
1025
|
+
]
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
"id": "legacy-patterns",
|
|
1029
|
+
"title": "Discouraged legacy patterns",
|
|
1030
|
+
"rules": [
|
|
1031
|
+
{
|
|
1032
|
+
"id": "avoid-heavy-clarification-front-doors",
|
|
1033
|
+
"status": "active",
|
|
1034
|
+
"level": "discouraged",
|
|
1035
|
+
"scope": [
|
|
1036
|
+
"legacy.patterns",
|
|
1037
|
+
"workflow.authoring"
|
|
1038
|
+
],
|
|
1039
|
+
"rule": "Avoid large up-front clarification batteries when the workflow can discover context with tools first and ask only the real remaining questions.",
|
|
1040
|
+
"why": "Heavy intake creates ceremony and often asks the user things the agent could have learned itself.",
|
|
1041
|
+
"enforcement": [
|
|
1042
|
+
"advisory"
|
|
1043
|
+
],
|
|
1044
|
+
"checks": [
|
|
1045
|
+
"Prefer targeted questioning after exploration over blanket intake questionnaires."
|
|
1046
|
+
],
|
|
1047
|
+
"antiPatterns": [
|
|
1048
|
+
"Multiple broad clarification prompts before any repo exploration",
|
|
1049
|
+
"Learning-path or experience-level questionnaires that do not affect workflow correctness"
|
|
1050
|
+
]
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
"id": "avoid-pseudo-dsl-meta-guidance",
|
|
1054
|
+
"status": "active",
|
|
1055
|
+
"level": "discouraged",
|
|
1056
|
+
"scope": [
|
|
1057
|
+
"legacy.patterns",
|
|
1058
|
+
"workflow.meta-guidance"
|
|
1059
|
+
],
|
|
1060
|
+
"rule": "Avoid pseudo-functions, fake DSLs, or teaching-product helper syntax in meta guidance.",
|
|
1061
|
+
"why": "Pseudo-DSL prose is harder to trust, harder to maintain, and usually weaker than either plain rules or real composition features.",
|
|
1062
|
+
"enforcement": [
|
|
1063
|
+
"advisory"
|
|
1064
|
+
],
|
|
1065
|
+
"checks": [
|
|
1066
|
+
"Meta guidance should read like rules, not pretend code."
|
|
1067
|
+
],
|
|
1068
|
+
"antiPatterns": [
|
|
1069
|
+
"fun adaptToPath(content) = ...",
|
|
1070
|
+
"Helper-function prose that mimics an API but is not actually executable"
|
|
1071
|
+
]
|
|
1072
|
+
},
|
|
1073
|
+
{
|
|
1074
|
+
"id": "avoid-local-regex-validation-when-real-validators-exist",
|
|
1075
|
+
"status": "active",
|
|
1076
|
+
"level": "discouraged",
|
|
1077
|
+
"scope": [
|
|
1078
|
+
"legacy.patterns",
|
|
1079
|
+
"documentation.validation",
|
|
1080
|
+
"workflow.authoring"
|
|
1081
|
+
],
|
|
1082
|
+
"rule": "Avoid local regex-style validation heuristics when a real workflow validator exists.",
|
|
1083
|
+
"why": "Approximate checks drift fast and create false confidence.",
|
|
1084
|
+
"enforcement": [
|
|
1085
|
+
"advisory"
|
|
1086
|
+
],
|
|
1087
|
+
"checks": [
|
|
1088
|
+
"Use real validators as the gate and keep heuristics secondary at most."
|
|
1089
|
+
],
|
|
1090
|
+
"antiPatterns": [
|
|
1091
|
+
"Treating hand-written regex checks as the final proof of correctness"
|
|
1092
|
+
]
|
|
1093
|
+
}
|
|
1094
|
+
]
|
|
1095
|
+
},
|
|
1096
|
+
{
|
|
1097
|
+
"id": "examples",
|
|
1098
|
+
"title": "Examples",
|
|
1099
|
+
"rules": [
|
|
1100
|
+
{
|
|
1101
|
+
"id": "examples-must-stay-modern-and-validated",
|
|
1102
|
+
"status": "active",
|
|
1103
|
+
"level": "required",
|
|
1104
|
+
"scope": [
|
|
1105
|
+
"workflow.authoring",
|
|
1106
|
+
"documentation.authoring",
|
|
1107
|
+
"tooling.workflow-authoring"
|
|
1108
|
+
],
|
|
1109
|
+
"rule": "Examples used by this spec should be modern, still validated, and still representative of current authoring guidance.",
|
|
1110
|
+
"why": "Examples quietly drifting out of date undermines the trustworthiness of the whole authoring system.",
|
|
1111
|
+
"enforcement": [
|
|
1112
|
+
"advisory"
|
|
1113
|
+
],
|
|
1114
|
+
"checks": [
|
|
1115
|
+
"Example refs should point to workflows that still validate.",
|
|
1116
|
+
"Review example refs when the referenced workflow changes materially."
|
|
1117
|
+
],
|
|
1118
|
+
"antiPatterns": [
|
|
1119
|
+
"Keeping a canonical example ref after the workflow has drifted into a legacy style"
|
|
1120
|
+
],
|
|
1121
|
+
"exampleRefs": [
|
|
1122
|
+
{
|
|
1123
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
1124
|
+
"note": "Current example of modern prompt composition, delegation barriers, and loop semantics."
|
|
1125
|
+
}
|
|
1126
|
+
]
|
|
1127
|
+
}
|
|
1128
|
+
]
|
|
1129
|
+
},
|
|
1130
|
+
{
|
|
1131
|
+
"id": "validation",
|
|
1132
|
+
"title": "Validation",
|
|
1133
|
+
"rules": [
|
|
1134
|
+
{
|
|
1135
|
+
"id": "validator-first",
|
|
1136
|
+
"status": "active",
|
|
1137
|
+
"level": "required",
|
|
1138
|
+
"scope": [
|
|
1139
|
+
"workflow.authoring",
|
|
1140
|
+
"tooling.workflow-authoring",
|
|
1141
|
+
"ci.validation"
|
|
1142
|
+
],
|
|
1143
|
+
"rule": "Use real workflow validators and runtime-equivalent validation as the gate for correctness.",
|
|
1144
|
+
"why": "Validator behavior is the executable truth for whether a workflow is actually runnable.",
|
|
1145
|
+
"enforcement": [
|
|
1146
|
+
"runtime",
|
|
1147
|
+
"validator",
|
|
1148
|
+
"ci"
|
|
1149
|
+
],
|
|
1150
|
+
"sourceRefs": [
|
|
1151
|
+
{
|
|
1152
|
+
"kind": "validator",
|
|
1153
|
+
"path": "scripts/validate-workflows-registry.ts",
|
|
1154
|
+
"note": "Registry validation is part of the real validation surface."
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
"kind": "validator",
|
|
1158
|
+
"path": "src/application/services/validation-engine.ts",
|
|
1159
|
+
"note": "Structural validation logic lives here."
|
|
1160
|
+
}
|
|
1161
|
+
],
|
|
1162
|
+
"checks": [
|
|
1163
|
+
"Validate against the same workflow runtime would discover and execute.",
|
|
1164
|
+
"Do not rely on regex-style local approximations when a real validator exists."
|
|
1165
|
+
],
|
|
1166
|
+
"antiPatterns": [
|
|
1167
|
+
"Docs-only validation",
|
|
1168
|
+
"File-shape checks that ignore runtime registry resolution"
|
|
1169
|
+
]
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
"id": "validation-bar-must-match-runtime",
|
|
1173
|
+
"status": "active",
|
|
1174
|
+
"level": "required",
|
|
1175
|
+
"scope": [
|
|
1176
|
+
"documentation.validation",
|
|
1177
|
+
"validator.implementation"
|
|
1178
|
+
],
|
|
1179
|
+
"rule": "Validation guidance must align with the same discovery, resolution, normalization, compilation, and lifecycle behavior that runtime uses.",
|
|
1180
|
+
"why": "A workflow that passes guidance-level validation but fails at runtime is a trust failure.",
|
|
1181
|
+
"enforcement": [
|
|
1182
|
+
"validator",
|
|
1183
|
+
"ci",
|
|
1184
|
+
"advisory"
|
|
1185
|
+
],
|
|
1186
|
+
"checks": [
|
|
1187
|
+
"Validation docs should describe the same phases runtime actually depends on.",
|
|
1188
|
+
"If runtime adds a new contract surface, update authoring guidance and validation docs."
|
|
1189
|
+
],
|
|
1190
|
+
"antiPatterns": [
|
|
1191
|
+
"Saying a workflow is valid because the file parses even though registry resolution or runtime compilation can still fail"
|
|
1192
|
+
]
|
|
1193
|
+
}
|
|
1194
|
+
]
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
"id": "artifacts",
|
|
1198
|
+
"title": "Artifacts and planning surfaces",
|
|
1199
|
+
"rules": [
|
|
1200
|
+
{
|
|
1201
|
+
"id": "artifact-canonicality",
|
|
1202
|
+
"status": "active",
|
|
1203
|
+
"level": "recommended",
|
|
1204
|
+
"scope": [
|
|
1205
|
+
"artifact.plan",
|
|
1206
|
+
"artifact.spec",
|
|
1207
|
+
"artifact.verification"
|
|
1208
|
+
],
|
|
1209
|
+
"rule": "When multiple human-facing artifacts exist, say which one is canonical for which concern.",
|
|
1210
|
+
"why": "Ambiguous ownership between plan, spec, and verification artifacts causes drift.",
|
|
1211
|
+
"enforcement": [
|
|
1212
|
+
"advisory"
|
|
1213
|
+
],
|
|
1214
|
+
"checks": [
|
|
1215
|
+
"If both a behavior artifact and an implementation artifact exist, define the boundary explicitly.",
|
|
1216
|
+
"Verification steps should know which artifact is the source of truth for behavior."
|
|
1217
|
+
],
|
|
1218
|
+
"antiPatterns": [
|
|
1219
|
+
"Plan and spec both contain acceptance criteria with no stated source of truth",
|
|
1220
|
+
"Verification steps check one artifact while planning updates a different one"
|
|
1221
|
+
],
|
|
1222
|
+
"exampleRefs": [
|
|
1223
|
+
{
|
|
1224
|
+
"path": "workflows/coding-task-workflow-agentic.lean.v2.json",
|
|
1225
|
+
"note": "Uses explicit spec vs implementation-plan ownership."
|
|
1226
|
+
}
|
|
1227
|
+
]
|
|
1228
|
+
}
|
|
1229
|
+
]
|
|
1230
|
+
}
|
|
1231
|
+
],
|
|
1232
|
+
"plannedTopics": [
|
|
1233
|
+
{
|
|
1234
|
+
"id": "delegation-results",
|
|
1235
|
+
"title": "Planned delegation packets and outputs",
|
|
1236
|
+
"rules": [
|
|
1237
|
+
{
|
|
1238
|
+
"id": "delegation-package",
|
|
1239
|
+
"status": "planned",
|
|
1240
|
+
"level": "recommended",
|
|
1241
|
+
"scope": [
|
|
1242
|
+
"delegation.context-packet"
|
|
1243
|
+
],
|
|
1244
|
+
"rule": "Every subagent should receive a self-contained context packet with mission, current decision, relevant files or artifacts, constraints, and expected deliverable shape.",
|
|
1245
|
+
"why": "Subagents do not inherit parent context cleanly today, and the engine should make the packet explicit.",
|
|
1246
|
+
"enforcement": [
|
|
1247
|
+
"planned",
|
|
1248
|
+
"advisory"
|
|
1249
|
+
],
|
|
1250
|
+
"checks": [
|
|
1251
|
+
"The context packet should be inspectable.",
|
|
1252
|
+
"The packet should be curated rather than hidden full-session inheritance."
|
|
1253
|
+
],
|
|
1254
|
+
"antiPatterns": [
|
|
1255
|
+
"Assuming a subagent implicitly knows the parent context"
|
|
1256
|
+
]
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
"id": "subagent-results-should-be-structured",
|
|
1260
|
+
"status": "planned",
|
|
1261
|
+
"level": "recommended",
|
|
1262
|
+
"scope": [
|
|
1263
|
+
"delegation.result-envelope",
|
|
1264
|
+
"synthesis.claim-adoption",
|
|
1265
|
+
"step.delegation-checkpoint"
|
|
1266
|
+
],
|
|
1267
|
+
"rule": "Delegated routines should return a structured result envelope rather than only freeform notes.",
|
|
1268
|
+
"why": "Parents can synthesize, verify, and reject subagent claims much more reliably when results are shaped consistently.",
|
|
1269
|
+
"enforcement": [
|
|
1270
|
+
"planned",
|
|
1271
|
+
"advisory"
|
|
1272
|
+
],
|
|
1273
|
+
"checks": [
|
|
1274
|
+
"A good result envelope includes findings, assumptions, missing context, confidence, and claims requiring verification.",
|
|
1275
|
+
"Decision-driving claims should be easy for the parent to inspect without rereading the entire deliverable."
|
|
1276
|
+
],
|
|
1277
|
+
"antiPatterns": [
|
|
1278
|
+
"Freeform delegated output with no separation between findings, assumptions, and uncertainty",
|
|
1279
|
+
"Subagent output that hides which claims still need parent verification"
|
|
1280
|
+
]
|
|
1281
|
+
},
|
|
1282
|
+
{
|
|
1283
|
+
"id": "subagent-output-discloses-assumptions",
|
|
1284
|
+
"status": "planned",
|
|
1285
|
+
"level": "recommended",
|
|
1286
|
+
"scope": [
|
|
1287
|
+
"delegation.result-envelope",
|
|
1288
|
+
"synthesis.claim-adoption"
|
|
1289
|
+
],
|
|
1290
|
+
"rule": "Subagent output should disclose the assumptions it depended on.",
|
|
1291
|
+
"why": "The parent cannot judge a delegated finding properly if the hidden assumptions stay hidden.",
|
|
1292
|
+
"enforcement": [
|
|
1293
|
+
"planned",
|
|
1294
|
+
"advisory"
|
|
1295
|
+
],
|
|
1296
|
+
"checks": [
|
|
1297
|
+
"High-impact findings name the assumptions they depend on.",
|
|
1298
|
+
"Assumptions are separated from findings, not buried in prose."
|
|
1299
|
+
],
|
|
1300
|
+
"antiPatterns": [
|
|
1301
|
+
"Delegated recommendations that read as certain but rely on unstated assumptions"
|
|
1302
|
+
]
|
|
1303
|
+
},
|
|
1304
|
+
{
|
|
1305
|
+
"id": "subagent-output-discloses-missing-context",
|
|
1306
|
+
"status": "planned",
|
|
1307
|
+
"level": "recommended",
|
|
1308
|
+
"scope": [
|
|
1309
|
+
"delegation.result-envelope",
|
|
1310
|
+
"delegation.context-packet"
|
|
1311
|
+
],
|
|
1312
|
+
"rule": "Subagent output should disclose what context it was missing or uncertain about.",
|
|
1313
|
+
"why": "The parent needs to know whether a finding is weak because the delegated context packet was incomplete.",
|
|
1314
|
+
"enforcement": [
|
|
1315
|
+
"planned",
|
|
1316
|
+
"advisory"
|
|
1317
|
+
],
|
|
1318
|
+
"checks": [
|
|
1319
|
+
"Missing context is called out explicitly instead of implied through hedging."
|
|
1320
|
+
],
|
|
1321
|
+
"antiPatterns": [
|
|
1322
|
+
"A confident delegated result that omits obvious context gaps"
|
|
1323
|
+
]
|
|
1324
|
+
},
|
|
1325
|
+
{
|
|
1326
|
+
"id": "subagent-output-exposes-confidence",
|
|
1327
|
+
"status": "planned",
|
|
1328
|
+
"level": "recommended",
|
|
1329
|
+
"scope": [
|
|
1330
|
+
"delegation.result-envelope",
|
|
1331
|
+
"synthesis.claim-adoption"
|
|
1332
|
+
],
|
|
1333
|
+
"rule": "Subagent output should expose confidence for its key findings or recommendations.",
|
|
1334
|
+
"why": "The parent needs a fast read on which delegated conclusions are tentative versus well-supported.",
|
|
1335
|
+
"enforcement": [
|
|
1336
|
+
"planned",
|
|
1337
|
+
"advisory"
|
|
1338
|
+
],
|
|
1339
|
+
"checks": [
|
|
1340
|
+
"Confidence is attached to findings or recommendations, not hidden in a general disclaimer."
|
|
1341
|
+
],
|
|
1342
|
+
"antiPatterns": [
|
|
1343
|
+
"All findings are presented with the same implied confidence"
|
|
1344
|
+
]
|
|
1345
|
+
},
|
|
1346
|
+
{
|
|
1347
|
+
"id": "high-impact-findings-must-be-easy-to-verify",
|
|
1348
|
+
"status": "planned",
|
|
1349
|
+
"level": "recommended",
|
|
1350
|
+
"scope": [
|
|
1351
|
+
"delegation.result-envelope",
|
|
1352
|
+
"synthesis.claim-adoption"
|
|
1353
|
+
],
|
|
1354
|
+
"rule": "High-impact delegated findings should be easy for the parent to verify against primary evidence.",
|
|
1355
|
+
"why": "The parent should not have to reverse-engineer a delegated deliverable to validate the claims that change the decision.",
|
|
1356
|
+
"enforcement": [
|
|
1357
|
+
"planned",
|
|
1358
|
+
"advisory"
|
|
1359
|
+
],
|
|
1360
|
+
"checks": [
|
|
1361
|
+
"Decision-driving claims are surfaced explicitly.",
|
|
1362
|
+
"The output makes it obvious what should be verified in code, artifacts, or tests."
|
|
1363
|
+
],
|
|
1364
|
+
"antiPatterns": [
|
|
1365
|
+
"Burying the finding that changes the decision inside a long prose dump"
|
|
1366
|
+
]
|
|
1367
|
+
}
|
|
1368
|
+
]
|
|
1369
|
+
}
|
|
1370
|
+
],
|
|
1371
|
+
"plannedRules": [
|
|
1372
|
+
]
|
|
1373
|
+
}
|