steroids-cli 0.9.30 → 0.9.32

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 (51) hide show
  1. package/dist/commands/loop-phases.d.ts +1 -1
  2. package/dist/commands/loop-phases.d.ts.map +1 -1
  3. package/dist/commands/loop-phases.js +404 -67
  4. package/dist/commands/loop-phases.js.map +1 -1
  5. package/dist/database/queries.d.ts +20 -0
  6. package/dist/database/queries.d.ts.map +1 -1
  7. package/dist/database/queries.js +63 -0
  8. package/dist/database/queries.js.map +1 -1
  9. package/dist/git/status.d.ts +10 -0
  10. package/dist/git/status.d.ts.map +1 -1
  11. package/dist/git/status.js +66 -0
  12. package/dist/git/status.js.map +1 -1
  13. package/dist/git/submission-resolution.d.ts +26 -0
  14. package/dist/git/submission-resolution.d.ts.map +1 -0
  15. package/dist/git/submission-resolution.js +213 -0
  16. package/dist/git/submission-resolution.js.map +1 -0
  17. package/dist/orchestrator/coordinator.d.ts +2 -0
  18. package/dist/orchestrator/coordinator.d.ts.map +1 -1
  19. package/dist/orchestrator/coordinator.js +17 -1
  20. package/dist/orchestrator/coordinator.js.map +1 -1
  21. package/dist/orchestrator/post-coder.d.ts.map +1 -1
  22. package/dist/orchestrator/post-coder.js +82 -5
  23. package/dist/orchestrator/post-coder.js.map +1 -1
  24. package/dist/orchestrator/reviewer.d.ts.map +1 -1
  25. package/dist/orchestrator/reviewer.js +69 -41
  26. package/dist/orchestrator/reviewer.js.map +1 -1
  27. package/dist/orchestrator/schemas.d.ts.map +1 -1
  28. package/dist/orchestrator/schemas.js +12 -0
  29. package/dist/orchestrator/schemas.js.map +1 -1
  30. package/dist/orchestrator/types.d.ts +3 -0
  31. package/dist/orchestrator/types.d.ts.map +1 -1
  32. package/dist/prompts/coder.d.ts.map +1 -1
  33. package/dist/prompts/coder.js +65 -2
  34. package/dist/prompts/coder.js.map +1 -1
  35. package/dist/prompts/prompt-helpers.d.ts.map +1 -1
  36. package/dist/prompts/prompt-helpers.js +15 -4
  37. package/dist/prompts/prompt-helpers.js.map +1 -1
  38. package/dist/prompts/reviewer.d.ts +4 -3
  39. package/dist/prompts/reviewer.d.ts.map +1 -1
  40. package/dist/prompts/reviewer.js +75 -14
  41. package/dist/prompts/reviewer.js.map +1 -1
  42. package/dist/runners/global-db.d.ts.map +1 -1
  43. package/dist/runners/global-db.js +7 -3
  44. package/dist/runners/global-db.js.map +1 -1
  45. package/dist/runners/orchestrator-loop.d.ts.map +1 -1
  46. package/dist/runners/orchestrator-loop.js +2 -2
  47. package/dist/runners/orchestrator-loop.js.map +1 -1
  48. package/dist/runners/wakeup.d.ts.map +1 -1
  49. package/dist/runners/wakeup.js +142 -2
  50. package/dist/runners/wakeup.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-resolution.d.ts","sourceRoot":"","sources":["../../src/git/submission-resolution.ts"],"names":[],"mappings":"AAaA,KAAK,gBAAgB,GACjB,eAAe,GACf,eAAe,GACf,6BAA6B,CAAC;AAElC,MAAM,MAAM,wBAAwB,GAChC;IACA,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,iBAAiB,GAAG,kBAAkB,CAAC;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GACC;IACA,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEJ,MAAM,WAAW,iCAAiC;IAChD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAoHD;;;GAGG;AACH,wBAAgB,mCAAmC,CACjD,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,wBAAwB,CAgB1B;AAED,wBAAgB,0CAA0C,CACxD,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,iCAAiC,CA0FnC"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSubmissionCommitWithRecovery = resolveSubmissionCommitWithRecovery;
4
+ exports.resolveSubmissionCommitHistoryWithRecovery = resolveSubmissionCommitHistoryWithRecovery;
5
+ const node_child_process_1 = require("node:child_process");
6
+ const node_crypto_1 = require("node:crypto");
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const global_db_js_1 = require("../runners/global-db.js");
10
+ const status_js_1 = require("./status.js");
11
+ function getProjectRepoId(projectPath) {
12
+ try {
13
+ return (0, node_fs_1.realpathSync)(projectPath);
14
+ }
15
+ catch {
16
+ return (0, node_path_1.resolve)(projectPath);
17
+ }
18
+ }
19
+ function getParallelWorkstreamSources(projectPath) {
20
+ const normalizedProjectPath = getProjectRepoId(projectPath);
21
+ const projectRepoId = getProjectRepoId(projectPath);
22
+ const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
23
+ try {
24
+ const rows = db
25
+ .prepare(`
26
+ SELECT ws.clone_path, ws.branch_name
27
+ FROM workstreams ws
28
+ JOIN parallel_sessions ps ON ps.id = ws.session_id
29
+ WHERE (ps.project_path = ? OR ps.project_repo_id = ?)
30
+ AND ps.status NOT IN ('failed', 'aborted')
31
+ AND ws.clone_path IS NOT NULL
32
+ `)
33
+ .all(normalizedProjectPath, projectRepoId);
34
+ const seen = new Set();
35
+ const sources = [];
36
+ for (const row of rows) {
37
+ if (!row.clone_path)
38
+ continue;
39
+ const resolvedClonePath = (0, node_path_1.resolve)(row.clone_path);
40
+ if (resolvedClonePath === normalizedProjectPath)
41
+ continue;
42
+ if (!(0, node_fs_1.existsSync)(row.clone_path))
43
+ continue;
44
+ const key = `${row.clone_path}::${row.branch_name}`;
45
+ if (seen.has(key))
46
+ continue;
47
+ seen.add(key);
48
+ sources.push({
49
+ clonePath: row.clone_path,
50
+ branchName: row.branch_name,
51
+ });
52
+ }
53
+ return sources;
54
+ }
55
+ finally {
56
+ close();
57
+ }
58
+ }
59
+ function safeRecoveryRef(pathLike) {
60
+ return pathLike.replace(/[^\w.-]/g, '_');
61
+ }
62
+ function isGitRepoPath(pathValue) {
63
+ try {
64
+ (0, node_child_process_1.execSync)('git rev-parse --is-inside-work-tree', {
65
+ cwd: pathValue,
66
+ encoding: 'utf-8',
67
+ stdio: ['pipe', 'pipe', 'pipe'],
68
+ timeout: 5_000,
69
+ });
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ function cleanupRecoveryRefs(projectPath, refs) {
77
+ for (const ref of refs) {
78
+ try {
79
+ (0, node_child_process_1.execSync)(`git update-ref -d ${ref}`, {
80
+ cwd: projectPath,
81
+ encoding: 'utf-8',
82
+ stdio: ['pipe', 'pipe', 'pipe'],
83
+ timeout: 5_000,
84
+ });
85
+ }
86
+ catch {
87
+ // best effort
88
+ }
89
+ }
90
+ }
91
+ function fetchWorkstreamBranch(projectPath, clonePath, branchName, suffix, attempts) {
92
+ if (!(0, node_fs_1.existsSync)(clonePath) || !isGitRepoPath(clonePath)) {
93
+ attempts.push(`workstream_skip:${clonePath}:invalid_repo`);
94
+ return { success: false };
95
+ }
96
+ const fetchRef = `refs/steroids/recovery/${safeRecoveryRef(branchName)}-${suffix}`;
97
+ attempts.push(`workstream_fetch:${clonePath}:${branchName}`);
98
+ try {
99
+ (0, node_child_process_1.execSync)(`git fetch ${clonePath} +${branchName}:${fetchRef}`, {
100
+ cwd: projectPath,
101
+ encoding: 'utf-8',
102
+ stdio: ['pipe', 'pipe', 'pipe'],
103
+ timeout: 30_000,
104
+ });
105
+ attempts.push(`workstream_fetch_ok:${clonePath}:${branchName}`);
106
+ return { success: true, recoveryRef: fetchRef };
107
+ }
108
+ catch {
109
+ attempts.push(`workstream_fetch_fail:${clonePath}:${branchName}`);
110
+ return { success: false };
111
+ }
112
+ }
113
+ /**
114
+ * Resolve the latest reachable commit among historical submission candidates.
115
+ * Falls back to parallel workstream clone fetches if the commit is missing locally.
116
+ */
117
+ function resolveSubmissionCommitWithRecovery(projectPath, candidateShas) {
118
+ const history = resolveSubmissionCommitHistoryWithRecovery(projectPath, candidateShas);
119
+ if (history.latestReachableSha) {
120
+ return {
121
+ status: 'resolved',
122
+ sha: history.latestReachableSha,
123
+ strategy: history.unreachableShas.length > 0 ? 'workstream_fetch' : 'local_or_remote',
124
+ attempts: history.attempts,
125
+ };
126
+ }
127
+ return {
128
+ status: 'unresolved',
129
+ reason: history.reason ?? 'not_reachable',
130
+ attempts: history.attempts,
131
+ };
132
+ }
133
+ function resolveSubmissionCommitHistoryWithRecovery(projectPath, candidateShas) {
134
+ const normalizedShas = Array.from(new Set(candidateShas
135
+ .map(sha => sha.trim())
136
+ .filter(sha => sha.length > 0)));
137
+ const attempts = [];
138
+ if (normalizedShas.length === 0) {
139
+ return {
140
+ latestReachableSha: null,
141
+ reachableShasOldestFirst: [],
142
+ unreachableShas: [],
143
+ attempts,
144
+ reason: 'no_candidates',
145
+ };
146
+ }
147
+ const reachableSet = new Set();
148
+ let unreachableShas = [...normalizedShas];
149
+ for (const sha of normalizedShas) {
150
+ attempts.push(`local_or_remote_check:${sha}`);
151
+ if ((0, status_js_1.isCommitReachableWithFetch)(projectPath, sha, { forceFetch: true })) {
152
+ reachableSet.add(sha);
153
+ }
154
+ }
155
+ unreachableShas = normalizedShas.filter(sha => !reachableSet.has(sha));
156
+ if (unreachableShas.length === 0) {
157
+ const reachableShasOldestFirst = [...normalizedShas].reverse();
158
+ return {
159
+ latestReachableSha: normalizedShas[0],
160
+ reachableShasOldestFirst,
161
+ unreachableShas: [],
162
+ attempts,
163
+ };
164
+ }
165
+ let sources = [];
166
+ try {
167
+ sources = getParallelWorkstreamSources(projectPath);
168
+ }
169
+ catch {
170
+ return {
171
+ latestReachableSha: normalizedShas.find(sha => reachableSet.has(sha)) ?? null,
172
+ reachableShasOldestFirst: [...normalizedShas].reverse().filter(sha => reachableSet.has(sha)),
173
+ unreachableShas,
174
+ attempts,
175
+ reason: reachableSet.size > 0 ? undefined : 'workstream_discovery_failed',
176
+ };
177
+ }
178
+ if (sources.length === 0) {
179
+ return {
180
+ latestReachableSha: normalizedShas.find(sha => reachableSet.has(sha)) ?? null,
181
+ reachableShasOldestFirst: [...normalizedShas].reverse().filter(sha => reachableSet.has(sha)),
182
+ unreachableShas,
183
+ attempts,
184
+ reason: reachableSet.size > 0 ? undefined : 'not_reachable',
185
+ };
186
+ }
187
+ const nonce = (0, node_crypto_1.randomUUID)();
188
+ const createdRecoveryRefs = [];
189
+ for (const source of sources) {
190
+ const fetched = fetchWorkstreamBranch(projectPath, source.clonePath, source.branchName, nonce, attempts);
191
+ if (fetched.recoveryRef) {
192
+ createdRecoveryRefs.push(fetched.recoveryRef);
193
+ }
194
+ }
195
+ for (const sha of unreachableShas) {
196
+ attempts.push(`post_workstream_check:${sha}`);
197
+ if ((0, status_js_1.isCommitReachable)(projectPath, sha)) {
198
+ reachableSet.add(sha);
199
+ }
200
+ }
201
+ cleanupRecoveryRefs(projectPath, createdRecoveryRefs);
202
+ unreachableShas = normalizedShas.filter(sha => !reachableSet.has(sha));
203
+ const reachableShasOldestFirst = [...normalizedShas].reverse().filter(sha => reachableSet.has(sha));
204
+ const latestReachableSha = normalizedShas.find(sha => reachableSet.has(sha)) ?? null;
205
+ return {
206
+ latestReachableSha,
207
+ reachableShasOldestFirst,
208
+ unreachableShas,
209
+ attempts,
210
+ reason: latestReachableSha ? undefined : 'not_reachable',
211
+ };
212
+ }
213
+ //# sourceMappingURL=submission-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-resolution.js","sourceRoot":"","sources":["../../src/git/submission-resolution.ts"],"names":[],"mappings":";;AA6JA,kFAmBC;AAED,gGA6FC;AA/QD,2DAA8C;AAC9C,6CAAyC;AACzC,qCAAmD;AACnD,yCAAoC;AAEpC,0DAA6D;AAC7D,2CAA4E;AAiC5E,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,IAAI,CAAC;QACH,OAAO,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAA,mBAAO,EAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,WAAmB;IACvD,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;;;;;SAOC,CACF;aACA,GAAG,CAAC,qBAAqB,EAAE,aAAa,CAGzC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,UAAU;gBAAE,SAAS;YAC9B,MAAM,iBAAiB,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,iBAAiB,KAAK,qBAAqB;gBAAE,SAAS;YAC1D,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,SAAS;YAE1C,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,UAAU,EAAE,GAAG,CAAC,WAAW;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,qCAAqC,EAAE;YAC9C,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB,EAAE,IAAc;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAA,6BAAQ,EAAC,qBAAqB,GAAG,EAAE,EAAE;gBACnC,GAAG,EAAE,WAAW;gBAChB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,MAAc,EACd,QAAkB;IAElB,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,SAAS,eAAe,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAG,0BAA0B,eAAe,CAAC,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;IACnF,QAAQ,CAAC,IAAI,CAAC,oBAAoB,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,aAAa,SAAS,KAAK,UAAU,IAAI,QAAQ,EAAE,EAAE;YAC5D,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,uBAAuB,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;QAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,yBAAyB,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,mCAAmC,CACjD,WAAmB,EACnB,aAAuB;IAEvB,MAAM,OAAO,GAAG,0CAA0C,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,GAAG,EAAE,OAAO,CAAC,kBAAkB;YAC/B,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB;YACrF,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe;QACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAgB,0CAA0C,CACxD,WAAmB,EACnB,aAAuB;IAEvB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CACvC,aAAa;SACV,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CACjC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,kBAAkB,EAAE,IAAI;YACxB,wBAAwB,EAAE,EAAE;YAC5B,eAAe,EAAE,EAAE;YACnB,QAAQ;YACR,MAAM,EAAE,eAAe;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,IAAI,eAAe,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,IAAA,sCAA0B,EAAC,WAAW,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,wBAAwB,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO;YACL,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;YACrC,wBAAwB;YACxB,eAAe,EAAE,EAAE;YACnB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,GAAuB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,kBAAkB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;YAC7E,wBAAwB,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5F,eAAe;YACf,QAAQ;YACR,MAAM,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B;SAC1E,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,kBAAkB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;YAC7E,wBAAwB,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5F,eAAe;YACf,QAAQ;YACR,MAAM,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,wBAAU,GAAE,CAAC;IAC3B,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,IAAA,6BAAiB,EAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACtD,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,wBAAwB,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpG,MAAM,kBAAkB,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IAErF,OAAO;QACL,kBAAkB;QAClB,wBAAwB;QACxB,eAAe;QACf,QAAQ;QACR,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;KACzD,CAAC;AACJ,CAAC"}
@@ -14,6 +14,8 @@ export interface CoordinatorContext {
14
14
  submissionNotes?: string | null;
15
15
  gitDiffSummary?: string;
16
16
  previousGuidance?: string;
17
+ lockedMustImplementGuidance?: string;
18
+ lockedMustImplementWatermark?: number;
17
19
  }
18
20
  export interface CoordinatorResult {
19
21
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,GAAG,mBAAmB,GAAG,cAAc,CAAC;CAChE;AAoMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,cAAc,EAAE,EAClC,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0EnC"}
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,GAAG,mBAAmB,GAAG,cAAc,CAAC;CAChE;AAqND;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,cAAc,EAAE,EAClC,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0EnC"}
@@ -69,6 +69,21 @@ You previously provided this guidance for this task:
69
69
  > ${extra.previousGuidance.substring(0, 500)}${extra.previousGuidance.length > 500 ? '...' : ''}
70
70
 
71
71
  **Do NOT repeat the same guidance.** If the previous guidance didn't work, provide a DIFFERENT approach.
72
+ `
73
+ : '';
74
+ const lockedMustImplementSection = extra?.lockedMustImplementGuidance
75
+ ? `
76
+ ---
77
+
78
+ ## NON-NEGOTIABLE MUST_IMPLEMENT OVERRIDE
79
+
80
+ This guidance was set by the orchestrator after rejecting a weak WONT_FIX claim.
81
+ You MUST preserve these mandatory items in your guidance and you MAY add clarifications,
82
+ but you must NOT weaken, contradict, or remove them.
83
+
84
+ **Override watermark (rejection count):** ${extra.lockedMustImplementWatermark ?? 'unknown'}
85
+
86
+ ${extra.lockedMustImplementGuidance}
72
87
  `
73
88
  : '';
74
89
  return `# COORDINATOR INTERVENTION
@@ -108,7 +123,7 @@ ${agentsMd}
108
123
  ## Full Rejection History
109
124
 
110
125
  ${rejectionSummary}
111
- ${sectionTasksSection}${submissionNotesSection}${diffSection}${previousGuidanceSection}
126
+ ${sectionTasksSection}${submissionNotesSection}${diffSection}${previousGuidanceSection}${lockedMustImplementSection}
112
127
  ---
113
128
 
114
129
  ## Your Decision Framework
@@ -158,6 +173,7 @@ GUIDANCE:
158
173
  - If there's a design disagreement, PICK the approach that matches the project's architecture and tell the coder to follow it
159
174
  - If the same feedback appeared 3+ times unchanged, the coder needs a fundamentally different approach - describe it
160
175
  - Always ask: "Will this be usable for the end user?" - if the current approach works for users, don't block on technicalities
176
+ - If NON-NEGOTIABLE MUST_IMPLEMENT override is present, you must keep those items mandatory
161
177
  - Never tell the reviewer to auto-approve based on a fixed checklist (e.g., "these are the only items required for approval")
162
178
  - Never claim reviewer guidance is binding over security, correctness, or specification requirements
163
179
  - Keep guidance under 500 words
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"post-coder.d.ts","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuMlE"}
1
+ {"version":3,"file":"post-coder.d.ts","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAkB1C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA2QlE"}
@@ -5,19 +5,33 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.buildPostCoderPrompt = buildPostCoderPrompt;
8
+ const CONTEXT_TAIL_CHARS = 6000;
9
+ function escapeRegExp(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
11
+ }
12
+ function extractMarkdownSection(output, heading) {
13
+ const pattern = new RegExp(`(^|\\n)##\\s*${escapeRegExp(heading)}\\s*[\\r\\n]+([\\s\\S]*?)(?=\\n##\\s|$)`, 'i');
14
+ const match = output.match(pattern);
15
+ if (!match)
16
+ return null;
17
+ return `## ${heading}\n${match[2].trim()}`.trim();
18
+ }
8
19
  /**
9
20
  * Generate post-coder orchestrator prompt
10
21
  */
11
22
  function buildPostCoderPrompt(context) {
12
23
  const { task, coder_output: { stdout, stderr, exit_code, timed_out, duration_ms }, git_state: { commits, files_changed, has_uncommitted_changes } } = context;
13
24
  const duration_seconds = (duration_ms / 1000).toFixed(1);
14
- const stdout_tail = stdout.slice(-2000);
15
- const stderr_tail = stderr.slice(-2000);
25
+ const stdout_tail = stdout.length > CONTEXT_TAIL_CHARS ? stdout.slice(-CONTEXT_TAIL_CHARS) : stdout;
26
+ const stderr_tail = stderr.length > CONTEXT_TAIL_CHARS ? stderr.slice(-CONTEXT_TAIL_CHARS) : stderr;
27
+ const selfReviewChecklist = extractMarkdownSection(stdout, 'SELF_REVIEW_CHECKLIST');
28
+ const rejectionResponse = extractMarkdownSection(stdout, 'REJECTION_RESPONSE');
16
29
  let rejectionSection = '';
17
30
  if (task.rejection_notes) {
18
31
  rejectionSection = `
19
32
  **Previous Rejection:** ${task.rejection_notes}
20
33
  **Rejection Count:** ${task.rejection_count || 0}
34
+ **Open Rejection Items (latest):** ${task.rejection_item_count ?? 0}
21
35
  `;
22
36
  }
23
37
  let commitsSection = '';
@@ -31,12 +45,28 @@ function buildPostCoderPrompt(context) {
31
45
  let stderrSection = '';
32
46
  if (stderr) {
33
47
  stderrSection = `
34
- **Errors:**
48
+ **Errors (tail ${CONTEXT_TAIL_CHARS} chars):**
35
49
  \`\`\`
36
50
  ${stderr_tail}
37
51
  \`\`\`
38
52
  `;
39
53
  }
54
+ const extractedBlocks = [];
55
+ if (selfReviewChecklist) {
56
+ extractedBlocks.push(`### Extracted SELF_REVIEW_CHECKLIST\n\`\`\`\n${selfReviewChecklist}\n\`\`\``);
57
+ }
58
+ if (rejectionResponse) {
59
+ extractedBlocks.push(`### Extracted REJECTION_RESPONSE\n\`\`\`\n${rejectionResponse}\n\`\`\``);
60
+ }
61
+ const extractedBlocksSection = extractedBlocks.length > 0
62
+ ? `
63
+ ---
64
+
65
+ ## Extracted Required Blocks (from full output)
66
+
67
+ ${extractedBlocks.join('\n\n')}
68
+ `
69
+ : '';
40
70
  return `# POST-CODER ORCHESTRATOR
41
71
 
42
72
  You are a state machine that analyzes coder output and determines the next action.
@@ -59,11 +89,12 @@ ${rejectionSection}
59
89
  **Timed Out:** ${timed_out}
60
90
  **Duration:** ${duration_seconds}s
61
91
 
62
- **Output (last 2000 chars):**
92
+ **Output (tail ${CONTEXT_TAIL_CHARS} chars):**
63
93
  \`\`\`
64
94
  ${stdout_tail}
65
95
  \`\`\`
66
96
  ${stderrSection}
97
+ ${extractedBlocksSection}
67
98
  ---
68
99
 
69
100
  ## Git State
@@ -98,7 +129,42 @@ ${filesSection}
98
129
  - Exit 0 + commits exist → \`submit\`
99
130
  - Most common happy path
100
131
 
101
- ### 5. Uncertainty Default
132
+ ### 5. First-Submission Self-Checklist
133
+ - If \`Rejection Count\` is 0, require a \`SELF_REVIEW_CHECKLIST\` block in coder output
134
+ - Checklist must include a final self-review confirmation item
135
+ - If missing, return:
136
+ - \`action: "retry"\`
137
+ - \`next_status: "in_progress"\`
138
+ - \`reasoning\` starting with \`CHECKLIST_REQUIRED:\` (short)
139
+ - \`contract_violation: "checklist_required"\`
140
+
141
+ ### 6. Rejection Response Contract (Required on Resubmissions)
142
+ - If \`Rejection Count\` is > 0, require a \`REJECTION_RESPONSE\` block
143
+ - The block must contain one line per rejection item using:
144
+ - \`ITEM-<n> | IMPLEMENTED | ...\`
145
+ - or \`ITEM-<n> | WONT_FIX | ...\`
146
+ - If missing or clearly incomplete, return:
147
+ - \`action: "retry"\`
148
+ - \`next_status: "in_progress"\`
149
+ - \`reasoning\` starting with \`REJECTION_RESPONSE_REQUIRED:\` (short)
150
+ - \`contract_violation: "rejection_response_required"\`
151
+ - \`REJECTION_RESPONSE\` completeness check must use \`Open Rejection Items (latest)\` from task context
152
+ - Require sequential responses: \`ITEM-1\` through \`ITEM-N\`
153
+
154
+ ### 7. WONT_FIX Claims (High Priority on Rejected Tasks)
155
+ - If task has prior rejections and coder output includes \`WONT_FIX\`, apply strict scrutiny
156
+ - A \`WONT_FIX\` is acceptable ONLY when all are present:
157
+ - Clear technical reason (impossible/unsafe/out-of-scope conflict)
158
+ - Concrete evidence the task still works without that item
159
+ - No conflict with any mandatory override guidance
160
+ - If any of the above is missing, return:
161
+ - \`action: "retry"\`
162
+ - \`next_status: "in_progress"\`
163
+ - \`reasoning\` that starts with \`WONT_FIX_OVERRIDE:\` (short)
164
+ - \`wont_fix_override_items\` containing specific mandatory fixes
165
+ - If evidence is strong and functionality is complete, \`submit\` is allowed
166
+
167
+ ### 8. Uncertainty Default
102
168
  - When signals conflict → \`retry\` (safer than error)
103
169
 
104
170
  ---
@@ -111,6 +177,8 @@ ${filesSection}
111
177
  "reasoning": "One sentence why (max 100 chars)",
112
178
  "commits": ["sha1", "sha2"],
113
179
  "commit_message": "Only if stage_commit_submit",
180
+ "contract_violation": "checklist_required" | "rejection_response_required" | null,
181
+ "wont_fix_override_items": ["specific required fix", "another required fix"],
114
182
  "next_status": "review" | "in_progress" | "failed",
115
183
  "metadata": {
116
184
  "files_changed": 0,
@@ -129,6 +197,15 @@ ${filesSection}
129
197
  - \`stage_commit_submit\` → Work complete but not committed
130
198
  - \`error\` → Fatal issue, needs human intervention
131
199
 
200
+ **contract_violation:**
201
+ - \`checklist_required\` when first submission missing required self-checklist
202
+ - \`rejection_response_required\` when resubmission misses required ITEM responses
203
+ - \`null\` when no contract violation
204
+
205
+ **wont_fix_override_items:**
206
+ - Optional list of mandatory fixes when WONT_FIX is rejected by orchestrator
207
+ - Use this field for detailed override items (do NOT put long detail in reasoning)
208
+
132
209
  **next_status:**
133
210
  - \`review\` for submit and stage_commit_submit
134
211
  - \`in_progress\` for retry
@@ -1 +1 @@
1
- {"version":3,"file":"post-coder.js","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,oDAuMC;AA1MD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAAqB;IACxD,MAAM,EACJ,IAAI,EACJ,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,EACnE,SAAS,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAC/D,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,gBAAgB,GAAG;0BACG,IAAI,CAAC,eAAe;uBACvB,IAAI,CAAC,eAAe,IAAI,CAAC;CAC/C,CAAC;IACA,CAAC;IAED,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,EAAE,CAAC;QACX,aAAa,GAAG;;;EAGlB,WAAW;;CAEZ,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;eAUM,IAAI,CAAC,EAAE;kBACJ,IAAI,CAAC,KAAK;;EAE1B,gBAAgB;;;;;iBAKD,SAAS;iBACT,SAAS;gBACV,gBAAgB;;;;EAI9B,WAAW;;EAEX,aAAa;;;;;oBAKK,OAAO,CAAC,MAAM;EAChC,cAAc;;qBAEK,aAAa,CAAC,MAAM;EACvC,YAAY;;2BAEa,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDA0HD,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"post-coder.js","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAuBH,oDA2QC;AA9RD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc,EAAE,OAAe;IAC7D,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,gBAAgB,YAAY,CAAC,OAAO,CAAC,yCAAyC,EAC9E,GAAG,CACJ,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAAqB;IACxD,MAAM,EACJ,IAAI,EACJ,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,EACnE,SAAS,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAC/D,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACpF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE/E,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,gBAAgB,GAAG;0BACG,IAAI,CAAC,eAAe;uBACvB,IAAI,CAAC,eAAe,IAAI,CAAC;qCACX,IAAI,CAAC,oBAAoB,IAAI,CAAC;CAClE,CAAC;IACA,CAAC;IAED,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,EAAE,CAAC;QACX,aAAa,GAAG;iBACH,kBAAkB;;EAEjC,WAAW;;CAEZ,CAAC;IACA,CAAC;IAED,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,mBAAmB,EAAE,CAAC;QACxB,eAAe,CAAC,IAAI,CAAC,gDAAgD,mBAAmB,UAAU,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,iBAAiB,EAAE,CAAC;QACtB,eAAe,CAAC,IAAI,CAAC,6CAA6C,iBAAiB,UAAU,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,sBAAsB,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;QACvD,CAAC,CAAC;;;;;EAKJ,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;CAC7B;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;eAUM,IAAI,CAAC,EAAE;kBACJ,IAAI,CAAC,KAAK;;EAE1B,gBAAgB;;;;;iBAKD,SAAS;iBACT,SAAS;gBACV,gBAAgB;;iBAEf,kBAAkB;;EAEjC,WAAW;;EAEX,aAAa;EACb,sBAAsB;;;;;oBAKJ,OAAO,CAAC,MAAM;EAChC,cAAc;;qBAEK,aAAa,CAAC,MAAM;EACvC,YAAY;;2BAEa,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAwKD,CAAC;AAClD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAcnD,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI3F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAElF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,GACxB;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAiClD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,EAAE,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,cAAc,EAAE,EACjC,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB3B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAiID;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,EAC5B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,cAAc,CAAC,CAmJzB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA6C9B"}
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAkBnD,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK3F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAElF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,GACxB;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAiClD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,EAAE,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,cAAc,EAAE,EACjC,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB3B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAiID;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,EAC5B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,cAAc,CAAC,CAkKzB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAgE9B"}
@@ -16,10 +16,10 @@ const node_path_1 = require("node:path");
16
16
  const queries_js_1 = require("../database/queries.js");
17
17
  const connection_js_1 = require("../database/connection.js");
18
18
  const reviewer_js_1 = require("../prompts/reviewer.js");
19
- const status_js_1 = require("../git/status.js");
20
19
  const loader_js_1 = require("../config/loader.js");
21
20
  const registry_js_1 = require("../providers/registry.js");
22
21
  const invocation_logger_js_1 = require("../providers/invocation-logger.js");
22
+ const submission_resolution_js_1 = require("../git/submission-resolution.js");
23
23
  /**
24
24
  * Deterministic policy engine for multi-reviewer decisions
25
25
  */
@@ -204,51 +204,63 @@ async function invokeReviewer(task, projectPath, coordinatorGuidance, coordinato
204
204
  console.log(`Provider: ${effectiveReviewerConfig?.provider ?? 'not configured'}`);
205
205
  console.log(`Model: ${effectiveReviewerConfig?.model ?? 'not configured'}`);
206
206
  console.log(`${'='.repeat(60)}\n`);
207
- const submissionCommitHash = (0, status_js_1.findTaskCommit)(projectPath, task.title);
208
- const fallbackCommitHash = 'HEAD~1';
209
- if (submissionCommitHash) {
210
- console.log(`Found task commit: ${submissionCommitHash}`);
211
- }
212
- else {
213
- console.log(`No matching commit found for task title. Reviewer will use fallback commit: ${fallbackCommitHash}`);
214
- }
215
207
  // Fetch other tasks in the same section for context
216
208
  let sectionTasks = [];
217
209
  let rejectionHistory = [];
218
210
  let submissionNotes = null;
219
211
  let resumeSessionId = null;
212
+ let submissionCommitHash = null;
213
+ let submissionCommitHashes = [];
214
+ let unresolvedSubmissionCommits = [];
220
215
  try {
221
216
  const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
222
- // Get section tasks
223
- if (task.section_id) {
224
- const allSectionTasks = (0, queries_js_1.listTasks)(db, { sectionId: task.section_id });
225
- sectionTasks = allSectionTasks.map(t => ({
226
- id: t.id,
227
- title: t.title,
228
- status: t.status,
229
- }));
230
- }
231
- // Get rejection history - ALWAYS fetch this so reviewer can see past attempts
232
- rejectionHistory = (0, queries_js_1.getTaskRejections)(db, task.id);
233
- if (rejectionHistory.length > 0) {
234
- console.log(`Found ${rejectionHistory.length} previous rejection(s) for this task`);
235
- }
236
- // Get coder's submission notes (if any)
237
- submissionNotes = (0, queries_js_1.getLatestSubmissionNotes)(db, task.id);
238
- if (submissionNotes) {
239
- console.log(`Coder included notes with submission`);
240
- }
241
- // Check for resumable session (same provider/model/role)
242
- if (effectiveReviewerConfig?.provider && effectiveReviewerConfig?.model) {
243
- resumeSessionId = (0, queries_js_1.findResumableSession)(db, task.id, 'reviewer', effectiveReviewerConfig.provider, effectiveReviewerConfig.model);
244
- if (resumeSessionId) {
245
- console.log(`Found resumable session: ${resumeSessionId.substring(0, 8)}... (resuming with delta prompt)`);
217
+ try {
218
+ // Get section tasks
219
+ if (task.section_id) {
220
+ const allSectionTasks = (0, queries_js_1.listTasks)(db, { sectionId: task.section_id });
221
+ sectionTasks = allSectionTasks.map(t => ({
222
+ id: t.id,
223
+ title: t.title,
224
+ status: t.status,
225
+ }));
226
+ }
227
+ // Get rejection history - ALWAYS fetch this so reviewer can see past attempts
228
+ rejectionHistory = (0, queries_js_1.getTaskRejections)(db, task.id);
229
+ if (rejectionHistory.length > 0) {
230
+ console.log(`Found ${rejectionHistory.length} previous rejection(s) for this task`);
231
+ }
232
+ // Get coder's submission notes (if any)
233
+ submissionNotes = (0, queries_js_1.getLatestSubmissionNotes)(db, task.id);
234
+ if (submissionNotes) {
235
+ console.log(`Coder included notes with submission`);
236
+ }
237
+ const submissionHistory = (0, submission_resolution_js_1.resolveSubmissionCommitHistoryWithRecovery)(projectPath, (0, queries_js_1.getSubmissionCommitShas)(db, task.id));
238
+ if (!submissionHistory.latestReachableSha) {
239
+ const attemptsText = submissionHistory.attempts.join(' | ') || 'none';
240
+ throw new Error(`No reachable submission commit hash found for task ${task.id} (${submissionHistory.reason ?? 'not_reachable'}; attempts: ${attemptsText})`);
241
+ }
242
+ submissionCommitHash = submissionHistory.latestReachableSha;
243
+ submissionCommitHashes = submissionHistory.reachableShasOldestFirst;
244
+ unresolvedSubmissionCommits = submissionHistory.unreachableShas;
245
+ console.log(`Using submission commit chain (${submissionCommitHashes.length} reachable), latest: ${submissionCommitHash}`);
246
+ if (unresolvedSubmissionCommits.length > 0) {
247
+ console.log(`Warning: ${unresolvedSubmissionCommits.length} historical submission commit(s) unresolved`);
248
+ }
249
+ // Check for resumable session (same provider/model/role)
250
+ if (effectiveReviewerConfig?.provider && effectiveReviewerConfig?.model) {
251
+ resumeSessionId = (0, queries_js_1.findResumableSession)(db, task.id, 'reviewer', effectiveReviewerConfig.provider, effectiveReviewerConfig.model);
252
+ if (resumeSessionId) {
253
+ console.log(`Found resumable session: ${resumeSessionId.substring(0, 8)}... (resuming with delta prompt)`);
254
+ }
246
255
  }
247
256
  }
248
- close();
257
+ finally {
258
+ close();
259
+ }
249
260
  }
250
261
  catch (error) {
251
- console.warn('Could not fetch task context:', error);
262
+ const message = error instanceof Error ? error.message : String(error);
263
+ throw new Error(`Could not fetch reviewer context: ${message}`);
252
264
  }
253
265
  // Reuse config loaded earlier, get reviewer model
254
266
  const reviewerModel = effectiveReviewerConfig?.model || 'unknown';
@@ -256,8 +268,9 @@ async function invokeReviewer(task, projectPath, coordinatorGuidance, coordinato
256
268
  task,
257
269
  projectPath,
258
270
  reviewerModel,
259
- submissionCommitHash,
260
- fallbackCommitHash,
271
+ submissionCommitHash: submissionCommitHash,
272
+ submissionCommitHashes,
273
+ unresolvedSubmissionCommits,
261
274
  sectionTasks,
262
275
  rejectionHistory,
263
276
  submissionNotes,
@@ -328,10 +341,25 @@ async function invokeReviewerBatch(tasks, sectionName, projectPath, reviewerConf
328
341
  console.log(`Provider: ${effectiveReviewerConfig?.provider ?? 'not configured'}`);
329
342
  console.log(`Model: ${effectiveReviewerConfig?.model ?? 'not configured'}`);
330
343
  console.log(`${'='.repeat(60)}\n`);
331
- const taskCommits = tasks.map(task => ({
332
- taskId: task.id,
333
- commitHash: (0, status_js_1.findTaskCommit)(projectPath, task.title),
334
- }));
344
+ const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
345
+ let taskCommits = [];
346
+ try {
347
+ const unresolved = [];
348
+ taskCommits = tasks.map(task => {
349
+ const submissionResolution = (0, submission_resolution_js_1.resolveSubmissionCommitWithRecovery)(projectPath, (0, queries_js_1.getSubmissionCommitShas)(db, task.id));
350
+ if (submissionResolution.status !== 'resolved') {
351
+ const attemptsText = submissionResolution.attempts.join(' | ') || 'none';
352
+ unresolved.push(`${task.id} (${submissionResolution.reason}; attempts: ${attemptsText})`);
353
+ }
354
+ return { taskId: task.id, commitHash: submissionResolution.status === 'resolved' ? submissionResolution.sha : '' };
355
+ });
356
+ if (unresolved.length > 0) {
357
+ throw new Error(`Missing reachable submission commit hash for batch review tasks: ${unresolved.join(', ')}`);
358
+ }
359
+ }
360
+ finally {
361
+ close();
362
+ }
335
363
  const context = {
336
364
  tasks,
337
365
  projectPath,