agentic-orchestrator 0.1.4 → 0.1.6
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/.claude/settings.local.json +6 -1
- package/README.md +81 -54
- package/agentic/orchestrator/defaults/policy.defaults.yaml +212 -0
- package/agentic/orchestrator/schemas/adapters.schema.json +17 -4
- package/agentic/orchestrator/schemas/agents.schema.json +58 -13
- package/agentic/orchestrator/schemas/gates.schema.json +88 -17
- package/agentic/orchestrator/schemas/index.schema.json +172 -37
- package/agentic/orchestrator/schemas/multi-project.schema.json +85 -17
- package/agentic/orchestrator/schemas/plan.schema.json +135 -30
- package/agentic/orchestrator/schemas/policy.schema.json +198 -69
- package/agentic/orchestrator/schemas/policy.user.schema.json +165 -0
- package/agentic/orchestrator/schemas/qa_test_index.schema.json +71 -14
- package/agentic/orchestrator/schemas/state.schema.json +196 -39
- package/apps/control-plane/scripts/validate-architecture-rules.mjs +5 -3
- package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +0 -3
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +2 -6
- package/apps/control-plane/src/application/services/policy-loader-service.ts +115 -0
- package/apps/control-plane/src/cli/aop.ts +35 -1
- package/apps/control-plane/src/cli/cli-argument-parser.ts +4 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +2 -1
- package/apps/control-plane/src/cli/init-command-handler.ts +136 -27
- package/apps/control-plane/src/cli/retry-command-handler.ts +3 -6
- package/apps/control-plane/src/cli/types.ts +1 -0
- package/apps/control-plane/src/core/git.ts +1 -3
- package/apps/control-plane/src/core/kernel.ts +3 -6
- package/apps/control-plane/src/core/schemas.ts +36 -1
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +1 -1
- package/apps/control-plane/src/mcp/tool-registry-loader.ts +37 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +1 -1
- package/apps/control-plane/test/aop.spec.ts +37 -0
- package/apps/control-plane/test/batch-operations.spec.ts +5 -3
- package/apps/control-plane/test/bootstrap-attach.spec.ts +28 -18
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +25 -15
- package/apps/control-plane/test/bootstrap.spec.ts +30 -22
- package/apps/control-plane/test/cli.unit.spec.ts +55 -10
- package/apps/control-plane/test/core-utils.spec.ts +12 -3
- package/apps/control-plane/test/feature-deletion-service.spec.ts +2 -1
- package/apps/control-plane/test/feature-lifecycle.spec.ts +1 -1
- package/apps/control-plane/test/helpers.ts +22 -2
- package/apps/control-plane/test/init-wizard.spec.ts +160 -7
- package/apps/control-plane/test/issue-tracker.spec.ts +3 -3
- package/apps/control-plane/test/kernel.spec.ts +62 -0
- package/apps/control-plane/test/lock-service.spec.ts +4 -4
- package/apps/control-plane/test/policy-loader-service.spec.ts +346 -0
- package/apps/control-plane/test/reactions.spec.ts +8 -6
- package/apps/control-plane/test/resume-command.spec.ts +31 -15
- package/apps/control-plane/test/supervisor.unit.spec.ts +2 -2
- package/apps/control-plane/test/tool-registry-loader.spec.ts +12 -0
- package/apps/control-plane/vitest.config.ts +1 -1
- package/dist/apps/control-plane/application/services/policy-loader-service.d.ts +24 -0
- package/dist/apps/control-plane/application/services/policy-loader-service.js +90 -0
- package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -0
- package/dist/apps/control-plane/application/tools/tool-metadata.js +1 -0
- package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
- package/dist/apps/control-plane/cli/aop.js +33 -1
- package/dist/apps/control-plane/cli/aop.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -0
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +11 -5
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/help-command-handler.js +5 -4
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.d.ts +1 -0
- package/dist/apps/control-plane/cli/init-command-handler.js +110 -26
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +3 -6
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/types.d.ts +1 -0
- package/dist/apps/control-plane/core/git.js +1 -3
- package/dist/apps/control-plane/core/git.js.map +1 -1
- package/dist/apps/control-plane/core/kernel.js +3 -5
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/schemas.d.ts +2 -0
- package/dist/apps/control-plane/core/schemas.js +31 -1
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.d.ts +2 -0
- package/dist/apps/control-plane/mcp/tool-registry-loader.js +31 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/package.json +18 -17
- package/packages/web-dashboard/package.json +1 -1
- package/packages/web-dashboard/src/app/api/actions/route.ts +2 -2
- package/packages/web-dashboard/src/app/api/events/route.ts +1 -1
- package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +1 -1
- package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +1 -1
- package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +1 -1
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +2 -2
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +1 -1
- package/packages/web-dashboard/src/app/api/projects/route.ts +2 -2
- package/packages/web-dashboard/src/app/api/status/route.ts +1 -1
- package/packages/web-dashboard/src/app/page.tsx +1 -1
- package/packages/web-dashboard/src/lib/aop-client.ts +1 -1
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +1 -1
- package/packages/web-dashboard/tsconfig.json +1 -0
- package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +481 -0
- package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +500 -0
- package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +500 -195
- package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +471 -162
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +532 -268
- package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +645 -0
- package/spec-files/progress.md +99 -2
- package/tsconfig.base.json +4 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_validator_hardening_spec.md +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://example.local/agentic/policy.schema.json",
|
|
4
|
+
"description": "Merged (defaults + user overrides) policy controlling orchestrator behaviour, gates, locks, and merge rules.",
|
|
4
5
|
"type": "object",
|
|
5
6
|
"additionalProperties": false,
|
|
6
7
|
"required": [
|
|
@@ -23,40 +24,48 @@
|
|
|
23
24
|
],
|
|
24
25
|
"properties": {
|
|
25
26
|
"version": {
|
|
26
|
-
"type": "number"
|
|
27
|
+
"type": "number",
|
|
28
|
+
"description": "Schema version number for the policy file."
|
|
27
29
|
},
|
|
28
30
|
"commit_policy": {
|
|
29
31
|
"type": "object",
|
|
32
|
+
"description": "Controls whether the orchestrator may create commits or execute merges on behalf of agents.",
|
|
30
33
|
"required": [
|
|
31
34
|
"allow_commit",
|
|
32
35
|
"allow_merge"
|
|
33
36
|
],
|
|
34
37
|
"properties": {
|
|
35
38
|
"allow_commit": {
|
|
36
|
-
"type": "boolean"
|
|
39
|
+
"type": "boolean",
|
|
40
|
+
"description": "When false, agents are not permitted to stage and commit changes to the feature branch."
|
|
37
41
|
},
|
|
38
42
|
"allow_merge": {
|
|
39
|
-
"type": "boolean"
|
|
43
|
+
"type": "boolean",
|
|
44
|
+
"description": "When false, merges are blocked even if all required gate modes have passed."
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
47
|
},
|
|
43
48
|
"patch_policy": {
|
|
44
49
|
"type": "object",
|
|
50
|
+
"description": "Constraints applied to file patches before they are written to the feature worktree.",
|
|
45
51
|
"required": [
|
|
46
52
|
"enforce_plan",
|
|
47
53
|
"enforce_allowed_areas"
|
|
48
54
|
],
|
|
49
55
|
"properties": {
|
|
50
56
|
"enforce_plan": {
|
|
51
|
-
"type": "boolean"
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"description": "When true, repo_apply_patch requires an accepted plan to exist before any patch is applied. Throws PLAN_REQUIRED if no plan is found."
|
|
52
59
|
},
|
|
53
60
|
"enforce_allowed_areas": {
|
|
54
|
-
"type": "boolean"
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"description": "When true, every file touched by a patch must match at least one path in the plan's allowed_areas. Violations throw PATCH_POLICY_VIOLATION."
|
|
55
63
|
}
|
|
56
64
|
}
|
|
57
65
|
},
|
|
58
66
|
"locks": {
|
|
59
67
|
"type": "object",
|
|
68
|
+
"description": "Distributed lock configuration controlling concurrent feature access to shared contract resources.",
|
|
60
69
|
"required": [
|
|
61
70
|
"resources",
|
|
62
71
|
"contract_to_resource",
|
|
@@ -68,6 +77,7 @@
|
|
|
68
77
|
"properties": {
|
|
69
78
|
"resources": {
|
|
70
79
|
"type": "array",
|
|
80
|
+
"description": "Ordered list of lockable resource names (e.g. 'openapi', 'events', 'db'). Only names in this list are accepted by the lock service.",
|
|
71
81
|
"items": {
|
|
72
82
|
"type": "string",
|
|
73
83
|
"minLength": 1
|
|
@@ -75,6 +85,7 @@
|
|
|
75
85
|
},
|
|
76
86
|
"contract_to_resource": {
|
|
77
87
|
"type": "object",
|
|
88
|
+
"description": "Maps plan contract types to the lock resource name they require. Used by plan and patch services to determine which locks must be held.",
|
|
78
89
|
"required": [
|
|
79
90
|
"openapi",
|
|
80
91
|
"events",
|
|
@@ -82,22 +93,27 @@
|
|
|
82
93
|
],
|
|
83
94
|
"properties": {
|
|
84
95
|
"openapi": {
|
|
85
|
-
"type": "string"
|
|
96
|
+
"type": "string",
|
|
97
|
+
"description": "Lock resource name required when a plan declares contracts.openapi = 'modify'."
|
|
86
98
|
},
|
|
87
99
|
"events": {
|
|
88
|
-
"type": "string"
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Lock resource name required when a plan declares contracts.events = 'modify'."
|
|
89
102
|
},
|
|
90
103
|
"db": {
|
|
91
|
-
"type": "string"
|
|
104
|
+
"type": "string",
|
|
105
|
+
"description": "Lock resource name required when a plan declares contracts.db = 'migration'."
|
|
92
106
|
}
|
|
93
107
|
}
|
|
94
108
|
},
|
|
95
109
|
"lease_ttl_seconds": {
|
|
96
110
|
"type": "number",
|
|
97
|
-
"minimum": 1
|
|
111
|
+
"minimum": 1,
|
|
112
|
+
"description": "How long in seconds a lock lease remains valid before it can be reclaimed as stale by another feature."
|
|
98
113
|
},
|
|
99
114
|
"acquire_behavior": {
|
|
100
115
|
"type": "string",
|
|
116
|
+
"description": "'wait' polls until the lock is freed or the timeout is reached; 'fail' returns LOCK_CONFLICT immediately if the lock is held.",
|
|
101
117
|
"enum": [
|
|
102
118
|
"wait",
|
|
103
119
|
"fail"
|
|
@@ -105,10 +121,12 @@
|
|
|
105
121
|
},
|
|
106
122
|
"default_wait_timeout_seconds": {
|
|
107
123
|
"type": "number",
|
|
108
|
-
"minimum": 1
|
|
124
|
+
"minimum": 1,
|
|
125
|
+
"description": "Maximum time in seconds to wait for a lock when acquire_behavior is 'wait'."
|
|
109
126
|
},
|
|
110
127
|
"acquire_backoff": {
|
|
111
128
|
"type": "object",
|
|
129
|
+
"description": "Exponential backoff parameters used between lock polling attempts when acquire_behavior is 'wait'.",
|
|
112
130
|
"required": [
|
|
113
131
|
"initial_ms",
|
|
114
132
|
"max_ms",
|
|
@@ -118,19 +136,23 @@
|
|
|
118
136
|
"properties": {
|
|
119
137
|
"initial_ms": {
|
|
120
138
|
"type": "number",
|
|
121
|
-
"minimum": 1
|
|
139
|
+
"minimum": 1,
|
|
140
|
+
"description": "Initial delay in milliseconds before the first lock retry."
|
|
122
141
|
},
|
|
123
142
|
"max_ms": {
|
|
124
143
|
"type": "number",
|
|
125
|
-
"minimum": 1
|
|
144
|
+
"minimum": 1,
|
|
145
|
+
"description": "Maximum delay in milliseconds; backoff is capped at this value."
|
|
126
146
|
},
|
|
127
147
|
"multiplier": {
|
|
128
148
|
"type": "number",
|
|
129
|
-
"minimum": 1
|
|
149
|
+
"minimum": 1,
|
|
150
|
+
"description": "Factor by which the delay is multiplied after each failed lock attempt."
|
|
130
151
|
},
|
|
131
152
|
"jitter_ms": {
|
|
132
153
|
"type": "number",
|
|
133
|
-
"minimum": 0
|
|
154
|
+
"minimum": 0,
|
|
155
|
+
"description": "Maximum random jitter in milliseconds added to each backoff delay to spread out competing lock attempts."
|
|
134
156
|
}
|
|
135
157
|
}
|
|
136
158
|
}
|
|
@@ -138,38 +160,45 @@
|
|
|
138
160
|
},
|
|
139
161
|
"protected_areas": {
|
|
140
162
|
"type": "array",
|
|
163
|
+
"description": "Path prefixes or glob patterns that no agent patch may touch, regardless of the plan. Violations throw PATCH_POLICY_VIOLATION with reason 'in_protected_areas'.",
|
|
141
164
|
"items": {
|
|
142
165
|
"type": "string"
|
|
143
166
|
}
|
|
144
167
|
},
|
|
145
168
|
"exclusive_areas": {
|
|
146
169
|
"type": "array",
|
|
170
|
+
"description": "Path prefixes or glob patterns that trigger a plan collision when two concurrent plans both declare changes to the same exclusive area.",
|
|
147
171
|
"items": {
|
|
148
172
|
"type": "string"
|
|
149
173
|
}
|
|
150
174
|
},
|
|
151
175
|
"required_modes": {
|
|
152
176
|
"type": "array",
|
|
177
|
+
"description": "Gate modes that must all have passed (status 'pass' in state.gates) before a merge is allowed.",
|
|
153
178
|
"items": {
|
|
154
179
|
"type": "string"
|
|
155
180
|
},
|
|
156
181
|
"minItems": 1
|
|
157
182
|
},
|
|
158
183
|
"required_merge_mode": {
|
|
159
|
-
"type": "string"
|
|
184
|
+
"type": "string",
|
|
185
|
+
"description": "Additional gate mode that must have passed immediately before merge (typically 'merge'), on top of required_modes."
|
|
160
186
|
},
|
|
161
187
|
"collision_policy": {
|
|
162
188
|
"type": "string",
|
|
189
|
+
"description": "'reject' immediately fails a colliding plan submission; 'block' queues the plan in index.blocked_queue until the conflicting feature merges.",
|
|
163
190
|
"enum": [
|
|
164
191
|
"reject",
|
|
165
192
|
"block"
|
|
166
193
|
]
|
|
167
194
|
},
|
|
168
195
|
"config_precedence": {
|
|
169
|
-
"type": "object"
|
|
196
|
+
"type": "object",
|
|
197
|
+
"description": "Reserved for future layered-config precedence rules. Currently persisted but not evaluated by the runtime."
|
|
170
198
|
},
|
|
171
199
|
"path_rules": {
|
|
172
200
|
"type": "object",
|
|
201
|
+
"description": "Controls how file paths are matched and normalised when validating patches against plans.",
|
|
173
202
|
"required": [
|
|
174
203
|
"matching",
|
|
175
204
|
"normalize_paths",
|
|
@@ -178,6 +207,7 @@
|
|
|
178
207
|
"properties": {
|
|
179
208
|
"matching": {
|
|
180
209
|
"type": "string",
|
|
210
|
+
"description": "'repo_prefix' uses a simple string-prefix check; 'glob' uses minimatch glob patterns for allowed_areas and forbidden_areas.",
|
|
181
211
|
"enum": [
|
|
182
212
|
"repo_prefix",
|
|
183
213
|
"glob"
|
|
@@ -185,15 +215,18 @@
|
|
|
185
215
|
},
|
|
186
216
|
"normalize_paths": {
|
|
187
217
|
"type": "boolean",
|
|
188
|
-
"const": true
|
|
218
|
+
"const": true,
|
|
219
|
+
"description": "Must be true. Ensures all patch paths are resolved to repo-relative form before comparison."
|
|
189
220
|
},
|
|
190
221
|
"allow_symlink_traversal": {
|
|
191
|
-
"type": "boolean"
|
|
222
|
+
"type": "boolean",
|
|
223
|
+
"description": "When false, path normalisation rejects paths that would escape the repository root via symlinks."
|
|
192
224
|
}
|
|
193
225
|
}
|
|
194
226
|
},
|
|
195
227
|
"execution": {
|
|
196
228
|
"type": "object",
|
|
229
|
+
"description": "Settings governing how gate step commands are executed and retried.",
|
|
197
230
|
"required": [
|
|
198
231
|
"default_step_timeout_seconds",
|
|
199
232
|
"retry_policy",
|
|
@@ -202,10 +235,12 @@
|
|
|
202
235
|
"properties": {
|
|
203
236
|
"default_step_timeout_seconds": {
|
|
204
237
|
"type": "number",
|
|
205
|
-
"minimum": 1
|
|
238
|
+
"minimum": 1,
|
|
239
|
+
"description": "Default execution timeout applied to each gate step that does not declare its own timeout_seconds."
|
|
206
240
|
},
|
|
207
241
|
"retry_policy": {
|
|
208
242
|
"type": "object",
|
|
243
|
+
"description": "Governs automatic retries for transient gate execution failures.",
|
|
209
244
|
"required": [
|
|
210
245
|
"transient_max_retries",
|
|
211
246
|
"transient_error_codes",
|
|
@@ -214,16 +249,19 @@
|
|
|
214
249
|
"properties": {
|
|
215
250
|
"transient_max_retries": {
|
|
216
251
|
"type": "number",
|
|
217
|
-
"minimum": 0
|
|
252
|
+
"minimum": 0,
|
|
253
|
+
"description": "Maximum number of retry attempts for errors whose exit code appears in transient_error_codes."
|
|
218
254
|
},
|
|
219
255
|
"transient_error_codes": {
|
|
220
256
|
"type": "array",
|
|
257
|
+
"description": "Process exit codes considered transient and eligible for automatic retry.",
|
|
221
258
|
"items": {
|
|
222
259
|
"type": "number"
|
|
223
260
|
}
|
|
224
261
|
},
|
|
225
262
|
"non_retryable_error_codes": {
|
|
226
263
|
"type": "array",
|
|
264
|
+
"description": "Process exit codes that immediately abort the gate run without any retry attempt.",
|
|
227
265
|
"items": {
|
|
228
266
|
"type": "number"
|
|
229
267
|
}
|
|
@@ -232,6 +270,7 @@
|
|
|
232
270
|
},
|
|
233
271
|
"env_allowlist": {
|
|
234
272
|
"type": "array",
|
|
273
|
+
"description": "Environment variable names from the host process that are forwarded into gate step subprocesses. All other env vars are stripped.",
|
|
235
274
|
"items": {
|
|
236
275
|
"type": "string"
|
|
237
276
|
}
|
|
@@ -240,18 +279,21 @@
|
|
|
240
279
|
},
|
|
241
280
|
"implementation": {
|
|
242
281
|
"type": "object",
|
|
282
|
+
"description": "Monorepo tooling configuration used by the kernel when locating project files.",
|
|
243
283
|
"required": [
|
|
244
284
|
"workspace"
|
|
245
285
|
],
|
|
246
286
|
"properties": {
|
|
247
287
|
"workspace": {
|
|
248
288
|
"type": "string",
|
|
249
|
-
"const": "nx"
|
|
289
|
+
"const": "nx",
|
|
290
|
+
"description": "Monorepo workspace tool. Must be 'nx'; the kernel uses this when resolving project paths."
|
|
250
291
|
}
|
|
251
292
|
}
|
|
252
293
|
},
|
|
253
294
|
"testing": {
|
|
254
295
|
"type": "object",
|
|
296
|
+
"description": "Test framework and global coverage threshold configuration.",
|
|
255
297
|
"required": [
|
|
256
298
|
"framework",
|
|
257
299
|
"coverage"
|
|
@@ -259,10 +301,12 @@
|
|
|
259
301
|
"properties": {
|
|
260
302
|
"framework": {
|
|
261
303
|
"type": "string",
|
|
262
|
-
"const": "vitest"
|
|
304
|
+
"const": "vitest",
|
|
305
|
+
"description": "Test framework that gate steps use. Must be 'vitest'."
|
|
263
306
|
},
|
|
264
307
|
"coverage": {
|
|
265
308
|
"type": "object",
|
|
309
|
+
"description": "Global coverage thresholds. Per-profile thresholds in gates.yaml override these when the profile value is higher.",
|
|
266
310
|
"required": [
|
|
267
311
|
"minimums",
|
|
268
312
|
"targets"
|
|
@@ -270,6 +314,7 @@
|
|
|
270
314
|
"properties": {
|
|
271
315
|
"minimums": {
|
|
272
316
|
"type": "object",
|
|
317
|
+
"description": "Minimum acceptable coverage fractions. A gate run fails if the measured coverage falls below these values.",
|
|
273
318
|
"required": [
|
|
274
319
|
"line",
|
|
275
320
|
"branch"
|
|
@@ -278,17 +323,20 @@
|
|
|
278
323
|
"line": {
|
|
279
324
|
"type": "number",
|
|
280
325
|
"minimum": 0,
|
|
281
|
-
"maximum": 1
|
|
326
|
+
"maximum": 1,
|
|
327
|
+
"description": "Minimum line coverage fraction (0\u20131)."
|
|
282
328
|
},
|
|
283
329
|
"branch": {
|
|
284
330
|
"type": "number",
|
|
285
331
|
"minimum": 0,
|
|
286
|
-
"maximum": 1
|
|
332
|
+
"maximum": 1,
|
|
333
|
+
"description": "Minimum branch coverage fraction (0\u20131)."
|
|
287
334
|
}
|
|
288
335
|
}
|
|
289
336
|
},
|
|
290
337
|
"targets": {
|
|
291
338
|
"type": "object",
|
|
339
|
+
"description": "Target (aspirational) coverage fractions used for reporting. Not enforced by the gate runner.",
|
|
292
340
|
"required": [
|
|
293
341
|
"line",
|
|
294
342
|
"branch"
|
|
@@ -297,12 +345,14 @@
|
|
|
297
345
|
"line": {
|
|
298
346
|
"type": "number",
|
|
299
347
|
"minimum": 0,
|
|
300
|
-
"maximum": 1
|
|
348
|
+
"maximum": 1,
|
|
349
|
+
"description": "Target line coverage fraction (0\u20131)."
|
|
301
350
|
},
|
|
302
351
|
"branch": {
|
|
303
352
|
"type": "number",
|
|
304
353
|
"minimum": 0,
|
|
305
|
-
"maximum": 1
|
|
354
|
+
"maximum": 1,
|
|
355
|
+
"description": "Target branch coverage fraction (0\u20131)."
|
|
306
356
|
}
|
|
307
357
|
}
|
|
308
358
|
}
|
|
@@ -312,16 +362,19 @@
|
|
|
312
362
|
},
|
|
313
363
|
"merge_policy": {
|
|
314
364
|
"type": "object",
|
|
365
|
+
"description": "Controls when and how the orchestrator may merge a feature branch into the base branch.",
|
|
315
366
|
"required": [
|
|
316
367
|
"require_user_approval",
|
|
317
368
|
"allowed_strategies"
|
|
318
369
|
],
|
|
319
370
|
"properties": {
|
|
320
371
|
"require_user_approval": {
|
|
321
|
-
"type": "boolean"
|
|
372
|
+
"type": "boolean",
|
|
373
|
+
"description": "When true, a user-provided approval token must be supplied to the merge tool before the merge proceeds."
|
|
322
374
|
},
|
|
323
375
|
"allowed_strategies": {
|
|
324
376
|
"type": "array",
|
|
377
|
+
"description": "Merge strategies available to the orchestrator. Requesting an unlisted strategy throws MERGE_DISABLED.",
|
|
325
378
|
"items": {
|
|
326
379
|
"type": "string",
|
|
327
380
|
"enum": [
|
|
@@ -335,22 +388,26 @@
|
|
|
335
388
|
},
|
|
336
389
|
"worktree": {
|
|
337
390
|
"type": "object",
|
|
391
|
+
"description": "Git worktree configuration controlling how feature branches and working directories are created.",
|
|
338
392
|
"required": [
|
|
339
393
|
"base_branch"
|
|
340
394
|
],
|
|
341
395
|
"properties": {
|
|
342
396
|
"base_branch": {
|
|
343
397
|
"type": "string",
|
|
344
|
-
"minLength": 1
|
|
398
|
+
"minLength": 1,
|
|
399
|
+
"description": "Git branch that feature branches are created from and merged into (e.g. 'main')."
|
|
345
400
|
},
|
|
346
401
|
"post_create": {
|
|
347
402
|
"type": "array",
|
|
403
|
+
"description": "Shell commands run after a new worktree is created, e.g. to install dependencies.",
|
|
348
404
|
"items": {
|
|
349
405
|
"type": "string"
|
|
350
406
|
}
|
|
351
407
|
},
|
|
352
408
|
"symlinks": {
|
|
353
409
|
"type": "array",
|
|
410
|
+
"description": "Repo-relative paths to symlink into every new feature worktree, e.g. shared secrets or config files.",
|
|
354
411
|
"items": {
|
|
355
412
|
"type": "string"
|
|
356
413
|
}
|
|
@@ -359,6 +416,7 @@
|
|
|
359
416
|
},
|
|
360
417
|
"rbac": {
|
|
361
418
|
"type": "object",
|
|
419
|
+
"description": "Role-based access control map. Keys are role names (e.g. 'builder'); values are lists of MCP tool names that role is allowed to call.",
|
|
362
420
|
"additionalProperties": {
|
|
363
421
|
"type": "array",
|
|
364
422
|
"items": {
|
|
@@ -368,101 +426,126 @@
|
|
|
368
426
|
},
|
|
369
427
|
"recovery": {
|
|
370
428
|
"type": "object",
|
|
429
|
+
"description": "Settings for handling orphaned or stale orchestrator sessions at startup.",
|
|
371
430
|
"properties": {
|
|
372
431
|
"orchestrator_session_reattach_timeout_ms": {
|
|
373
432
|
"type": "number",
|
|
374
|
-
"minimum": 0
|
|
433
|
+
"minimum": 0,
|
|
434
|
+
"description": "Milliseconds to wait for an existing orchestrator session to reattach before treating it as orphaned."
|
|
375
435
|
},
|
|
376
436
|
"orphan_session_cleanup_enabled": {
|
|
377
|
-
"type": "boolean"
|
|
437
|
+
"type": "boolean",
|
|
438
|
+
"description": "When true, orphaned agent sessions detected at startup are automatically cleaned up."
|
|
378
439
|
}
|
|
379
440
|
}
|
|
380
441
|
},
|
|
381
442
|
"supervisor": {
|
|
382
443
|
"type": "object",
|
|
444
|
+
"description": "Supervisor loop tuning parameters.",
|
|
383
445
|
"additionalProperties": false,
|
|
384
446
|
"properties": {
|
|
385
447
|
"max_iterations_per_phase": {
|
|
386
448
|
"type": "integer",
|
|
387
449
|
"minimum": 0,
|
|
388
|
-
"default": 6
|
|
450
|
+
"default": 6,
|
|
451
|
+
"description": "Maximum agent iterations allowed per phase (planning, build, QA) before the supervisor escalates or fails the feature. Default 6."
|
|
389
452
|
},
|
|
390
453
|
"max_parallel_gate_runs": {
|
|
391
454
|
"type": "integer",
|
|
392
455
|
"minimum": 1,
|
|
393
|
-
"default": 2
|
|
456
|
+
"default": 2,
|
|
457
|
+
"description": "Maximum number of gate runs that may execute concurrently across all active features. Default 2."
|
|
394
458
|
},
|
|
395
459
|
"agent_idle_threshold_ms": {
|
|
396
460
|
"type": "integer",
|
|
397
461
|
"minimum": 0,
|
|
398
|
-
"default": 300000
|
|
462
|
+
"default": 300000,
|
|
463
|
+
"description": "Milliseconds of agent inactivity after which an agent is considered stuck and may trigger the agent_stuck reaction. Default 300000 (5 min)."
|
|
399
464
|
}
|
|
400
465
|
}
|
|
401
466
|
},
|
|
402
467
|
"cleanup": {
|
|
403
468
|
"type": "object",
|
|
469
|
+
"description": "Controls automatic cleanup of merged feature worktrees and branches.",
|
|
404
470
|
"properties": {
|
|
405
471
|
"auto_after_merge": {
|
|
406
|
-
"type": "boolean"
|
|
472
|
+
"type": "boolean",
|
|
473
|
+
"description": "When true, the feature worktree and branch are automatically removed after a successful merge."
|
|
407
474
|
},
|
|
408
475
|
"grace_period_seconds": {
|
|
409
476
|
"type": "number",
|
|
410
|
-
"minimum": 0
|
|
477
|
+
"minimum": 0,
|
|
478
|
+
"description": "Delay in seconds before automatic post-merge cleanup runs, allowing time for CI or post-merge hooks to reference the worktree."
|
|
411
479
|
}
|
|
412
480
|
}
|
|
413
481
|
},
|
|
414
482
|
"dashboard": {
|
|
415
483
|
"type": "object",
|
|
484
|
+
"description": "Real-time status dashboard HTTP server settings.",
|
|
416
485
|
"properties": {
|
|
417
486
|
"enabled": {
|
|
418
|
-
"type": "boolean"
|
|
487
|
+
"type": "boolean",
|
|
488
|
+
"description": "Whether the dashboard HTTP server is started alongside the orchestrator."
|
|
419
489
|
},
|
|
420
490
|
"port": {
|
|
421
491
|
"type": "number",
|
|
422
492
|
"minimum": 1,
|
|
423
|
-
"maximum": 65535
|
|
493
|
+
"maximum": 65535,
|
|
494
|
+
"description": "Port the dashboard HTTP server listens on."
|
|
424
495
|
}
|
|
425
496
|
}
|
|
426
497
|
},
|
|
427
498
|
"notifications": {
|
|
428
499
|
"type": "object",
|
|
500
|
+
"description": "Notification delivery configuration for orchestrator events.",
|
|
429
501
|
"properties": {
|
|
430
502
|
"enabled": {
|
|
431
|
-
"type": "boolean"
|
|
503
|
+
"type": "boolean",
|
|
504
|
+
"description": "Master switch for all notification channels."
|
|
432
505
|
},
|
|
433
506
|
"channels": {
|
|
434
507
|
"type": "object",
|
|
508
|
+
"description": "Per-channel delivery configuration.",
|
|
435
509
|
"properties": {
|
|
436
510
|
"desktop": {
|
|
437
511
|
"type": "object",
|
|
512
|
+
"description": "Desktop OS notification settings.",
|
|
438
513
|
"properties": {
|
|
439
514
|
"enabled": {
|
|
440
|
-
"type": "boolean"
|
|
515
|
+
"type": "boolean",
|
|
516
|
+
"description": "Whether desktop OS notifications are sent."
|
|
441
517
|
}
|
|
442
518
|
}
|
|
443
519
|
},
|
|
444
520
|
"slack": {
|
|
445
521
|
"type": "object",
|
|
522
|
+
"description": "Slack notification settings.",
|
|
446
523
|
"properties": {
|
|
447
524
|
"enabled": {
|
|
448
|
-
"type": "boolean"
|
|
525
|
+
"type": "boolean",
|
|
526
|
+
"description": "Whether Slack notifications are sent."
|
|
449
527
|
},
|
|
450
528
|
"webhook": {
|
|
451
|
-
"type": "string"
|
|
529
|
+
"type": "string",
|
|
530
|
+
"description": "Incoming webhook URL for Slack notifications."
|
|
452
531
|
},
|
|
453
532
|
"channel": {
|
|
454
|
-
"type": "string"
|
|
533
|
+
"type": "string",
|
|
534
|
+
"description": "Slack channel to post to when using the webhook."
|
|
455
535
|
}
|
|
456
536
|
}
|
|
457
537
|
},
|
|
458
538
|
"webhook": {
|
|
459
539
|
"type": "object",
|
|
540
|
+
"description": "Generic outbound HTTP webhook settings.",
|
|
460
541
|
"properties": {
|
|
461
542
|
"enabled": {
|
|
462
|
-
"type": "boolean"
|
|
543
|
+
"type": "boolean",
|
|
544
|
+
"description": "Whether the outbound HTTP webhook is called for notifications."
|
|
463
545
|
},
|
|
464
546
|
"url": {
|
|
465
|
-
"type": "string"
|
|
547
|
+
"type": "string",
|
|
548
|
+
"description": "URL of the outbound webhook endpoint."
|
|
466
549
|
}
|
|
467
550
|
}
|
|
468
551
|
}
|
|
@@ -470,36 +553,42 @@
|
|
|
470
553
|
},
|
|
471
554
|
"routing": {
|
|
472
555
|
"type": "object",
|
|
556
|
+
"description": "Maps event severity levels to the channel names that should receive them.",
|
|
473
557
|
"properties": {
|
|
474
558
|
"critical": {
|
|
475
559
|
"type": "array",
|
|
476
560
|
"items": {
|
|
477
561
|
"type": "string"
|
|
478
|
-
}
|
|
562
|
+
},
|
|
563
|
+
"description": "Channel names that receive 'critical' severity events (e.g. budget exceeded, run failure)."
|
|
479
564
|
},
|
|
480
565
|
"urgent": {
|
|
481
566
|
"type": "array",
|
|
482
567
|
"items": {
|
|
483
568
|
"type": "string"
|
|
484
|
-
}
|
|
569
|
+
},
|
|
570
|
+
"description": "Channel names that receive 'urgent' severity events."
|
|
485
571
|
},
|
|
486
572
|
"action": {
|
|
487
573
|
"type": "array",
|
|
488
574
|
"items": {
|
|
489
575
|
"type": "string"
|
|
490
|
-
}
|
|
576
|
+
},
|
|
577
|
+
"description": "Channel names that receive 'action' severity events (e.g. merge ready, user approval needed)."
|
|
491
578
|
},
|
|
492
579
|
"warning": {
|
|
493
580
|
"type": "array",
|
|
494
581
|
"items": {
|
|
495
582
|
"type": "string"
|
|
496
|
-
}
|
|
583
|
+
},
|
|
584
|
+
"description": "Channel names that receive 'warning' severity events (e.g. budget alert, agent stuck)."
|
|
497
585
|
},
|
|
498
586
|
"info": {
|
|
499
587
|
"type": "array",
|
|
500
588
|
"items": {
|
|
501
589
|
"type": "string"
|
|
502
|
-
}
|
|
590
|
+
},
|
|
591
|
+
"description": "Channel names that receive 'info' severity events."
|
|
503
592
|
}
|
|
504
593
|
}
|
|
505
594
|
}
|
|
@@ -507,19 +596,24 @@
|
|
|
507
596
|
},
|
|
508
597
|
"reactions": {
|
|
509
598
|
"type": "object",
|
|
599
|
+
"description": "Automated reaction policies that trigger when specific orchestrator events occur.",
|
|
510
600
|
"properties": {
|
|
511
601
|
"gate_failed": {
|
|
512
602
|
"type": "object",
|
|
603
|
+
"description": "Reaction triggered when a gate run fails.",
|
|
513
604
|
"properties": {
|
|
514
605
|
"enabled": {
|
|
515
|
-
"type": "boolean"
|
|
606
|
+
"type": "boolean",
|
|
607
|
+
"description": "Whether the gate_failed reaction is active."
|
|
516
608
|
},
|
|
517
609
|
"max_retries": {
|
|
518
610
|
"type": "integer",
|
|
519
|
-
"minimum": 0
|
|
611
|
+
"minimum": 0,
|
|
612
|
+
"description": "Maximum number of automatic agent repair attempts before escalating to a human."
|
|
520
613
|
},
|
|
521
614
|
"action": {
|
|
522
615
|
"type": "string",
|
|
616
|
+
"description": "'retry_with_agent_repair' prompts the builder agent to fix the failure; 'notify_only' sends a notification without retrying.",
|
|
523
617
|
"enum": [
|
|
524
618
|
"retry_with_agent_repair",
|
|
525
619
|
"notify_only"
|
|
@@ -527,67 +621,84 @@
|
|
|
527
621
|
},
|
|
528
622
|
"escalate_after": {
|
|
529
623
|
"type": "integer",
|
|
530
|
-
"minimum": 0
|
|
624
|
+
"minimum": 0,
|
|
625
|
+
"description": "Number of consecutive failed repair attempts after which the feature is escalated to a human."
|
|
531
626
|
},
|
|
532
627
|
"retry_delay_ms": {
|
|
533
628
|
"type": "integer",
|
|
534
|
-
"minimum": 0
|
|
629
|
+
"minimum": 0,
|
|
630
|
+
"description": "Milliseconds to wait between gate repair retry attempts."
|
|
535
631
|
}
|
|
536
632
|
}
|
|
537
633
|
},
|
|
538
634
|
"agent_stuck": {
|
|
539
635
|
"type": "object",
|
|
636
|
+
"description": "Reaction triggered when an agent is detected as idle beyond the configured threshold.",
|
|
540
637
|
"properties": {
|
|
541
638
|
"enabled": {
|
|
542
|
-
"type": "boolean"
|
|
639
|
+
"type": "boolean",
|
|
640
|
+
"description": "Whether the agent_stuck reaction is active."
|
|
543
641
|
},
|
|
544
642
|
"action": {
|
|
545
|
-
"type": "string"
|
|
643
|
+
"type": "string",
|
|
644
|
+
"description": "Action to take when an agent is detected as stuck."
|
|
546
645
|
},
|
|
547
646
|
"idle_threshold_ms": {
|
|
548
647
|
"type": "integer",
|
|
549
|
-
"minimum": 0
|
|
648
|
+
"minimum": 0,
|
|
649
|
+
"description": "Milliseconds of agent inactivity before triggering the stuck reaction. Overrides supervisor.agent_idle_threshold_ms for reaction purposes."
|
|
550
650
|
},
|
|
551
651
|
"escalate_after": {
|
|
552
652
|
"type": "integer",
|
|
553
|
-
"minimum": 0
|
|
653
|
+
"minimum": 0,
|
|
654
|
+
"description": "Number of consecutive stuck detections after which the feature is escalated to a human."
|
|
554
655
|
}
|
|
555
656
|
}
|
|
556
657
|
},
|
|
557
658
|
"collision_detected": {
|
|
558
659
|
"type": "object",
|
|
660
|
+
"description": "Reaction triggered when a plan collision is detected during plan submission.",
|
|
559
661
|
"properties": {
|
|
560
662
|
"enabled": {
|
|
561
|
-
"type": "boolean"
|
|
663
|
+
"type": "boolean",
|
|
664
|
+
"description": "Whether the collision_detected reaction fires."
|
|
562
665
|
},
|
|
563
666
|
"action": {
|
|
564
|
-
"type": "string"
|
|
667
|
+
"type": "string",
|
|
668
|
+
"description": "Action to take when a plan collision is detected."
|
|
565
669
|
}
|
|
566
670
|
}
|
|
567
671
|
},
|
|
568
672
|
"ready_to_merge": {
|
|
569
673
|
"type": "object",
|
|
674
|
+
"description": "Reaction triggered when a feature reaches the ready_to_merge status.",
|
|
570
675
|
"properties": {
|
|
571
676
|
"enabled": {
|
|
572
|
-
"type": "boolean"
|
|
677
|
+
"type": "boolean",
|
|
678
|
+
"description": "Whether the ready_to_merge reaction fires."
|
|
573
679
|
},
|
|
574
680
|
"action": {
|
|
575
|
-
"type": "string"
|
|
681
|
+
"type": "string",
|
|
682
|
+
"description": "Action to take when a feature is ready to merge."
|
|
576
683
|
}
|
|
577
684
|
}
|
|
578
685
|
},
|
|
579
686
|
"changes_requested": {
|
|
580
687
|
"type": "object",
|
|
688
|
+
"description": "Reaction triggered when a PR reviewer requests changes on a feature's pull request.",
|
|
581
689
|
"properties": {
|
|
582
690
|
"enabled": {
|
|
583
|
-
"type": "boolean"
|
|
691
|
+
"type": "boolean",
|
|
692
|
+
"description": "Whether the changes_requested reaction fires."
|
|
584
693
|
},
|
|
585
694
|
"action": {
|
|
586
|
-
"type": "string"
|
|
695
|
+
"type": "string",
|
|
696
|
+
"description": "Action to take when changes are requested on the PR."
|
|
587
697
|
},
|
|
588
698
|
"escalate_after": {
|
|
589
699
|
"type": "integer",
|
|
590
|
-
"minimum": 0
|
|
700
|
+
"minimum": 0,
|
|
701
|
+
"description": "Number of change-request cycles before escalating to a human."
|
|
591
702
|
}
|
|
592
703
|
}
|
|
593
704
|
}
|
|
@@ -595,28 +706,46 @@
|
|
|
595
706
|
},
|
|
596
707
|
"budget": {
|
|
597
708
|
"type": "object",
|
|
709
|
+
"description": "Agent spend limits. When a feature exceeds per_feature_limit_usd, further agent waves are paused until a human intervenes.",
|
|
598
710
|
"additionalProperties": false,
|
|
599
711
|
"properties": {
|
|
600
712
|
"per_feature_limit_usd": {
|
|
601
713
|
"type": "number",
|
|
602
|
-
"minimum": 0
|
|
714
|
+
"minimum": 0,
|
|
715
|
+
"description": "Maximum estimated USD spend per feature. The supervisor checks this before each wave and blocks over-budget features."
|
|
603
716
|
},
|
|
604
717
|
"alert_threshold": {
|
|
605
718
|
"type": "number",
|
|
606
719
|
"minimum": 0,
|
|
607
|
-
"maximum": 1
|
|
720
|
+
"maximum": 1,
|
|
721
|
+
"description": "Fraction of per_feature_limit_usd (0\u20131) at which a budget_alert notification is sent, before the hard limit is reached."
|
|
608
722
|
}
|
|
609
723
|
}
|
|
610
724
|
},
|
|
611
725
|
"issue_tracker": {
|
|
612
726
|
"type": "object",
|
|
727
|
+
"description": "Issue tracker integration settings. When enabled, the orchestrator creates and updates issues for features.",
|
|
613
728
|
"additionalProperties": false,
|
|
614
729
|
"properties": {
|
|
615
|
-
"enabled": {
|
|
616
|
-
|
|
730
|
+
"enabled": {
|
|
731
|
+
"type": "boolean",
|
|
732
|
+
"description": "Whether issue tracker integration is active."
|
|
733
|
+
},
|
|
734
|
+
"type": {
|
|
735
|
+
"type": "string",
|
|
736
|
+
"enum": [
|
|
737
|
+
"github",
|
|
738
|
+
"linear",
|
|
739
|
+
"jira"
|
|
740
|
+
],
|
|
741
|
+
"description": "Issue tracker backend: 'github', 'linear', or 'jira'."
|
|
742
|
+
},
|
|
617
743
|
"config": {
|
|
618
744
|
"type": "object",
|
|
619
|
-
"
|
|
745
|
+
"description": "Adapter-specific configuration key-value pairs (e.g. auth tokens, project keys).",
|
|
746
|
+
"additionalProperties": {
|
|
747
|
+
"type": "string"
|
|
748
|
+
}
|
|
620
749
|
}
|
|
621
750
|
}
|
|
622
751
|
}
|