@exaudeus/workrail 3.14.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/application/services/validation-engine.js +4 -9
  2. package/dist/application/services/workflow-compiler.js +4 -6
  3. package/dist/application/services/workflow-service.d.ts +2 -0
  4. package/dist/application/services/workflow-service.js +3 -0
  5. package/dist/console/assets/index-BE5PAgPO.js +28 -0
  6. package/dist/console/assets/index-BZNM03t1.css +1 -0
  7. package/dist/console/index.html +2 -2
  8. package/dist/engine/engine-factory.js +2 -2
  9. package/dist/engine/types.d.ts +1 -1
  10. package/dist/env-flags.d.ts +1 -0
  11. package/dist/env-flags.js +4 -0
  12. package/dist/infrastructure/session/HttpServer.d.ts +3 -3
  13. package/dist/infrastructure/session/HttpServer.js +68 -74
  14. package/dist/infrastructure/storage/caching-workflow-storage.d.ts +2 -0
  15. package/dist/infrastructure/storage/caching-workflow-storage.js +15 -6
  16. package/dist/infrastructure/storage/file-workflow-storage.js +3 -4
  17. package/dist/infrastructure/storage/schema-validating-workflow-storage.js +9 -8
  18. package/dist/manifest.json +283 -219
  19. package/dist/mcp/assert-output.d.ts +37 -0
  20. package/dist/mcp/assert-output.js +52 -0
  21. package/dist/mcp/boundary-coercion.d.ts +1 -0
  22. package/dist/mcp/boundary-coercion.js +44 -0
  23. package/dist/mcp/dev-mode.d.ts +1 -0
  24. package/dist/mcp/dev-mode.js +4 -0
  25. package/dist/mcp/handler-factory.js +12 -9
  26. package/dist/mcp/handlers/session.js +8 -9
  27. package/dist/mcp/handlers/shared/request-workflow-reader.d.ts +5 -0
  28. package/dist/mcp/handlers/shared/request-workflow-reader.js +47 -2
  29. package/dist/mcp/handlers/v2-advance-core/assessment-consequences.d.ts +1 -1
  30. package/dist/mcp/handlers/v2-advance-core/assessment-consequences.js +4 -5
  31. package/dist/mcp/handlers/v2-advance-core/event-builders.d.ts +2 -0
  32. package/dist/mcp/handlers/v2-advance-core/event-builders.js +6 -6
  33. package/dist/mcp/handlers/v2-advance-core/index.d.ts +2 -0
  34. package/dist/mcp/handlers/v2-advance-core/index.js +5 -4
  35. package/dist/mcp/handlers/v2-advance-core/input-validation.d.ts +2 -0
  36. package/dist/mcp/handlers/v2-advance-core/input-validation.js +32 -9
  37. package/dist/mcp/handlers/v2-advance-core/outcome-blocked.d.ts +2 -0
  38. package/dist/mcp/handlers/v2-advance-core/outcome-blocked.js +2 -2
  39. package/dist/mcp/handlers/v2-advance-core/outcome-success.d.ts +2 -0
  40. package/dist/mcp/handlers/v2-advance-core/outcome-success.js +1 -1
  41. package/dist/mcp/handlers/v2-checkpoint.d.ts +1 -1
  42. package/dist/mcp/handlers/v2-checkpoint.js +5 -6
  43. package/dist/mcp/handlers/v2-execution/advance.d.ts +4 -2
  44. package/dist/mcp/handlers/v2-execution/advance.js +5 -7
  45. package/dist/mcp/handlers/v2-execution/continue-advance.js +56 -26
  46. package/dist/mcp/handlers/v2-execution/continue-rehydrate.d.ts +1 -1
  47. package/dist/mcp/handlers/v2-execution/continue-rehydrate.js +9 -9
  48. package/dist/mcp/handlers/v2-execution/replay.d.ts +6 -4
  49. package/dist/mcp/handlers/v2-execution/replay.js +47 -30
  50. package/dist/mcp/handlers/v2-execution/start.d.ts +3 -3
  51. package/dist/mcp/handlers/v2-execution/start.js +31 -12
  52. package/dist/mcp/handlers/v2-execution/workflow-object-cache.d.ts +5 -0
  53. package/dist/mcp/handlers/v2-execution/workflow-object-cache.js +19 -0
  54. package/dist/mcp/handlers/v2-execution-helpers.d.ts +1 -0
  55. package/dist/mcp/handlers/v2-execution-helpers.js +23 -7
  56. package/dist/mcp/handlers/v2-resume.d.ts +1 -1
  57. package/dist/mcp/handlers/v2-resume.js +3 -4
  58. package/dist/mcp/handlers/v2-state-conversion.js +5 -1
  59. package/dist/mcp/handlers/v2-workflow.d.ts +100 -0
  60. package/dist/mcp/handlers/v2-workflow.js +155 -31
  61. package/dist/mcp/handlers/workflow.d.ts +2 -5
  62. package/dist/mcp/handlers/workflow.js +15 -12
  63. package/dist/mcp/output-schemas.d.ts +123 -29
  64. package/dist/mcp/output-schemas.js +36 -18
  65. package/dist/mcp/server.js +70 -5
  66. package/dist/mcp/tool-call-timing.d.ts +24 -0
  67. package/dist/mcp/tool-call-timing.js +85 -0
  68. package/dist/mcp/tool-descriptions.js +17 -9
  69. package/dist/mcp/transports/http-entry.js +3 -2
  70. package/dist/mcp/transports/http-listener.d.ts +1 -0
  71. package/dist/mcp/transports/http-listener.js +25 -0
  72. package/dist/mcp/transports/shutdown-hooks.d.ts +4 -1
  73. package/dist/mcp/transports/shutdown-hooks.js +3 -2
  74. package/dist/mcp/transports/stdio-entry.js +6 -28
  75. package/dist/mcp/v2/tools.d.ts +6 -0
  76. package/dist/mcp/v2/tools.js +2 -0
  77. package/dist/mcp/v2-response-formatter.js +2 -4
  78. package/dist/mcp/validation/schema-introspection.d.ts +1 -0
  79. package/dist/mcp/validation/schema-introspection.js +15 -5
  80. package/dist/mcp/validation/suggestion-generator.js +2 -2
  81. package/dist/mcp/workflow-protocol-contracts.js +5 -1
  82. package/dist/runtime/adapters/node-process-signals.d.ts +1 -0
  83. package/dist/runtime/adapters/node-process-signals.js +5 -0
  84. package/dist/runtime/adapters/noop-process-signals.d.ts +1 -0
  85. package/dist/runtime/adapters/noop-process-signals.js +2 -0
  86. package/dist/runtime/ports/process-signals.d.ts +1 -0
  87. package/dist/types/workflow-definition.d.ts +3 -2
  88. package/dist/types/workflow.d.ts +3 -0
  89. package/dist/types/workflow.js +35 -26
  90. package/dist/v2/durable-core/domain/context-template-resolver.js +2 -2
  91. package/dist/v2/durable-core/domain/function-definition-expander.js +2 -17
  92. package/dist/v2/durable-core/domain/prompt-renderer.d.ts +1 -0
  93. package/dist/v2/durable-core/domain/prompt-renderer.js +23 -18
  94. package/dist/v2/durable-core/domain/recap-recovery.js +23 -16
  95. package/dist/v2/durable-core/domain/retrieval-contract.js +13 -7
  96. package/dist/v2/durable-core/session-index.d.ts +22 -0
  97. package/dist/v2/durable-core/session-index.js +58 -0
  98. package/dist/v2/durable-core/sorted-event-log.d.ts +6 -0
  99. package/dist/v2/durable-core/sorted-event-log.js +15 -0
  100. package/dist/v2/infra/local/fs/index.js +8 -8
  101. package/dist/v2/infra/local/session-store/index.d.ts +1 -1
  102. package/dist/v2/infra/local/session-store/index.js +71 -61
  103. package/dist/v2/infra/local/session-summary-provider/index.js +9 -4
  104. package/dist/v2/infra/local/snapshot-store/index.js +2 -1
  105. package/dist/v2/infra/local/workspace-anchor/index.js +4 -1
  106. package/dist/v2/ports/session-event-log-store.port.d.ts +1 -1
  107. package/dist/v2/projections/assessment-consequences.d.ts +2 -1
  108. package/dist/v2/projections/assessment-consequences.js +0 -5
  109. package/dist/v2/projections/assessments.d.ts +2 -1
  110. package/dist/v2/projections/assessments.js +2 -4
  111. package/dist/v2/projections/gaps.d.ts +2 -1
  112. package/dist/v2/projections/gaps.js +0 -5
  113. package/dist/v2/projections/preferences.d.ts +2 -1
  114. package/dist/v2/projections/preferences.js +0 -5
  115. package/dist/v2/projections/run-context.d.ts +2 -2
  116. package/dist/v2/projections/run-context.js +0 -5
  117. package/dist/v2/projections/run-dag.js +7 -1
  118. package/dist/v2/projections/run-execution-trace.d.ts +8 -0
  119. package/dist/v2/projections/run-execution-trace.js +124 -0
  120. package/dist/v2/projections/run-status-signals.d.ts +2 -2
  121. package/dist/v2/usecases/console-routes.d.ts +3 -1
  122. package/dist/v2/usecases/console-routes.js +149 -3
  123. package/dist/v2/usecases/console-service.d.ts +2 -0
  124. package/dist/v2/usecases/console-service.js +87 -26
  125. package/dist/v2/usecases/console-types.d.ts +65 -0
  126. package/dist/v2/usecases/worktree-service.js +87 -8
  127. package/package.json +7 -6
  128. package/spec/authoring-spec.json +82 -1
  129. package/spec/workflow-tags.json +132 -0
  130. package/spec/workflow.schema.json +21 -11
  131. package/workflows/adaptive-ticket-creation.json +33 -8
  132. package/workflows/architecture-scalability-audit.json +50 -9
  133. package/workflows/bug-investigation.agentic.v2.json +43 -14
  134. package/workflows/coding-task-workflow-agentic.json +57 -38
  135. package/workflows/coding-task-workflow-agentic.lean.v2.json +129 -34
  136. package/workflows/coding-task-workflow-agentic.v2.json +97 -30
  137. package/workflows/cross-platform-code-conversion.v2.json +175 -48
  138. package/workflows/document-creation-workflow.json +49 -12
  139. package/workflows/documentation-update-workflow.json +9 -2
  140. package/workflows/intelligent-test-case-generation.json +9 -2
  141. package/workflows/learner-centered-course-workflow.json +273 -266
  142. package/workflows/mr-review-workflow.agentic.v2.json +88 -14
  143. package/workflows/personal-learning-materials-creation-branched.json +181 -174
  144. package/workflows/presentation-creation.json +167 -160
  145. package/workflows/production-readiness-audit.json +61 -15
  146. package/workflows/relocation-workflow-us.json +21 -5
  147. package/workflows/routines/tension-driven-design.json +1 -1
  148. package/workflows/scoped-documentation-workflow.json +9 -2
  149. package/workflows/test-artifact-loop-control.json +1 -2
  150. package/workflows/ui-ux-design-workflow.json +334 -0
  151. package/workflows/workflow-diagnose-environment.json +7 -1
  152. package/workflows/workflow-for-workflows.json +514 -484
  153. package/workflows/workflow-for-workflows.v2.json +55 -11
  154. package/workflows/wr.discovery.json +118 -29
  155. package/dist/console/assets/index-DW78t31j.css +0 -1
  156. package/dist/console/assets/index-EsSXrC_a.js +0 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exaudeus/workrail",
3
- "version": "3.14.0",
3
+ "version": "3.16.0",
4
4
  "description": "Step-by-step workflow enforcement for AI agents via MCP",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,7 +39,7 @@
39
39
  "dev": "npm run build && node dist/mcp-server.js",
40
40
  "watch": "tsc --watch",
41
41
  "validate:workflows": "bash scripts/validate-workflows.sh",
42
- "validate:registry": "node scripts/validate-workflows-registry.ts",
42
+ "validate:registry": "node --experimental-strip-types scripts/validate-workflows-registry.ts",
43
43
  "stamp-workflow": "node scripts/stamp-workflow.ts",
44
44
  "validate:authoring-spec": "node scripts/validate-authoring-spec.js",
45
45
  "validate:authoring-docs": "node scripts/generate-authoring-docs.js --check",
@@ -77,7 +77,8 @@
77
77
  "codemod:v2-contexts": "npx ts-node scripts/codemods/run.ts --mod v2-contexts --tsconfig tsconfig.test.json --write",
78
78
  "codemod:v2-prune": "npx ts-node scripts/codemods/run.ts --mod v2-prune --tsconfig tsconfig.test.json --write",
79
79
  "codemod:guard": "npx ts-node scripts/codemods/run.ts --mod guard --tsconfig tsconfig.test.json",
80
- "codemod:test-platform-guard": "npx ts-node scripts/codemods/run.ts --mod test-platform-guard --tsconfig tsconfig.test.json"
80
+ "codemod:test-platform-guard": "npx ts-node scripts/codemods/run.ts --mod test-platform-guard --tsconfig tsconfig.test.json",
81
+ "prepare": "bash scripts/setup-hooks.sh"
81
82
  },
82
83
  "dependencies": {
83
84
  "@modelcontextprotocol/sdk": "^1.24.0",
@@ -89,7 +90,7 @@
89
90
  "dotenv": "^17.2.0",
90
91
  "express": "^5.1.0",
91
92
  "neverthrow": "^8.2.0",
92
- "open": "^10.2.0",
93
+ "open": "^11.0.0",
93
94
  "reflect-metadata": "^0.2.0",
94
95
  "semver": "^7.7.2",
95
96
  "tsconfig-paths": "^4.2.0",
@@ -121,8 +122,8 @@
121
122
  "happy-dom": "^20.0.11",
122
123
  "jsdom": "^27.0.0",
123
124
  "lit": "^3.3.1",
124
- "node-fetch": "^2.7.0",
125
- "semantic-release": "^24.2.0",
125
+ "node-fetch": "^3.3.2",
126
+ "semantic-release": "^25.0.3",
126
127
  "ts-morph": "^27.0.2",
127
128
  "typescript": "^5.9.3",
128
129
  "vite": "^7.1.9",
@@ -3,7 +3,7 @@
3
3
  "version": 3,
4
4
  "title": "WorkRail Authoring Rules",
5
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",
6
+ "lastReviewed": "2026-04-04",
7
7
  "principles": [
8
8
  "Schema defines what is valid. These rules define what is good.",
9
9
  "Prefer current authoring rules over design rationale or historical notes.",
@@ -931,6 +931,87 @@
931
931
  }
932
932
  ]
933
933
  },
934
+ {
935
+ "id": "assessment-gates",
936
+ "title": "Assessment gates",
937
+ "rules": [
938
+ {
939
+ "id": "assessment-use-for-bounded-judgment",
940
+ "status": "active",
941
+ "level": "recommended",
942
+ "scope": [
943
+ "workflow.assessments",
944
+ "step.assessmentRefs",
945
+ "step.assessmentConsequences"
946
+ ],
947
+ "rule": "Use assessment gates when a step needs the agent to submit a bounded, durable judgment before the workflow can safely advance -- not for generic scoring or ceremony.",
948
+ "why": "Assessment gates force explicit structured reasoning at a decision point and durably record the result. Generic scoring that never affects routing adds noise without value.",
949
+ "enforcement": ["advisory"],
950
+ "sourceRefs": [
951
+ {
952
+ "kind": "example",
953
+ "path": "workflows/mr-review-workflow.agentic.v2.json",
954
+ "note": "Uses a three-dimension readiness gate on the final validation step."
955
+ },
956
+ {
957
+ "kind": "example",
958
+ "path": "workflows/bug-investigation.agentic.v2.json",
959
+ "note": "Uses a single-dimension diagnosis readiness gate before handoff."
960
+ }
961
+ ],
962
+ "checks": [
963
+ "The assessment is at a step where a wrong answer would produce a bad handoff.",
964
+ "At least one dimension has a consequence that keeps the step pending and requires follow-up.",
965
+ "The assessment result is durably recorded and useful to a future resume agent."
966
+ ],
967
+ "antiPatterns": [
968
+ "Using assessments as a generic five-level scoring rubric with no routing consequence",
969
+ "Declaring an assessment but never referencing it from any step"
970
+ ]
971
+ },
972
+ {
973
+ "id": "assessment-dimension-orthogonality",
974
+ "status": "active",
975
+ "level": "required",
976
+ "scope": [
977
+ "workflow.assessments"
978
+ ],
979
+ "rule": "Each dimension in an assessment must capture a distinct failure mode that the other dimensions cannot catch. A dimension that restates existing workflow state (such as a generic 'confidence' dimension that mirrors the workflow's confidence band) adds ceremony without structure.",
980
+ "why": "The value of multiple dimensions is that each one independently blocks advancement for a different reason. Correlated or vague dimensions collapse to a single gate with extra steps.",
981
+ "enforcement": ["advisory"],
982
+ "checks": [
983
+ "Each dimension is independently checkable without needing to know the result of the others.",
984
+ "No dimension restates a context variable the workflow already computes (e.g. recommendationConfidenceBand).",
985
+ "A 'low' rating on any one dimension alone justifies a follow-up, regardless of the others."
986
+ ],
987
+ "antiPatterns": [
988
+ "A single 'confidence' dimension that mirrors the workflow's existing confidence band",
989
+ "Multiple dimensions that all reduce to 'did I do a good job overall'",
990
+ "Dimensions so correlated that one being low always means the others are low too"
991
+ ]
992
+ },
993
+ {
994
+ "id": "assessment-v1-constraints",
995
+ "status": "active",
996
+ "level": "required",
997
+ "scope": [
998
+ "step.assessmentRefs",
999
+ "step.assessmentConsequences"
1000
+ ],
1001
+ "rule": "V1 supports exactly one assessmentRef per step and at most one assessmentConsequences entry per step. Use anyEqualsLevel as the trigger -- the engine checks all submitted dimensions and fires if any equals that level.",
1002
+ "why": "anyEqualsLevel is the only trigger form. It works for both single-dimension and multi-dimension assessments without requiring the author to choose between two forms.",
1003
+ "enforcement": ["schema"],
1004
+ "checks": [
1005
+ "No more than one assessmentRefs entry per step.",
1006
+ "No more than one assessmentConsequences entry per step.",
1007
+ "The consequence uses anyEqualsLevel to declare which level blocks -- not a named dimension."
1008
+ ],
1009
+ "antiPatterns": [
1010
+ "Trying to encode multiple consequences via workarounds"
1011
+ ]
1012
+ }
1013
+ ]
1014
+ },
934
1015
  {
935
1016
  "id": "delegation",
936
1017
  "title": "Delegation and subagents",
@@ -0,0 +1,132 @@
1
+ {
2
+ "$schema": "./workflow-tags.schema.json",
3
+ "version": 1,
4
+ "tags": [
5
+ {
6
+ "id": "coding",
7
+ "displayName": "Coding & Development",
8
+ "when": [
9
+ "implementing a feature or task",
10
+ "refactoring or improving existing code",
11
+ "converting code between platforms or languages"
12
+ ],
13
+ "examples": ["coding-task-workflow-agentic", "cross-platform-code-conversion"]
14
+ },
15
+ {
16
+ "id": "review_audit",
17
+ "displayName": "Review & Audit",
18
+ "when": [
19
+ "reviewing a merge request before merging",
20
+ "auditing a service for production readiness",
21
+ "checking architecture for scalability issues"
22
+ ],
23
+ "examples": ["mr-review-workflow-agentic", "production-readiness-audit"]
24
+ },
25
+ {
26
+ "id": "investigation",
27
+ "displayName": "Investigation & Debugging",
28
+ "when": [
29
+ "diagnosing a bug or unexpected behavior in code",
30
+ "diagnosing tool, environment, or MCP server issues"
31
+ ],
32
+ "examples": ["bug-investigation-agentic", "workflow-diagnose-environment"]
33
+ },
34
+ {
35
+ "id": "design",
36
+ "displayName": "Design & Discovery",
37
+ "when": [
38
+ "designing a UI or UX feature from scratch",
39
+ "exploring and thinking through a problem or decision",
40
+ "generating and comparing design candidates"
41
+ ],
42
+ "examples": ["ui-ux-design-workflow", "wr.discovery"]
43
+ },
44
+ {
45
+ "id": "documentation",
46
+ "displayName": "Documentation",
47
+ "when": [
48
+ "creating new documentation for a project, feature, or API",
49
+ "updating or maintaining existing documentation",
50
+ "writing documentation for a single bounded component or concept"
51
+ ],
52
+ "examples": ["document-creation-workflow", "documentation-update-workflow"]
53
+ },
54
+ {
55
+ "id": "tickets",
56
+ "displayName": "Tickets & Planning",
57
+ "when": [
58
+ "creating Jira tickets for a feature or epic",
59
+ "grooming and refining a backlog",
60
+ "generating test cases from ticket requirements"
61
+ ],
62
+ "examples": ["adaptive-ticket-creation", "ticket-grooming"]
63
+ },
64
+ {
65
+ "id": "learning",
66
+ "displayName": "Learning & Personal",
67
+ "when": [
68
+ "creating learning materials or a course",
69
+ "designing a presentation",
70
+ "making a major personal decision like where to relocate"
71
+ ],
72
+ "examples": ["personal-learning-materials-creation-branched", "presentation-creation"]
73
+ },
74
+ {
75
+ "id": "routines",
76
+ "displayName": "Routines",
77
+ "when": [
78
+ "gathering context about a codebase",
79
+ "generating design candidates",
80
+ "running a hypothesis challenge or adversarial review",
81
+ "running a final verification pass"
82
+ ],
83
+ "examples": ["routine-context-gathering", "routine-hypothesis-challenge"]
84
+ },
85
+ {
86
+ "id": "authoring",
87
+ "displayName": "Workflow Authoring",
88
+ "when": [
89
+ "creating a new WorkRail workflow from scratch",
90
+ "modernizing or updating an existing workflow"
91
+ ],
92
+ "examples": ["workflow-for-workflows"]
93
+ }
94
+ ],
95
+ "workflows": {
96
+ "adaptive-ticket-creation": { "tags": ["tickets"] },
97
+ "architecture-scalability-audit": { "tags": ["review_audit"] },
98
+ "bug-investigation-agentic": { "tags": ["investigation"] },
99
+ "coding-task-workflow-agentic": { "tags": ["coding"] },
100
+ "cross-platform-code-conversion": { "tags": ["coding"] },
101
+ "document-creation-workflow": { "tags": ["documentation"] },
102
+ "documentation-update-workflow": { "tags": ["documentation"] },
103
+ "intelligent-test-case-generation": { "tags": ["tickets", "coding"] },
104
+ "mr-review-workflow-agentic": { "tags": ["review_audit"] },
105
+ "personal-learning-course-design": { "tags": ["learning"] },
106
+ "personal-learning-materials-creation-branched": { "tags": ["learning"] },
107
+ "presentation-creation": { "tags": ["learning"] },
108
+ "production-readiness-audit": { "tags": ["review_audit"] },
109
+ "relocation-workflow-us": { "tags": ["learning"] },
110
+ "routine-context-gathering": { "tags": ["routines"] },
111
+ "routine-design-review": { "tags": ["routines"] },
112
+ "routine-execution-simulation": { "tags": ["routines"] },
113
+ "routine-feature-implementation": { "tags": ["routines", "coding"] },
114
+ "routine-final-verification": { "tags": ["routines"] },
115
+ "routine-hypothesis-challenge": { "tags": ["routines"] },
116
+ "routine-ideation": { "tags": ["routines"] },
117
+ "routine-parallel-work-partitioning": { "tags": ["routines"] },
118
+ "routine-philosophy-alignment": { "tags": ["routines"] },
119
+ "routine-plan-analysis": { "tags": ["routines"] },
120
+ "routine-plan-generation": { "tags": ["routines"] },
121
+ "routine-tension-driven-design": { "tags": ["routines"] },
122
+ "scoped-documentation-workflow": { "tags": ["documentation"] },
123
+ "ticket-grooming": { "tags": ["tickets"] },
124
+ "ui-ux-design-workflow": { "tags": ["design"] },
125
+ "workflow-diagnose-environment": { "tags": ["investigation"] },
126
+ "workflow-for-workflows": { "tags": ["authoring"] },
127
+ "wr.discovery": { "tags": ["design", "investigation"] },
128
+ "test-artifact-loop-control": { "tags": ["coding"], "hidden": true },
129
+ "test-session-persistence": { "tags": ["coding"], "hidden": true },
130
+ "test-missing-context": { "tags": ["coding"], "hidden": true }
131
+ }
132
+ }
@@ -182,6 +182,24 @@
182
182
  "type": "integer",
183
183
  "minimum": 1,
184
184
  "description": "The authoring spec version this workflow was last validated against."
185
+ },
186
+ "about": {
187
+ "type": "string",
188
+ "description": "Human-readable overview for display in the console and other UIs. Markdown is supported. Write for a user deciding whether to use this workflow: what it does, when to use it, what it produces, and how to get good results. User-facing surface -- not an agent instruction (use metaGuidance for that).",
189
+ "minLength": 1,
190
+ "maxLength": 4096
191
+ },
192
+ "examples": {
193
+ "type": "array",
194
+ "description": "Short illustrative goal strings showing what this workflow is used for. Write for humans browsing the catalog and for agents selecting the right workflow. Each item should be concrete and specific enough to be informative.",
195
+ "items": {
196
+ "type": "string",
197
+ "minLength": 10,
198
+ "maxLength": 120
199
+ },
200
+ "minItems": 1,
201
+ "maxItems": 6,
202
+ "uniqueItems": true
185
203
  }
186
204
  },
187
205
  "required": [
@@ -1064,23 +1082,15 @@
1064
1082
  },
1065
1083
  "assessmentConsequenceTrigger": {
1066
1084
  "type": "object",
1067
- "description": "Exact-match trigger on one declared assessment dimension and one declared canonical level.",
1085
+ "description": "Fires when ANY dimension in the submitted assessment equals the given level. The consequence blocks advancement until the agent addresses all dimensions that scored at that level.",
1068
1086
  "properties": {
1069
- "dimensionId": {
1070
- "type": "string",
1071
- "minLength": 1,
1072
- "maxLength": 64
1073
- },
1074
- "equalsLevel": {
1087
+ "anyEqualsLevel": {
1075
1088
  "type": "string",
1076
1089
  "minLength": 1,
1077
1090
  "maxLength": 64
1078
1091
  }
1079
1092
  },
1080
- "required": [
1081
- "dimensionId",
1082
- "equalsLevel"
1083
- ],
1093
+ "required": ["anyEqualsLevel"],
1084
1094
  "additionalProperties": false
1085
1095
  },
1086
1096
  "assessmentConsequenceEffect": {
@@ -2,7 +2,14 @@
2
2
  "id": "adaptive-ticket-creation",
3
3
  "name": "Adaptive Ticket Creation Workflow",
4
4
  "version": "1.0.0",
5
- "description": "Create high-quality Jira tickets by automatically selecting the right complexity path (Simple, Standard, or Epic) based on request analysis. One polished ticket for simple requests; structured decomposition with estimates for epics.",
5
+ "description": "Use this to create high-quality Jira tickets for features, tasks, or epics. Automatically selects the right complexity path (Simple, Standard, or Epic) and generates properly structured tickets with acceptance criteria and estimates.",
6
+ "about": "## Adaptive Ticket Creation Workflow\n\nUse this to create well-structured Jira tickets for features, tasks, or epics. The workflow automatically selects the right complexity path (Simple, Standard, or Epic) based on the request, so you don't have to decide upfront how much process you need.\n\n### What it produces\n\n- **Simple path**: one complete, developer-ready Jira ticket with a context-rich description, checkbox-style acceptance criteria, and an effort estimate.\n- **Standard path**: a high-level plan plus a batch of related tickets covering all deliverables.\n- **Epic path**: everything in Standard, plus full epic decomposition, per-story estimates with risk ratings, dependency mapping, and a reusable team rules file at `.workflow_rules/ticket_creation.md` that future runs load automatically.\n\n### When to use it\n\n- You need to create one or more Jira tickets and want them to be genuinely developer-ready.\n- You have a feature request, bug, task, or epic that needs to be broken down and estimated.\n- Your team has specific ticket conventions (naming, sizing, labels) -- the workflow learns and stores these on the Epic path.\n\n### How to get good results\n\n- Provide as much context as you have: PRD links, design files, existing related tickets, and any known constraints.\n- If your team has a `.workflow_rules/ticket_creation.md` file, the workflow loads it automatically and applies your conventions.\n- On the Epic path, the workflow asks you to approve the high-level plan and the decomposition before generating tickets. Use these checkpoints to catch scope issues early.\n- Acceptance criteria are written as checkbox-style observable conditions, not restatements of requirements. If your team has a specific AC format, describe it in the rules file.",
7
+ "examples": [
8
+ "Create a Jira ticket for adding biometric authentication to the mobile login screen",
9
+ "Break down the new real-time notifications feature into an epic with stories and estimates",
10
+ "Write tickets for all backend work needed to support the v2 search API",
11
+ "Create a single bug ticket for the checkout crash when applying a promo code on iOS 17"
12
+ ],
6
13
  "preconditions": [
7
14
  "User has provided a description of the feature, task, or work to be ticketed.",
8
15
  "Agent has file system access for loading team preferences and persisting rules."
@@ -81,8 +88,14 @@
81
88
  "title": "Path C, Phase 1: Gather Context and Surface Gaps",
82
89
  "runCondition": {
83
90
  "or": [
84
- { "var": "pathComplexity", "equals": "Standard" },
85
- { "var": "pathComplexity", "equals": "Epic" }
91
+ {
92
+ "var": "pathComplexity",
93
+ "equals": "Standard"
94
+ },
95
+ {
96
+ "var": "pathComplexity",
97
+ "equals": "Epic"
98
+ }
86
99
  ]
87
100
  },
88
101
  "promptBlocks": {
@@ -116,8 +129,14 @@
116
129
  "title": "Path C, Phase 2: Create High-Level Plan",
117
130
  "runCondition": {
118
131
  "or": [
119
- { "var": "pathComplexity", "equals": "Standard" },
120
- { "var": "pathComplexity", "equals": "Epic" }
132
+ {
133
+ "var": "pathComplexity",
134
+ "equals": "Standard"
135
+ },
136
+ {
137
+ "var": "pathComplexity",
138
+ "equals": "Epic"
139
+ }
121
140
  ]
122
141
  },
123
142
  "promptBlocks": {
@@ -218,8 +237,14 @@
218
237
  "title": "Path C/E, Phase 5: Batch Ticket Generation",
219
238
  "runCondition": {
220
239
  "or": [
221
- { "var": "pathComplexity", "equals": "Standard" },
222
- { "var": "pathComplexity", "equals": "Epic" }
240
+ {
241
+ "var": "pathComplexity",
242
+ "equals": "Standard"
243
+ },
244
+ {
245
+ "var": "pathComplexity",
246
+ "equals": "Epic"
247
+ }
223
248
  ]
224
249
  },
225
250
  "promptBlocks": {
@@ -282,4 +307,4 @@
282
307
  "requireConfirmation": false
283
308
  }
284
309
  ]
285
- }
310
+ }
@@ -2,7 +2,14 @@
2
2
  "id": "architecture-scalability-audit",
3
3
  "name": "Architecture Scalability Audit (v1 • Evidence-Driven • Dimension-Scoped • rigorMode-Adaptive)",
4
4
  "version": "0.1.0",
5
- "description": "Audit a bounded codebase scope for architecture scalability. The user declares which scalability dimensions matter (load, data volume, team/org, feature extensibility, operational); the workflow audits only those dimensions and produces per-dimension verdicts grounded in actual code, not generic advice.",
5
+ "description": "Use this to audit a bounded codebase scope for architecture scalability. Declare which scalability dimensions matter (load, data volume, team size, feature extensibility, operational); the workflow investigates each and produces evidence-grounded findings.",
6
+ "about": "## Architecture Scalability Audit\n\nThis workflow audits a bounded codebase scope for scalability across the dimensions you care about. It does not produce generic \"won't scale\" warnings -- every finding must cite a specific file, class, method, or pattern, and every concern must name a concrete growth scenario (e.g. 10x traffic, 100x records, 3x team size).\n\n**What it does:**\nYou declare the scope boundary and the scalability dimensions that matter for your context. The workflow reads the codebase to understand the architecture, assigns one dedicated reviewer family per dimension, runs them in parallel from a shared fact packet, reconciles contradictions and blind spots through a synthesis loop, and delivers a per-dimension verdict (will_break / risk / fine) with an overall scalability readiness verdict.\n\n**The five scalability dimensions you can select:**\n- **load** -- handles more requests, users, or throughput\n- **data_volume** -- handles more records, storage, or query size\n- **team_org** -- more teams or developers working on this scope without friction\n- **feature_extensibility** -- more features added without rearchitecting\n- **operational** -- more deployments, environments, or operational complexity\n\n**When to use it:**\n- Before investing significantly in a component you expect to grow\n- When planning capacity for a new traffic tier or data volume increase\n- When evaluating a codebase acquired through a merger, partnership, or open-source adoption\n- When a team is growing and you want to know if the architecture will hold under parallel development\n\n**What it produces:**\nAn overall scalability verdict, per-dimension findings with specific code references and growth scenarios, cross-cutting concerns that span multiple dimensions, a prioritized concern list, and explicit callouts of what is already well-designed for scale.\n\n**How to get good results:**\nBe specific about the scope boundary -- name the service, module, or feature explicitly and say what is out of scope. Choose the dimensions relevant to your actual growth pressures; the workflow will not add dimensions you did not select. If you know a specific growth target (e.g. \"we expect 50x user growth in 18 months\"), mention it.",
7
+ "examples": [
8
+ "Audit the search service for load and data_volume scalability before the Black Friday traffic ramp",
9
+ "Check the analytics pipeline for data_volume and operational scalability -- we are moving from 1M to 100M events/day",
10
+ "Scalability audit of the user management module for team_org and feature_extensibility as we split into three squads",
11
+ "Audit the cart and checkout services for load scalability -- scope is /cart and /checkout only"
12
+ ],
6
13
  "recommendedPreferences": {
7
14
  "recommendedAutonomy": "guided",
8
15
  "recommendedRiskPolicy": "conservative"
@@ -33,7 +40,12 @@
33
40
  "promptBlocks": {
34
41
  "goal": "Establish a precise bounded scope and confirm which scalability dimensions this audit will cover.",
35
42
  "constraints": [
36
- [{ "kind": "ref", "refId": "wr.refs.notes_first_durability" }],
43
+ [
44
+ {
45
+ "kind": "ref",
46
+ "refId": "wr.refs.notes_first_durability"
47
+ }
48
+ ],
37
49
  "Scope must be bounded before investigation begins. Unbounded scope produces generic findings.",
38
50
  "Dimension selection is the user's decision. Explore the codebase to inform the conversation, but the user declares which dimensions matter."
39
51
  ],
@@ -87,7 +99,12 @@
87
99
  "promptBlocks": {
88
100
  "goal": "Freeze a neutral scalability fact packet and assign one reviewer family per declared dimension.",
89
101
  "constraints": [
90
- [{ "kind": "ref", "refId": "wr.refs.notes_first_durability" }],
102
+ [
103
+ {
104
+ "kind": "ref",
105
+ "refId": "wr.refs.notes_first_durability"
106
+ }
107
+ ],
91
108
  "The fact packet is the primary truth for all dimension reviewer families.",
92
109
  "Keep the scalability hypothesis as a reference to challenge, not a frame to defend.",
93
110
  "One reviewer family per declared dimension only. Do not add families for undeclared dimensions."
@@ -110,7 +127,10 @@
110
127
  "promptFragments": [
111
128
  {
112
129
  "id": "phase-2-quick",
113
- "when": { "var": "auditComplexity", "equals": "Simple" },
130
+ "when": {
131
+ "var": "auditComplexity",
132
+ "equals": "Simple"
133
+ },
114
134
  "text": "For a Simple audit, keep the fact packet compact — scope summary, key patterns, and declared dimensions only. Skip exhaustive realism signal enumeration."
115
135
  }
116
136
  ],
@@ -122,8 +142,18 @@
122
142
  "promptBlocks": {
123
143
  "goal": "Run one reviewer family per declared dimension in parallel, then synthesize their findings as evidence rather than verdicts.",
124
144
  "constraints": [
125
- [{ "kind": "ref", "refId": "wr.refs.notes_first_durability" }],
126
- [{ "kind": "ref", "refId": "wr.refs.synthesis_under_disagreement" }],
145
+ [
146
+ {
147
+ "kind": "ref",
148
+ "refId": "wr.refs.notes_first_durability"
149
+ }
150
+ ],
151
+ [
152
+ {
153
+ "kind": "ref",
154
+ "refId": "wr.refs.synthesis_under_disagreement"
155
+ }
156
+ ],
127
157
  "Each reviewer family uses scalabilityFactPacket as primary truth.",
128
158
  "Reviewer-family outputs are raw evidence. The main agent owns synthesis and verdict assignment.",
129
159
  "Each reviewer family audits only its declared dimension — no cross-dimension scope creep."
@@ -148,12 +178,18 @@
148
178
  "promptFragments": [
149
179
  {
150
180
  "id": "phase-3-quick",
151
- "when": { "var": "auditComplexity", "equals": "Simple" },
181
+ "when": {
182
+ "var": "auditComplexity",
183
+ "equals": "Simple"
184
+ },
152
185
  "text": "For a Simple audit, self-execute each dimension investigation directly without spawning WorkRail Executors. One dimension at a time, using tools to inspect the codebase. This keeps the audit proportionate to the scope."
153
186
  },
154
187
  {
155
188
  "id": "phase-3-thorough",
156
- "when": { "var": "auditComplexity", "equals": "Complex" },
189
+ "when": {
190
+ "var": "auditComplexity",
191
+ "equals": "Complex"
192
+ },
157
193
  "text": "For a Complex audit, spawn all dimension executors simultaneously, then after synthesis run routine-hypothesis-challenge against any will_break finding before closing this phase. This adds an adversarial check on the most serious findings."
158
194
  }
159
195
  ],
@@ -179,7 +215,12 @@
179
215
  "promptBlocks": {
180
216
  "goal": "Resolve contradictions between dimension findings and sharpen cross-cutting concerns.",
181
217
  "constraints": [
182
- [{ "kind": "ref", "refId": "wr.refs.parallelize_cognition_serialize_synthesis" }],
218
+ [
219
+ {
220
+ "kind": "ref",
221
+ "refId": "wr.refs.parallelize_cognition_serialize_synthesis"
222
+ }
223
+ ],
183
224
  "Contradiction resolution is main-agent work. Do not delegate synthesis.",
184
225
  "A cross-cutting concern that spans multiple dimensions is its own finding."
185
226
  ],
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "id": "bug-investigation-agentic",
3
- "name": "Bug Investigation (v2 Notes-First WorkRail Executor)",
3
+ "name": "Bug Investigation (v2 \u2022 Notes-First \u2022 WorkRail Executor)",
4
4
  "version": "2.0.0",
5
- "description": "A v2-first bug investigation workflow focused on moving from theory to proof with notes-first durability, explicit trigger fields, de-anchored fresh-eye review, and investigation-only handoff boundaries.",
5
+ "description": "Use this to diagnose a bug or unexpected behavior in code. Builds a hypothesis, gathers evidence, and proves or disproves the root cause before concluding.",
6
+ "about": "## Bug Investigation Workflow\n\nThis workflow guides an AI agent through a rigorous, evidence-driven investigation of a bug or unexpected behavior. It is designed to prevent the most common failure mode in AI debugging: jumping to a plausible-sounding conclusion without sufficient proof.\n\n**What it does:**\nThe workflow moves through triage, context gathering, hypothesis generation, evidence planning, iterative evidence collection, diagnosis validation, and a final handoff. It explicitly distinguishes between theories (formed by reading code) and proof (confirmed by running tests or reproducing the failure). The final output is a diagnosis with a confidence rating, the strongest alternative explanations that were ruled out, and a high-level fix direction -- not a patch.\n\n**When to use it:**\n- You have a specific bug report, failing test, or production incident to investigate\n- The root cause is not immediately obvious and multiple explanations are plausible\n- You want a trustworthy diagnosis before spending time writing a fix\n- The bug carries enough risk that you need to be confident before changing code\n\n**What it produces:**\nA structured investigation handoff covering: root cause type (single cause, multi-factor, working as designed, etc.), proof summary, ruled-out alternatives, residual uncertainty, likely files involved, and verification steps for whoever implements the fix.\n\n**How to get good results:**\nProvide repro steps, observed symptoms, and expected behavior upfront. Include any relevant logs, failing test commands, or environment details you already have. The more concrete the repro, the faster the workflow can gather real evidence rather than theorizing. If the bug is intermittent, say so -- the workflow adapts its rigor based on reproducibility confidence.",
7
+ "examples": [
8
+ "Investigate why the payments API returns 500 after deploying the rate limiter",
9
+ "Debug why the mobile app crashes on logout when a background sync is in progress",
10
+ "Find out why search results are missing items added in the last 10 minutes",
11
+ "Diagnose why CI passes locally but the integration test fails on the build server"
12
+ ],
6
13
  "recommendedPreferences": {
7
14
  "recommendedAutonomy": "guided",
8
15
  "recommendedRiskPolicy": "conservative"
@@ -39,7 +46,10 @@
39
46
  {
40
47
  "id": "confidence",
41
48
  "purpose": "How confident the agent is that the diagnosis is ready for final handoff.",
42
- "levels": ["low", "high"]
49
+ "levels": [
50
+ "low",
51
+ "high"
52
+ ]
43
53
  }
44
54
  ]
45
55
  }
@@ -47,7 +57,7 @@
47
57
  "steps": [
48
58
  {
49
59
  "id": "phase-0-triage-and-intake",
50
- "title": "Phase 0: Triage (Bug Intake Risk Mode)",
60
+ "title": "Phase 0: Triage (Bug Intake \u2022 Risk \u2022 Mode)",
51
61
  "prompt": "Understand the bug report and choose the right rigor.\n\nCapture:\n- `bugSummary`: concise statement of the issue\n- `reproSummary`: repro steps, symptoms, expected behavior, environment notes\n- `investigationComplexity`: Small / Medium / Large\n- `riskLevel`: Low / Medium / High\n- `rigorMode`: QUICK / STANDARD / THOROUGH\n- `automationLevel`: High / Medium / Low\n- `maxParallelism`: 0 / 2 / 3\n\nDecision guidance:\n- QUICK: clear repro, narrow surface area, low ambiguity\n- STANDARD: moderate ambiguity, moderate system breadth, or meaningful risk\n- THOROUGH: high ambiguity, high-risk production impact, broad surface area, or multiple plausible causes\n\nSet context variables:\n- `bugSummary`\n- `reproSummary`\n- `investigationComplexity`\n- `riskLevel`\n- `rigorMode`\n- `automationLevel`\n- `maxParallelism`\n- `reproducibilityConfidence` (High / Medium / Low)\n\nAsk for confirmation only if the chosen rigor materially affects expectations or if critical repro details are still missing.",
52
62
  "requireConfirmation": true
53
63
  },
@@ -57,8 +67,14 @@
57
67
  "prompt": "If critical inputs are missing, ask only for the minimum needed to investigate.\n\nPossible asks:\n- missing repro steps or failing test command\n- missing expected behavior\n- missing environment constraints or permissions\n- missing logs or stack traces when the codebase alone cannot answer the gap\n\nDo NOT ask for information you can discover with tools.",
58
68
  "requireConfirmation": {
59
69
  "or": [
60
- { "var": "automationLevel", "equals": "Low" },
61
- { "var": "automationLevel", "equals": "Medium" }
70
+ {
71
+ "var": "automationLevel",
72
+ "equals": "Low"
73
+ },
74
+ {
75
+ "var": "automationLevel",
76
+ "equals": "Medium"
77
+ }
62
78
  ]
63
79
  }
64
80
  },
@@ -78,8 +94,14 @@
78
94
  "prompt": "Reassess investigation scope after real context is known.\n\nReview:\n- `contextUnknownCount`\n- `executionPathCount`\n- `suspiciousPointCount`\n- actual systems/components involved\n- whether risk or ambiguity is larger than originally assessed\n\nDo:\n- confirm or adjust `investigationComplexity`\n- confirm or adjust `riskLevel`\n- confirm or adjust `rigorMode`\n- confirm or adjust `maxParallelism`\n\nSet context variables:\n- `investigationComplexity`\n- `riskLevel`\n- `rigorMode`\n- `maxParallelism`\n- `retriageChanged`\n\nRule:\n- upgrade rigor when the real investigation surface is broader or riskier than expected",
79
95
  "requireConfirmation": {
80
96
  "or": [
81
- { "var": "retriageChanged", "equals": true },
82
- { "var": "automationLevel", "equals": "Low" }
97
+ {
98
+ "var": "retriageChanged",
99
+ "equals": true
100
+ },
101
+ {
102
+ "var": "automationLevel",
103
+ "equals": "Low"
104
+ }
83
105
  ]
84
106
  }
85
107
  },
@@ -118,7 +140,7 @@
118
140
  {
119
141
  "id": "phase-4b-loop-decision",
120
142
  "title": "Evidence Loop Decision",
121
- "prompt": "Decide whether the evidence loop should continue.\n\nDecision rules:\n- if `contradictionCount > 0` continue\n- else if `unresolvedEvidenceGapCount > 0` continue\n- else if `hasStrongAlternative = true` and the alternative is not meaningfully weaker continue\n- else if `diagnosisType = inconclusive_but_narrowed` and further evidence is not realistically available stop with bounded uncertainty\n- else stop\n\nOutput exactly:\n```json\n{\n \"artifacts\": [{\n \"kind\": \"wr.loop_control\",\n \"decision\": \"continue\"\n }]\n}\n```",
143
+ "prompt": "Decide whether the evidence loop should continue.\n\nDecision rules:\n- if `contradictionCount > 0` \u2192 continue\n- else if `unresolvedEvidenceGapCount > 0` \u2192 continue\n- else if `hasStrongAlternative = true` and the alternative is not meaningfully weaker \u2192 continue\n- else if `diagnosisType = inconclusive_but_narrowed` and further evidence is not realistically available \u2192 stop with bounded uncertainty\n- else \u2192 stop\n\nOutput exactly:\n```json\n{\n \"artifacts\": [{\n \"kind\": \"wr.loop_control\",\n \"decision\": \"continue\"\n }]\n}\n```",
122
144
  "requireConfirmation": true,
123
145
  "outputContract": {
124
146
  "contractRef": "wr.contracts.loop_control"
@@ -130,12 +152,13 @@
130
152
  "id": "phase-5-diagnosis-validation",
131
153
  "title": "Phase 5: Diagnosis Validation Bundle",
132
154
  "prompt": "Stress-test the current diagnosis before handoff.\n\nSet `diagnosisConfidenceBand` using these rules:\n- High = all symptoms explained, no material contradictions, no unresolved evidence gaps\n- Medium = likely diagnosis, but one bounded uncertainty remains\n- Low = multiple viable explanations remain or contradictions are unresolved\n\nMode-adaptive validation:\n- QUICK: self-challenge; if `diagnosisConfidenceBand != High` or contradictions remain, optionally spawn ONE WorkRail Executor running `routine-hypothesis-challenge`\n- STANDARD: if delegation is available, spawn TWO WorkRail Executors SIMULTANEOUSLY running `routine-hypothesis-challenge` and `routine-execution-simulation`\n- THOROUGH: if delegation is available, spawn THREE WorkRail Executors SIMULTANEOUSLY running `routine-hypothesis-challenge`, `routine-execution-simulation`, and an additional `routine-hypothesis-challenge` pass focused on breaking the current diagnosis from a different angle\n\nParallel-output synthesis rules:\n- if 2+ validators raise serious concerns, reopen evidence or shortlist work\n- if exactly one validator raises a concern, investigate it before escalating\n- if no validator can materially break the diagnosis and `contradictionCount = 0`, proceed to handoff\n\nAfter synthesizing the validation result, assess whether the diagnosis is ready for final handoff.\n\nSet context variables:\n- `diagnosisConfidenceBand`\n- `validationFindingsCountBySeverity`\n- `validationSummary`\n\nBoundary rule:\n- allowed: high-level fix direction, likely files involved, verification recommendations\n- not allowed: implementation plan, patch sequencing, PR plan, or code-writing momentum",
133
- "assessmentRefs": ["diagnosis_readiness_gate"],
155
+ "assessmentRefs": [
156
+ "diagnosis_readiness_gate"
157
+ ],
134
158
  "assessmentConsequences": [
135
159
  {
136
160
  "when": {
137
- "dimensionId": "confidence",
138
- "equalsLevel": "low"
161
+ "anyEqualsLevel": "low"
139
162
  },
140
163
  "effect": {
141
164
  "kind": "require_followup",
@@ -145,8 +168,14 @@
145
168
  ],
146
169
  "requireConfirmation": {
147
170
  "or": [
148
- { "var": "diagnosisConfidenceBand", "equals": "Low" },
149
- { "var": "contradictionCount", "not_equals": 0 }
171
+ {
172
+ "var": "diagnosisConfidenceBand",
173
+ "equals": "Low"
174
+ },
175
+ {
176
+ "var": "contradictionCount",
177
+ "not_equals": 0
178
+ }
150
179
  ]
151
180
  }
152
181
  },