@on-par/factory-core 0.9.7-next.9 → 0.9.7

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 (191) hide show
  1. package/dist/blockers/dependencies.d.ts +19 -0
  2. package/dist/blockers/dependencies.d.ts.map +1 -0
  3. package/dist/blockers/dependencies.js +49 -0
  4. package/dist/blockers/dependencies.js.map +1 -0
  5. package/dist/blockers/file-blocker.d.ts +44 -0
  6. package/dist/blockers/file-blocker.d.ts.map +1 -0
  7. package/dist/blockers/file-blocker.js +203 -0
  8. package/dist/blockers/file-blocker.js.map +1 -0
  9. package/dist/blockers/index.d.ts +7 -0
  10. package/dist/blockers/index.d.ts.map +1 -0
  11. package/dist/blockers/index.js +5 -0
  12. package/dist/blockers/index.js.map +1 -0
  13. package/dist/blockers/poller.d.ts +37 -0
  14. package/dist/blockers/poller.d.ts.map +1 -0
  15. package/dist/blockers/poller.js +111 -0
  16. package/dist/blockers/poller.js.map +1 -0
  17. package/dist/checkers/index.d.ts +10 -1
  18. package/dist/checkers/index.d.ts.map +1 -1
  19. package/dist/checkers/index.js +14 -22
  20. package/dist/checkers/index.js.map +1 -1
  21. package/dist/checkers/probe.d.ts.map +1 -1
  22. package/dist/checkers/probe.js +5 -3
  23. package/dist/checkers/probe.js.map +1 -1
  24. package/dist/config/example.d.ts.map +1 -1
  25. package/dist/config/example.js +18 -0
  26. package/dist/config/example.js.map +1 -1
  27. package/dist/config/index.d.ts +1 -1
  28. package/dist/config/index.d.ts.map +1 -1
  29. package/dist/config/index.js +3 -3
  30. package/dist/config/index.js.map +1 -1
  31. package/dist/config/repo-build-pin.d.ts +4 -0
  32. package/dist/config/repo-build-pin.d.ts.map +1 -0
  33. package/dist/config/repo-build-pin.js +13 -0
  34. package/dist/config/repo-build-pin.js.map +1 -0
  35. package/dist/config/repo-harnesses.d.ts +43 -0
  36. package/dist/config/repo-harnesses.d.ts.map +1 -0
  37. package/dist/config/repo-harnesses.js +20 -0
  38. package/dist/config/repo-harnesses.js.map +1 -0
  39. package/dist/config/repo.d.ts +44 -11
  40. package/dist/config/repo.d.ts.map +1 -1
  41. package/dist/config/repo.js +26 -22
  42. package/dist/config/repo.js.map +1 -1
  43. package/dist/daemon/execution-config.d.ts +34 -0
  44. package/dist/daemon/execution-config.d.ts.map +1 -1
  45. package/dist/daemon/run-runtime.d.ts +34 -0
  46. package/dist/daemon/run-runtime.d.ts.map +1 -1
  47. package/dist/daemon/ship-executor.js +2 -3
  48. package/dist/daemon/ship-executor.js.map +1 -1
  49. package/dist/eval/baseline.d.ts.map +1 -1
  50. package/dist/eval/baseline.js +4 -4
  51. package/dist/eval/baseline.js.map +1 -1
  52. package/dist/eval/judge.d.ts.map +1 -1
  53. package/dist/eval/judge.js +9 -7
  54. package/dist/eval/judge.js.map +1 -1
  55. package/dist/eval/regression-report.js +1 -1
  56. package/dist/eval/regression-report.js.map +1 -1
  57. package/dist/eval/score.d.ts.map +1 -1
  58. package/dist/eval/score.js +2 -1
  59. package/dist/eval/score.js.map +1 -1
  60. package/dist/events/kinds.d.ts +1 -1
  61. package/dist/events/kinds.d.ts.map +1 -1
  62. package/dist/events/kinds.js +3 -0
  63. package/dist/events/kinds.js.map +1 -1
  64. package/dist/harness/catalog.d.ts +2 -0
  65. package/dist/harness/catalog.d.ts.map +1 -1
  66. package/dist/harness/catalog.js +5 -1
  67. package/dist/harness/catalog.js.map +1 -1
  68. package/dist/harness/contract.js +4 -4
  69. package/dist/harness/contract.js.map +1 -1
  70. package/dist/harness/index.d.ts +1 -1
  71. package/dist/harness/index.d.ts.map +1 -1
  72. package/dist/harness/index.js +1 -0
  73. package/dist/harness/index.js.map +1 -1
  74. package/dist/hosted/store-contract.js +1 -1
  75. package/dist/hosted/store-contract.js.map +1 -1
  76. package/dist/internal.d.ts +4 -4
  77. package/dist/internal.d.ts.map +1 -1
  78. package/dist/internal.js +4 -2
  79. package/dist/internal.js.map +1 -1
  80. package/dist/kpis/human.d.ts.map +1 -1
  81. package/dist/kpis/human.js +4 -8
  82. package/dist/kpis/human.js.map +1 -1
  83. package/dist/phases/build.d.ts +6 -2
  84. package/dist/phases/build.d.ts.map +1 -1
  85. package/dist/phases/build.js +43 -12
  86. package/dist/phases/build.js.map +1 -1
  87. package/dist/phases/check.d.ts +32 -2
  88. package/dist/phases/check.d.ts.map +1 -1
  89. package/dist/phases/check.js +5 -6
  90. package/dist/phases/check.js.map +1 -1
  91. package/dist/phases/plan-route.d.ts +16 -0
  92. package/dist/phases/plan-route.d.ts.map +1 -0
  93. package/dist/phases/plan-route.js +38 -0
  94. package/dist/phases/plan-route.js.map +1 -0
  95. package/dist/phases/plan-routes.d.ts +16 -1
  96. package/dist/phases/plan-routes.d.ts.map +1 -1
  97. package/dist/phases/plan-routes.js +40 -1
  98. package/dist/phases/plan-routes.js.map +1 -1
  99. package/dist/phases/plan.d.ts +4 -3
  100. package/dist/phases/plan.d.ts.map +1 -1
  101. package/dist/phases/plan.js +15 -30
  102. package/dist/phases/plan.js.map +1 -1
  103. package/dist/phases/ship-git.d.ts +52 -0
  104. package/dist/phases/ship-git.d.ts.map +1 -0
  105. package/dist/phases/ship-git.js +104 -0
  106. package/dist/phases/ship-git.js.map +1 -0
  107. package/dist/phases/ship.d.ts +8 -6
  108. package/dist/phases/ship.d.ts.map +1 -1
  109. package/dist/phases/ship.js +71 -121
  110. package/dist/phases/ship.js.map +1 -1
  111. package/dist/queue/queue-backend.d.ts +6 -1
  112. package/dist/queue/queue-backend.d.ts.map +1 -1
  113. package/dist/queue/queue-backend.js +7 -1
  114. package/dist/queue/queue-backend.js.map +1 -1
  115. package/dist/queue/unpark.d.ts +28 -0
  116. package/dist/queue/unpark.d.ts.map +1 -0
  117. package/dist/queue/unpark.js +69 -0
  118. package/dist/queue/unpark.js.map +1 -0
  119. package/dist/readiness/slice-plan.js +1 -1
  120. package/dist/readiness/slice-plan.js.map +1 -1
  121. package/dist/review/backtest.js +2 -2
  122. package/dist/review/backtest.js.map +1 -1
  123. package/dist/review/containment.js +1 -1
  124. package/dist/review/containment.js.map +1 -1
  125. package/dist/router/index.d.ts.map +1 -1
  126. package/dist/router/index.js +2 -13
  127. package/dist/router/index.js.map +1 -1
  128. package/dist/router/requires.d.ts +4 -0
  129. package/dist/router/requires.d.ts.map +1 -0
  130. package/dist/router/requires.js +22 -0
  131. package/dist/router/requires.js.map +1 -0
  132. package/dist/run/ci-rework-loop.d.ts +65 -0
  133. package/dist/run/ci-rework-loop.d.ts.map +1 -0
  134. package/dist/run/ci-rework-loop.js +169 -0
  135. package/dist/run/ci-rework-loop.js.map +1 -0
  136. package/dist/run/ci-rework.d.ts +25 -0
  137. package/dist/run/ci-rework.d.ts.map +1 -0
  138. package/dist/run/ci-rework.js +113 -0
  139. package/dist/run/ci-rework.js.map +1 -0
  140. package/dist/run/ci-suppression-guard.d.ts +11 -0
  141. package/dist/run/ci-suppression-guard.d.ts.map +1 -0
  142. package/dist/run/ci-suppression-guard.js +143 -0
  143. package/dist/run/ci-suppression-guard.js.map +1 -0
  144. package/dist/run/outcome.d.ts +9 -2
  145. package/dist/run/outcome.d.ts.map +1 -1
  146. package/dist/run/outcome.js +5 -0
  147. package/dist/run/outcome.js.map +1 -1
  148. package/dist/run/park-comment.d.ts +73 -0
  149. package/dist/run/park-comment.d.ts.map +1 -0
  150. package/dist/run/park-comment.js +211 -0
  151. package/dist/run/park-comment.js.map +1 -0
  152. package/dist/run/phase-snapshot.js +2 -2
  153. package/dist/run/phase-snapshot.js.map +1 -1
  154. package/dist/run/resume-context.d.ts +3 -2
  155. package/dist/run/resume-context.d.ts.map +1 -1
  156. package/dist/run/resume-context.js.map +1 -1
  157. package/dist/run/run-issue.d.ts +2 -1
  158. package/dist/run/run-issue.d.ts.map +1 -1
  159. package/dist/run/run-issue.js +50 -52
  160. package/dist/run/run-issue.js.map +1 -1
  161. package/dist/sandbox/index.js +1 -1
  162. package/dist/sandbox/index.js.map +1 -1
  163. package/dist/sim/pipeline.d.ts +2 -1
  164. package/dist/sim/pipeline.d.ts.map +1 -1
  165. package/dist/sim/pipeline.js.map +1 -1
  166. package/dist/spec/index.d.ts +3 -2
  167. package/dist/spec/index.d.ts.map +1 -1
  168. package/dist/spec/index.js +1 -1
  169. package/dist/spec/index.js.map +1 -1
  170. package/dist/steward/detect.d.ts +2 -1
  171. package/dist/steward/detect.d.ts.map +1 -1
  172. package/dist/steward/detect.js +3 -2
  173. package/dist/steward/detect.js.map +1 -1
  174. package/dist/types/index.d.ts +34 -1
  175. package/dist/types/index.d.ts.map +1 -1
  176. package/dist/usage/index.js +1 -1
  177. package/dist/usage/index.js.map +1 -1
  178. package/dist/utils/command-runner.js +2 -2
  179. package/dist/utils/command-runner.js.map +1 -1
  180. package/dist/utils/worktree-gc.d.ts.map +1 -1
  181. package/dist/utils/worktree-gc.js +5 -5
  182. package/dist/utils/worktree-gc.js.map +1 -1
  183. package/dist/utils/worktree-location.d.ts +2 -2
  184. package/dist/utils/worktree-location.d.ts.map +1 -1
  185. package/dist/utils/worktree-location.js +16 -9
  186. package/dist/utils/worktree-location.js.map +1 -1
  187. package/dist/utils/worktree-name.d.ts +6 -0
  188. package/dist/utils/worktree-name.d.ts.map +1 -1
  189. package/dist/utils/worktree-name.js +16 -1
  190. package/dist/utils/worktree-name.js.map +1 -1
  191. package/package.json +5 -5
@@ -0,0 +1,169 @@
1
+ // packages/core/src/run/ci-rework-loop.ts — SHIP with a bounded CI rework loop (#2816)
2
+ import { reworkWorker as reworkWorkerDefault } from '../phases/check.js';
3
+ import { attributableCodeqlAlerts, attributeCiFailure, CI_REWORK_INSTRUCTIONS, ciReworkSummary, listBaseFailingChecks as listBaseFailingChecksDefault, listPrChangedFiles as listPrChangedFilesDefault, needsBaseChecks, resolveMaxCiReworkRounds, } from './ci-rework.js';
4
+ import { describeSuppression, readReworkDiff as readReworkDiffDefault, readWorktreeHead as readWorktreeHeadDefault, scanReworkDiff, } from './ci-suppression-guard.js';
5
+ import { reworkRouteFor } from './outcome.js';
6
+ import { shipParkReason } from './ship-park.js';
7
+ const errorMessage = (err) => (err instanceof Error ? err.message : String(err));
8
+ const guardError = (match) => ({
9
+ kind: 'path',
10
+ rule: 'guard-error',
11
+ file: '(unknown)',
12
+ match,
13
+ });
14
+ /**
15
+ * Runs SHIP. When the CI watch fails on CodeQL alerts in files the PR changed, feeds them to the
16
+ * BUILD rework worker, re-runs CHECK and re-enters SHIP on the same PR, up to
17
+ * resolveMaxCiReworkRounds() rounds — a counter separate from CHECK's own rework rounds.
18
+ * After each rework round the committed diff is scanned for suppression attempts (#2818); any hit,
19
+ * or an unreadable diff, parks ci-failed before the re-CHECK, push or re-watch.
20
+ */
21
+ export async function shipWithCiRework(ctx, inputs) {
22
+ const { request, ports, shipPhase, checkPhase, check } = ctx;
23
+ const rework = ports.reworkWorker ?? reworkWorkerDefault;
24
+ const listChanged = ports.listPrChangedFiles ?? listPrChangedFilesDefault;
25
+ const listBase = ports.listBaseFailingChecks ?? listBaseFailingChecksDefault;
26
+ const readHead = ports.readWorktreeHead ?? readWorktreeHeadDefault;
27
+ const readDiff = ports.readReworkDiff ?? readReworkDiffDefault;
28
+ const { builtRoute, builtModel, planSlice } = inputs;
29
+ const log = ports.events();
30
+ const shipOpts = {
31
+ issue: request.issue,
32
+ repo: request.repo,
33
+ worktree: ports.workspace.path,
34
+ branch: request.branch,
35
+ recordedRemoteSha: ports.workspace.remoteBranch?.sha,
36
+ octokit: ports.octokit,
37
+ watchCI: !request.skipCI,
38
+ log: ports.events('ship'),
39
+ approvalGate: request.options.interactive ? ports.createApprovalGate?.() : undefined,
40
+ specPath: request.specPath,
41
+ eventsFile: request.eventsFile,
42
+ startedAt: request.startedAt,
43
+ logsDir: request.logsDir,
44
+ work: request.work,
45
+ laneId: request.lane,
46
+ reviewRouting: inputs.reviewRouting,
47
+ ...(inputs.pinNote ? { pinNotes: [inputs.pinNote] } : {}),
48
+ slice: planSlice ? { index: planSlice.index, count: planSlice.plan.slices.length } : undefined,
49
+ };
50
+ let ship = await shipPhase({ ...shipOpts, checkSummary: check.summary, reworkRounds: check.reworkRounds });
51
+ const [owner, repoName] = request.repo.split('/');
52
+ const maxRounds = resolveMaxCiReworkRounds();
53
+ let rounds = 0;
54
+ let lastCiFailure = ship.ciFailure;
55
+ let suffix = '';
56
+ while (!ship.ok && ship.ciOutcome === 'failure' && ship.prNumber !== undefined) {
57
+ lastCiFailure = ship.ciFailure ?? lastCiFailure;
58
+ let changed;
59
+ try {
60
+ changed = await listChanged(ports.octokit, owner, repoName, ship.prNumber);
61
+ }
62
+ catch (err) {
63
+ const msg = `could not list PR #${ship.prNumber} files for CI attribution: ${errorMessage(err)}`;
64
+ ports.events('ship')('ship', msg);
65
+ break;
66
+ }
67
+ let base;
68
+ if (needsBaseChecks(ship.ciFailure)) {
69
+ try {
70
+ base = await listBase(ports.octokit, owner, repoName, ship.prNumber);
71
+ }
72
+ catch (err) {
73
+ ports.events('ship')('ship', `could not read base checks for PR #${ship.prNumber}: ${errorMessage(err)}`);
74
+ }
75
+ }
76
+ const attribution = attributeCiFailure(ship.ciFailure, changed, base);
77
+ if (ship.ciFailure)
78
+ lastCiFailure = { ...ship.ciFailure, attribution };
79
+ if (attribution.baseline) {
80
+ const note = 'baseline: no CI failure is attributable to this PR';
81
+ suffix = ` — ${note}`;
82
+ ports.events('ship')('ship', `${note} (PR #${ship.prNumber})`);
83
+ break;
84
+ }
85
+ const attributable = attributableCodeqlAlerts(ship.ciFailure, changed);
86
+ if (attributable.length === 0)
87
+ break;
88
+ if (rounds >= maxRounds) {
89
+ suffix = ` — CI rework budget exhausted after ${rounds} round${rounds === 1 ? '' : 's'}`;
90
+ break;
91
+ }
92
+ rounds++;
93
+ const skipped = attribution.items.filter((i) => !i.attributable).map((i) => i.ref);
94
+ log('rework', `CI rework round ${rounds}/${maxRounds}: ${attributable.length} attributable CodeQL alert(s) on PR #${ship.prNumber}` +
95
+ (skipped.length > 0 ? `; non-attributable: ${skipped.join(', ')}` : ''), lastCiFailure ? { ciFailure: lastCiFailure } : undefined);
96
+ const suppressionPark = (findings) => {
97
+ const described = describeSuppression(findings);
98
+ ports.events('ship')('ship', `${described} after CI rework round ${rounds} (PR #${ship.prNumber})`);
99
+ const message = ship.reason
100
+ ? `ship phase failed: ${ship.reason} — ${described}`
101
+ : `ship phase failed — ${described}`;
102
+ const base = lastCiFailure ?? { failingChecks: [], alerts: [], truncated: false };
103
+ return { ship, parked: { reason: 'ci-failed', message, ciFailure: { ...base, suppressionAttempt: findings } } };
104
+ };
105
+ let beforeSha;
106
+ try {
107
+ beforeSha = await readHead(ports.workspace.path);
108
+ }
109
+ catch (err) {
110
+ return suppressionPark([guardError(`could not read the worktree HEAD: ${errorMessage(err)}`)]);
111
+ }
112
+ const worked = await rework({
113
+ issue: request.issue,
114
+ worktree: ports.workspace.path,
115
+ specPath: request.specPath,
116
+ summary: ciReworkSummary(attributable),
117
+ constitution: ctx.constitution,
118
+ router: ports.router,
119
+ log: ports.events('build'),
120
+ buildTimeoutSeconds: request.timeouts.build,
121
+ sandbox: request.sandboxPolicy,
122
+ appPort: ctx.appPort,
123
+ appBaseUrl: ctx.appBaseUrl,
124
+ onPgid: ctx.onPgid,
125
+ ...reworkRouteFor(builtRoute, builtModel),
126
+ runId: ctx.runId,
127
+ extraInstructions: CI_REWORK_INSTRUCTIONS,
128
+ });
129
+ if (!worked.modelCompleted) {
130
+ suffix = ' — CI rework worker never ran';
131
+ break;
132
+ }
133
+ let findings;
134
+ try {
135
+ findings = scanReworkDiff(await readDiff(ports.workspace.path, beforeSha));
136
+ }
137
+ catch (err) {
138
+ findings = [guardError(`could not read the CI rework diff: ${errorMessage(err)}`)];
139
+ }
140
+ if (findings.length > 0)
141
+ return suppressionPark(findings);
142
+ const recheck = await checkPhase(ctx.checkOpts);
143
+ if (!recheck.passed) {
144
+ const checkFailure = recheck.failureSignature !== undefined
145
+ ? {
146
+ failureSignature: recheck.failureSignature,
147
+ failingChecks: recheck.summary.results.filter((r) => r.result === 'FAIL').map((r) => r.checker),
148
+ }
149
+ : undefined;
150
+ const message = `${recheck.summary.failures} check failures after CI rework round ${rounds}`;
151
+ return { ship, parked: { reason: 'fail', message, ...(checkFailure ? { checkFailure } : {}) } };
152
+ }
153
+ ship = await shipPhase({
154
+ ...shipOpts,
155
+ checkSummary: recheck.summary,
156
+ reworkRounds: recheck.reworkRounds,
157
+ reentry: { prNumber: ship.prNumber, previousHeadSha: ship.headSha },
158
+ });
159
+ }
160
+ if (ship.ok)
161
+ return { ship };
162
+ const message = ship.denied
163
+ ? `ship denied: ${ship.deniedReason}`
164
+ : ship.reason
165
+ ? `ship phase failed: ${ship.reason}${suffix}`
166
+ : `ship phase failed${suffix}`;
167
+ return { ship, parked: { reason: shipParkReason(ship), message, ciFailure: lastCiFailure ?? ship.ciFailure } };
168
+ }
169
+ //# sourceMappingURL=ci-rework-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-rework-loop.js","sourceRoot":"","sources":["../../src/run/ci-rework-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { CheckSummary, CiAttribution, CiCodeScanningAlert, CiFailureEvidence } from '../types/index.js';
3
+ export declare const MAX_CI_REWORK_ROUNDS = 2;
4
+ export declare const CI_REWORK_ENV = "FACTORY_MAX_CI_REWORK_ROUNDS";
5
+ export declare const CI_REWORK_INSTRUCTIONS: string;
6
+ /** Non-negative integer from FACTORY_MAX_CI_REWORK_ROUNDS (0 disables CI rework); anything else falls back to the default. */
7
+ export declare function resolveMaxCiReworkRounds(env?: NodeJS.ProcessEnv): number;
8
+ /** Alerts whose file is among the PR's changed files; the rest are pre-existing or baseline. */
9
+ export declare function attributableCodeqlAlerts(evidence: CiFailureEvidence | undefined, changedFiles: readonly string[]): CiCodeScanningAlert[];
10
+ /** Failing check names on the PR base branch's latest commit (#2817). */
11
+ export interface BaseFailingChecks {
12
+ baseRef: string;
13
+ baseSha: string;
14
+ failing: string[];
15
+ }
16
+ /** True when a failing check is attributed on its own (not through CodeQL alerts). */
17
+ export declare function needsBaseChecks(evidence: CiFailureEvidence | undefined): boolean;
18
+ /** Attributes each failing item to the PR: alerts by changed file, other checks by the base commit (#2817). */
19
+ export declare function attributeCiFailure(evidence: CiFailureEvidence | undefined, changedFiles: readonly string[], base: BaseFailingChecks | undefined): CiAttribution;
20
+ /** Failing check names on the latest commit of the PR's base branch. Errors propagate to the caller. */
21
+ export declare function listBaseFailingChecks(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<BaseFailingChecks>;
22
+ /** The same CheckSummary shape local CHECK rework consumes, with one FAIL `ci_codeql` result. */
23
+ export declare function ciReworkSummary(alerts: readonly CiCodeScanningAlert[]): CheckSummary;
24
+ export declare function listPrChangedFiles(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<string[]>;
25
+ //# sourceMappingURL=ci-rework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-rework.d.ts","sourceRoot":"","sources":["../../src/run/ci-rework.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAEb,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,aAAa,iCAAiC,CAAC;AAK5D,eAAO,MAAM,sBAAsB,QAGhB,CAAC;AAEpB,8HAA8H;AAC9H,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGrF;AASD,gGAAgG;AAChG,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,mBAAmB,EAAE,CAOvB;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAEhF;AAED,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAClC,aAAa,CA+Bf;AAED,wGAAwG;AACxG,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,GAAG,YAAY,CAUpF;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB"}
@@ -0,0 +1,113 @@
1
+ // packages/core/src/run/ci-rework.ts — attribution, budget and feedback for SHIP CI rework (#2816)
2
+ import { isPassingConclusion, listAllCheckRuns } from '../utils/ci-watch.js';
3
+ export const MAX_CI_REWORK_ROUNDS = 2;
4
+ export const CI_REWORK_ENV = 'FACTORY_MAX_CI_REWORK_ROUNDS';
5
+ const LIST_FILES_PAGE_SIZE = 100;
6
+ const LIST_FILES_MAX_PAGES = 30;
7
+ export const CI_REWORK_INSTRUCTIONS = 'CI (CodeQL) flagged the alerts above on files this PR changed. Fix the root cause in the code at the listed file:line. ' +
8
+ 'Suppression is forbidden: do not add `// codeql[...]`, `lgtm`, `eslint-disable` or `@ts-ignore` comments, do not exclude queries or paths in any config, and do not dismiss alerts. ' +
9
+ 'Commit the fix.';
10
+ /** Non-negative integer from FACTORY_MAX_CI_REWORK_ROUNDS (0 disables CI rework); anything else falls back to the default. */
11
+ export function resolveMaxCiReworkRounds(env = process.env) {
12
+ const value = (env[CI_REWORK_ENV] ?? '').trim();
13
+ return /^\d+$/.test(value) ? Number(value) : MAX_CI_REWORK_ROUNDS;
14
+ }
15
+ function alertPath(location) {
16
+ const trimmed = location.trim();
17
+ if (trimmed === '' || trimmed === '(unknown location)')
18
+ return undefined;
19
+ const path = trimmed.replace(/:\d+$/, '').replace(/^\.\//, '');
20
+ return path === '' ? undefined : path;
21
+ }
22
+ /** Alerts whose file is among the PR's changed files; the rest are pre-existing or baseline. */
23
+ export function attributableCodeqlAlerts(evidence, changedFiles) {
24
+ if (!evidence)
25
+ return [];
26
+ const changed = new Set(changedFiles);
27
+ return evidence.alerts.filter((alert) => {
28
+ const path = alertPath(alert.location);
29
+ return path !== undefined && changed.has(path);
30
+ });
31
+ }
32
+ /** True when a failing check is attributed on its own (not through CodeQL alerts). */
33
+ export function needsBaseChecks(evidence) {
34
+ return !!evidence && evidence.failingChecks.some((c) => !(/codeql/i.test(c.name) && evidence.alerts.length > 0));
35
+ }
36
+ /** Attributes each failing item to the PR: alerts by changed file, other checks by the base commit (#2817). */
37
+ export function attributeCiFailure(evidence, changedFiles, base) {
38
+ if (!evidence)
39
+ return { baseline: false, items: [] };
40
+ const changed = new Set(changedFiles);
41
+ const items = [];
42
+ for (const alert of evidence.alerts) {
43
+ const path = alertPath(alert.location);
44
+ const attributable = path !== undefined && changed.has(path);
45
+ items.push({
46
+ kind: 'codeql-alert',
47
+ ref: `${alert.ruleId} at ${alert.location}`,
48
+ attributable,
49
+ reason: attributable ? 'file changed by this PR' : 'file not changed by this PR',
50
+ });
51
+ }
52
+ const baseLabel = base ? `${base.baseRef}@${base.baseSha.slice(0, 12)}` : '';
53
+ for (const check of evidence.failingChecks) {
54
+ if (/codeql/i.test(check.name) && evidence.alerts.length > 0)
55
+ continue;
56
+ if (!base) {
57
+ items.push({ kind: 'check', ref: check.name, attributable: true, reason: 'base checks unavailable' });
58
+ continue;
59
+ }
60
+ const onBase = base.failing.includes(check.name);
61
+ items.push({
62
+ kind: 'check',
63
+ ref: check.name,
64
+ attributable: !onBase,
65
+ reason: onBase ? `also failing on base ${baseLabel}` : `not failing on base ${baseLabel}`,
66
+ });
67
+ }
68
+ const baseline = items.length > 0 && items.every((i) => !i.attributable) && !evidence.errors?.length;
69
+ return { baseline, ...(base ? { baseRef: base.baseRef, baseSha: base.baseSha } : {}), items };
70
+ }
71
+ /** Failing check names on the latest commit of the PR's base branch. Errors propagate to the caller. */
72
+ export async function listBaseFailingChecks(octokit, owner, repo, prNumber) {
73
+ const { data: pr } = await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber });
74
+ const baseRef = pr.base.ref;
75
+ const { data: branch } = await octokit.rest.repos.getBranch({ owner, repo, branch: baseRef });
76
+ const baseSha = branch.commit.sha;
77
+ const runs = await listAllCheckRuns(octokit, owner, repo, baseSha, 100, 10);
78
+ const failing = new Set();
79
+ for (const run of runs) {
80
+ if (run.name && run.status === 'completed' && !isPassingConclusion(run.conclusion))
81
+ failing.add(run.name);
82
+ }
83
+ return { baseRef, baseSha, failing: [...failing] };
84
+ }
85
+ /** The same CheckSummary shape local CHECK rework consumes, with one FAIL `ci_codeql` result. */
86
+ export function ciReworkSummary(alerts) {
87
+ const lines = alerts.map((a) => `- ${a.ruleId} at ${a.location} — ${a.message}`);
88
+ const details = ['CodeQL alerts on files this PR changed:', ...lines].join('\n');
89
+ return {
90
+ failures: 1,
91
+ passes: 0,
92
+ skips: 0,
93
+ total: 1,
94
+ results: [{ checker: 'ci_codeql', result: 'FAIL', details }],
95
+ };
96
+ }
97
+ export async function listPrChangedFiles(octokit, owner, repo, prNumber) {
98
+ const files = [];
99
+ for (let page = 1; page <= LIST_FILES_MAX_PAGES; page++) {
100
+ const { data } = await octokit.rest.pulls.listFiles({
101
+ owner,
102
+ repo,
103
+ pull_number: prNumber,
104
+ per_page: LIST_FILES_PAGE_SIZE,
105
+ page,
106
+ });
107
+ files.push(...data.map((f) => f.filename));
108
+ if (data.length < LIST_FILES_PAGE_SIZE)
109
+ break;
110
+ }
111
+ return files;
112
+ }
113
+ //# sourceMappingURL=ci-rework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-rework.js","sourceRoot":"","sources":["../../src/run/ci-rework.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CiSuppressionFinding } from '../types/index.js';
2
+ export declare const SUPPRESSION_ATTEMPT = "suppression-attempt";
3
+ /** Scans a unified git diff for suppression comments (added lines) and protected paths (any file header). */
4
+ export declare function scanReworkDiff(diff: string): CiSuppressionFinding[];
5
+ /** Reads the worktree's current HEAD SHA. */
6
+ export declare function readWorktreeHead(worktree: string): Promise<string>;
7
+ /** Reads the committed diff from `fromSha` to HEAD (SHIP re-entry pushes HEAD, not the working tree). */
8
+ export declare function readReworkDiff(worktree: string, fromSha: string): Promise<string>;
9
+ /** One-line summary of guard findings for park messages and logs. */
10
+ export declare function describeSuppression(findings: readonly CiSuppressionFinding[]): string;
11
+ //# sourceMappingURL=ci-suppression-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-suppression-guard.d.ts","sourceRoot":"","sources":["../../src/run/ci-suppression-guard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AA2CzD,6GAA6G;AAC7G,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAsEnE;AAED,6CAA6C;AAC7C,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxE;AAED,yGAAyG;AACzG,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKvF;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,GAAG,MAAM,CAOrF"}
@@ -0,0 +1,143 @@
1
+ // packages/core/src/run/ci-suppression-guard.ts — mechanical suppression guard for SHIP CI rework diffs (#2818)
2
+ import { execGit } from '../utils/git-exec.js';
3
+ export const SUPPRESSION_ATTEMPT = 'suppression-attempt';
4
+ const MAX_MATCH = 200;
5
+ const MAX_LISTED = 5;
6
+ /** True when an eslint-disable directive in `line` is blanket or names a security rule. */
7
+ function eslintDisablesSecurity(line) {
8
+ const m = /eslint-disable(?:-next-line|-line)?(?![\w-])([^\n]*)/.exec(line);
9
+ if (!m)
10
+ return false;
11
+ let list = m[1];
12
+ const dash = list.indexOf('--');
13
+ if (dash >= 0)
14
+ list = list.slice(0, dash);
15
+ const end = list.indexOf('*/');
16
+ if (end >= 0)
17
+ list = list.slice(0, end);
18
+ const rules = list.split(/[,\s]+/).filter(Boolean);
19
+ return rules.length === 0 || rules.some((r) => /security/i.test(r));
20
+ }
21
+ /** Added-line rules; the single owner of the known suppression comment forms. */
22
+ const SUPPRESSION_COMMENT_RULES = [
23
+ { rule: 'codeql-comment', test: (l) => /\bcodeql\[/i.test(l) },
24
+ { rule: 'lgtm-comment', test: (l) => /(?:\/\/|#|\/\*|\*|<!--|--).*\blgtm\b/i.test(l) },
25
+ { rule: 'nosec-comment', test: (l) => /#\s*nosec\b/i.test(l) || /\/\/\s*#?nosec\b/i.test(l) },
26
+ { rule: 'eslint-disable-security', test: eslintDisablesSecurity },
27
+ ];
28
+ function pathRules(path) {
29
+ const segments = path.split('/');
30
+ const base = segments[segments.length - 1];
31
+ const rules = [];
32
+ if (path.startsWith('.github/workflows/'))
33
+ rules.push('workflow-path');
34
+ if (segments.slice(0, -1).some((s) => /^\.?codeql$/i.test(s)) || /codeql.*\.(ya?ml|json)$/i.test(base)) {
35
+ rules.push('codeql-path');
36
+ }
37
+ if (/\.sarif(\.json)?$/i.test(base))
38
+ rules.push('sarif-path');
39
+ return rules;
40
+ }
41
+ /** Scans a unified git diff for suppression comments (added lines) and protected paths (any file header). */
42
+ export function scanReworkDiff(diff) {
43
+ const findings = [];
44
+ const seen = new Set();
45
+ const add = (f) => {
46
+ const key = `${f.kind}|${f.rule}|${f.file}|${f.line ?? ''}|${f.kind === 'path' ? f.match : ''}`;
47
+ if (seen.has(key))
48
+ return;
49
+ seen.add(key);
50
+ findings.push(f);
51
+ };
52
+ const checkPath = (path) => {
53
+ if (!path || path === '/dev/null')
54
+ return;
55
+ for (const rule of pathRules(path))
56
+ add({ kind: 'path', rule, file: path, match: path });
57
+ };
58
+ let file = '(unknown)';
59
+ let line;
60
+ let inHunk = false;
61
+ for (const raw of diff.split('\n')) {
62
+ const header = /^diff --git a\/(.+) b\/(.+)$/.exec(raw);
63
+ if (header) {
64
+ inHunk = false;
65
+ line = undefined;
66
+ file = header[2];
67
+ checkPath(header[1]);
68
+ checkPath(header[2]);
69
+ continue;
70
+ }
71
+ if (!inHunk) {
72
+ const rename = /^rename (?:from|to) (.+)$/.exec(raw);
73
+ if (rename) {
74
+ checkPath(rename[1]);
75
+ continue;
76
+ }
77
+ const oldPath = /^--- (?:a\/)?(.+)$/.exec(raw);
78
+ if (oldPath) {
79
+ checkPath(oldPath[1]);
80
+ continue;
81
+ }
82
+ const newPath = /^\+\+\+ (?:b\/)?(.+)$/.exec(raw);
83
+ if (newPath) {
84
+ if (newPath[1] !== '/dev/null')
85
+ file = newPath[1];
86
+ checkPath(newPath[1]);
87
+ continue;
88
+ }
89
+ }
90
+ const hunk = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(raw);
91
+ if (hunk) {
92
+ inHunk = true;
93
+ line = Number(hunk[1]);
94
+ continue;
95
+ }
96
+ if (raw.startsWith('+')) {
97
+ const text = raw.slice(1);
98
+ for (const { rule, test } of SUPPRESSION_COMMENT_RULES) {
99
+ if (test(text)) {
100
+ add({
101
+ kind: 'comment',
102
+ rule,
103
+ file,
104
+ ...(line !== undefined ? { line } : {}),
105
+ match: text.trim().slice(0, MAX_MATCH),
106
+ });
107
+ }
108
+ }
109
+ if (line !== undefined)
110
+ line++;
111
+ }
112
+ else if (raw.startsWith(' ') && line !== undefined) {
113
+ line++;
114
+ }
115
+ }
116
+ return findings;
117
+ }
118
+ /** Reads the worktree's current HEAD SHA. */
119
+ export async function readWorktreeHead(worktree) {
120
+ const { stdout } = await execGit(['rev-parse', 'HEAD'], { cwd: worktree });
121
+ const sha = stdout.trim();
122
+ if (!sha)
123
+ throw new Error('git rev-parse HEAD returned nothing');
124
+ return sha;
125
+ }
126
+ /** Reads the committed diff from `fromSha` to HEAD (SHIP re-entry pushes HEAD, not the working tree). */
127
+ export async function readReworkDiff(worktree, fromSha) {
128
+ const { stdout } = await execGit(['diff', '--no-color', '--no-ext-diff', '--unified=0', fromSha, 'HEAD'], {
129
+ cwd: worktree,
130
+ });
131
+ return stdout;
132
+ }
133
+ /** One-line summary of guard findings for park messages and logs. */
134
+ export function describeSuppression(findings) {
135
+ const items = findings.slice(0, MAX_LISTED).map((f) => {
136
+ if (f.kind === 'comment')
137
+ return `${f.rule} at ${f.file}${f.line !== undefined ? `:${f.line}` : ''}`;
138
+ return `${f.rule} ${f.match}`;
139
+ });
140
+ const more = findings.length > MAX_LISTED ? `, +${findings.length - MAX_LISTED} more` : '';
141
+ return `${SUPPRESSION_ATTEMPT}: ${findings.length} finding(s): ${items.join(', ')}${more}`;
142
+ }
143
+ //# sourceMappingURL=ci-suppression-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-suppression-guard.js","sourceRoot":"","sources":["../../src/run/ci-suppression-guard.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import type { EventKind } from '../events/kinds.js';
2
- export type ParkReason = Extract<EventKind, 'escalate' | 'timeout' | 'fail' | 'conflict' | 'ci-failed' | 'ci-infra' | 'held' | 'config'>;
3
- export type BuildRoute = 'codex' | 'claude' | 'opencode';
2
+ export type ParkReason = Extract<EventKind, 'escalate' | 'timeout' | 'fail' | 'conflict' | 'ci-failed' | 'ci-infra' | 'held' | 'config' | 'blocked'>;
3
+ import type { BuildRoutePin } from '../config/repo.js';
4
+ export type BuildRoute = BuildRoutePin;
5
+ /** CHECK/CI rework reruns on the route BUILD completed on, `command` included (#2873):
6
+ * reworkWorker keeps it when its model can run and reroutes otherwise. */
7
+ export declare function reworkRouteFor(route: BuildRoute, model: string | undefined): {
8
+ reworkRoute?: BuildRoutePin;
9
+ reworkModel?: string;
10
+ };
4
11
  /** A run's terminal outcome. `parked` is produced by the CLI's LaneParkError and `released`
5
12
  * by an environment-caused CHECK failure (#1928, not a park); `shipped` / `ready` /
6
13
  * `escalated` are defined here for later stories (#4, #5) that re-point the CLI
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/run/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,SAAS,EACT,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAC5F,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEzD;;;8CAG8C;AAC9C,MAAM,MAAM,UAAU,GAClB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/F;IACE,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,GACD;IACE,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yHAAyH;IACzH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACD;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAOtD;AAED;;;+EAG+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAQ3E"}
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/run/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,SAAS,EACT,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CACxG,CAAC;AAEF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;2EAC2E;AAC3E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB;IAAE,WAAW,CAAC,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAEvD;AAED;;;8CAG8C;AAC9C,MAAM,MAAM,UAAU,GAClB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/F;IACE,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,GACD;IACE,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yHAAyH;IACzH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACD;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAOtD;AAED;;;+EAG+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAQ3E"}
@@ -1,3 +1,8 @@
1
+ /** CHECK/CI rework reruns on the route BUILD completed on, `command` included (#2873):
2
+ * reworkWorker keeps it when its model can run and reroutes otherwise. */
3
+ export function reworkRouteFor(route, model) {
4
+ return { reworkRoute: route, reworkModel: model };
5
+ }
1
6
  /** Core classifies structurally — via a parked RunOutcome on `err.outcome` or a
2
7
  * `parkReason` marker property — rather than `instanceof`, because core cannot import
3
8
  * the CLI's error classes (LaneParkError, LandConflictError, CiFailedError). */
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/run/outcome.ts"],"names":[],"mappings":"AAmDA;;iFAEiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,OAAO,GAAI,GAAmD,EAAE,OAAO,CAAC;IAC9E,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAI,GAAsD,EAAE,UAAU,CAAC;IACnF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAK,GAA+C,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;+EAG+E;AAC/E,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAuC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,wDAAwD,GAAG,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/run/outcome.ts"],"names":[],"mappings":"AAWA;2EAC2E;AAC3E,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,KAAyB;IAEzB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACpD,CAAC;AA4CD;;iFAEiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,OAAO,GAAI,GAAmD,EAAE,OAAO,CAAC;IAC9E,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAI,GAAsD,EAAE,UAAU,CAAC;IACnF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAK,GAA+C,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;+EAG+E;AAC/E,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAuC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,wDAAwD,GAAG,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { ParkReason } from './outcome.js';
3
+ export declare const ISSUE_STATE_MARKER_VERSION = "v1";
4
+ export interface ParkCommentInput {
5
+ issue: number;
6
+ reason: ParkReason;
7
+ message: string;
8
+ runId: string;
9
+ branch: string;
10
+ lane?: string;
11
+ parkSha?: string;
12
+ blockers?: readonly number[];
13
+ autoUnparks?: number;
14
+ status?: string;
15
+ }
16
+ /** `reason` is a plain string because the parser reads untrusted text. */
17
+ export interface ParkState {
18
+ reason: string;
19
+ lane?: string;
20
+ runId?: string;
21
+ branch?: string;
22
+ parkSha?: string;
23
+ blockers: number[];
24
+ /** Times the blocked-park poller re-queued this issue; 0 when the line is absent or malformed. */
25
+ autoUnparks: number;
26
+ status?: string;
27
+ }
28
+ export interface ParkStateComment {
29
+ id: number;
30
+ body: string;
31
+ }
32
+ export declare function issueStateMarker(issue: number): string;
33
+ export declare function parkUnblockHint(reason: ParkReason, issue: number): string;
34
+ export declare function renderParkComment(input: ParkCommentInput): string;
35
+ export interface ParkCommentPatch {
36
+ reason?: ParkReason;
37
+ status?: string;
38
+ autoUnparks?: number;
39
+ }
40
+ /** Rewrites the state block (and the unblock hint on a reason change) in place; null when there is no state block. */
41
+ export declare function patchParkComment(body: string, issue: number, patch: ParkCommentPatch): string | null;
42
+ /** Lowest-id marked comment decides; null when none, or when its state block is unreadable. */
43
+ export declare function readParkState(comments: readonly ParkStateComment[], issue?: number): ParkState | null;
44
+ /** The lowest-id marker comment written by the authenticated user, or undefined. */
45
+ export declare function findOwnParkComment(deps: {
46
+ octokit: Octokit;
47
+ repo: string;
48
+ issue: number;
49
+ }): Promise<ParkStateComment | undefined>;
50
+ export declare function upsertParkComment(deps: {
51
+ octokit: Octokit;
52
+ repo: string;
53
+ input: ParkCommentInput;
54
+ }): Promise<{
55
+ commentId: number;
56
+ created: boolean;
57
+ }>;
58
+ /** Never throws: a GitHub or git failure comes back as `{ ok: false, error }`. */
59
+ export declare function publishParkComment(deps: {
60
+ octokit: Octokit;
61
+ repo: string;
62
+ worktree?: string;
63
+ input: Omit<ParkCommentInput, 'parkSha'>;
64
+ readHead?: (worktree: string) => Promise<string>;
65
+ }): Promise<{
66
+ ok: true;
67
+ commentId: number;
68
+ created: boolean;
69
+ } | {
70
+ ok: false;
71
+ error: string;
72
+ }>;
73
+ //# sourceMappingURL=park-comment.d.ts.map