@alecsibilia/luca 14.0.0-alpha.2 → 14.0.0-alpha.21

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 (321) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +7 -2
  3. package/board/client/board-look.ts +31 -1
  4. package/board/client/board-panel-parts.tsx +150 -0
  5. package/board/client/board-panel-stages.ts +99 -0
  6. package/board/client/board-panel-styles.ts +223 -0
  7. package/board/client/board-panel.tsx +77 -1275
  8. package/board/client/engine-life.ts +48 -0
  9. package/board/client/final-review-stack.tsx +144 -0
  10. package/board/client/heartbeat.tsx +61 -0
  11. package/board/client/helper-lines.tsx +69 -0
  12. package/board/client/live-feed.tsx +86 -0
  13. package/board/client/live-line.ts +73 -0
  14. package/board/client/model-line.tsx +178 -0
  15. package/board/client/needs-you-section.tsx +133 -0
  16. package/board/client/one-line.tsx +193 -0
  17. package/board/client/repo-wait-banner.tsx +69 -0
  18. package/board/client/run-footer.tsx +68 -0
  19. package/board/client/run-header.tsx +189 -0
  20. package/board/client/run-picker.tsx +98 -0
  21. package/board/client/status-bar.tsx +131 -0
  22. package/board/client/step-dots.tsx +127 -0
  23. package/board/client/stuck-actions.tsx +269 -0
  24. package/board/client/ticket-card-view.tsx +238 -0
  25. package/board/client/ticket-detail.tsx +87 -0
  26. package/board/client/ticket-stack.tsx +119 -0
  27. package/board/client/ticket-wait.ts +188 -0
  28. package/board/client/timeline-rows.tsx +41 -14
  29. package/board/client/usage-line.tsx +51 -0
  30. package/board/client/wait-line.tsx +39 -0
  31. package/board/index.client.tsx +1 -1
  32. package/board/index.server.ts +7 -1
  33. package/board/package.json +1 -1
  34. package/board/server/board-panel-state-helpers.ts +67 -0
  35. package/board/server/board-server-check.ts +294 -0
  36. package/board/server/board-server-engine.ts +129 -0
  37. package/board/server/board-server-events.ts +134 -0
  38. package/board/server/board-server-read.ts +190 -0
  39. package/board/server/board-server-resume.ts +164 -0
  40. package/board/server/board-server-start.ts +174 -0
  41. package/board/server/board-server-store.ts +281 -0
  42. package/board/server/board-server-types.ts +114 -0
  43. package/board/server/board-server-util.ts +4 -0
  44. package/board/server/board-server.ts +52 -943
  45. package/board/server/board-vocabulary-engine.ts +144 -0
  46. package/board/server/board-vocabulary-review.ts +115 -0
  47. package/board/server/board-vocabulary-run.ts +145 -0
  48. package/board/server/board-vocabulary-shapes.ts +153 -0
  49. package/board/server/board-vocabulary.ts +20 -375
  50. package/board/server/current-step-panel-helpers.ts +108 -0
  51. package/board/server/describe-record.ts +403 -0
  52. package/board/server/engine-launch.ts +20 -3
  53. package/board/server/engine-restart-helpers.ts +105 -0
  54. package/board/server/engine-watch.ts +45 -5
  55. package/board/server/journal-rebuild-helpers.ts +169 -0
  56. package/board/server/live-file.ts +130 -0
  57. package/board/server/luca-version.ts +1 -1
  58. package/board/server/make-rows.ts +14 -629
  59. package/board/server/record-texts.ts +350 -0
  60. package/board/server/reduce-board-agent-start.ts +224 -0
  61. package/board/server/reduce-board-agents.ts +160 -0
  62. package/board/server/reduce-board-counters.ts +138 -0
  63. package/board/server/reduce-board-create.ts +148 -0
  64. package/board/server/reduce-board-final-review.ts +174 -0
  65. package/board/server/reduce-board-needs-you.ts +283 -0
  66. package/board/server/reduce-board-reasons.ts +59 -0
  67. package/board/server/reduce-board-run.ts +255 -0
  68. package/board/server/reduce-board-settle.ts +88 -0
  69. package/board/server/reduce-board-steps.ts +226 -0
  70. package/board/server/reduce-board-text.ts +139 -0
  71. package/board/server/reduce-board-ticket-checks.ts +168 -0
  72. package/board/server/reduce-board-ticket-join.ts +144 -0
  73. package/board/server/reduce-board-ticket-start.ts +132 -0
  74. package/board/server/reduce-board-update.ts +117 -0
  75. package/board/server/reduce-board-usage.ts +247 -0
  76. package/board/server/reduce-board.ts +100 -1917
  77. package/board/server/reply-post.ts +407 -0
  78. package/board/server/run-registry.ts +8 -4
  79. package/board/server/ticket-stages-panel-helpers.ts +296 -0
  80. package/board/shared/board-rows.ts +9 -0
  81. package/board/shared/board-rpc.ts +42 -0
  82. package/board/shared/board-state-counts.ts +77 -0
  83. package/board/shared/board-state-live.ts +99 -0
  84. package/board/shared/board-state-review.ts +59 -0
  85. package/board/shared/board-state-run.ts +236 -0
  86. package/board/shared/board-state-ticket.ts +257 -0
  87. package/board/shared/board-state-usage.ts +107 -0
  88. package/board/shared/board-state.ts +97 -567
  89. package/board/shared/reply-actions.ts +207 -0
  90. package/engine/agents/agent-launcher.ts +27 -4
  91. package/engine/agents/claude-launcher-helpers.ts +233 -0
  92. package/engine/agents/claude-launcher.ts +28 -669
  93. package/engine/agents/claude-messages.ts +212 -0
  94. package/engine/agents/claude-options.ts +43 -8
  95. package/engine/agents/common-instructions.ts +138 -0
  96. package/engine/agents/input-channel.ts +36 -0
  97. package/engine/agents/launch-paths.ts +29 -0
  98. package/engine/agents/launch-session.ts +227 -0
  99. package/engine/agents/learner-instructions.ts +31 -0
  100. package/engine/agents/open-session.ts +210 -0
  101. package/engine/agents/prompt-sections.ts +95 -0
  102. package/engine/agents/rejoin-prompts.ts +135 -0
  103. package/engine/agents/reviewer-instructions.ts +99 -0
  104. package/engine/agents/role-instructions.ts +31 -244
  105. package/engine/agents/role-prompts.ts +39 -109
  106. package/engine/agents/role-results.ts +106 -7
  107. package/engine/agents/scripted-launcher.ts +21 -6
  108. package/engine/agents/session-pool.ts +124 -0
  109. package/engine/agents/turn-progress.ts +283 -0
  110. package/engine/agents/writer-instructions.ts +151 -0
  111. package/engine/cli/computer-adapters-real.ts +15 -3
  112. package/engine/cli/computer-adapters.ts +2 -0
  113. package/engine/cli/computer-checks.ts +87 -4
  114. package/engine/cli/config-reload-text.ts +39 -0
  115. package/engine/cli/decision-model-setup.ts +70 -0
  116. package/engine/cli/doctor-command.ts +1 -0
  117. package/engine/cli/doctor.ts +21 -3
  118. package/engine/cli/going-runs.ts +192 -36
  119. package/engine/cli/init-command.ts +1 -0
  120. package/engine/cli/init.ts +23 -1
  121. package/engine/cli/live-runs.ts +73 -0
  122. package/engine/cli/luca-run.ts +42 -7
  123. package/engine/cli/luca-skills.ts +183 -0
  124. package/engine/cli/luca.ts +8 -1
  125. package/engine/cli/models-command.ts +119 -0
  126. package/engine/cli/read-run.ts +81 -0
  127. package/engine/cli/run-args.ts +33 -6
  128. package/engine/cli/run-demo.ts +143 -0
  129. package/engine/cli/run-end.ts +184 -0
  130. package/engine/cli/run-modes-helpers.ts +81 -0
  131. package/engine/cli/run-modes.ts +62 -439
  132. package/engine/cli/setup.ts +5 -48
  133. package/engine/cli/unfinished-runs.ts +122 -0
  134. package/engine/cli/upgrade-command.ts +212 -30
  135. package/engine/cli/upgrade-finish.ts +149 -0
  136. package/engine/cli/upgrade.ts +112 -71
  137. package/engine/config/config-fields.ts +127 -0
  138. package/engine/config/config-reload.ts +250 -0
  139. package/engine/config/engine-config-schema.ts +235 -0
  140. package/engine/config/engine-config.ts +72 -142
  141. package/engine/config/test-commands.ts +102 -0
  142. package/engine/core/agent-guards-helpers.ts +84 -0
  143. package/engine/core/agent-turn.ts +395 -0
  144. package/engine/core/already-done.ts +44 -1
  145. package/engine/core/build-action.ts +214 -0
  146. package/engine/core/build-context.ts +135 -0
  147. package/engine/core/build-launch.ts +259 -0
  148. package/engine/core/commit-in.ts +282 -0
  149. package/engine/core/decide-build-early.ts +108 -0
  150. package/engine/core/decide-build-ending.ts +145 -0
  151. package/engine/core/decide-build-helpers.ts +87 -0
  152. package/engine/core/decide-build-tickets.ts +207 -0
  153. package/engine/core/decide-build-view.ts +103 -0
  154. package/engine/core/decide-build.ts +101 -1368
  155. package/engine/core/decide-final-fix.ts +203 -0
  156. package/engine/core/decide-final-review.ts +55 -310
  157. package/engine/core/decide-red-green.ts +398 -0
  158. package/engine/core/decide-rejoin.ts +259 -0
  159. package/engine/core/decide-repo-wait.ts +129 -0
  160. package/engine/core/decide-run-budget.ts +86 -12
  161. package/engine/core/decide-stuck-helpers.ts +127 -0
  162. package/engine/core/decide-stuck.ts +60 -8
  163. package/engine/core/decide-ticket-review.ts +95 -0
  164. package/engine/core/decide-ticket.ts +267 -0
  165. package/engine/core/decide-waits.ts +47 -0
  166. package/engine/core/decide.ts +74 -23
  167. package/engine/core/engine-chores.ts +163 -0
  168. package/engine/core/environment-rerun.ts +83 -0
  169. package/engine/core/evidence-text.ts +84 -0
  170. package/engine/core/execute-action.ts +303 -0
  171. package/engine/core/execute-already-done-check.ts +133 -0
  172. package/engine/core/execute-build.ts +68 -944
  173. package/engine/core/execute-changeset.ts +5 -7
  174. package/engine/core/execute-final-review.ts +125 -13
  175. package/engine/core/execute-gates.ts +182 -0
  176. package/engine/core/execute-intake.ts +130 -0
  177. package/engine/core/execute-join.ts +276 -0
  178. package/engine/core/execute-memory.ts +12 -0
  179. package/engine/core/execute-pull-request.ts +84 -0
  180. package/engine/core/execute-red-check.ts +219 -0
  181. package/engine/core/execute-repo-wait.ts +129 -0
  182. package/engine/core/execute-stuck.ts +25 -10
  183. package/engine/core/execute-waits.ts +158 -0
  184. package/engine/core/execute-with-jev.ts +118 -0
  185. package/engine/core/execute.ts +124 -831
  186. package/engine/core/final-failure-cap.ts +38 -0
  187. package/engine/core/final-review-action.ts +125 -0
  188. package/engine/core/final-review-text.ts +63 -17
  189. package/engine/core/final-stuck-text.ts +86 -0
  190. package/engine/core/fix-loop-text.ts +49 -2
  191. package/engine/core/left-out.ts +120 -0
  192. package/engine/core/live-file.ts +372 -0
  193. package/engine/core/loop-caps.ts +25 -2
  194. package/engine/core/not-in-run.ts +7 -3
  195. package/engine/core/pull-request-text.ts +255 -6
  196. package/engine/core/repo-wait-text.ts +81 -0
  197. package/engine/core/review-text.ts +55 -1
  198. package/engine/core/run-crash-recovery-helpers.ts +16 -0
  199. package/engine/core/run-session-close-helpers.ts +96 -0
  200. package/engine/core/run-start.ts +148 -0
  201. package/engine/core/run-stuck-text.ts +86 -0
  202. package/engine/core/schedule-rules.ts +193 -0
  203. package/engine/core/stuck-detail-text.ts +89 -0
  204. package/engine/core/stuck-format.ts +22 -0
  205. package/engine/core/stuck-text.ts +29 -332
  206. package/engine/core/ticket-stuck-text.ts +192 -0
  207. package/engine/core/worktree-changes.ts +106 -0
  208. package/engine/gates/already-done-check.ts +120 -0
  209. package/engine/gates/feature-map.ts +96 -0
  210. package/engine/gates/gate-runner.ts +108 -108
  211. package/engine/gates/gate-schemas.ts +61 -2
  212. package/engine/gates/leftover-scan.ts +154 -31
  213. package/engine/gates/new-tests.ts +45 -0
  214. package/engine/gates/own-files-check.ts +98 -0
  215. package/engine/gates/prepare-check.ts +60 -0
  216. package/engine/gates/prepare-slots.ts +99 -0
  217. package/engine/gates/red-check.ts +184 -16
  218. package/engine/gates/shell-check.ts +64 -0
  219. package/engine/gates/slot-waits.ts +55 -0
  220. package/engine/gates/slow-test-runner.ts +59 -0
  221. package/engine/gates/test-checks.ts +161 -0
  222. package/engine/gates/test-runner.ts +164 -5
  223. package/engine/gates/test-slots.ts +48 -0
  224. package/engine/git/git-adapter.ts +55 -396
  225. package/engine/git/git-commits.ts +132 -0
  226. package/engine/git/git-join.ts +139 -0
  227. package/engine/git/git-read.ts +123 -0
  228. package/engine/git/git-run.ts +32 -0
  229. package/engine/git/git-worktrees.ts +143 -0
  230. package/engine/git/outside-links.ts +55 -0
  231. package/engine/guards/after-turn-check.ts +31 -5
  232. package/engine/guards/guard-hook.ts +60 -12
  233. package/engine/guards/guard-roles.ts +68 -0
  234. package/engine/guards/helper-rules.ts +92 -0
  235. package/engine/guards/permission-rules.ts +161 -0
  236. package/engine/guards/role-rules-helpers.ts +48 -0
  237. package/engine/guards/role-rules.ts +34 -606
  238. package/engine/guards/shell-rules.ts +344 -0
  239. package/engine/guards/worktree-git.ts +208 -0
  240. package/engine/guards/worktree-snapshot.ts +412 -0
  241. package/engine/guards/worktree-state.ts +28 -825
  242. package/engine/guards/worktree-undo.ts +260 -0
  243. package/engine/guards/write-rules.ts +149 -0
  244. package/engine/index.ts +30 -9
  245. package/engine/intake/criteria-checks.ts +114 -0
  246. package/engine/intake/intake-checks.ts +164 -30
  247. package/engine/intake/intake-schemas.ts +37 -2
  248. package/engine/jev/clef-client.ts +259 -0
  249. package/engine/jev/decision-model-credentials.ts +212 -0
  250. package/engine/jev/jev-jobs.ts +144 -60
  251. package/engine/jev/jev-schemas.ts +86 -5
  252. package/engine/jev/jev-shadow-helpers.ts +218 -0
  253. package/engine/jev/jev-shadow.ts +109 -64
  254. package/engine/jev/model-pick.ts +275 -0
  255. package/engine/journal/agent-entries.ts +167 -0
  256. package/engine/journal/agent-message-entries.ts +72 -0
  257. package/engine/journal/agent-turn-replay.ts +203 -0
  258. package/engine/journal/already-done-entries.ts +55 -0
  259. package/engine/journal/commit-entries.ts +56 -0
  260. package/engine/journal/cross-ticket-replay.ts +222 -0
  261. package/engine/journal/decision-model-entries.ts +86 -0
  262. package/engine/journal/entry-fields.ts +10 -0
  263. package/engine/journal/final-review-entries.ts +128 -0
  264. package/engine/journal/final-review-replay.ts +324 -0
  265. package/engine/journal/final-review-round.ts +320 -0
  266. package/engine/journal/final-review-state.ts +180 -0
  267. package/engine/journal/gate-entries.ts +81 -0
  268. package/engine/journal/intake-entries.ts +87 -0
  269. package/engine/journal/join-entries.ts +126 -0
  270. package/engine/journal/journal-entry-schema.ts +218 -0
  271. package/engine/journal/journal-kinds.ts +97 -0
  272. package/engine/journal/journal-record-schema.ts +218 -0
  273. package/engine/journal/journal-record.ts +43 -1400
  274. package/engine/journal/journal.ts +6 -1
  275. package/engine/journal/limit-entries.ts +90 -0
  276. package/engine/journal/memory-entries.ts +124 -0
  277. package/engine/journal/memory-replay.ts +157 -0
  278. package/engine/journal/plan-replay.ts +139 -0
  279. package/engine/journal/pull-request-entries.ts +41 -0
  280. package/engine/journal/replay.ts +157 -2144
  281. package/engine/journal/reply-replay.ts +144 -0
  282. package/engine/journal/repo-wait-entries.ts +53 -0
  283. package/engine/journal/run-entries.ts +172 -0
  284. package/engine/journal/run-state.ts +264 -0
  285. package/engine/journal/shared-failure-replay.ts +133 -0
  286. package/engine/journal/stuck-entries.ts +193 -0
  287. package/engine/journal/ticket-progress.ts +392 -0
  288. package/engine/journal/ticket-replay.ts +411 -0
  289. package/engine/journal/ticket-result-replay.ts +364 -0
  290. package/engine/journal/ticket-retry-replay.ts +142 -0
  291. package/engine/journal/worktree-entries.ts +122 -0
  292. package/engine/models/model-score.ts +512 -0
  293. package/engine/shell/run-command.ts +187 -18
  294. package/engine/testing/agent-turn-fixtures.ts +287 -0
  295. package/engine/testing/already-done-fixtures.ts +97 -0
  296. package/engine/testing/build-fixtures.ts +68 -973
  297. package/engine/testing/checkouts-fixtures.ts +48 -0
  298. package/engine/testing/final-review-fixtures.ts +62 -1
  299. package/engine/testing/final-review-steps.ts +143 -0
  300. package/engine/testing/limit-fixtures.ts +85 -0
  301. package/engine/testing/live-file-fixtures.ts +57 -0
  302. package/engine/testing/practice-repo.ts +10 -4
  303. package/engine/testing/practice-run.ts +1 -1
  304. package/engine/testing/reply-fixtures.ts +88 -0
  305. package/engine/testing/run-budget-fixtures.ts +165 -0
  306. package/engine/testing/run-fixtures.ts +219 -0
  307. package/engine/testing/sdk-play.ts +177 -0
  308. package/engine/testing/setup-repo.ts +194 -0
  309. package/engine/testing/step-record-fixtures.ts +55 -0
  310. package/engine/testing/ticket-step-fixtures.ts +272 -0
  311. package/engine/testing/wait-scenarios.ts +186 -0
  312. package/engine/tracker/gh-retry.ts +217 -0
  313. package/engine/tracker/github-tracker.ts +310 -90
  314. package/engine/tracker/in-memory-tracker.ts +8 -4
  315. package/engine/tracker/tracker.ts +131 -6
  316. package/package.json +2 -1
  317. package/skills/luca-retro/SKILL.md +74 -0
  318. package/skills/luca-retro/scripts/retro-summary.ts +1356 -0
  319. package/skills/luca-unstick/SKILL.md +153 -0
  320. package/skills/luca-unstick/scripts/stuck-summary.ts +1063 -0
  321. package/engine/jev/jev-client.ts +0 -173
@@ -0,0 +1,392 @@
1
+ /**
2
+ * The shape of one ticket's progress as replay rebuilds it, with its parts
3
+ * (worktree, gates, review fix round, rejoin, test update), and the progress
4
+ * of a ticket nothing has happened to yet.
5
+ */
6
+ import type {
7
+ AgentFailure,
8
+ CommitStage,
9
+ JournalRecord,
10
+ StuckReason,
11
+ } from './journal-record'
12
+
13
+ import type { RejoinContext } from '../agents/role-prompts'
14
+ import type {
15
+ AgentRole,
16
+ BadTest,
17
+ BadTestSource,
18
+ Finding,
19
+ FindingResponse,
20
+ ImplementerResult,
21
+ TestRef,
22
+ TestWriterResult,
23
+ TicketReviewResult,
24
+ } from '../agents/role-results'
25
+ import type {
26
+ GateCheck,
27
+ LeftoverHit,
28
+ RedCheckResult,
29
+ TestCase,
30
+ TestRun,
31
+ } from '../gates/gate-schemas'
32
+
33
+ /** A worktree the engine made, as journaled. */
34
+ export type ReplayedWorktree = {
35
+ branch: string
36
+ path: string
37
+ base_sha: string
38
+ }
39
+
40
+ /**
41
+ * A ticket sent back to be fixed on top of the run branch (`ticket_rebased`):
42
+ * why, where it starts now, the files that clashed, and the findings known
43
+ * from its reviews. `tests_pending` and `code_pending` stay true until a
44
+ * fresh test-writer (the clashed tests) or the implementer (the clashed
45
+ * code) has answered.
46
+ */
47
+ export type ReplayedRejoin = RejoinContext & {
48
+ tests_pending: boolean
49
+ code_pending: boolean
50
+ /** Where the ticket started from before this rebase. */
51
+ from_sha: string
52
+ }
53
+
54
+ /**
55
+ * The open test update after a rebase (`tests_sent_back`, #489): the bad
56
+ * test, what joined the run branch, and the test-writer's answer once it
57
+ * gave one. It closes when the implementer answers after it.
58
+ */
59
+ export type TestUpdate = TestsSentBackContent & {
60
+ /** The test-writer's answer, `null` until it gave one. */
61
+ result: TestWriterResult | null
62
+ }
63
+
64
+ type TestsSentBackContent = Extract<
65
+ JournalRecord,
66
+ { kind: 'tests_sent_back' }
67
+ >['content']
68
+
69
+ /**
70
+ * One gate run, as journaled. A ticket's gates also carry the test cases of
71
+ * its red test files, with their `expect()` counts (#581); none in an older
72
+ * journal, or in a join's or the final review's gates.
73
+ */
74
+ export type ReplayedGates = {
75
+ ok: boolean
76
+ checks: GateCheck[]
77
+ cases?: TestCase[]
78
+ } & SharedFailureFields
79
+
80
+ /**
81
+ * What a ticket's red check or gates carry for shared failures (#544):
82
+ * whether the run was a lone rerun, and whether each old test it failed
83
+ * also failed in another ticket shortly before, so a lone rerun is due.
84
+ */
85
+ export type SharedFailureFields = {
86
+ /** It was a lone rerun, alone on every test slot. */
87
+ exclusive?: boolean
88
+ /** It failed only on old tests another ticket failed within 10 minutes. */
89
+ shared?: boolean
90
+ }
91
+
92
+ /** The red check's verdict, plus the test run's (clipped) output. */
93
+ export type ReplayedRedCheck = RedCheckResult & {
94
+ output: string
95
+ } & SharedFailureFields
96
+
97
+ /** A check that can get a lone rerun (#544). */
98
+ export type LoneRerunCheck = 'red_check' | 'gates'
99
+
100
+ /** The roles that write: they fix review findings. */
101
+ export type WriterRole = 'test-writer' | 'implementer'
102
+
103
+ /**
104
+ * A writer's `environment` answer to a failed check (#613): who gave it,
105
+ * its evidence, and the failed check it blamed on the environment. The
106
+ * check runs again; a rerun that fails the same way makes it stuck. It
107
+ * stays until the next agent answers.
108
+ */
109
+ export type EnvironmentRerun = {
110
+ role: 'test-writer' | 'implementer'
111
+ evidence: string
112
+ } & (
113
+ | { check: 'red_check'; failed: ReplayedRedCheck }
114
+ | { check: 'gates'; failed: ReplayedGates }
115
+ )
116
+
117
+ /**
118
+ * The open review fix round: the blockers and should-fixes the latest ticket
119
+ * review sent back, and which fixers have answered. Test findings go to a
120
+ * fresh test-writer first, then code findings to the implementer, then any
121
+ * finding a fixer answered `other_role` to the other writer role.
122
+ */
123
+ export type ReviewFix = {
124
+ /** 1 after the first review, 2 after the first re-review, ... */
125
+ round: number
126
+ findings: Finding[]
127
+ /** True once the test-writer answered, or when no finding is a test finding. */
128
+ tests_answered: boolean
129
+ /** True once the implementer answered, or when no finding is a code finding. */
130
+ code_answered: boolean
131
+ /**
132
+ * The fixers' answers, oldest first. A handed-off finding's answer from
133
+ * the other role replaces the first one.
134
+ */
135
+ responses: FindingResponse[]
136
+ /**
137
+ * The findings a fixer answered `other_role` (#616), by the writer role
138
+ * they were handed to. After the round's fixers answered, each role here
139
+ * runs once more, fresh, with only these findings; its answer clears it.
140
+ */
141
+ handed_off: Partial<Record<WriterRole, string[]>>
142
+ /** A test the implementer sent back as bad while fixing, if any. */
143
+ bad_test: BadTest | null
144
+ }
145
+
146
+ /**
147
+ * A finding a fixer answered "won't fix" and the next reviewer let go: its
148
+ * ruling was `accepted`, or it gave none and did not list the finding again.
149
+ */
150
+ export type DeclinedFinding = {
151
+ finding: Finding
152
+ /** The fixer's reason. */
153
+ reason: string
154
+ /** The reviewer's reason for accepting it, if it gave one. */
155
+ ruling: string
156
+ }
157
+
158
+ /**
159
+ * How far one ticket got, from its journal records. Each field holds the
160
+ * latest record of its kind; `null` means the step has not finished.
161
+ *
162
+ * The fix-loop counts are derived from record order, never written by hand,
163
+ * so a crashed run counts them the same way again: a test-writer result that
164
+ * comes after a red check answers a fix round (and the red check runs again),
165
+ * and an implementer result after the gates does the same for the gates.
166
+ */
167
+ export type TicketProgress = {
168
+ worktree: ReplayedWorktree | null
169
+ /** The install in the new worktree; its `check` is `null` with no manifest. */
170
+ install: ReplayedInstall | null
171
+ /** The prepare command run before its baseline tests (`baseline_prepared`). */
172
+ prepare: GateCheck | null
173
+ /** Its own baseline test run, or the one it reused (`baseline_reused`). */
174
+ baseline: TestRun | null
175
+ /**
176
+ * The run-branch commit the baseline was taken at. It stays when a rebase
177
+ * moves the worktree, so the baseline is only lent to tickets from there.
178
+ */
179
+ baseline_sha: string | null
180
+ test_writer: TestWriterResult | null
181
+ red_check: ReplayedRedCheck | null
182
+ /**
183
+ * The new tests the latest passing red check proved fail first (#513),
184
+ * from the test-writer's criteria, one per file and name. A failed red
185
+ * check leaves them; a worktree reset clears them.
186
+ */
187
+ red_tests: TestRef[]
188
+ /**
189
+ * The engine's check of the test-writer's latest `already_done`
190
+ * evidence (#495), `null` until it runs. A new test-writer result
191
+ * clears it.
192
+ */
193
+ already_done_check: { ok: boolean; problems: string[] } | null
194
+ /** Follow-ups the test-writer answered after a failed red check. */
195
+ red_fix_rounds: number
196
+ implementer: ImplementerResult | null
197
+ /** Follow-ups the implementer answered after failed gates. */
198
+ gate_fix_rounds: number
199
+ /**
200
+ * `environment` answers to a failed red check or failed gates (#613),
201
+ * each a rerun that used no fix round.
202
+ */
203
+ environment_reruns: number
204
+ /** The latest `environment` answer, until the next agent answers. */
205
+ environment: EnvironmentRerun | null
206
+ /**
207
+ * How many times a test was sent back as bad, by the implementer or by
208
+ * the engine, which found a mapped test that passes with no `expect()`
209
+ * (#581). Both count toward `MAX_BAD_TEST_BOUNCES`.
210
+ */
211
+ bad_test_bounces: number
212
+ /** The latest test sent back as bad, for the fresh test-writer's prompt. */
213
+ bad_test: BadTest | null
214
+ /**
215
+ * Who sent each bounce counted in `bad_test_bounces`, oldest first (the
216
+ * last is who sent `bad_test`). The prompt and the stuck details word each
217
+ * bounce from its source (#581).
218
+ */
219
+ bad_test_sources: BadTestSource[]
220
+ /**
221
+ * Who sent `bad_test`, kept beside it. A retry clears `bad_test_sources`
222
+ * but keeps this, so a fresh test-writer's prompt still words the bounce
223
+ * from its source (#581).
224
+ */
225
+ bad_test_source: BadTestSource | null
226
+ /** The session each role's latest turn ran in, for follow-ups. */
227
+ sessions: Partial<Record<AgentRole, string>>
228
+ /** Every assumption any agent on the ticket made, oldest first. */
229
+ assumptions: string[]
230
+ /**
231
+ * How many turns each role on the ticket ran out of turns (#543), in the
232
+ * order each first did, for the PR.
233
+ */
234
+ out_of_turns: Partial<Record<AgentRole, number>>
235
+ /** The latest ticket review's result. */
236
+ review: TicketReviewResult | null
237
+ /** Ticket reviews finished on this ticket. */
238
+ review_rounds: number
239
+ /** The commit the latest review looked at. */
240
+ reviewed_sha: string | null
241
+ /** The open review fix round; `null` before a review or once approved. */
242
+ review_fix: ReviewFix | null
243
+ /** Every nit reviewers reported, oldest first, one per id. */
244
+ nits: Finding[]
245
+ /** Findings declined through "won't fix", oldest first. */
246
+ declined: DeclinedFinding[]
247
+ /**
248
+ * The seq of the review that finally approved the ticket (no blocker or
249
+ * should-fix left), `null` until one does. Approved tickets join the run
250
+ * branch in this order, one at a time.
251
+ */
252
+ approved_seq: number | null
253
+ /** How many times the ticket was sent back onto the run branch. */
254
+ rejoins: number
255
+ /** The latest time it was sent back, `null` if it never was. */
256
+ rejoin: ReplayedRejoin | null
257
+ /**
258
+ * How many times its tests went back to the test-writer after a rebase
259
+ * made them wrong (`tests_sent_back`, #489).
260
+ */
261
+ test_updates: number
262
+ /** The open test update, `null` when none is open. */
263
+ test_update: TestUpdate | null
264
+ /**
265
+ * The latest failed agent turn, if no agent finished after it: its role,
266
+ * error, how it failed, and the session it ran in (for a follow-up).
267
+ */
268
+ agent_failure: {
269
+ role: AgentRole
270
+ error: string
271
+ failure: AgentFailure
272
+ session_id: string | null
273
+ } | null
274
+ /**
275
+ * Failed tries (agent, result, and guard failures) each role has used on
276
+ * this ticket, in all. Engine failures never count here.
277
+ */
278
+ failed_tries: Partial<Record<AgentRole, number>>
279
+ /**
280
+ * The model each role's latest agent on this ticket launched on
281
+ * (#604); `null` in older journals.
282
+ */
283
+ launched_on: Partial<Record<AgentRole, string | null>>
284
+ /**
285
+ * The roles that used up a try (as `failed_tries` counts one) on a
286
+ * model cheaper than Opus (#604): their later fresh agents on this
287
+ * ticket run Opus. A retry keeps it.
288
+ */
289
+ failed_cheaper: AgentRole[]
290
+ /** Engine failures in a row; any other turn's end resets it. */
291
+ engine_failures: number
292
+ leftovers: Record<CommitStage, LeftoverHit[] | null>
293
+ commits: Record<CommitStage, string | null>
294
+ /** The files each stage's latest commit changed. */
295
+ commit_files: Record<CommitStage, string[]>
296
+ gates: ReplayedGates | null
297
+ /** The checks that had their one lone rerun on this ticket (#544). */
298
+ lone_reruns: LoneRerunCheck[]
299
+ joined: { ok: true; shas: string[] } | { ok: false; error: string } | null
300
+ join_gates: ReplayedGates | null
301
+ pushed: string | null
302
+ stuck: ReplayedStuck | null
303
+ /** The spec issue's comment that told the owner, once posted. */
304
+ stuck_report: { comment_id: number } | null
305
+ /** The owner's reply to this stuck ticket, until the engine acts on it. */
306
+ reply: { word: 'retry' | 'skip'; comment_id: number } | null
307
+ /** Left out of the run: skipped by reply, or waits on a skipped ticket. */
308
+ skipped: { because: number | null } | null
309
+ /**
310
+ * Its work was already on the base branch, done by these commits (#484):
311
+ * the ticket is done without a join, like a pushed one.
312
+ */
313
+ already_done: { shas: string[] } | null
314
+ /** The engine closed it (an already-done ticket in a run with no PR). */
315
+ closed: boolean
316
+ /**
317
+ * Why the ticket got stuck before its latest `retry` resumed it; the next
318
+ * fresh agent is told. Cleared once an agent starts.
319
+ */
320
+ retried: ReplayedStuck | null
321
+ /** A test setup file change an agent asked for; the ticket is stuck on it. */
322
+ setup_change: { role: AgentRole; file: string; reason: string } | null
323
+ /**
324
+ * The role whose turn a crash cut off (`run_resumed`), so the fresh
325
+ * agent that takes it again is told. Cleared once an agent starts.
326
+ */
327
+ crashed_turn: AgentRole | null
328
+ }
329
+
330
+ /** Why a ticket is stuck, as journaled. */
331
+ export type ReplayedStuck = { reason: StuckReason; detail: string }
332
+
333
+ /** The engine's install in a new worktree: `null` check means nothing to install. */
334
+ export type ReplayedInstall = { check: GateCheck | null }
335
+
336
+ /** A ticket nothing has happened to yet. */
337
+ export const EMPTY_TICKET_PROGRESS: TicketProgress = {
338
+ worktree: null,
339
+ install: null,
340
+ prepare: null,
341
+ baseline: null,
342
+ baseline_sha: null,
343
+ test_writer: null,
344
+ red_check: null,
345
+ red_tests: [],
346
+ already_done_check: null,
347
+ red_fix_rounds: 0,
348
+ implementer: null,
349
+ gate_fix_rounds: 0,
350
+ environment_reruns: 0,
351
+ environment: null,
352
+ bad_test_bounces: 0,
353
+ bad_test: null,
354
+ bad_test_sources: [],
355
+ bad_test_source: null,
356
+ sessions: {},
357
+ assumptions: [],
358
+ out_of_turns: {},
359
+ review: null,
360
+ review_rounds: 0,
361
+ reviewed_sha: null,
362
+ review_fix: null,
363
+ nits: [],
364
+ declined: [],
365
+ approved_seq: null,
366
+ rejoins: 0,
367
+ rejoin: null,
368
+ test_updates: 0,
369
+ test_update: null,
370
+ agent_failure: null,
371
+ failed_tries: {},
372
+ launched_on: {},
373
+ failed_cheaper: [],
374
+ engine_failures: 0,
375
+ leftovers: { red: null, green: null, fix: null },
376
+ commits: { red: null, green: null, fix: null },
377
+ commit_files: { red: [], green: [], fix: [] },
378
+ gates: null,
379
+ lone_reruns: [],
380
+ joined: null,
381
+ join_gates: null,
382
+ pushed: null,
383
+ stuck: null,
384
+ stuck_report: null,
385
+ reply: null,
386
+ skipped: null,
387
+ already_done: null,
388
+ closed: false,
389
+ retried: null,
390
+ setup_change: null,
391
+ crashed_turn: null,
392
+ }