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.
Files changed (108) hide show
  1. package/.claude/settings.local.json +6 -1
  2. package/README.md +81 -54
  3. package/agentic/orchestrator/defaults/policy.defaults.yaml +212 -0
  4. package/agentic/orchestrator/schemas/adapters.schema.json +17 -4
  5. package/agentic/orchestrator/schemas/agents.schema.json +58 -13
  6. package/agentic/orchestrator/schemas/gates.schema.json +88 -17
  7. package/agentic/orchestrator/schemas/index.schema.json +172 -37
  8. package/agentic/orchestrator/schemas/multi-project.schema.json +85 -17
  9. package/agentic/orchestrator/schemas/plan.schema.json +135 -30
  10. package/agentic/orchestrator/schemas/policy.schema.json +198 -69
  11. package/agentic/orchestrator/schemas/policy.user.schema.json +165 -0
  12. package/agentic/orchestrator/schemas/qa_test_index.schema.json +71 -14
  13. package/agentic/orchestrator/schemas/state.schema.json +196 -39
  14. package/apps/control-plane/scripts/validate-architecture-rules.mjs +5 -3
  15. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +0 -3
  16. package/apps/control-plane/scripts/validate-mcp-contracts.ts +2 -6
  17. package/apps/control-plane/src/application/services/policy-loader-service.ts +115 -0
  18. package/apps/control-plane/src/cli/aop.ts +35 -1
  19. package/apps/control-plane/src/cli/cli-argument-parser.ts +4 -0
  20. package/apps/control-plane/src/cli/help-command-handler.ts +2 -1
  21. package/apps/control-plane/src/cli/init-command-handler.ts +136 -27
  22. package/apps/control-plane/src/cli/retry-command-handler.ts +3 -6
  23. package/apps/control-plane/src/cli/types.ts +1 -0
  24. package/apps/control-plane/src/core/git.ts +1 -3
  25. package/apps/control-plane/src/core/kernel.ts +3 -6
  26. package/apps/control-plane/src/core/schemas.ts +36 -1
  27. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +1 -1
  28. package/apps/control-plane/src/mcp/tool-registry-loader.ts +37 -1
  29. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +1 -1
  30. package/apps/control-plane/test/aop.spec.ts +37 -0
  31. package/apps/control-plane/test/batch-operations.spec.ts +5 -3
  32. package/apps/control-plane/test/bootstrap-attach.spec.ts +28 -18
  33. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +25 -15
  34. package/apps/control-plane/test/bootstrap.spec.ts +30 -22
  35. package/apps/control-plane/test/cli.unit.spec.ts +55 -10
  36. package/apps/control-plane/test/core-utils.spec.ts +12 -3
  37. package/apps/control-plane/test/feature-deletion-service.spec.ts +2 -1
  38. package/apps/control-plane/test/feature-lifecycle.spec.ts +1 -1
  39. package/apps/control-plane/test/helpers.ts +22 -2
  40. package/apps/control-plane/test/init-wizard.spec.ts +160 -7
  41. package/apps/control-plane/test/issue-tracker.spec.ts +3 -3
  42. package/apps/control-plane/test/kernel.spec.ts +62 -0
  43. package/apps/control-plane/test/lock-service.spec.ts +4 -4
  44. package/apps/control-plane/test/policy-loader-service.spec.ts +346 -0
  45. package/apps/control-plane/test/reactions.spec.ts +8 -6
  46. package/apps/control-plane/test/resume-command.spec.ts +31 -15
  47. package/apps/control-plane/test/supervisor.unit.spec.ts +2 -2
  48. package/apps/control-plane/test/tool-registry-loader.spec.ts +12 -0
  49. package/apps/control-plane/vitest.config.ts +1 -1
  50. package/dist/apps/control-plane/application/services/policy-loader-service.d.ts +24 -0
  51. package/dist/apps/control-plane/application/services/policy-loader-service.js +90 -0
  52. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -0
  53. package/dist/apps/control-plane/application/tools/tool-metadata.js +1 -0
  54. package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
  55. package/dist/apps/control-plane/cli/aop.js +33 -1
  56. package/dist/apps/control-plane/cli/aop.js.map +1 -1
  57. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -0
  58. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  59. package/dist/apps/control-plane/cli/dashboard-command-handler.js +11 -5
  60. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  61. package/dist/apps/control-plane/cli/help-command-handler.js +5 -4
  62. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  63. package/dist/apps/control-plane/cli/init-command-handler.d.ts +1 -0
  64. package/dist/apps/control-plane/cli/init-command-handler.js +110 -26
  65. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  66. package/dist/apps/control-plane/cli/retry-command-handler.js +3 -6
  67. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  68. package/dist/apps/control-plane/cli/types.d.ts +1 -0
  69. package/dist/apps/control-plane/core/git.js +1 -3
  70. package/dist/apps/control-plane/core/git.js.map +1 -1
  71. package/dist/apps/control-plane/core/kernel.js +3 -5
  72. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  73. package/dist/apps/control-plane/core/schemas.d.ts +2 -0
  74. package/dist/apps/control-plane/core/schemas.js +31 -1
  75. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  76. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +1 -1
  77. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  78. package/dist/apps/control-plane/mcp/tool-registry-loader.d.ts +2 -0
  79. package/dist/apps/control-plane/mcp/tool-registry-loader.js +31 -1
  80. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  81. package/dist/apps/control-plane/supervisor/build-wave-executor.js +1 -1
  82. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  83. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +1 -1
  84. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  85. package/package.json +18 -17
  86. package/packages/web-dashboard/package.json +1 -1
  87. package/packages/web-dashboard/src/app/api/actions/route.ts +2 -2
  88. package/packages/web-dashboard/src/app/api/events/route.ts +1 -1
  89. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +1 -1
  90. package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +1 -1
  91. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +1 -1
  92. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +2 -2
  93. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +1 -1
  94. package/packages/web-dashboard/src/app/api/projects/route.ts +2 -2
  95. package/packages/web-dashboard/src/app/api/status/route.ts +1 -1
  96. package/packages/web-dashboard/src/app/page.tsx +1 -1
  97. package/packages/web-dashboard/src/lib/aop-client.ts +1 -1
  98. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +1 -1
  99. package/packages/web-dashboard/tsconfig.json +1 -0
  100. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +481 -0
  101. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +500 -0
  102. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +500 -195
  103. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +471 -162
  104. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +532 -268
  105. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +645 -0
  106. package/spec-files/progress.md +99 -2
  107. package/tsconfig.base.json +4 -0
  108. /package/spec-files/{outstanding → completed}/agentic_orchestrator_validator_hardening_spec.md +0 -0
@@ -1,42 +1,83 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://example.local/agentic/gates.schema.json",
4
+ "description": "Gate profiles defining the verification steps and coverage thresholds used to validate feature branches.",
4
5
  "type": "object",
5
6
  "additionalProperties": false,
6
- "required": ["version", "profiles"],
7
+ "required": [
8
+ "version",
9
+ "profiles"
10
+ ],
7
11
  "properties": {
8
- "version": { "type": "number" },
12
+ "version": {
13
+ "type": "number",
14
+ "description": "Schema version number for this gates configuration file."
15
+ },
9
16
  "profiles": {
10
17
  "type": "object",
18
+ "description": "Named gate profiles. A feature's active profile is recorded in plan.gate_profile and referenced by the gate service when running checks.",
11
19
  "additionalProperties": {
12
20
  "type": "object",
13
- "required": ["modes"],
21
+ "description": "A named gate profile containing one or more execution modes.",
22
+ "required": [
23
+ "modes"
24
+ ],
14
25
  "properties": {
15
26
  "modes": {
16
27
  "type": "object",
28
+ "description": "Named gate execution modes (e.g. 'fast', 'full', 'merge') each containing an ordered list of steps to run.",
17
29
  "additionalProperties": {
18
30
  "type": "array",
19
31
  "items": {
20
32
  "type": "object",
21
- "required": ["name", "cmd"],
33
+ "required": [
34
+ "name",
35
+ "cmd"
36
+ ],
22
37
  "additionalProperties": false,
23
38
  "properties": {
24
- "name": { "type": "string", "minLength": 1 },
39
+ "name": {
40
+ "type": "string",
41
+ "minLength": 1,
42
+ "description": "Unique step identifier within the mode. Used as the key in depends_on arrays."
43
+ },
25
44
  "cmd": {
26
45
  "type": "array",
27
46
  "minItems": 1,
28
- "items": { "type": "string", "minLength": 1 }
47
+ "items": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "description": "Command tokens to execute for this step. The first element is the executable; subsequent elements are arguments."
52
+ },
53
+ "cwd": {
54
+ "type": "string",
55
+ "description": "Working directory for the command, relative to the feature worktree. Defaults to the worktree root if omitted."
29
56
  },
30
- "cwd": { "type": "string" },
31
57
  "env": {
32
58
  "type": "object",
33
- "additionalProperties": { "type": "string" }
59
+ "additionalProperties": {
60
+ "type": "string"
61
+ },
62
+ "description": "Additional environment variables for this step's subprocess. Only variables listed in policy.execution.env_allowlist are inherited from the host."
63
+ },
64
+ "timeout_seconds": {
65
+ "type": "number",
66
+ "minimum": 1,
67
+ "description": "Per-step execution timeout in seconds. Falls back to policy.execution.default_step_timeout_seconds when omitted."
68
+ },
69
+ "parallel_group": {
70
+ "type": "string",
71
+ "minLength": 1,
72
+ "description": "Steps sharing the same parallel_group label may execute concurrently within the mode run."
34
73
  },
35
- "timeout_seconds": { "type": "number", "minimum": 1 },
36
- "parallel_group": { "type": "string", "minLength": 1 },
37
74
  "depends_on": {
38
75
  "type": "array",
39
- "items": { "type": "string", "minLength": 1 }
76
+ "items": {
77
+ "type": "string",
78
+ "minLength": 1
79
+ },
80
+ "description": "List of step names that must complete successfully before this step starts."
40
81
  }
41
82
  }
42
83
  }
@@ -44,16 +85,38 @@
44
85
  },
45
86
  "parsers": {
46
87
  "type": "object",
47
- "additionalProperties": true
88
+ "additionalProperties": true,
89
+ "description": "Coverage parser configuration for this profile. The 'coverage' key selects the parser type (e.g. { type: 'lcov' })."
48
90
  },
49
91
  "thresholds": {
50
92
  "type": "object",
51
93
  "additionalProperties": false,
94
+ "description": "Per-profile coverage thresholds. These are combined with policy.testing.coverage values (max wins) during gate evaluation.",
52
95
  "properties": {
53
- "coverage_line_min": { "type": "number", "minimum": 0, "maximum": 1 },
54
- "coverage_branch_min": { "type": "number", "minimum": 0, "maximum": 1 },
55
- "coverage_line_target": { "type": "number", "minimum": 0, "maximum": 1 },
56
- "coverage_branch_target": { "type": "number", "minimum": 0, "maximum": 1 }
96
+ "coverage_line_min": {
97
+ "type": "number",
98
+ "minimum": 0,
99
+ "maximum": 1,
100
+ "description": "Minimum line coverage fraction (0\u20131) required for a gate run to pass. Combined with policy.testing.coverage.minimums.line \u2014 the higher value wins."
101
+ },
102
+ "coverage_branch_min": {
103
+ "type": "number",
104
+ "minimum": 0,
105
+ "maximum": 1,
106
+ "description": "Minimum branch coverage fraction (0\u20131) required for a gate run to pass."
107
+ },
108
+ "coverage_line_target": {
109
+ "type": "number",
110
+ "minimum": 0,
111
+ "maximum": 1,
112
+ "description": "Target line coverage fraction (0\u20131) used for reporting and trend tracking, not enforcement."
113
+ },
114
+ "coverage_branch_target": {
115
+ "type": "number",
116
+ "minimum": 0,
117
+ "maximum": 1,
118
+ "description": "Target branch coverage fraction (0\u20131) used for reporting and trend tracking, not enforcement."
119
+ }
57
120
  }
58
121
  }
59
122
  }
@@ -61,9 +124,17 @@
61
124
  },
62
125
  "capabilities": {
63
126
  "type": "array",
127
+ "description": "Coverage format capabilities declared for this project. Used to select the appropriate coverage parser (e.g. 'lcov', 'junit_xml').",
64
128
  "items": {
65
129
  "type": "string",
66
- "enum": ["none", "lcov", "junit_xml", "jacoco_xml", "cobertura_xml", "custom"]
130
+ "enum": [
131
+ "none",
132
+ "lcov",
133
+ "junit_xml",
134
+ "jacoco_xml",
135
+ "cobertura_xml",
136
+ "custom"
137
+ ]
67
138
  }
68
139
  }
69
140
  }
@@ -1,83 +1,167 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://example.local/agentic/index.schema.json",
4
+ "description": "Global feature index stored in .aop/features/index.json. Acts as the single source of truth for all active features, locks, and the current orchestrator run lease.",
4
5
  "type": "object",
5
6
  "additionalProperties": false,
6
- "required": ["version", "active", "blocked", "merged", "locks", "lock_leases", "blocked_queue", "runtime_sessions"],
7
+ "required": [
8
+ "version",
9
+ "active",
10
+ "blocked",
11
+ "merged",
12
+ "locks",
13
+ "lock_leases",
14
+ "blocked_queue",
15
+ "runtime_sessions"
16
+ ],
7
17
  "properties": {
8
- "version": { "type": "integer", "minimum": 1 },
18
+ "version": {
19
+ "type": "integer",
20
+ "minimum": 1,
21
+ "description": "Monotonically incrementing integer for optimistic concurrency on the index file. Incremented on every index write."
22
+ },
9
23
  "active": {
10
24
  "type": "array",
11
- "items": { "type": "string" }
25
+ "description": "Feature IDs currently in an active lifecycle state (planning, building, or qa).",
26
+ "items": {
27
+ "type": "string"
28
+ }
12
29
  },
13
30
  "blocked": {
14
31
  "type": "array",
15
- "items": { "type": "string" }
32
+ "description": "Feature IDs that are blocked (due to collisions, dependency waits, budget overrun, or errors).",
33
+ "items": {
34
+ "type": "string"
35
+ }
16
36
  },
17
37
  "merged": {
18
38
  "type": "array",
19
- "items": { "type": "string" }
39
+ "description": "Feature IDs that have been successfully merged. Used by the dependency scheduler to unblock waiting features.",
40
+ "items": {
41
+ "type": "string"
42
+ }
20
43
  },
21
44
  "locks": {
22
45
  "type": "object",
46
+ "description": "Current lock holders. Keys are resource names from policy.locks.resources; values are the holding feature_id or null.",
23
47
  "additionalProperties": {
24
48
  "anyOf": [
25
- { "type": "string" },
26
- { "type": "null" }
49
+ {
50
+ "type": "string"
51
+ },
52
+ {
53
+ "type": "null"
54
+ }
27
55
  ]
28
56
  }
29
57
  },
30
58
  "lock_leases": {
31
59
  "type": "object",
60
+ "description": "Full lease objects for each lock resource. Used for stale-lease detection and reclamation.",
32
61
  "additionalProperties": {
33
62
  "anyOf": [
34
63
  {
35
64
  "type": "object",
36
- "required": ["holder", "lease_id", "expires_at"],
65
+ "required": [
66
+ "holder",
67
+ "lease_id",
68
+ "expires_at"
69
+ ],
37
70
  "properties": {
38
- "holder": { "type": "string" },
39
- "lease_id": { "type": "string" },
40
- "expires_at": { "type": "string", "format": "date-time" }
71
+ "holder": {
72
+ "type": "string",
73
+ "description": "Feature ID that holds this lease."
74
+ },
75
+ "lease_id": {
76
+ "type": "string",
77
+ "description": "UUID for the current lease, generated on acquisition and rotated on renewal."
78
+ },
79
+ "expires_at": {
80
+ "type": "string",
81
+ "format": "date-time",
82
+ "description": "ISO 8601 expiry time. Leases past this timestamp are eligible for stale reclamation by any feature calling locksAcquire."
83
+ }
41
84
  }
42
85
  },
43
- { "type": "null" }
86
+ {
87
+ "type": "null"
88
+ }
44
89
  ]
45
90
  }
46
91
  },
47
92
  "blocked_queue": {
48
93
  "type": "array",
94
+ "description": "Queue of features waiting for a lock after a collision when collision_policy is 'block'. Entries are ordered by detected_at and re-driven when a lock is released.",
49
95
  "items": {
50
96
  "type": "object",
51
- "required": ["feature_id", "plan_version", "detected_at", "collision_fingerprint", "required_resources"],
97
+ "required": [
98
+ "feature_id",
99
+ "plan_version",
100
+ "detected_at",
101
+ "collision_fingerprint",
102
+ "required_resources"
103
+ ],
52
104
  "properties": {
53
- "feature_id": { "type": "string" },
54
- "plan_version": { "type": "integer", "minimum": 1 },
55
- "detected_at": { "type": "string", "format": "date-time" },
56
- "collision_fingerprint": { "type": "string" },
105
+ "feature_id": {
106
+ "type": "string",
107
+ "description": "Feature ID waiting to re-submit its plan once the conflicting feature's locks are released."
108
+ },
109
+ "plan_version": {
110
+ "type": "integer",
111
+ "minimum": 1,
112
+ "description": "Version of the plan that triggered the block; used to re-validate on re-drive."
113
+ },
114
+ "detected_at": {
115
+ "type": "string",
116
+ "format": "date-time",
117
+ "description": "ISO 8601 timestamp when the collision was first detected."
118
+ },
119
+ "collision_fingerprint": {
120
+ "type": "string",
121
+ "description": "Stable hash of the collision set, used to deduplicate queue entries."
122
+ },
57
123
  "required_resources": {
58
124
  "type": "array",
59
- "items": { "type": "string" }
125
+ "items": {
126
+ "type": "string"
127
+ },
128
+ "description": "Lock resource names this feature must acquire before its plan can be accepted."
60
129
  }
61
130
  }
62
131
  }
63
132
  },
64
- "updated_at": { "type": "string", "format": "date-time" },
133
+ "updated_at": {
134
+ "type": "string",
135
+ "format": "date-time",
136
+ "description": "ISO 8601 timestamp of the most recent index write."
137
+ },
65
138
  "dep_blocked": {
66
139
  "type": "array",
140
+ "description": "Features whose plan submission was deferred because one or more declared feature dependencies have not yet merged.",
67
141
  "items": {
68
142
  "type": "object",
69
- "required": ["feature_id", "depends_on_unresolved"],
143
+ "required": [
144
+ "feature_id",
145
+ "depends_on_unresolved"
146
+ ],
70
147
  "properties": {
71
- "feature_id": { "type": "string" },
148
+ "feature_id": {
149
+ "type": "string",
150
+ "description": "Feature waiting for its dependencies to merge."
151
+ },
72
152
  "depends_on_unresolved": {
73
153
  "type": "array",
74
- "items": { "type": "string" }
154
+ "items": {
155
+ "type": "string"
156
+ },
157
+ "description": "IDs of dependency features that have not yet merged. When this list becomes empty the feature is automatically unblocked."
75
158
  }
76
159
  }
77
160
  }
78
161
  },
79
162
  "runtime_sessions": {
80
163
  "type": "object",
164
+ "description": "Current orchestrator run lease. Acts as a distributed mutex: only one supervisor may hold this at a time. Stored both inside index.json and in a separate run-lease file.",
81
165
  "additionalProperties": false,
82
166
  "required": [
83
167
  "run_id",
@@ -92,27 +176,78 @@
92
176
  "lease_expires_at"
93
177
  ],
94
178
  "properties": {
95
- "run_id": { "type": "string" },
96
- "orchestrator_session_id": { "type": "string" },
97
- "provider": { "type": "string" },
98
- "model": { "type": "string" },
99
- "provider_config_ref_hash": { "type": "string" },
100
- "owner_instance_id": { "type": "string" },
101
- "lease_id": { "type": "string" },
102
- "started_at": { "type": "string", "format": "date-time" },
103
- "last_heartbeat_at": { "type": "string", "format": "date-time" },
104
- "lease_expires_at": { "type": "string", "format": "date-time" },
105
- "orchestrator_epoch": { "type": "integer", "minimum": 0 },
179
+ "run_id": {
180
+ "type": "string",
181
+ "description": "Stable identifier for the current orchestrator run, set at supervisor startup."
182
+ },
183
+ "orchestrator_session_id": {
184
+ "type": "string",
185
+ "description": "AI session ID of the orchestrator agent. Updated each time the orchestrator reconnects or starts a new session."
186
+ },
187
+ "provider": {
188
+ "type": "string",
189
+ "description": "AI provider name in use for this run (e.g. 'claude', 'codex')."
190
+ },
191
+ "model": {
192
+ "type": "string",
193
+ "description": "AI model string in use for this run."
194
+ },
195
+ "provider_config_ref_hash": {
196
+ "type": "string",
197
+ "description": "Stable hash of the resolved provider configuration. Used to detect config drift between runs."
198
+ },
199
+ "owner_instance_id": {
200
+ "type": "string",
201
+ "description": "Unique identifier for the supervisor process instance, combining PID and a random UUID."
202
+ },
203
+ "lease_id": {
204
+ "type": "string",
205
+ "description": "UUID of the current run lease, rotated on each acquisition or renewal."
206
+ },
207
+ "started_at": {
208
+ "type": "string",
209
+ "format": "date-time",
210
+ "description": "ISO 8601 timestamp when the current run began."
211
+ },
212
+ "last_heartbeat_at": {
213
+ "type": "string",
214
+ "format": "date-time",
215
+ "description": "ISO 8601 timestamp of the most recent heartbeat from the lease-heartbeat service."
216
+ },
217
+ "lease_expires_at": {
218
+ "type": "string",
219
+ "format": "date-time",
220
+ "description": "ISO 8601 time after which the run lease is considered stale and may be taken over by a new supervisor."
221
+ },
222
+ "orchestrator_epoch": {
223
+ "type": "integer",
224
+ "minimum": 0,
225
+ "description": "Monotonic integer incremented each time the orchestrator session ID changes. Used to invalidate cached worker session assignments."
226
+ },
106
227
  "feature_sessions": {
107
228
  "type": "object",
229
+ "description": "Per-feature agent session assignments keyed by feature_id. Used by SessionOrchestrator to reuse or close agent sessions across runs.",
108
230
  "additionalProperties": {
109
231
  "type": "object",
110
232
  "additionalProperties": false,
111
- "required": ["planner_session_id", "builder_session_id", "qa_session_id"],
233
+ "required": [
234
+ "planner_session_id",
235
+ "builder_session_id",
236
+ "qa_session_id"
237
+ ],
112
238
  "properties": {
113
- "planner_session_id": { "type": "string" },
114
- "builder_session_id": { "type": "string" },
115
- "qa_session_id": { "type": "string" }
239
+ "planner_session_id": {
240
+ "type": "string",
241
+ "description": "AI session ID of the planner agent for this feature."
242
+ },
243
+ "builder_session_id": {
244
+ "type": "string",
245
+ "description": "AI session ID of the builder agent for this feature."
246
+ },
247
+ "qa_session_id": {
248
+ "type": "string",
249
+ "description": "AI session ID of the QA agent for this feature."
250
+ }
116
251
  }
117
252
  }
118
253
  }
@@ -1,39 +1,107 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://example.local/agentic/multi-project.schema.json",
4
+ "description": "Multi-project workspace configuration stored in agentic/orchestrator/multi-project.yaml. Defines multiple repository projects managed by a single orchestrator installation.",
4
5
  "type": "object",
5
- "required": ["version", "projects"],
6
+ "required": [
7
+ "version",
8
+ "projects"
9
+ ],
6
10
  "additionalProperties": false,
7
11
  "properties": {
8
- "version": { "type": "string", "pattern": "^1\\.0$" },
12
+ "version": {
13
+ "type": "string",
14
+ "pattern": "^1\\.0$",
15
+ "description": "Configuration format version. Must be '1.0'."
16
+ },
9
17
  "defaults": {
10
18
  "type": "object",
19
+ "description": "Default values applied to all projects unless overridden at the project level.",
11
20
  "additionalProperties": false,
12
21
  "properties": {
13
- "max_active_features": { "type": "integer", "minimum": 1 },
14
- "max_parallel_gate_runs": { "type": "integer", "minimum": 1 },
15
- "dashboard_port": { "type": "integer", "minimum": 1, "maximum": 65535 },
16
- "default_project": { "type": "string", "minLength": 1 },
17
- "policy": { "type": "string" },
18
- "gates": { "type": "string" },
19
- "notifications": { "type": "object", "properties": { "enabled": { "type": "boolean" } } }
22
+ "max_active_features": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "Default maximum number of concurrently active features per project."
26
+ },
27
+ "max_parallel_gate_runs": {
28
+ "type": "integer",
29
+ "minimum": 1,
30
+ "description": "Default maximum number of parallel gate runs per project."
31
+ },
32
+ "dashboard_port": {
33
+ "type": "integer",
34
+ "minimum": 1,
35
+ "maximum": 65535,
36
+ "description": "Default dashboard HTTP port used when a project does not specify its own dashboard_port."
37
+ },
38
+ "default_project": {
39
+ "type": "string",
40
+ "minLength": 1,
41
+ "description": "Name of the project to use when no --project flag is provided on the CLI."
42
+ },
43
+ "policy": {
44
+ "type": "string",
45
+ "description": "Default path to a policy.yaml override file. Applied to projects that do not specify their own policy path."
46
+ },
47
+ "gates": {
48
+ "type": "string",
49
+ "description": "Default path to a gates.yaml override file. Applied to projects that do not specify their own gates path."
50
+ },
51
+ "notifications": {
52
+ "type": "object",
53
+ "properties": {
54
+ "enabled": {
55
+ "type": "boolean",
56
+ "description": "Default notification enabled/disabled setting for all projects."
57
+ }
58
+ }
59
+ }
20
60
  }
21
61
  },
22
62
  "projects": {
23
63
  "type": "array",
64
+ "description": "Ordered list of project configurations managed by this orchestrator installation.",
24
65
  "minItems": 1,
25
66
  "items": {
26
67
  "type": "object",
27
- "required": ["name", "path"],
68
+ "required": [
69
+ "name",
70
+ "path"
71
+ ],
28
72
  "additionalProperties": false,
29
73
  "properties": {
30
- "name": { "type": "string", "minLength": 1 },
31
- "path": { "type": "string" },
32
- "repo": { "type": "string" },
33
- "branch": { "type": "string" },
34
- "policy": { "type": "string" },
35
- "gates": { "type": "string" },
36
- "dashboard_port": { "type": "integer", "minimum": 1, "maximum": 65535 }
74
+ "name": {
75
+ "type": "string",
76
+ "minLength": 1,
77
+ "description": "Unique short name for the project, used with the --project CLI flag."
78
+ },
79
+ "path": {
80
+ "type": "string",
81
+ "description": "Filesystem path to the project root. May be absolute, relative to the multi-project config file, or use ~ home expansion."
82
+ },
83
+ "repo": {
84
+ "type": "string",
85
+ "description": "Optional URL of the project's git remote. Currently informational only."
86
+ },
87
+ "branch": {
88
+ "type": "string",
89
+ "description": "Optional default branch override for this project."
90
+ },
91
+ "policy": {
92
+ "type": "string",
93
+ "description": "Optional path to a policy.yaml override for this project, relative to the project path."
94
+ },
95
+ "gates": {
96
+ "type": "string",
97
+ "description": "Optional path to a gates.yaml override for this project, relative to the project path."
98
+ },
99
+ "dashboard_port": {
100
+ "type": "integer",
101
+ "minimum": 1,
102
+ "maximum": 65535,
103
+ "description": "Port for this project's dashboard HTTP server. Overrides defaults.dashboard_port."
104
+ }
37
105
  }
38
106
  }
39
107
  }