agentic-orchestrator 0.1.18 → 0.1.19
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/agentic/orchestrator/prompts/planner.system.md +1 -0
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -2
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +94 -0
- package/apps/control-plane/test/dashboard-client.spec.ts +55 -1
- package/apps/control-plane/test/dashboard-ui-utils.spec.ts +139 -0
- package/apps/control-plane/test/worker-decision-loop.spec.ts +70 -2
- package/config/agentic/orchestrator/prompts/planner.system.md +1 -0
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +29 -2
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/package.json +1 -1
- package/packages/web-dashboard/src/app/api/actions/route.ts +30 -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]/log/route.ts +18 -0
- package/packages/web-dashboard/src/app/globals.css +12 -3
- package/packages/web-dashboard/src/app/page.tsx +247 -317
- package/packages/web-dashboard/src/components/collision-queue.tsx +38 -0
- package/packages/web-dashboard/src/components/confirmation-modal.tsx +73 -0
- package/packages/web-dashboard/src/components/detail-panel.tsx +431 -0
- package/packages/web-dashboard/src/components/diff-viewer.tsx +68 -0
- package/packages/web-dashboard/src/components/evidence-viewer.tsx +127 -0
- package/packages/web-dashboard/src/components/feature-card.tsx +145 -0
- package/packages/web-dashboard/src/components/filter-bar.tsx +153 -0
- package/packages/web-dashboard/src/components/gate-results.tsx +50 -0
- package/packages/web-dashboard/src/components/human-input-panel.tsx +74 -0
- package/packages/web-dashboard/src/components/kanban-board.tsx +72 -0
- package/packages/web-dashboard/src/components/plan-viewer.tsx +93 -0
- package/packages/web-dashboard/src/components/pr-status-card.tsx +97 -0
- package/packages/web-dashboard/src/components/summary-bar.tsx +65 -0
- package/packages/web-dashboard/src/components/toast.tsx +96 -0
- package/packages/web-dashboard/src/lib/aop-client.ts +96 -0
- package/packages/web-dashboard/src/lib/dashboard-utils.ts +393 -0
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +85 -0
- package/packages/web-dashboard/src/lib/types.ts +16 -0
- package/packages/web-dashboard/src/styles/dashboard.module.css +906 -0
- package/spec-files/outstanding/agentic_orchestrator_dashboard_advanced_ux_spec.md +660 -0
- package/spec-files/outstanding/agentic_orchestrator_worker_runtime_watchdog_resilience_spec.md +509 -0
- package/spec-files/progress.md +26 -1
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_ux_improvements_spec.md +0 -0
|
@@ -2,6 +2,7 @@ You are the planner role.
|
|
|
2
2
|
|
|
3
3
|
Produce deterministic plan submissions and plan updates that conform to plan schema and policy constraints.
|
|
4
4
|
Avoid speculative edits outside the declared file scope.
|
|
5
|
+
When emitting `PLAN_SUBMISSION` or `REQUEST.action=amend_plan`, `plan_json` must only include keys allowed by `plan.schema.json` (no extra fields such as `phase_notes`).
|
|
5
6
|
|
|
6
7
|
After each QA wave, perform an explicit reconciliation pass:
|
|
7
8
|
|
|
@@ -7,6 +7,23 @@ import type { RuntimeRole, SupervisorToolCaller } from './types.js';
|
|
|
7
7
|
import type { ActivityMonitorService } from '../application/services/activity-monitor-service.js';
|
|
8
8
|
|
|
9
9
|
type AnyRecord = Record<string, unknown>;
|
|
10
|
+
const PLAN_TOP_LEVEL_KEYS = new Set([
|
|
11
|
+
'feature_id',
|
|
12
|
+
'plan_version',
|
|
13
|
+
'summary',
|
|
14
|
+
'allowed_areas',
|
|
15
|
+
'forbidden_areas',
|
|
16
|
+
'base_ref',
|
|
17
|
+
'files',
|
|
18
|
+
'contracts',
|
|
19
|
+
'acceptance_criteria',
|
|
20
|
+
'gate_profile',
|
|
21
|
+
'gate_targets',
|
|
22
|
+
'risk',
|
|
23
|
+
'revision_of',
|
|
24
|
+
'revision_reason',
|
|
25
|
+
'verification_overrides',
|
|
26
|
+
]);
|
|
10
27
|
|
|
11
28
|
export interface WorkerDecisionInput {
|
|
12
29
|
role: RuntimeRole;
|
|
@@ -65,6 +82,17 @@ function readPlanVersion(value: unknown): number | null {
|
|
|
65
82
|
return Math.floor(value);
|
|
66
83
|
}
|
|
67
84
|
|
|
85
|
+
function sanitizePlannerPlan(plan: AnyRecord): AnyRecord {
|
|
86
|
+
const sanitized: AnyRecord = {};
|
|
87
|
+
for (const [key, value] of Object.entries(plan)) {
|
|
88
|
+
if (!PLAN_TOP_LEVEL_KEYS.has(key)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
sanitized[key] = value;
|
|
92
|
+
}
|
|
93
|
+
return sanitized;
|
|
94
|
+
}
|
|
95
|
+
|
|
68
96
|
function asOutputs(result: Record<string, unknown>): AnyRecord[] {
|
|
69
97
|
const outputs = result.outputs;
|
|
70
98
|
if (Array.isArray(outputs)) {
|
|
@@ -223,7 +251,7 @@ export class WorkerDecisionLoop implements WorkerDecisionRunner {
|
|
|
223
251
|
return;
|
|
224
252
|
}
|
|
225
253
|
|
|
226
|
-
const planJson = asRecord(output.plan_json ?? output.plan);
|
|
254
|
+
const planJson = sanitizePlannerPlan(asRecord(output.plan_json ?? output.plan));
|
|
227
255
|
if (Object.keys(planJson).length === 0) {
|
|
228
256
|
return;
|
|
229
257
|
}
|
|
@@ -350,7 +378,7 @@ export class WorkerDecisionLoop implements WorkerDecisionRunner {
|
|
|
350
378
|
}
|
|
351
379
|
|
|
352
380
|
if (action === 'amend_plan' && input.role === 'planner') {
|
|
353
|
-
const planJson = asRecord(request.plan_json);
|
|
381
|
+
const planJson = sanitizePlannerPlan(asRecord(request.plan_json));
|
|
354
382
|
if (Object.keys(planJson).length === 0) {
|
|
355
383
|
return;
|
|
356
384
|
}
|
|
@@ -11,6 +11,12 @@ const readDashboardStatusMock = vi.hoisted(() =>
|
|
|
11
11
|
})),
|
|
12
12
|
);
|
|
13
13
|
const readFeatureStateMock = vi.hoisted(() => vi.fn(async () => null));
|
|
14
|
+
const readFeatureLogMock = vi.hoisted(() =>
|
|
15
|
+
vi.fn(async () => ({
|
|
16
|
+
entries: [{ timestamp: '2026-03-05T00:00:00Z', message: 'log message', type: 'log' }],
|
|
17
|
+
total: 1,
|
|
18
|
+
})),
|
|
19
|
+
);
|
|
14
20
|
const getAopRootMock = vi.hoisted(() => vi.fn(() => process.cwd()));
|
|
15
21
|
const approveFeatureReviewMock = vi.hoisted(() =>
|
|
16
22
|
vi.fn(async () => ({ ok: true, data: { merged: true } })),
|
|
@@ -21,12 +27,19 @@ const denyFeatureReviewMock = vi.hoisted(() =>
|
|
|
21
27
|
const requestFeatureChangesMock = vi.hoisted(() =>
|
|
22
28
|
vi.fn(async () => ({ ok: true, data: { delivered: true } })),
|
|
23
29
|
);
|
|
30
|
+
const sendFeatureMessageMock = vi.hoisted(() =>
|
|
31
|
+
vi.fn(async () => ({ ok: true, data: { delivered: true } })),
|
|
32
|
+
);
|
|
33
|
+
const retryFeatureMock = vi.hoisted(() =>
|
|
34
|
+
vi.fn(async () => ({ ok: true, data: { retry_mode: 'full' } })),
|
|
35
|
+
);
|
|
24
36
|
const execFileMock = vi.hoisted(() => vi.fn());
|
|
25
37
|
|
|
26
38
|
vi.mock('../../../packages/web-dashboard/src/lib/aop-client.js', () => ({
|
|
27
39
|
resolveProjectRoot: resolveProjectRootMock,
|
|
28
40
|
readDashboardStatus: readDashboardStatusMock,
|
|
29
41
|
readFeatureState: readFeatureStateMock,
|
|
42
|
+
readFeatureLog: readFeatureLogMock,
|
|
30
43
|
getAopRoot: getAopRootMock,
|
|
31
44
|
}));
|
|
32
45
|
|
|
@@ -34,6 +47,8 @@ vi.mock('../../../packages/web-dashboard/src/lib/orchestrator-tools.js', () => (
|
|
|
34
47
|
approveFeatureReview: approveFeatureReviewMock,
|
|
35
48
|
denyFeatureReview: denyFeatureReviewMock,
|
|
36
49
|
requestFeatureChanges: requestFeatureChangesMock,
|
|
50
|
+
sendFeatureMessage: sendFeatureMessageMock,
|
|
51
|
+
retryFeature: retryFeatureMock,
|
|
37
52
|
}));
|
|
38
53
|
|
|
39
54
|
vi.mock('node:child_process', () => ({
|
|
@@ -52,6 +67,7 @@ vi.mock('node:child_process', () => ({
|
|
|
52
67
|
|
|
53
68
|
import { POST as actionsPost } from '../../../packages/web-dashboard/src/app/api/actions/route.js';
|
|
54
69
|
import { POST as checkoutPost } from '../../../packages/web-dashboard/src/app/api/features/[id]/checkout/route.js';
|
|
70
|
+
import { GET as logGet } from '../../../packages/web-dashboard/src/app/api/features/[id]/log/route.js';
|
|
55
71
|
import { GET as statusGet } from '../../../packages/web-dashboard/src/app/api/status/route.js';
|
|
56
72
|
import { GET as projectsGet } from '../../../packages/web-dashboard/src/app/api/projects/route.js';
|
|
57
73
|
|
|
@@ -67,10 +83,13 @@ describe('dashboard api integration', () => {
|
|
|
67
83
|
resolveProjectRootMock.mockReset();
|
|
68
84
|
readDashboardStatusMock.mockReset();
|
|
69
85
|
readFeatureStateMock.mockReset();
|
|
86
|
+
readFeatureLogMock.mockReset();
|
|
70
87
|
getAopRootMock.mockReset();
|
|
71
88
|
approveFeatureReviewMock.mockReset();
|
|
72
89
|
denyFeatureReviewMock.mockReset();
|
|
73
90
|
requestFeatureChangesMock.mockReset();
|
|
91
|
+
sendFeatureMessageMock.mockReset();
|
|
92
|
+
retryFeatureMock.mockReset();
|
|
74
93
|
execFileMock.mockReset();
|
|
75
94
|
|
|
76
95
|
resolveProjectRootMock.mockResolvedValue(repoRoot);
|
|
@@ -89,6 +108,10 @@ describe('dashboard api integration', () => {
|
|
|
89
108
|
},
|
|
90
109
|
],
|
|
91
110
|
});
|
|
111
|
+
readFeatureLogMock.mockResolvedValue({
|
|
112
|
+
entries: [{ timestamp: '2026-03-05T00:00:00Z', message: 'log message', type: 'log' }],
|
|
113
|
+
total: 1,
|
|
114
|
+
});
|
|
92
115
|
});
|
|
93
116
|
|
|
94
117
|
afterEach(async () => {
|
|
@@ -154,6 +177,58 @@ describe('dashboard api integration', () => {
|
|
|
154
177
|
expect(body.error.code).toBe('reason_required');
|
|
155
178
|
});
|
|
156
179
|
|
|
180
|
+
it('GIVEN_feature_send_message_without_message_WHEN_posted_THEN_returns_400', async () => {
|
|
181
|
+
const response = await actionsPost(
|
|
182
|
+
new Request('http://localhost/api/actions', {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
body: JSON.stringify({
|
|
185
|
+
action: 'feature.send_message',
|
|
186
|
+
feature_id: 'feature_checkout',
|
|
187
|
+
}),
|
|
188
|
+
}),
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const body = (await response.json()) as { ok: boolean; error: { code: string } };
|
|
192
|
+
expect(response.status).toBe(400);
|
|
193
|
+
expect(body.ok).toBe(false);
|
|
194
|
+
expect(body.error.code).toBe('message_required');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('GIVEN_feature_send_message_WHEN_posted_THEN_routes_to_tool', async () => {
|
|
198
|
+
const response = await actionsPost(
|
|
199
|
+
new Request('http://localhost/api/actions?project=alpha', {
|
|
200
|
+
method: 'POST',
|
|
201
|
+
body: JSON.stringify({
|
|
202
|
+
action: 'feature.send_message',
|
|
203
|
+
feature_id: 'feature_checkout',
|
|
204
|
+
message: 'Need clarification',
|
|
205
|
+
}),
|
|
206
|
+
}),
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
expect(response.status).toBe(200);
|
|
210
|
+
expect(sendFeatureMessageMock).toHaveBeenCalledWith(
|
|
211
|
+
'feature_checkout',
|
|
212
|
+
'Need clarification',
|
|
213
|
+
repoRoot,
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('GIVEN_feature_retry_WHEN_posted_THEN_routes_to_retry_tool', async () => {
|
|
218
|
+
const response = await actionsPost(
|
|
219
|
+
new Request('http://localhost/api/actions', {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
body: JSON.stringify({
|
|
222
|
+
action: 'feature.retry',
|
|
223
|
+
feature_id: 'feature_checkout',
|
|
224
|
+
}),
|
|
225
|
+
}),
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
expect(response.status).toBe(200);
|
|
229
|
+
expect(retryFeatureMock).toHaveBeenCalledWith('feature_checkout', repoRoot);
|
|
230
|
+
});
|
|
231
|
+
|
|
157
232
|
it('GIVEN_checkout_then_restore_WHEN_feature_branch_exists_THEN_persists_and_restores_checkout_record', async () => {
|
|
158
233
|
readFeatureStateMock.mockResolvedValue({
|
|
159
234
|
id: 'feature_checkout',
|
|
@@ -276,4 +351,23 @@ describe('dashboard api integration', () => {
|
|
|
276
351
|
expect(body.data.projects.map((project) => project.name)).toEqual(['alpha', 'beta']);
|
|
277
352
|
expect(body.data.projects.map((project) => project.path)).toEqual([projectAlpha, projectBeta]);
|
|
278
353
|
});
|
|
354
|
+
|
|
355
|
+
it('GIVEN_feature_history_route_WHEN_requested_THEN_returns_log_entries', async () => {
|
|
356
|
+
const response = await logGet(
|
|
357
|
+
new Request('http://localhost/api/features/feature_checkout/log?project=alpha'),
|
|
358
|
+
{
|
|
359
|
+
params: Promise.resolve({ id: 'feature_checkout' }),
|
|
360
|
+
},
|
|
361
|
+
);
|
|
362
|
+
const body = (await response.json()) as {
|
|
363
|
+
ok: boolean;
|
|
364
|
+
data: { entries: Array<{ message: string }>; total: number };
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
expect(response.status).toBe(200);
|
|
368
|
+
expect(body.ok).toBe(true);
|
|
369
|
+
expect(body.data.total).toBe(1);
|
|
370
|
+
expect(body.data.entries[0].message).toBe('log message');
|
|
371
|
+
expect(readFeatureLogMock).toHaveBeenCalledWith('feature_checkout', repoRoot);
|
|
372
|
+
});
|
|
279
373
|
});
|
|
@@ -2,7 +2,7 @@ import fs from 'node:fs/promises';
|
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { readDashboardStatus } from '@/lib/aop-client.js';
|
|
5
|
+
import { readDashboardStatus, readFeatureLog } from '@/lib/aop-client.js';
|
|
6
6
|
|
|
7
7
|
async function writeState(repoRoot: string, featureId: string, frontMatter: string): Promise<void> {
|
|
8
8
|
const featureDir = path.join(repoRoot, '.aop', 'features', featureId);
|
|
@@ -91,6 +91,33 @@ describe('dashboard aop client mapping', () => {
|
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
+
it('GIVEN_state_with_gate_map_WHEN_readDashboardStatus_THEN_gate_statuses_are_parsed', async () => {
|
|
95
|
+
const repoRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'aop-dash-client-'));
|
|
96
|
+
tempRoots.push(repoRoot);
|
|
97
|
+
await fs.mkdir(path.join(repoRoot, '.aop', 'features'), { recursive: true });
|
|
98
|
+
await fs.writeFile(
|
|
99
|
+
path.join(repoRoot, '.aop', 'features', 'index.json'),
|
|
100
|
+
JSON.stringify({ active: ['feature_gate'], blocked: [], merged: [], blocked_queue: [] }),
|
|
101
|
+
'utf8',
|
|
102
|
+
);
|
|
103
|
+
await writeState(
|
|
104
|
+
repoRoot,
|
|
105
|
+
'feature_gate',
|
|
106
|
+
[
|
|
107
|
+
'feature_id: feature_gate',
|
|
108
|
+
'version: 1',
|
|
109
|
+
'status: qa',
|
|
110
|
+
'gates:',
|
|
111
|
+
' fast: pass',
|
|
112
|
+
' full: fail',
|
|
113
|
+
' merge: na',
|
|
114
|
+
].join('\n'),
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const payload = await readDashboardStatus(repoRoot);
|
|
118
|
+
expect(payload.features[0].gates).toEqual({ fast: 'pass', full: 'fail', merge: 'na' });
|
|
119
|
+
});
|
|
120
|
+
|
|
94
121
|
it('GIVEN_blocked_queue_feature_without_state_WHEN_readDashboardStatus_THEN_phase_is_blocked', async () => {
|
|
95
122
|
const repoRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'aop-dash-client-'));
|
|
96
123
|
tempRoots.push(repoRoot);
|
|
@@ -119,4 +146,31 @@ describe('dashboard aop client mapping', () => {
|
|
|
119
146
|
phase: 'blocked',
|
|
120
147
|
});
|
|
121
148
|
});
|
|
149
|
+
|
|
150
|
+
it('GIVEN_state_body_and_evidence_WHEN_readFeatureLog_THEN_returns_sorted_entries', async () => {
|
|
151
|
+
const repoRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'aop-dash-client-'));
|
|
152
|
+
tempRoots.push(repoRoot);
|
|
153
|
+
const featureRoot = path.join(repoRoot, '.aop', 'features', 'feature_hist');
|
|
154
|
+
const evidenceRoot = path.join(featureRoot, 'evidence');
|
|
155
|
+
await fs.mkdir(evidenceRoot, { recursive: true });
|
|
156
|
+
await fs.writeFile(
|
|
157
|
+
path.join(featureRoot, 'state.md'),
|
|
158
|
+
[
|
|
159
|
+
'---',
|
|
160
|
+
'feature_id: feature_hist',
|
|
161
|
+
'status: qa',
|
|
162
|
+
'---',
|
|
163
|
+
'[2026-03-05T00:00:00Z] status changed to qa',
|
|
164
|
+
'[2026-03-04T20:00:00Z] gates fast pass',
|
|
165
|
+
].join('\n'),
|
|
166
|
+
'utf8',
|
|
167
|
+
);
|
|
168
|
+
await fs.writeFile(path.join(evidenceRoot, 'qa-summary.txt'), 'ok', 'utf8');
|
|
169
|
+
|
|
170
|
+
const log = await readFeatureLog('feature_hist', repoRoot);
|
|
171
|
+
expect(log.total).toBeGreaterThanOrEqual(3);
|
|
172
|
+
expect(log.entries[0].timestamp >= log.entries[1].timestamp).toBe(true);
|
|
173
|
+
expect(log.entries.some((entry) => entry.type === 'evidence')).toBe(true);
|
|
174
|
+
expect(log.entries.some((entry) => entry.type === 'state_change')).toBe(true);
|
|
175
|
+
});
|
|
122
176
|
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
applyQuickFilter,
|
|
4
|
+
computeSummaryCounts,
|
|
5
|
+
createDefaultFilters,
|
|
6
|
+
filterFeatures,
|
|
7
|
+
formatElapsedTime,
|
|
8
|
+
formatRelativeTime,
|
|
9
|
+
parseUnifiedDiff,
|
|
10
|
+
truncateText,
|
|
11
|
+
} from '../../../packages/web-dashboard/src/lib/dashboard-utils.js';
|
|
12
|
+
import type {
|
|
13
|
+
DashboardStatusPayload,
|
|
14
|
+
FeatureSummary,
|
|
15
|
+
} from '../../../packages/web-dashboard/src/lib/types.js';
|
|
16
|
+
|
|
17
|
+
function feature(overrides: Partial<FeatureSummary>): FeatureSummary {
|
|
18
|
+
return {
|
|
19
|
+
id: overrides.feature_id ?? 'feature_a',
|
|
20
|
+
feature_id: overrides.feature_id ?? 'feature_a',
|
|
21
|
+
status: overrides.status ?? 'planning',
|
|
22
|
+
phase: overrides.phase ?? 'planning',
|
|
23
|
+
branch: overrides.branch ?? null,
|
|
24
|
+
worktree_path: overrides.worktree_path ?? null,
|
|
25
|
+
activity_state: overrides.activity_state ?? 'idle',
|
|
26
|
+
pr: overrides.pr ?? null,
|
|
27
|
+
gates: overrides.gates,
|
|
28
|
+
...overrides,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('dashboard utilities', () => {
|
|
33
|
+
it('applies quick filters deterministically', () => {
|
|
34
|
+
const active = applyQuickFilter('active');
|
|
35
|
+
expect(active.phases).toEqual(['planning', 'building', 'qa', 'ready_to_merge']);
|
|
36
|
+
|
|
37
|
+
const awaitingInput = applyQuickFilter('awaiting_input');
|
|
38
|
+
expect(awaitingInput.activities).toEqual(['waiting_input']);
|
|
39
|
+
|
|
40
|
+
const ciFailing = applyQuickFilter('ci_failing');
|
|
41
|
+
expect(ciFailing.ciFailuresOnly).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('filters feature collections by search, phase, activity, gates, and ci', () => {
|
|
45
|
+
const features = [
|
|
46
|
+
feature({
|
|
47
|
+
feature_id: 'alpha',
|
|
48
|
+
phase: 'blocked',
|
|
49
|
+
activity_state: 'waiting_input',
|
|
50
|
+
gates: { fast: 'fail' },
|
|
51
|
+
pr: { ci_status: 'failure' },
|
|
52
|
+
}),
|
|
53
|
+
feature({
|
|
54
|
+
feature_id: 'beta',
|
|
55
|
+
phase: 'qa',
|
|
56
|
+
activity_state: 'active',
|
|
57
|
+
gates: { fast: 'pass' },
|
|
58
|
+
pr: { ci_status: 'success' },
|
|
59
|
+
}),
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const filters = {
|
|
63
|
+
...createDefaultFilters(),
|
|
64
|
+
searchText: 'alp',
|
|
65
|
+
phases: ['blocked'] as FeatureSummary['phase'][],
|
|
66
|
+
activities: ['waiting_input'] as NonNullable<FeatureSummary['activity_state']>[],
|
|
67
|
+
gateFailuresOnly: true,
|
|
68
|
+
ciFailuresOnly: true,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const filtered = filterFeatures(features, filters);
|
|
72
|
+
expect(filtered).toHaveLength(1);
|
|
73
|
+
expect(filtered[0].feature_id).toBe('alpha');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('computes summary counters from status payload', () => {
|
|
77
|
+
const payload: DashboardStatusPayload = {
|
|
78
|
+
index: {
|
|
79
|
+
active: ['alpha', 'beta'],
|
|
80
|
+
blocked: ['alpha'],
|
|
81
|
+
merged: [],
|
|
82
|
+
blocked_queue: [],
|
|
83
|
+
},
|
|
84
|
+
features: [
|
|
85
|
+
feature({
|
|
86
|
+
feature_id: 'alpha',
|
|
87
|
+
phase: 'blocked',
|
|
88
|
+
activity_state: 'waiting_input',
|
|
89
|
+
pr: { ci_status: 'failure' },
|
|
90
|
+
}),
|
|
91
|
+
feature({
|
|
92
|
+
feature_id: 'beta',
|
|
93
|
+
phase: 'ready_to_merge',
|
|
94
|
+
activity_state: 'active',
|
|
95
|
+
pr: { ci_status: 'success' },
|
|
96
|
+
}),
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const counts = computeSummaryCounts(payload);
|
|
101
|
+
expect(counts).toEqual({
|
|
102
|
+
active: 2,
|
|
103
|
+
blocked: 1,
|
|
104
|
+
awaitingInput: 1,
|
|
105
|
+
readyToMerge: 1,
|
|
106
|
+
ciFailing: 1,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('parses unified diff into file and hunk metadata with line numbers', () => {
|
|
111
|
+
const parsed = parseUnifiedDiff(
|
|
112
|
+
[
|
|
113
|
+
'diff --git a/file.ts b/file.ts',
|
|
114
|
+
'index abc..def 100644',
|
|
115
|
+
'--- a/file.ts',
|
|
116
|
+
'+++ b/file.ts',
|
|
117
|
+
'@@ -1,2 +1,2 @@',
|
|
118
|
+
'-const oldValue = 1;',
|
|
119
|
+
'+const newValue = 2;',
|
|
120
|
+
' export const done = true;',
|
|
121
|
+
].join('\n'),
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
expect(parsed).toHaveLength(1);
|
|
125
|
+
expect(parsed[0].filePath).toBe('file.ts');
|
|
126
|
+
const allLines = parsed[0].hunks.flatMap((hunk) => hunk.lines);
|
|
127
|
+
const firstDelete = allLines.find((line) => line.type === 'del');
|
|
128
|
+
const firstAdd = allLines.find((line) => line.type === 'add');
|
|
129
|
+
expect(firstDelete).toMatchObject({ type: 'del', oldLineNumber: 1 });
|
|
130
|
+
expect(firstAdd).toMatchObject({ type: 'add', newLineNumber: 1 });
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('formats relative and elapsed time and truncates text', () => {
|
|
134
|
+
const now = Date.parse('2026-03-05T00:01:00Z');
|
|
135
|
+
expect(formatRelativeTime('2026-03-05T00:00:00Z', now)).toBe('1 minute ago');
|
|
136
|
+
expect(formatElapsedTime('2026-03-04T22:31:00Z', now)).toBe('1h 30m');
|
|
137
|
+
expect(truncateText('feature_abcdefghijklmnopqrstuvwxyz', 24)).toBe('feature_abcdefghijklm...');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -19,7 +19,7 @@ describe('WorkerDecisionLoop', () => {
|
|
|
19
19
|
|
|
20
20
|
function makeToolCaller() {
|
|
21
21
|
return {
|
|
22
|
-
callTool: vi.fn(async (_role: string, toolName: string) => {
|
|
22
|
+
callTool: vi.fn(async (_role: string, toolName: string, _input?: unknown) => {
|
|
23
23
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT) {
|
|
24
24
|
return { ok: true, data: { refreshed: true } };
|
|
25
25
|
}
|
|
@@ -117,6 +117,38 @@ describe('WorkerDecisionLoop', () => {
|
|
|
117
117
|
);
|
|
118
118
|
});
|
|
119
119
|
|
|
120
|
+
it('GIVEN_planner_submission_with_unknown_plan_fields_WHEN_executed_THEN_drops_unrecognized_fields', async () => {
|
|
121
|
+
const provider = makeProvider({
|
|
122
|
+
type: 'PLAN_SUBMISSION',
|
|
123
|
+
plan_json: {
|
|
124
|
+
feature_id: 'feature_a',
|
|
125
|
+
plan_version: 1,
|
|
126
|
+
summary: 'Initial plan',
|
|
127
|
+
phase_notes: ['not in schema'],
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
const toolCaller = makeToolCaller();
|
|
131
|
+
const loop = new WorkerDecisionLoop({
|
|
132
|
+
provider: provider as never,
|
|
133
|
+
toolCaller: toolCaller as never,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const result = await loop.execute({
|
|
137
|
+
role: 'planner',
|
|
138
|
+
featureId: 'feature_a',
|
|
139
|
+
contextBundle: { plan: null },
|
|
140
|
+
instructions: 'plan',
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
expect(result.planSubmission).toBe(true);
|
|
144
|
+
const planSubmitCall = toolCaller.callTool.mock.calls.find(
|
|
145
|
+
(call) => call[0] === 'planner' && call[1] === TOOLS.PLAN_SUBMIT,
|
|
146
|
+
);
|
|
147
|
+
expect(planSubmitCall).toBeDefined();
|
|
148
|
+
const payload = planSubmitCall?.[2] as { plan_json?: Record<string, unknown> };
|
|
149
|
+
expect(payload.plan_json?.phase_notes).toBeUndefined();
|
|
150
|
+
});
|
|
151
|
+
|
|
120
152
|
it('GIVEN_planner_submission_with_existing_plan_WHEN_executed_THEN_routes_to_plan_update', async () => {
|
|
121
153
|
const provider = makeProvider({
|
|
122
154
|
type: 'PLAN_SUBMISSION',
|
|
@@ -478,6 +510,42 @@ describe('WorkerDecisionLoop', () => {
|
|
|
478
510
|
);
|
|
479
511
|
});
|
|
480
512
|
|
|
513
|
+
it('GIVEN_planner_amend_plan_with_unknown_plan_fields_WHEN_executed_THEN_strips_unrecognized_fields', async () => {
|
|
514
|
+
const provider = makeProvider({
|
|
515
|
+
type: 'REQUEST',
|
|
516
|
+
request: {
|
|
517
|
+
action: 'amend_plan',
|
|
518
|
+
plan_json: {
|
|
519
|
+
feature_id: 'feature_a',
|
|
520
|
+
plan_version: 1,
|
|
521
|
+
summary: 'Plan with extra metadata',
|
|
522
|
+
phase_notes: ['drop me'],
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
const toolCaller = makeToolCaller();
|
|
527
|
+
const loop = new WorkerDecisionLoop({
|
|
528
|
+
provider: provider as never,
|
|
529
|
+
toolCaller: toolCaller as never,
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
const result = await loop.execute({
|
|
533
|
+
role: 'planner',
|
|
534
|
+
featureId: 'feature_a',
|
|
535
|
+
contextBundle: { plan: null },
|
|
536
|
+
instructions: 'amend',
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
expect(result.requestHandled).toBe(true);
|
|
540
|
+
expect(result.planSubmission).toBe(true);
|
|
541
|
+
const planSubmitCall = toolCaller.callTool.mock.calls.find(
|
|
542
|
+
(call) => call[0] === 'planner' && call[1] === TOOLS.PLAN_SUBMIT,
|
|
543
|
+
);
|
|
544
|
+
expect(planSubmitCall).toBeDefined();
|
|
545
|
+
const payload = planSubmitCall?.[2] as { plan_json?: Record<string, unknown> };
|
|
546
|
+
expect(payload.plan_json?.phase_notes).toBeUndefined();
|
|
547
|
+
});
|
|
548
|
+
|
|
481
549
|
it('GIVEN_planner_amend_plan_request_WHEN_existing_version_present_THEN_updates_plan', async () => {
|
|
482
550
|
const provider = makeProvider({
|
|
483
551
|
type: 'REQUEST',
|
|
@@ -620,7 +688,7 @@ describe('WorkerDecisionLoop amend_plan revision_of branches', () => {
|
|
|
620
688
|
|
|
621
689
|
function makeToolCaller() {
|
|
622
690
|
return {
|
|
623
|
-
callTool: vi.fn(async (_role: string, toolName: string) => {
|
|
691
|
+
callTool: vi.fn(async (_role: string, toolName: string, _input?: unknown) => {
|
|
624
692
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT) {
|
|
625
693
|
return { ok: true, data: { refreshed: true } };
|
|
626
694
|
}
|
|
@@ -2,6 +2,7 @@ You are the planner role.
|
|
|
2
2
|
|
|
3
3
|
Produce deterministic plan submissions and plan updates that conform to plan schema and policy constraints.
|
|
4
4
|
Avoid speculative edits outside the declared file scope.
|
|
5
|
+
When emitting `PLAN_SUBMISSION` or `REQUEST.action=amend_plan`, `plan_json` must only include keys allowed by `plan.schema.json` (no extra fields such as `phase_notes`).
|
|
5
6
|
|
|
6
7
|
After each QA wave, perform an explicit reconciliation pass:
|
|
7
8
|
|
|
@@ -2,6 +2,23 @@ import fs from 'node:fs/promises';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { TOOLS } from '../core/constants.js';
|
|
4
4
|
import { ERROR_CODES } from '../core/error-codes.js';
|
|
5
|
+
const PLAN_TOP_LEVEL_KEYS = new Set([
|
|
6
|
+
'feature_id',
|
|
7
|
+
'plan_version',
|
|
8
|
+
'summary',
|
|
9
|
+
'allowed_areas',
|
|
10
|
+
'forbidden_areas',
|
|
11
|
+
'base_ref',
|
|
12
|
+
'files',
|
|
13
|
+
'contracts',
|
|
14
|
+
'acceptance_criteria',
|
|
15
|
+
'gate_profile',
|
|
16
|
+
'gate_targets',
|
|
17
|
+
'risk',
|
|
18
|
+
'revision_of',
|
|
19
|
+
'revision_reason',
|
|
20
|
+
'verification_overrides',
|
|
21
|
+
]);
|
|
5
22
|
function asRecord(value) {
|
|
6
23
|
return value && typeof value === 'object' ? value : {};
|
|
7
24
|
}
|
|
@@ -31,6 +48,16 @@ function readPlanVersion(value) {
|
|
|
31
48
|
}
|
|
32
49
|
return Math.floor(value);
|
|
33
50
|
}
|
|
51
|
+
function sanitizePlannerPlan(plan) {
|
|
52
|
+
const sanitized = {};
|
|
53
|
+
for (const [key, value] of Object.entries(plan)) {
|
|
54
|
+
if (!PLAN_TOP_LEVEL_KEYS.has(key)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
sanitized[key] = value;
|
|
58
|
+
}
|
|
59
|
+
return sanitized;
|
|
60
|
+
}
|
|
34
61
|
function asOutputs(result) {
|
|
35
62
|
const outputs = result.outputs;
|
|
36
63
|
if (Array.isArray(outputs)) {
|
|
@@ -163,7 +190,7 @@ export class WorkerDecisionLoop {
|
|
|
163
190
|
if (input.role !== 'planner') {
|
|
164
191
|
return;
|
|
165
192
|
}
|
|
166
|
-
const planJson = asRecord(output.plan_json ?? output.plan);
|
|
193
|
+
const planJson = sanitizePlannerPlan(asRecord(output.plan_json ?? output.plan));
|
|
167
194
|
if (Object.keys(planJson).length === 0) {
|
|
168
195
|
return;
|
|
169
196
|
}
|
|
@@ -266,7 +293,7 @@ export class WorkerDecisionLoop {
|
|
|
266
293
|
return;
|
|
267
294
|
}
|
|
268
295
|
if (action === 'amend_plan' && input.role === 'planner') {
|
|
269
|
-
const planJson = asRecord(request.plan_json);
|
|
296
|
+
const planJson = sanitizePlannerPlan(asRecord(request.plan_json));
|
|
270
297
|
if (Object.keys(planJson).length === 0) {
|
|
271
298
|
return;
|
|
272
299
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-decision-loop.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/supervisor/worker-decision-loop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker-decision-loop.js","sourceRoot":"","sources":["../../../../apps/control-plane/src/supervisor/worker-decision-loop.ts"],"names":[],"mappings":"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"}
|