compounding-loop 0.4.0 → 0.6.0

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 (128) hide show
  1. package/README.md +152 -128
  2. package/dist/cli/draft.js +69 -0
  3. package/dist/cli/draft.js.map +1 -0
  4. package/dist/cli/eval.js +186 -0
  5. package/dist/cli/eval.js.map +1 -0
  6. package/dist/cli/hook.js +92 -0
  7. package/dist/cli/hook.js.map +1 -0
  8. package/dist/cli/index.js +336 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli/init.js +41 -4
  11. package/dist/cli/init.js.map +1 -1
  12. package/dist/cli/lanesInit.js +8 -2
  13. package/dist/cli/lanesInit.js.map +1 -1
  14. package/dist/cli/pace.js +41 -0
  15. package/dist/cli/pace.js.map +1 -0
  16. package/dist/cli/pause.js +3 -3
  17. package/dist/cli/pause.js.map +1 -1
  18. package/dist/cli/recipe.js +89 -0
  19. package/dist/cli/recipe.js.map +1 -0
  20. package/dist/cli/recipeDraft.js +64 -0
  21. package/dist/cli/recipeDraft.js.map +1 -0
  22. package/dist/cli/runs.js +49 -11
  23. package/dist/cli/runs.js.map +1 -1
  24. package/dist/cli/schedule.js +177 -0
  25. package/dist/cli/schedule.js.map +1 -0
  26. package/dist/core/brief.js +35 -12
  27. package/dist/core/brief.js.map +1 -1
  28. package/dist/core/draftBrief.js +68 -0
  29. package/dist/core/draftBrief.js.map +1 -0
  30. package/dist/core/eval.js +123 -0
  31. package/dist/core/eval.js.map +1 -0
  32. package/dist/core/hooksInit.js +54 -0
  33. package/dist/core/hooksInit.js.map +1 -0
  34. package/dist/core/laneRound.js +28 -7
  35. package/dist/core/laneRound.js.map +1 -1
  36. package/dist/core/lanes.js +3 -0
  37. package/dist/core/lanes.js.map +1 -1
  38. package/dist/core/lanesInit.js +19 -0
  39. package/dist/core/lanesInit.js.map +1 -1
  40. package/dist/core/parse/index.js +8 -0
  41. package/dist/core/parse/index.js.map +1 -1
  42. package/dist/core/parse/outcomes.js +51 -0
  43. package/dist/core/parse/outcomes.js.map +1 -0
  44. package/dist/core/parse/policy.js +56 -0
  45. package/dist/core/parse/policy.js.map +1 -0
  46. package/dist/core/parse/runs.js +1 -0
  47. package/dist/core/parse/runs.js.map +1 -1
  48. package/dist/core/parse/schedule.js +101 -0
  49. package/dist/core/parse/schedule.js.map +1 -0
  50. package/dist/core/parse/steer.js +68 -0
  51. package/dist/core/parse/steer.js.map +1 -0
  52. package/dist/core/recipeDraft.js +37 -0
  53. package/dist/core/recipeDraft.js.map +1 -0
  54. package/dist/core/recipes.js +185 -0
  55. package/dist/core/recipes.js.map +1 -0
  56. package/dist/core/repo.js +16 -1
  57. package/dist/core/repo.js.map +1 -1
  58. package/dist/core/triggers.js +137 -0
  59. package/dist/core/triggers.js.map +1 -0
  60. package/dist/server/actionBody.js +54 -0
  61. package/dist/server/actionBody.js.map +1 -0
  62. package/dist/server/checkLabels.js +7 -2
  63. package/dist/server/checkLabels.js.map +1 -1
  64. package/dist/server/claude.js +18 -0
  65. package/dist/server/claude.js.map +1 -0
  66. package/dist/server/controls.js +28 -1
  67. package/dist/server/controls.js.map +1 -1
  68. package/dist/server/data.js +8 -3
  69. package/dist/server/data.js.map +1 -1
  70. package/dist/server/draftInputs.js +33 -0
  71. package/dist/server/draftInputs.js.map +1 -0
  72. package/dist/server/health.js +3 -3
  73. package/dist/server/health.js.map +1 -1
  74. package/dist/server/index.js +55 -0
  75. package/dist/server/index.js.map +1 -1
  76. package/dist/server/laneChecks.js +1 -1
  77. package/dist/server/laneChecks.js.map +1 -1
  78. package/dist/server/laneSchedule.js +15 -0
  79. package/dist/server/laneSchedule.js.map +1 -0
  80. package/dist/server/live/build.js +25 -10
  81. package/dist/server/live/build.js.map +1 -1
  82. package/dist/server/live/index.js +4 -2
  83. package/dist/server/live/index.js.map +1 -1
  84. package/dist/server/live/urls.js +3 -1
  85. package/dist/server/live/urls.js.map +1 -1
  86. package/dist/server/loops.js +145 -20
  87. package/dist/server/loops.js.map +1 -1
  88. package/dist/server/memory.js +115 -0
  89. package/dist/server/memory.js.map +1 -0
  90. package/dist/server/memory.json +398 -0
  91. package/dist/server/paceNote.js +13 -0
  92. package/dist/server/paceNote.js.map +1 -0
  93. package/dist/server/roundState.js +26 -2
  94. package/dist/server/roundState.js.map +1 -1
  95. package/dist/server/runs.js +72 -9
  96. package/dist/server/runs.js.map +1 -1
  97. package/dist/server/shipped.js +35 -0
  98. package/dist/server/shipped.js.map +1 -0
  99. package/dist/server/static-export.js +8 -2
  100. package/dist/server/static-export.js.map +1 -1
  101. package/dist/server/this-repo.json +2367 -858
  102. package/dist/web/assets/index-C5q9d5-n.css +2 -0
  103. package/dist/web/assets/index-DDEAcJFt.js +123 -0
  104. package/dist/web/index.html +2 -2
  105. package/method/COMPOUNDING_LOOP.md +33 -6
  106. package/method/operating-card.md +1 -1
  107. package/method/retro.md +4 -3
  108. package/package.json +4 -4
  109. package/plugin/.claude-plugin/plugin.json +1 -1
  110. package/plugin/commands/loop-init.md +1 -0
  111. package/plugin/commands/retro.md +3 -2
  112. package/plugin/hooks/hooks.json +62 -0
  113. package/runners/github-actions/lanes.yml +2 -2
  114. package/runners/routine/README.md +4 -0
  115. package/runners/routine/control-room-prompt.md +4 -14
  116. package/runners/routine/lane-prompt.md +4 -10
  117. package/templates/lanes/README.md +5 -1
  118. package/templates/lanes/claude-section.md +1 -0
  119. package/templates/lanes/control-run.md +37 -0
  120. package/templates/lanes/lane-run.md +33 -0
  121. package/templates/lanes/schedule.json +4 -0
  122. package/templates/lanes/steer.md +3 -0
  123. package/templates/recipe.md +39 -0
  124. package/templates/recipes/cli-command-json.md +47 -0
  125. package/templates/recipes/static-calculator-site.md +50 -0
  126. package/templates/static-site/CLAUDE.md +1 -1
  127. package/dist/web/assets/index-BOPytDNU.js +0 -53
  128. package/dist/web/assets/index-BSHEI7fa.css +0 -2
@@ -0,0 +1,398 @@
1
+ {
2
+ "knowledge": {
3
+ "proj1": {
4
+ "entries": [],
5
+ "triggers": [],
6
+ "recipes": [
7
+ {
8
+ "id": "R-static-calculator-site",
9
+ "title": "Static calculator site (Vite or plain HTML)",
10
+ "kind": "project",
11
+ "stack": [
12
+ "node@20",
13
+ "playwright@1",
14
+ "vite@5"
15
+ ],
16
+ "tags": [
17
+ "calculator",
18
+ "static",
19
+ "seo"
20
+ ],
21
+ "status": "CONFIRMED",
22
+ "uses": 5,
23
+ "passes": 5,
24
+ "steps": 7,
25
+ "checks": 4,
26
+ "bytes": 3120,
27
+ "store": "user",
28
+ "path": "~/.ai/recipes/static-calculator-site.md",
29
+ "match": {
30
+ "score": 2,
31
+ "reason": "stack 2/3, tags: calculator, static"
32
+ }
33
+ }
34
+ ]
35
+ },
36
+ "proj2": {
37
+ "entries": [],
38
+ "triggers": [],
39
+ "recipes": [
40
+ {
41
+ "id": "R-static-calculator-site",
42
+ "title": "Static calculator site (Vite or plain HTML)",
43
+ "kind": "project",
44
+ "stack": [
45
+ "node@20",
46
+ "playwright@1",
47
+ "vite@5"
48
+ ],
49
+ "tags": [
50
+ "calculator",
51
+ "static",
52
+ "seo"
53
+ ],
54
+ "status": "CONFIRMED",
55
+ "uses": 5,
56
+ "passes": 5,
57
+ "steps": 7,
58
+ "checks": 4,
59
+ "bytes": 3120,
60
+ "store": "user",
61
+ "path": "~/.ai/recipes/static-calculator-site.md",
62
+ "match": {
63
+ "score": 2,
64
+ "reason": "stack 2/3, tags: calculator, static"
65
+ }
66
+ }
67
+ ]
68
+ },
69
+ "proj3": {
70
+ "entries": [],
71
+ "triggers": [],
72
+ "recipes": [
73
+ {
74
+ "id": "R-static-calculator-site",
75
+ "title": "Static calculator site (Vite or plain HTML)",
76
+ "kind": "project",
77
+ "stack": [
78
+ "node@20",
79
+ "playwright@1",
80
+ "vite@5"
81
+ ],
82
+ "tags": [
83
+ "calculator",
84
+ "static",
85
+ "seo"
86
+ ],
87
+ "status": "CONFIRMED",
88
+ "uses": 5,
89
+ "passes": 5,
90
+ "steps": 7,
91
+ "checks": 4,
92
+ "bytes": 3120,
93
+ "store": "user",
94
+ "path": "~/.ai/recipes/static-calculator-site.md",
95
+ "match": {
96
+ "score": 2,
97
+ "reason": "stack 2/3, tags: calculator, static"
98
+ }
99
+ }
100
+ ]
101
+ },
102
+ "proj4": {
103
+ "entries": [],
104
+ "triggers": [],
105
+ "recipes": [
106
+ {
107
+ "id": "R-static-calculator-site",
108
+ "title": "Static calculator site (Vite or plain HTML)",
109
+ "kind": "project",
110
+ "stack": [
111
+ "node@20",
112
+ "playwright@1",
113
+ "vite@5"
114
+ ],
115
+ "tags": [
116
+ "calculator",
117
+ "static",
118
+ "seo"
119
+ ],
120
+ "status": "CONFIRMED",
121
+ "uses": 5,
122
+ "passes": 5,
123
+ "steps": 7,
124
+ "checks": 4,
125
+ "bytes": 3120,
126
+ "store": "user",
127
+ "path": "~/.ai/recipes/static-calculator-site.md",
128
+ "match": {
129
+ "score": 2,
130
+ "reason": "stack 2/3, tags: calculator, static"
131
+ }
132
+ }
133
+ ]
134
+ },
135
+ "proj5": {
136
+ "entries": [],
137
+ "triggers": [],
138
+ "recipes": [
139
+ {
140
+ "id": "R-static-calculator-site",
141
+ "title": "Static calculator site (Vite or plain HTML)",
142
+ "kind": "project",
143
+ "stack": [
144
+ "node@20",
145
+ "playwright@1",
146
+ "vite@5"
147
+ ],
148
+ "tags": [
149
+ "calculator",
150
+ "static",
151
+ "seo"
152
+ ],
153
+ "status": "CONFIRMED",
154
+ "uses": 5,
155
+ "passes": 5,
156
+ "steps": 7,
157
+ "checks": 4,
158
+ "bytes": 3120,
159
+ "store": "user",
160
+ "path": "~/.ai/recipes/static-calculator-site.md",
161
+ "match": {
162
+ "score": 2,
163
+ "reason": "stack 2/3, tags: calculator, static"
164
+ }
165
+ }
166
+ ]
167
+ },
168
+ "compounding-loop": {
169
+ "entries": [
170
+ {
171
+ "id": "K-0001",
172
+ "title": "Hono app.request() has no Host header (403 from the loopback guard)",
173
+ "status": "confirmed",
174
+ "fired": 4,
175
+ "triggerIds": [
176
+ "K-0001"
177
+ ]
178
+ },
179
+ {
180
+ "id": "K-0002",
181
+ "title": "Windows: Vitest runner not found, EBUSY at cleanup, git-heavy test timeouts",
182
+ "status": "confirmed",
183
+ "fired": 9,
184
+ "triggerIds": [
185
+ "K-0002",
186
+ "K-0002-ebusy"
187
+ ]
188
+ },
189
+ {
190
+ "id": "K-0003",
191
+ "title": "Playwright \"Response has been disposed\" is a flaky route, not a product bug",
192
+ "status": "guess",
193
+ "fired": 0,
194
+ "triggerIds": []
195
+ }
196
+ ],
197
+ "triggers": [
198
+ {
199
+ "id": "K-0001",
200
+ "kinds": [
201
+ "error"
202
+ ],
203
+ "fired": 4,
204
+ "entry": "K-0001"
205
+ },
206
+ {
207
+ "id": "K-0002",
208
+ "kinds": [
209
+ "error"
210
+ ],
211
+ "fired": 6,
212
+ "entry": "K-0002"
213
+ },
214
+ {
215
+ "id": "K-0002-ebusy",
216
+ "kinds": [
217
+ "file"
218
+ ],
219
+ "fired": 3,
220
+ "entry": "K-0002"
221
+ }
222
+ ],
223
+ "recipes": [
224
+ {
225
+ "id": "R-cli-command-json",
226
+ "title": "Add a CLI subcommand with --json",
227
+ "kind": "feature",
228
+ "stack": [
229
+ "node@20",
230
+ "vitest@2",
231
+ "typescript@5"
232
+ ],
233
+ "tags": [
234
+ "cli",
235
+ "json",
236
+ "tests"
237
+ ],
238
+ "status": "CONFIRMED",
239
+ "uses": 3,
240
+ "passes": 2,
241
+ "steps": 6,
242
+ "checks": 3,
243
+ "bytes": 2480,
244
+ "store": "project",
245
+ "path": ".ai/recipes/cli-command-json.md",
246
+ "match": {
247
+ "score": 3,
248
+ "reason": "stack 3/3"
249
+ }
250
+ },
251
+ {
252
+ "id": "R-static-calculator-site",
253
+ "title": "Static calculator site (Vite or plain HTML)",
254
+ "kind": "project",
255
+ "stack": [
256
+ "node@20",
257
+ "playwright@1",
258
+ "vite@5"
259
+ ],
260
+ "tags": [
261
+ "calculator",
262
+ "static",
263
+ "seo"
264
+ ],
265
+ "status": "CONFIRMED",
266
+ "uses": 5,
267
+ "passes": 5,
268
+ "steps": 7,
269
+ "checks": 4,
270
+ "bytes": 3120,
271
+ "store": "user",
272
+ "path": "~/.ai/recipes/static-calculator-site.md",
273
+ "match": {
274
+ "score": 1,
275
+ "reason": "stack 1/3, major differs: vite"
276
+ }
277
+ }
278
+ ]
279
+ }
280
+ },
281
+ "recipes": {
282
+ "recipes": [
283
+ {
284
+ "id": "R-static-calculator-site",
285
+ "title": "Static calculator site (Vite or plain HTML)",
286
+ "kind": "project",
287
+ "stack": [
288
+ "node@20",
289
+ "playwright@1",
290
+ "vite@5"
291
+ ],
292
+ "tags": [
293
+ "calculator",
294
+ "static",
295
+ "seo"
296
+ ],
297
+ "status": "CONFIRMED",
298
+ "uses": 5,
299
+ "passes": 5,
300
+ "steps": 7,
301
+ "checks": 4,
302
+ "bytes": 3120,
303
+ "store": "user",
304
+ "path": "~/.ai/recipes/static-calculator-site.md"
305
+ },
306
+ {
307
+ "id": "R-cli-command-json",
308
+ "title": "Add a CLI subcommand with --json",
309
+ "kind": "feature",
310
+ "stack": [
311
+ "node@20",
312
+ "vitest@2",
313
+ "typescript@5"
314
+ ],
315
+ "tags": [
316
+ "cli",
317
+ "json",
318
+ "tests"
319
+ ],
320
+ "status": "CONFIRMED",
321
+ "uses": 3,
322
+ "passes": 2,
323
+ "steps": 6,
324
+ "checks": 3,
325
+ "bytes": 2480,
326
+ "store": "project",
327
+ "path": ".ai/recipes/cli-command-json.md"
328
+ }
329
+ ]
330
+ },
331
+ "eval": {
332
+ "sample": true,
333
+ "command": "loop eval run --task calc-page --arm both",
334
+ "headline": "haiku: 3/3 with a recipe vs 1/3 cold, 58% fewer tokens (sample data)",
335
+ "rows": [
336
+ {
337
+ "task": "calc-page",
338
+ "arm": "cold",
339
+ "model": "haiku",
340
+ "runs": 3,
341
+ "passed": 1,
342
+ "medianTokens": 96000,
343
+ "medianSeconds": 410,
344
+ "medianTurns": 24
345
+ },
346
+ {
347
+ "task": "calc-page",
348
+ "arm": "recipe",
349
+ "model": "haiku",
350
+ "runs": 3,
351
+ "passed": 3,
352
+ "medianTokens": 40500,
353
+ "medianSeconds": 190,
354
+ "medianTurns": 11
355
+ },
356
+ {
357
+ "task": "cli-json",
358
+ "arm": "cold",
359
+ "model": "haiku",
360
+ "runs": 3,
361
+ "passed": 2,
362
+ "medianTokens": 70200,
363
+ "medianSeconds": 300,
364
+ "medianTurns": 18
365
+ },
366
+ {
367
+ "task": "cli-json",
368
+ "arm": "recipe",
369
+ "model": "haiku",
370
+ "runs": 3,
371
+ "passed": 3,
372
+ "medianTokens": 31000,
373
+ "medianSeconds": 140,
374
+ "medianTurns": 9
375
+ },
376
+ {
377
+ "task": "known-trap",
378
+ "arm": "cold",
379
+ "model": "haiku",
380
+ "runs": 3,
381
+ "passed": 0,
382
+ "medianTokens": 88000,
383
+ "medianSeconds": 380,
384
+ "medianTurns": 26
385
+ },
386
+ {
387
+ "task": "known-trap",
388
+ "arm": "recipe+triggers",
389
+ "model": "haiku",
390
+ "runs": 3,
391
+ "passed": 2,
392
+ "medianTokens": 36000,
393
+ "medianSeconds": 170,
394
+ "medianTurns": 10
395
+ }
396
+ ]
397
+ }
398
+ }
@@ -0,0 +1,13 @@
1
+ /** The optional `reason` string in `.ai/policy.json` (the control room writes it when it changes the pace); core's parser drops unknown keys. */
2
+ export function policyNote(text) {
3
+ if (text === undefined)
4
+ return undefined;
5
+ try {
6
+ const reason = JSON.parse(text)?.reason;
7
+ return typeof reason === 'string' && reason.trim() ? reason.trim().slice(0, 300) : undefined;
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ //# sourceMappingURL=paceNote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paceNote.js","sourceRoot":"","sources":["../../src/server/paceNote.ts"],"names":[],"mappings":"AAAA,iJAAiJ;AACjJ,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiC,EAAE,MAAM,CAAC;QAClF,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -10,8 +10,32 @@ export function packageVersion(packageJson) {
10
10
  return undefined;
11
11
  }
12
12
  }
13
- export function roundState({ round, hasDone, laned, version }) {
14
- return { roundLabel: hasDone ? `Round ${round} done${version ? ` · ${version}` : ''}` : `Round ${round}`, releaseWaiting: hasDone && laned };
13
+ /** `name` of a package.json text, for the npm lookup. */
14
+ export function packageName(packageJson) {
15
+ if (packageJson === undefined)
16
+ return undefined;
17
+ try {
18
+ const name = JSON.parse(packageJson).name;
19
+ return typeof name === 'string' && name !== '' ? name : undefined;
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ /** `homepage` of a package.json text when it is an https URL that is not just the repo or npm page: the loop's public site. */
26
+ export function homepageOf(packageJson) {
27
+ if (packageJson === undefined)
28
+ return undefined;
29
+ try {
30
+ const homepage = JSON.parse(packageJson).homepage;
31
+ return typeof homepage === 'string' && /^https:\/\/[^\s]+$/.test(homepage) && !/^https:\/\/(?:www\.)?(?:github\.com|npmjs\.com)\//.test(homepage) ? homepage : undefined;
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ export function roundState({ round, hasDone, laned, version, shipped = false }) {
38
+ return { roundLabel: hasDone ? `Round ${round} done${version ? ` · ${version}` : ''}` : `Round ${round}`, releaseWaiting: hasDone && laned && !shipped };
15
39
  }
16
40
  /** The attention-list entry for a waiting release; `kind: 'release'` tells the UI not to offer an answer form. */
17
41
  export function releaseInboxItem(loopId, version, since) {
@@ -1 +1 @@
1
- {"version":3,"file":"roundState.js","sourceRoot":"","sources":["../../src/server/roundState.ts"],"names":[],"mappings":"AAqBA,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,WAA+B;IAC5D,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAA2B,CAAC,OAAO,CAAC;QAC3E,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAc;IACvE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC;AAC/I,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAA2B,EAAE,KAAa;IACzF,OAAO;QACL,MAAM;QACN,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,oBAAoB,CAAC,CAAC,CAAC,6BAA6B;QAC1F,SAAS,EAAE,sDAAsD;QACjE,KAAK;KACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"roundState.js","sourceRoot":"","sources":["../../src/server/roundState.ts"],"names":[],"mappings":"AAuBA,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,WAA+B;IAC5D,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAA2B,CAAC,OAAO,CAAC;QAC3E,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,WAA+B;IACzD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAwB,CAAC,IAAI,CAAC;QAClE,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,+HAA+H;AAC/H,MAAM,UAAU,UAAU,CAAC,WAA+B;IACxD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAA4B,CAAC,QAAQ,CAAC;QAC9E,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3K,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAc;IACxF,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAC3J,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAA2B,EAAE,KAAa;IACzF,OAAO;QACL,MAAM;QACN,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,oBAAoB,CAAC,CAAC,CAAC,6BAA6B;QAC1F,SAAS,EAAE,sDAAsD;QACjE,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -1,14 +1,29 @@
1
1
  // Pure (no Node imports): turns the per-lane run logs, the cron slots and the commits into the Runs tab's data.
2
- import { expectedSlots, matchSlots, missedInARow, parseRunLog } from '../core/parse/index.js';
2
+ import { classifyRunSlots, expectedSlots, matchSlots, missedInARow, notDueReason, parseRunLog, parseSteer, trailingIdleRuns } from '../core/parse/index.js';
3
3
  /** How far back the Runs tab looks. */
4
4
  export const RUNS_WINDOW_HOURS = 48;
5
+ /** How far back the lane × hour grid needs the slots nobody expected a run for. */
6
+ export const GRID_WINDOW_HOURS = 24;
5
7
  /** A slot this young may still be running (the log line is written at the end), so it is not "missing" yet. */
6
8
  export const SLOT_GRACE_MINUTES = 90;
7
9
  /** Missing runs in a row that raise the "lanes are not running" attention item. */
8
10
  export const SILENT_STREAK = 3;
9
11
  const HOUR = 3_600_000;
10
12
  const MINUTE = 60_000;
11
- function laneRuns(lane, input) {
13
+ /** Slots (ISO, by lane) that no run was expected for, according to `schedule.json`. */
14
+ function notDueSlots(input, from) {
15
+ const runs = new Map(input.lanes.map((l) => [l.name, parseRunLog(input.logs[l.name] ?? '')]));
16
+ const commits = new Map();
17
+ for (const c of input.commits)
18
+ if (c.lane)
19
+ commits.set(c.lane, [...(commits.get(c.lane) ?? []), new Date(c.at)]);
20
+ const classified = classifyRunSlots({
21
+ lanes: input.lanes, runs, schedule: input.schedule ?? { version: 1, lanes: {} }, paused: false, rootDone: input.lanes.length > 0 && input.lanes.every((l) => l.stopped), laneDone: new Set(input.lanes.filter((l) => l.stopped).map((l) => l.name)), now: input.now, from, commits,
22
+ });
23
+ const skipped = new Map(classified.lanes.map((l) => [l.lane, new Set(l.slots.filter((s) => s.kind === 'not-due').map((s) => s.slot))]));
24
+ return { skipped, routinesLookOff: !input.paused && classified.routinesLookOff, classified };
25
+ }
26
+ function laneRuns(lane, input, skipped, kinds) {
12
27
  const from = new Date(input.now.getTime() - RUNS_WINDOW_HOURS * HOUR);
13
28
  const everLogged = parseRunLog(input.logs[lane.name] ?? '');
14
29
  const entries = everLogged.filter((e) => new Date(e.at) > from);
@@ -21,8 +36,13 @@ function laneRuns(lane, input) {
21
36
  const manual = entries.filter((e) => !claimed.has(e.at)).map((entry) => ({ slot: new Date(entry.at).toISOString(), entry, outcome: outcomeOf(entry) }));
22
37
  const graceEnd = input.now.getTime() - SLOT_GRACE_MINUTES * MINUTE;
23
38
  const pausedFrom = input.paused ? (input.paused.at?.getTime() ?? -Infinity) : Infinity;
24
- const settled = results.filter((r) => r.outcome !== 'no-run-recorded' || (new Date(r.slot).getTime() <= graceEnd && new Date(r.slot).getTime() < pausedFrom));
25
- const all = [...settled, ...manual].sort((a, b) => a.slot.localeCompare(b.slot));
39
+ const settled = results.filter((r) => r.outcome !== 'no-run-recorded' || (!skipped.has(r.slot) && new Date(r.slot).getTime() <= graceEnd && new Date(r.slot).getTime() < pausedFrom));
40
+ // The heat map wants the slots nobody expected a run for (not due, paused, done) of the last day too; they never count as missed.
41
+ // `.ai/PAUSED` is not in the classifier's input here (it would reclassify skipped slots); slots from the pause on read as paused.
42
+ const kindOfSlot = (r) => (!r.entry && r.outcome === 'no-run-recorded' && new Date(r.slot).getTime() >= pausedFrom && !['done'].includes(kinds.get(r.slot) ?? '') ? 'paused' : kinds.get(r.slot));
43
+ const gridFrom = input.now.getTime() - GRID_WINDOW_HOURS * HOUR;
44
+ const quiet = results.filter((r) => !settled.includes(r) && QUIET_KINDS.has(kindOfSlot(r)) && new Date(r.slot).getTime() >= gridFrom);
45
+ const all = [...settled, ...quiet, ...manual].sort((a, b) => a.slot.localeCompare(b.slot));
26
46
  const loggedSessions = new Set(entries.flatMap((e) => (e.session ? [sessionKey(e.session)] : [])));
27
47
  const runs = all.map((r, i) => {
28
48
  const windowStart = new Date(r.slot).getTime();
@@ -36,6 +56,7 @@ function laneRuns(lane, input) {
36
56
  lane: lane.name,
37
57
  at: new Date(r.slot).toISOString(),
38
58
  outcome: r.outcome,
59
+ ...(kindFor(r, kindOfSlot(r)) && { kind: kindFor(r, kindOfSlot(r)) }),
39
60
  ...(r.entry && { endedAt: new Date(r.entry.at).toISOString() }),
40
61
  units: r.entry?.units ?? [],
41
62
  ...(r.entry?.tests && { tests: r.entry.tests }),
@@ -46,23 +67,64 @@ function laneRuns(lane, input) {
46
67
  return { runs, ...(next && { next }), // A lane that never logged a run or made a commit is new, not silent.
47
68
  missed: !lane.stopped && !input.paused && (everLogged.length > 0 || own.length > 0) ? missedInARow(settled) : 0 };
48
69
  }
70
+ export const QUIET_KINDS = new Set(['not-due', 'paused', 'done']);
71
+ /** Core's slot kind for a run: classified slots keep theirs, manual runs derive it from their log line. */
72
+ function kindFor(r, kind) {
73
+ if (kind)
74
+ return kind;
75
+ if (!r.entry)
76
+ return undefined;
77
+ return r.outcome === 'tests-failed' ? 'tests-failed' : r.outcome === 'pushed' || r.entry.units.length > 0 ? 'worked' : 'idle';
78
+ }
49
79
  const at = (c) => new Date(c.at).getTime();
50
80
  const outcomeOf = (e) => (e.tests && e.tests.failed > 0 ? 'tests-failed' : e.pushed ? 'pushed' : 'nothing-pushed');
51
81
  /** The last 8 characters of a session id or `Claude-Session:` URL, the key commits and run lines share. */
52
82
  export function sessionKey(idOrUrl) {
53
83
  return idOrUrl.trim().replace(/\/+$/, '').slice(-8);
54
84
  }
85
+ const LIMIT_WINDOW_HOURS = 5;
86
+ /** The status strip's facts from the classified slots and the schedule. Pure. */
87
+ function outcomesOf(input, classified, routinesLookOff) {
88
+ const since = input.now.getTime() - LIMIT_WINDOW_HOURS * HOUR;
89
+ const live = input.lanes.filter((l) => !l.stopped);
90
+ const slots = classified.lanes.filter((l) => live.some((x) => x.name === l.lane)).flatMap((l) => l.slots.map((s) => ({ lane: l.lane, ...s })));
91
+ const sleeping = live.filter((l) => ['sleeping', 'snoozed'].includes(notDueReason(input.schedule?.lanes[l.name], input.now) ?? '')).map((l) => l.name);
92
+ const upcoming = live.flatMap((l) => {
93
+ const entry = input.schedule?.lanes[l.name];
94
+ if (!l.cron || input.paused || entry?.paused || entry?.sleeping)
95
+ return [];
96
+ const from = new Date(Math.max(input.now.getTime(), entry?.notBefore ? Date.parse(entry.notBefore) : 0));
97
+ const slot = expectedSlots(l.cron, from, new Date(from.getTime() + 7 * 24 * HOUR))[0];
98
+ return slot ? [{ lane: l.name, at: slot.toISOString() }] : [];
99
+ }).sort((a, b) => a.at.localeCompare(b.at));
100
+ return {
101
+ limitStops5h: input.paused || routinesLookOff ? 0 : slots.filter((s) => s.kind === 'missed' && new Date(s.slot).getTime() >= since).length,
102
+ running: input.paused ? [] : [...new Set(slots.filter((s) => s.kind === 'running').map((s) => s.lane))],
103
+ sleeping,
104
+ paused: live.filter((l) => input.schedule?.lanes[l.name]?.paused === true).map((l) => l.name),
105
+ routinesLookOff,
106
+ ...(upcoming[0] && { nextDue: upcoming[0] }),
107
+ };
108
+ }
55
109
  export function buildRuns(input) {
56
- const perLane = input.lanes.map((lane) => ({ lane, ...laneRuns(lane, input) }));
110
+ const { skipped, routinesLookOff, classified } = notDueSlots(input, new Date(input.now.getTime() - RUNS_WINDOW_HOURS * HOUR));
111
+ const perLane = input.lanes.map((lane) => ({ lane, ...laneRuns(lane, input, skipped.get(lane.name) ?? new Set(), new Map(classified.lanes.find((c) => c.lane === lane.name)?.slots.map((x) => [x.slot, x.kind]) ?? [])) }));
57
112
  return {
58
113
  runs: perLane.flatMap((l) => l.runs).sort((a, b) => b.at.localeCompare(a.at)),
59
114
  nextRuns: perLane.flatMap((l) => (l.next ? [{ lane: l.lane.name, at: l.next }] : [])),
60
115
  silentLanes: perLane.filter((l) => l.missed >= SILENT_STREAK).map((l) => ({ lane: l.lane.name, missed: l.missed })),
116
+ routinesLookOff,
117
+ outcomes: outcomesOf(input, classified, routinesLookOff),
118
+ idleRuns: Object.fromEntries(input.lanes.map((l) => [l.name, trailingIdleRuns(parseRunLog(input.logs[l.name] ?? ''))])),
119
+ steer: input.lanes.flatMap((l) => {
120
+ const text = input.steerTexts?.[l.name];
121
+ return text === undefined ? [] : [{ lane: l.name, entries: parseSteer(text) }];
122
+ }),
61
123
  };
62
124
  }
63
- /** The attention item for lanes that stopped running, or none. */
64
- export function silentLanesItem(loopId, silent, since) {
65
- if (silent.length === 0)
125
+ /** The attention item for lanes that stopped running, or none. After 6 h of silence the usage-limit advice is wrong, so the "Routines look off" row replaces it. */
126
+ export function silentLanesItem(loopId, silent, since, routinesLookOff = false) {
127
+ if (silent.length === 0 || routinesLookOff)
66
128
  return undefined;
67
129
  return {
68
130
  loopId,
@@ -75,7 +137,8 @@ export function silentLanesItem(loopId, silent, since) {
75
137
  }
76
138
  /** The newest run of any lane, for the fleet card. Missing runs count: they are what the owner needs to see. */
77
139
  export function lastRunOf(runs) {
78
- const newest = runs[0];
140
+ // Slots nobody expected a run for (kept for the heat map) are not "the last run".
141
+ const newest = runs.find((r) => !(r.kind && QUIET_KINDS.has(r.kind)));
79
142
  return newest && { lane: newest.lane, at: newest.at, outcome: newest.outcome };
80
143
  }
81
144
  //# sourceMappingURL=runs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/server/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/server/runs.ts"],"names":[],"mappings":"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"}