@osovv/vv-opencode 0.35.23 → 0.35.24

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.
@@ -1,43 +1,60 @@
1
1
  // FILE: src/plugins/workflow/state.ts
2
- // VERSION: 0.2.0
2
+ // VERSION: 0.3.0
3
3
  // START_MODULE_CONTRACT
4
- // PURPOSE: Manage in-memory workflow work-item state scoped by session with idempotent open semantics.
5
- // SCOPE: Session-scoped work-item storage, id generation, idempotent open-by-key, state transitions, review counters, and close/list/get operations.
6
- // DEPENDS: [src/plugins/workflow/protocol.ts]
4
+ // PURPOSE: Manage session-scoped workflow work-item state with explicit workflow intent and collect-all review rounds.
5
+ // SCOPE: Session-scoped storage, id generation, idempotent open-by-key, explicit mode/reviewer metadata, launch-time in-flight tracking, result-time round aggregation, close gating, and review-round helpers.
6
+ // DEPENDS: [src/plugins/workflow/protocol.ts, src/plugins/workflow/transitions.ts]
7
7
  // LINKS: [M-WORKFLOW-STATE]
8
8
  // ROLE: RUNTIME
9
9
  // MAP_MODE: EXPORTS
10
10
  // END_MODULE_CONTRACT
11
11
  //
12
12
  // START_MODULE_MAP
13
+ // WorkItemMode - Explicit workflow intent stored on each work item.
14
+ // ReviewerRole - Domain reviewer role IDs accepted by work_item_open.
15
+ // ReviewerAgentName - Tracked reviewer subagent names mapped from reviewer roles.
16
+ // ReviewRound - Explicit current-round reviewer progress and results.
13
17
  // WorkItemState - Allowed lifecycle states for a tracked work item.
14
- // WorkItemRecord - Canonical in-memory state record for a work item.
15
- // WorkItemStore - Store interface exposing deterministic workflow state operations.
16
- // OpenWorkItemResult - Structured open operation result with idempotency and conflict signaling.
17
- // CloseWorkItemResult - Structured close operation result.
18
- // TransitionWorkItemStateResult - Structured transition operation result.
19
- // createWorkItemStore - Creates a new in-memory store instance, optionally hydrated from persisted data.
20
- // openWorkItem - Opens an item idempotently by (sessionId, key).
21
- // getWorkItem - Fetches an item by session and work-item id.
22
- // listWorkItems - Lists session items with optional closed inclusion.
23
- // closeWorkItem - Closes an existing open item.
24
- // transitionWorkItemState - Applies deterministic state transitions and increments review counters.
25
- // getReviewRound - Computes review round as max(specReviewCount, codeReviewCount).
26
- // WorkItemStoreData - JSON-serializable store data structure for persistence.
18
+ // WorkItemRecord - Canonical in-memory and persisted state record for a work item.
19
+ // WorkItemStore - Store interface exposing open, launch, result, list, close, and snapshot operations.
20
+ // createWorkItemStore - Creates a new scoped in-memory work-item store.
21
+ // openWorkItem - Creates or returns an existing work item by idempotency key.
22
+ // beginTrackedLaunch - Validates tracked launch and marks reviewers in flight.
23
+ // applyTrackedResult - Applies parsed tracked output and aggregates review rounds.
24
+ // getWorkItem - Retrieves a work item by ID.
25
+ // listWorkItems - Lists session work items with optional closed inclusion.
26
+ // closeWorkItem - Closes only ready_to_close work items.
27
+ // getReviewRound - Computes visible review round from current or completed round state.
27
28
  // END_MODULE_MAP
28
29
  //
29
30
  // START_CHANGE_SUMMARY
31
+ // LAST_CHANGE: [v0.3.0 - Replaced inferred sequential reviewer states with explicit work-item mode, reviewer intent, in-flight tracking, and collect-all review-round aggregation.]
30
32
  // LAST_CHANGE: [v0.2.0 - Allowed fresh review-only work items to transition directly from reviewer outcomes.]
31
33
  // LAST_CHANGE: [v0.1.2 - Required actor metadata for tracked transitions so reviewer counters cannot be bypassed by actor-less updates.]
32
34
  // LAST_CHANGE: [v0.1.1 - Enforced deterministic transition invariants with sticky hard-stop states and optional closed-item listing support.]
33
35
  // LAST_CHANGE: [v0.1.0 - Added session-scoped in-memory workflow state store with idempotent open, transitions, close/list/get, and review-round helpers.]
34
36
  // END_CHANGE_SUMMARY
37
+ import { getAllowedNextAgents, getReviewerRoleForAgent, hasNeedsContextResult, isRoundSettled, resolveCompletedRoundState, } from "./transitions.js";
38
+ export const WORK_ITEM_MODES = ["implementation", "review_only"];
39
+ export const REVIEWER_ROLES = ["spec", "code"];
35
40
  function createRecordLookupKey(sessionId, workItemId) {
36
41
  return `${sessionId}::${workItemId}`;
37
42
  }
43
+ function cloneRound(round) {
44
+ return {
45
+ ...round,
46
+ requiredReviewers: [...round.requiredReviewers],
47
+ pendingReviewers: [...round.pendingReviewers],
48
+ inFlightReviewers: [...round.inFlightReviewers],
49
+ completedReviewers: [...round.completedReviewers],
50
+ results: { ...round.results },
51
+ };
52
+ }
38
53
  function cloneRecord(record) {
39
54
  return {
40
55
  ...record,
56
+ requiredReviewers: [...record.requiredReviewers],
57
+ ...(record.currentRound ? { currentRound: cloneRound(record.currentRound) } : {}),
41
58
  };
42
59
  }
43
60
  function createHeader(workItemId) {
@@ -46,7 +63,55 @@ function createHeader(workItemId) {
46
63
  function toIsoNow() {
47
64
  return new Date().toISOString();
48
65
  }
66
+ function isReviewerRole(value) {
67
+ return value === "spec" || value === "code";
68
+ }
69
+ function canonicalizeReviewers(value) {
70
+ if (!Array.isArray(value) || value.length === 0)
71
+ return undefined;
72
+ if (!value.every(isReviewerRole))
73
+ return undefined;
74
+ const unique = new Set(value);
75
+ if (unique.size !== value.length)
76
+ return undefined;
77
+ return [...value].sort((left, right) => {
78
+ if (left === right)
79
+ return 0;
80
+ return left === "spec" ? -1 : 1;
81
+ });
82
+ }
83
+ function sameReviewerSet(left, right) {
84
+ return left.length === right.length && left.every((entry, index) => entry === right[index]);
85
+ }
86
+ function createReviewRound(requiredReviewers, round, now) {
87
+ return {
88
+ round,
89
+ requiredReviewers: [...requiredReviewers],
90
+ pendingReviewers: [...requiredReviewers],
91
+ inFlightReviewers: [],
92
+ completedReviewers: [],
93
+ results: {},
94
+ status: "active",
95
+ createdAt: now,
96
+ };
97
+ }
98
+ function createLaunchError(record, errorCode, message) {
99
+ return {
100
+ ok: false,
101
+ errorCode,
102
+ message,
103
+ allowedAgents: record ? getAllowedNextAgents(record) : [],
104
+ };
105
+ }
49
106
  function openWorkItemInStore(store, input) {
107
+ const requiredReviewers = canonicalizeReviewers(input.requiredReviewers);
108
+ if (!requiredReviewers) {
109
+ return {
110
+ ok: false,
111
+ errorCode: "INVALID_INPUT",
112
+ message: "INVALID_INPUT: requiredReviewers must be a non-empty canonical set of spec/code reviewers",
113
+ };
114
+ }
50
115
  const sessionIndex = store.keyIndexBySession.get(input.sessionId) ??
51
116
  (() => {
52
117
  const index = new Map();
@@ -59,11 +124,13 @@ function openWorkItemInStore(store, input) {
59
124
  if (!existing) {
60
125
  sessionIndex.delete(input.key);
61
126
  }
62
- else if (existing.title !== input.title) {
127
+ else if (existing.title !== input.title ||
128
+ existing.mode !== input.mode ||
129
+ !sameReviewerSet(existing.requiredReviewers, requiredReviewers)) {
63
130
  return {
64
131
  ok: false,
65
132
  errorCode: "WORK_ITEM_KEY_CONFLICT",
66
- message: `WORK_ITEM_KEY_CONFLICT: key ${input.key} is already associated with a different title`,
133
+ message: `WORK_ITEM_KEY_CONFLICT: key ${input.key} is already associated with different workflow intent`,
67
134
  existingWorkItemId: existing.workItemId,
68
135
  };
69
136
  }
@@ -84,7 +151,13 @@ function openWorkItemInStore(store, input) {
84
151
  workItemId,
85
152
  key: input.key,
86
153
  title: input.title,
87
- state: "open",
154
+ mode: input.mode,
155
+ requiredReviewers,
156
+ state: input.mode === "review_only" ? "awaiting_reviews" : "open",
157
+ ...(input.mode === "review_only"
158
+ ? { currentRound: createReviewRound(requiredReviewers, 1, now) }
159
+ : {}),
160
+ completedReviewRoundCount: 0,
88
161
  specReviewCount: 0,
89
162
  codeReviewCount: 0,
90
163
  createdAt: now,
@@ -103,55 +176,6 @@ function getWorkItemInStore(store, sessionId, workItemId) {
103
176
  const record = store.records.get(createRecordLookupKey(sessionId, workItemId));
104
177
  return record ? cloneRecord(record) : undefined;
105
178
  }
106
- function isTransitionAllowed(fromState, toState) {
107
- const allowed = {
108
- open: [
109
- "awaiting_implementer",
110
- "awaiting_spec_review",
111
- "awaiting_code_review",
112
- "needs_context",
113
- "blocked",
114
- "ready_to_close",
115
- ],
116
- awaiting_implementer: ["awaiting_spec_review", "needs_context", "blocked"],
117
- awaiting_spec_review: ["awaiting_code_review", "awaiting_implementer", "needs_context"],
118
- awaiting_code_review: ["ready_to_close", "awaiting_implementer", "needs_context"],
119
- ready_to_close: [],
120
- needs_context: [],
121
- blocked: [],
122
- closed: [],
123
- };
124
- return allowed[fromState].includes(toState);
125
- }
126
- function getAllowedActorsForState(state) {
127
- if (state === "open" || state === "awaiting_implementer") {
128
- return state === "open"
129
- ? ["vv-implementer", "vv-spec-reviewer", "vv-code-reviewer"]
130
- : ["vv-implementer"];
131
- }
132
- if (state === "awaiting_spec_review") {
133
- return ["vv-spec-reviewer"];
134
- }
135
- if (state === "awaiting_code_review") {
136
- return ["vv-code-reviewer"];
137
- }
138
- return [];
139
- }
140
- function isActorStateTransitionAllowed(actor, fromState, toState) {
141
- if (!actor) {
142
- return true;
143
- }
144
- if (actor === "vv-implementer") {
145
- return ((fromState === "open" || fromState === "awaiting_implementer") &&
146
- ["awaiting_spec_review", "needs_context", "blocked"].includes(toState));
147
- }
148
- if (actor === "vv-spec-reviewer") {
149
- return ((fromState === "open" || fromState === "awaiting_spec_review") &&
150
- ["awaiting_code_review", "awaiting_implementer", "needs_context"].includes(toState));
151
- }
152
- return ((fromState === "open" || fromState === "awaiting_code_review") &&
153
- ["ready_to_close", "awaiting_implementer", "needs_context"].includes(toState));
154
- }
155
179
  function listWorkItemsInStore(store, sessionId, options = {}) {
156
180
  const includeClosed = options.includeClosed === true;
157
181
  return [...store.records.values()]
@@ -180,6 +204,13 @@ function closeWorkItemInStore(store, sessionId, workItemId) {
180
204
  message: `WORK_ITEM_ALREADY_CLOSED: ${workItemId} is already closed`,
181
205
  };
182
206
  }
207
+ if (existing.state !== "ready_to_close") {
208
+ return {
209
+ ok: false,
210
+ errorCode: "READY_TO_CLOSE_REQUIRED",
211
+ message: `READY_TO_CLOSE_REQUIRED: ${workItemId} is ${existing.state} and cannot be closed`,
212
+ };
213
+ }
183
214
  const now = toIsoNow();
184
215
  const updated = {
185
216
  ...existing,
@@ -194,79 +225,217 @@ function closeWorkItemInStore(store, sessionId, workItemId) {
194
225
  header: createHeader(workItemId),
195
226
  };
196
227
  }
197
- function transitionWorkItemStateInStore(store, input) {
228
+ function beginTrackedLaunchInStore(store, input) {
198
229
  const lookupKey = createRecordLookupKey(input.sessionId, input.workItemId);
199
230
  const existing = store.records.get(lookupKey);
200
231
  if (!existing) {
232
+ return createLaunchError(undefined, "WORK_ITEM_NOT_FOUND", `WORK_ITEM_NOT_FOUND: ${input.workItemId}`);
233
+ }
234
+ if (existing.state === "closed") {
235
+ return createLaunchError(existing, "WORK_ITEM_ALREADY_CLOSED", `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`);
236
+ }
237
+ const role = getReviewerRoleForAgent(input.agent);
238
+ if (!role) {
239
+ if (!getAllowedNextAgents(existing).includes(input.agent)) {
240
+ return createLaunchError(existing, "INVALID_NEXT_AGENT", `INVALID_NEXT_AGENT: ${input.agent} is not allowed for ${existing.state}`);
241
+ }
201
242
  return {
202
- ok: false,
203
- errorCode: "WORK_ITEM_NOT_FOUND",
204
- message: `WORK_ITEM_NOT_FOUND: no work item ${input.workItemId} for session ${input.sessionId}`,
243
+ ok: true,
244
+ record: cloneRecord(existing),
245
+ reviewRound: getReviewRound(existing),
205
246
  };
206
247
  }
207
- if (existing.state === "closed") {
248
+ const round = existing.currentRound;
249
+ if (existing.state !== "awaiting_reviews" || !round || round.status !== "active") {
250
+ return createLaunchError(existing, "REVIEW_ROUND_NOT_ACTIVE", `REVIEW_ROUND_NOT_ACTIVE: ${input.workItemId} has no active review round`);
251
+ }
252
+ if (!round.requiredReviewers.includes(role)) {
253
+ return createLaunchError(existing, "REVIEWER_NOT_REQUIRED", `REVIEWER_NOT_REQUIRED: ${role} is not required for ${input.workItemId}`);
254
+ }
255
+ if (hasNeedsContextResult(round)) {
256
+ return createLaunchError(existing, "REVIEW_ROUND_NEEDS_CONTEXT", `REVIEW_ROUND_NEEDS_CONTEXT: ${input.workItemId} is waiting for in-flight reviewers after NEEDS_CONTEXT`);
257
+ }
258
+ if (round.inFlightReviewers.includes(role)) {
259
+ return createLaunchError(existing, "REVIEWER_ALREADY_IN_FLIGHT", `REVIEWER_ALREADY_IN_FLIGHT: ${role} is already in flight for ${input.workItemId}`);
260
+ }
261
+ if (round.completedReviewers.includes(role)) {
262
+ return createLaunchError(existing, "REVIEWER_ALREADY_COMPLETED", `REVIEWER_ALREADY_COMPLETED: ${role} already completed for ${input.workItemId}`);
263
+ }
264
+ if (!round.pendingReviewers.includes(role)) {
265
+ return createLaunchError(existing, "INVALID_NEXT_AGENT", `INVALID_NEXT_AGENT: ${role} is not pending for ${input.workItemId}`);
266
+ }
267
+ const updatedRound = {
268
+ ...round,
269
+ pendingReviewers: round.pendingReviewers.filter((reviewer) => reviewer !== role),
270
+ inFlightReviewers: [...round.inFlightReviewers, role],
271
+ };
272
+ const updated = {
273
+ ...existing,
274
+ currentRound: updatedRound,
275
+ updatedAt: toIsoNow(),
276
+ };
277
+ store.records.set(lookupKey, updated);
278
+ return {
279
+ ok: true,
280
+ record: cloneRecord(updated),
281
+ reviewer: role,
282
+ reviewRound: updatedRound.round,
283
+ };
284
+ }
285
+ function applyImplementerResult(existing, result, now) {
286
+ if (result.status === "DONE" || result.status === "DONE_WITH_CONCERNS") {
208
287
  return {
209
- ok: false,
210
- errorCode: "WORK_ITEM_ALREADY_CLOSED",
211
- message: `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`,
288
+ ...existing,
289
+ state: "awaiting_reviews",
290
+ currentRound: createReviewRound(existing.requiredReviewers, existing.completedReviewRoundCount + 1, now),
291
+ updatedAt: now,
292
+ };
293
+ }
294
+ if (result.status === "NEEDS_CONTEXT") {
295
+ return {
296
+ ...existing,
297
+ state: "needs_context",
298
+ updatedAt: now,
212
299
  };
213
300
  }
214
- const allowedActors = getAllowedActorsForState(existing.state);
215
- if (allowedActors.length > 0 && !input.actor) {
301
+ return {
302
+ ...existing,
303
+ state: "blocked",
304
+ updatedAt: now,
305
+ };
306
+ }
307
+ function applyReviewerResult(existing, role, result, now) {
308
+ const round = existing.currentRound;
309
+ if (existing.state !== "awaiting_reviews" || !round || round.status !== "active") {
216
310
  return {
217
311
  ok: false,
218
- errorCode: "MISSING_TRANSITION_ACTOR",
219
- message: `MISSING_TRANSITION_ACTOR: state ${existing.state} requires actor metadata`,
312
+ errorCode: "REVIEW_ROUND_NOT_ACTIVE",
313
+ message: `REVIEW_ROUND_NOT_ACTIVE: ${existing.workItemId} has no active review round`,
220
314
  };
221
315
  }
222
- if (input.actor && allowedActors.length > 0 && !allowedActors.includes(input.actor)) {
316
+ if (!round.requiredReviewers.includes(role)) {
223
317
  return {
224
318
  ok: false,
225
- errorCode: "INVALID_STATE_TRANSITION",
226
- message: `INVALID_STATE_TRANSITION: actor ${input.actor} is not allowed for state ${existing.state}`,
319
+ errorCode: "REVIEWER_NOT_REQUIRED",
320
+ message: `REVIEWER_NOT_REQUIRED: ${role} is not required for ${existing.workItemId}`,
227
321
  };
228
322
  }
229
- if (!isTransitionAllowed(existing.state, input.state)) {
323
+ if (round.completedReviewers.includes(role) || round.results[role]) {
230
324
  return {
231
325
  ok: false,
232
- errorCode: "INVALID_STATE_TRANSITION",
233
- message: `INVALID_STATE_TRANSITION: cannot transition from ${existing.state} to ${input.state}`,
326
+ errorCode: "REVIEWER_ALREADY_COMPLETED",
327
+ message: `REVIEWER_ALREADY_COMPLETED: ${role} already completed for ${existing.workItemId}`,
234
328
  };
235
329
  }
236
- if (!isActorStateTransitionAllowed(input.actor, existing.state, input.state)) {
330
+ if (!round.inFlightReviewers.includes(role)) {
237
331
  return {
238
332
  ok: false,
239
- errorCode: "INVALID_STATE_TRANSITION",
240
- message: `INVALID_STATE_TRANSITION: actor ${input.actor ?? "<none>"} cannot transition from ${existing.state} to ${input.state}`,
333
+ errorCode: "REVIEWER_NOT_IN_FLIGHT",
334
+ message: `REVIEWER_NOT_IN_FLIGHT: ${role} was not in flight for ${existing.workItemId}`,
241
335
  };
242
336
  }
243
- const updated = {
337
+ const status = result.status;
338
+ const reviewerResult = {
339
+ reviewer: role,
340
+ agent: result.agent,
341
+ status,
342
+ completedAt: now,
343
+ };
344
+ let updatedRound = {
345
+ ...round,
346
+ inFlightReviewers: round.inFlightReviewers.filter((reviewer) => reviewer !== role),
347
+ completedReviewers: [...round.completedReviewers, role],
348
+ results: {
349
+ ...round.results,
350
+ [role]: reviewerResult,
351
+ },
352
+ };
353
+ const aggregateComplete = isRoundSettled(updatedRound);
354
+ const nextState = aggregateComplete
355
+ ? resolveCompletedRoundState(existing, updatedRound)
356
+ : "awaiting_reviews";
357
+ if (aggregateComplete) {
358
+ updatedRound = {
359
+ ...updatedRound,
360
+ status: "completed",
361
+ completedAt: now,
362
+ };
363
+ }
364
+ return {
244
365
  ...existing,
245
- state: input.state,
246
- updatedAt: toIsoNow(),
247
- specReviewCount: input.actor === "vv-spec-reviewer" ? existing.specReviewCount + 1 : existing.specReviewCount,
248
- codeReviewCount: input.actor === "vv-code-reviewer" ? existing.codeReviewCount + 1 : existing.codeReviewCount,
366
+ state: nextState,
367
+ currentRound: updatedRound,
368
+ completedReviewRoundCount: aggregateComplete
369
+ ? Math.max(existing.completedReviewRoundCount, updatedRound.round)
370
+ : existing.completedReviewRoundCount,
371
+ specReviewCount: role === "spec" ? existing.specReviewCount + 1 : existing.specReviewCount,
372
+ codeReviewCount: role === "code" ? existing.codeReviewCount + 1 : existing.codeReviewCount,
373
+ updatedAt: now,
249
374
  };
375
+ }
376
+ function applyTrackedResultInStore(store, input) {
377
+ const lookupKey = createRecordLookupKey(input.sessionId, input.workItemId);
378
+ const existing = store.records.get(lookupKey);
379
+ if (!existing) {
380
+ return {
381
+ ok: false,
382
+ errorCode: "WORK_ITEM_NOT_FOUND",
383
+ message: `WORK_ITEM_NOT_FOUND: no work item ${input.workItemId} for session ${input.sessionId}`,
384
+ };
385
+ }
386
+ if (existing.state === "closed") {
387
+ return {
388
+ ok: false,
389
+ errorCode: "WORK_ITEM_ALREADY_CLOSED",
390
+ message: `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`,
391
+ };
392
+ }
393
+ const now = toIsoNow();
394
+ const fromState = existing.state;
395
+ let updated;
396
+ const role = getReviewerRoleForAgent(input.result.agent);
397
+ if (!role) {
398
+ if (existing.mode !== "implementation" ||
399
+ (existing.state !== "open" && existing.state !== "awaiting_implementer")) {
400
+ return {
401
+ ok: false,
402
+ errorCode: "INVALID_RESULT_AGENT",
403
+ message: `INVALID_RESULT_AGENT: ${input.result.agent} cannot produce a result for ${existing.state}`,
404
+ };
405
+ }
406
+ updated = applyImplementerResult(existing, input.result, now);
407
+ }
408
+ else {
409
+ updated = applyReviewerResult(existing, role, input.result, now);
410
+ }
411
+ if ("ok" in updated && updated.ok === false) {
412
+ return updated;
413
+ }
250
414
  store.records.set(lookupKey, updated);
251
415
  return {
252
416
  ok: true,
253
417
  record: cloneRecord(updated),
418
+ fromState,
419
+ toState: updated.state,
420
+ aggregateComplete: role !== undefined &&
421
+ updated.currentRound?.status === "completed" &&
422
+ fromState === "awaiting_reviews",
254
423
  };
255
424
  }
256
425
  // START_CONTRACT: getReviewRound
257
- // PURPOSE: Compute deterministic review round from reviewer counters.
258
- // INPUTS: { record: Pick<WorkItemRecord, "specReviewCount" | "codeReviewCount"> - review counters }
259
- // OUTPUTS: { number - max(specReviewCount, codeReviewCount) }
426
+ // PURPOSE: Compute visible review round from current explicit round or completed round count.
427
+ // INPUTS: { record: Pick<WorkItemRecord, "completedReviewRoundCount" | "currentRound"> - review-round metadata }
428
+ // OUTPUTS: { number - current active/completed round number or completed round count }
260
429
  // SIDE_EFFECTS: [none]
261
430
  // LINKS: [M-WORKFLOW-STATE]
262
431
  // END_CONTRACT: getReviewRound
263
432
  export function getReviewRound(record) {
264
- return Math.max(record.specReviewCount, record.codeReviewCount);
433
+ return record.currentRound?.round ?? record.completedReviewRoundCount;
265
434
  }
266
435
  // START_CONTRACT: createWorkItemStore
267
- // PURPOSE: Create a session-scoped in-memory work-item store, optionally hydrated from a previous session's persisted data.
436
+ // PURPOSE: Create a session-scoped in-memory work-item store, optionally hydrated from persisted data.
268
437
  // INPUTS: { hydrateData?: WorkItemStoreData | null - optional persisted store data to restore }
269
- // OUTPUTS: { WorkItemStore - operation surface for open/get/list/close/transition operations }
438
+ // OUTPUTS: { WorkItemStore - operation surface for open/get/list/close/launch/result operations }
270
439
  // SIDE_EFFECTS: [none]
271
440
  // LINKS: [M-WORKFLOW-STATE, M-WORKFLOW-PERSISTENCE]
272
441
  // END_CONTRACT: createWorkItemStore
@@ -284,27 +453,48 @@ export function createWorkItemStore(hydrateData) {
284
453
  };
285
454
  return {
286
455
  openWorkItem: (input) => openWorkItemInStore(data, input),
456
+ beginTrackedLaunch: (input) => beginTrackedLaunchInStore(data, input),
457
+ applyTrackedResult: (input) => applyTrackedResultInStore(data, input),
287
458
  getWorkItem: (sessionId, workItemId) => getWorkItemInStore(data, sessionId, workItemId),
288
459
  listWorkItems: (sessionId, options) => listWorkItemsInStore(data, sessionId, options),
289
460
  closeWorkItem: (sessionId, workItemId) => closeWorkItemInStore(data, sessionId, workItemId),
290
- transitionWorkItemState: (input) => transitionWorkItemStateInStore(data, input),
291
461
  getReviewRound,
292
462
  getStoreData: () => data,
293
463
  };
294
464
  }
295
465
  // START_CONTRACT: openWorkItem
296
- // PURPOSE: Open a work item idempotently by (sessionId, key) while enforcing key/title consistency.
297
- // INPUTS: { store: WorkItemStoreData - backing store, input: { sessionId, key, title } - open parameters }
298
- // OUTPUTS: { OpenWorkItemResult - success with record/header or WORK_ITEM_KEY_CONFLICT }
466
+ // PURPOSE: Open a work item idempotently by (sessionId, key) while enforcing explicit workflow intent consistency.
467
+ // INPUTS: { store: WorkItemStore - backing store, input: OpenWorkItemInput - open parameters with mode and requiredReviewers }
468
+ // OUTPUTS: { OpenWorkItemResult - success with record/header or deterministic failure }
299
469
  // SIDE_EFFECTS: [Mutates in-memory work-item store]
300
470
  // LINKS: [M-WORKFLOW-STATE]
301
471
  // END_CONTRACT: openWorkItem
302
472
  export function openWorkItem(store, input) {
303
473
  return store.openWorkItem(input);
304
474
  }
475
+ // START_CONTRACT: beginTrackedLaunch
476
+ // PURPOSE: Validate a tracked launch and mark reviewer launches in flight for the current round.
477
+ // INPUTS: { store: WorkItemStore - backing store, input: { sessionId, workItemId, agent } - launch payload }
478
+ // OUTPUTS: { BeginTrackedLaunchResult - success with updated record or launch rejection }
479
+ // SIDE_EFFECTS: [Mutates in-memory work-item store for reviewer launches]
480
+ // LINKS: [M-WORKFLOW-STATE, M-WORKFLOW-TRANSITIONS]
481
+ // END_CONTRACT: beginTrackedLaunch
482
+ export function beginTrackedLaunch(store, input) {
483
+ return store.beginTrackedLaunch(input);
484
+ }
485
+ // START_CONTRACT: applyTrackedResult
486
+ // PURPOSE: Apply parsed tracked output, update explicit review rounds, and aggregate lifecycle state when rounds settle.
487
+ // INPUTS: { store: WorkItemStore - backing store, input: { sessionId, workItemId, result } - parsed result payload }
488
+ // OUTPUTS: { ApplyTrackedResultResult - success with updated record or result-state failure }
489
+ // SIDE_EFFECTS: [Mutates in-memory work-item store]
490
+ // LINKS: [M-WORKFLOW-STATE, M-WORKFLOW-TRANSITIONS]
491
+ // END_CONTRACT: applyTrackedResult
492
+ export function applyTrackedResult(store, input) {
493
+ return store.applyTrackedResult(input);
494
+ }
305
495
  // START_CONTRACT: getWorkItem
306
496
  // PURPOSE: Return a work item by session and work-item id.
307
- // INPUTS: { store: WorkItemStoreData - backing store, sessionId: string - session scope, workItemId: string - work item id }
497
+ // INPUTS: { store: WorkItemStore - backing store, sessionId: string - session scope, workItemId: string - work item id }
308
498
  // OUTPUTS: { WorkItemRecord | undefined - matching record when present }
309
499
  // SIDE_EFFECTS: [none]
310
500
  // LINKS: [M-WORKFLOW-STATE]
@@ -314,7 +504,7 @@ export function getWorkItem(store, sessionId, workItemId) {
314
504
  }
315
505
  // START_CONTRACT: listWorkItems
316
506
  // PURPOSE: List session work items with optional closed-item inclusion.
317
- // INPUTS: { store: WorkItemStoreData - backing store, sessionId: string - session scope, options?: { includeClosed?: boolean } - list behavior options }
507
+ // INPUTS: { store: WorkItemStore - backing store, sessionId: string - session scope, options?: { includeClosed?: boolean } - list behavior options }
318
508
  // OUTPUTS: { WorkItemRecord[] - records sorted by numeric work-item id }
319
509
  // SIDE_EFFECTS: [none]
320
510
  // LINKS: [M-WORKFLOW-STATE]
@@ -323,8 +513,8 @@ export function listWorkItems(store, sessionId, options) {
323
513
  return store.listWorkItems(sessionId, options);
324
514
  }
325
515
  // START_CONTRACT: closeWorkItem
326
- // PURPOSE: Close an existing open work item and stamp closedAt.
327
- // INPUTS: { store: WorkItemStoreData - backing store, sessionId: string - session scope, workItemId: string - target id }
516
+ // PURPOSE: Close an existing ready_to_close work item and stamp closedAt.
517
+ // INPUTS: { store: WorkItemStore - backing store, sessionId: string - session scope, workItemId: string - target id }
328
518
  // OUTPUTS: { CloseWorkItemResult - success with updated record/header or failure code }
329
519
  // SIDE_EFFECTS: [Mutates in-memory work-item store]
330
520
  // LINKS: [M-WORKFLOW-STATE]
@@ -332,16 +522,4 @@ export function listWorkItems(store, sessionId, options) {
332
522
  export function closeWorkItem(store, sessionId, workItemId) {
333
523
  return store.closeWorkItem(sessionId, workItemId);
334
524
  }
335
- // START_CONTRACT: transitionWorkItemState
336
- // PURPOSE: Update work-item state deterministically and maintain reviewer counters.
337
- // INPUTS: { store: WorkItemStoreData - backing store, input: { sessionId, workItemId, state, actor? } - transition payload }
338
- // OUTPUTS: { TransitionWorkItemStateResult - success with updated record or failure code }
339
- // SIDE_EFFECTS: [Mutates in-memory work-item store]
340
- // LINKS: [M-WORKFLOW-STATE]
341
- // END_CONTRACT: transitionWorkItemState
342
- // START_BLOCK_TRANSITION_STATE
343
- export function transitionWorkItemState(store, input) {
344
- return store.transitionWorkItemState(input);
345
- }
346
- // END_BLOCK_TRANSITION_STATE
347
525
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/plugins/workflow/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/plugins/workflow/state.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,16 @@ Workflow tracking is active for vv-managed review loops.
3
3
 
4
4
  For tracked subagents (`vv-implementer`, `vv-spec-reviewer`, `vv-code-reviewer`):
5
5
 
6
- 1. Open work items first with `work_item_open`.
6
+ 1. Open work items first with `work_item_open` using explicit `mode` and `requiredReviewers`.
7
+ - Implementation loop: `{ key, title, mode: "implementation", requiredReviewers: ["spec", "code"] }`
8
+ - Review-only report: `{ key, title, mode: "review_only", requiredReviewers: ["spec", "code"] }`
7
9
  2. Reuse the returned `VVOC_WORK_ITEM_ID`.
8
10
  3. Put that header as the first line in tracked subagent prompts.
9
11
  4. Prefer lightweight XML-like tagged assignment bodies after the header, such as `<assignment>`, `<goal>`, `<context>`, and `<verification>`.
10
12
  5. Treat `NEEDS_CONTEXT` as a hard stop.
11
13
  6. Use `work_item_list` to inspect workflow state before retrying.
12
14
  7. Avoid free-form review loops without explicit work-item identity.
15
+ 8. In `review_only`, reviewer `FAIL` is a completed review finding result; collect all required reviewer results before closing, and do not route review-only failures to `vv-implementer`.
13
16
 
14
17
  Use `work_item_close` explicitly when a work item is complete.
15
18
  </workflow_protocol>