@telora/daemon 0.23.1 → 0.23.5

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 (298) hide show
  1. package/build-info.json +6 -3
  2. package/dist/completion/review-exit/review-exit-deps.d.ts +2 -1
  3. package/dist/completion/review-exit/review-exit-deps.d.ts.map +1 -1
  4. package/dist/completion/review-exit/review-exit-phase.d.ts.map +1 -1
  5. package/dist/completion/review-exit/review-exit-phase.js +5 -4
  6. package/dist/completion/review-exit/review-exit-phase.js.map +1 -1
  7. package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts +2 -1
  8. package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts.map +1 -1
  9. package/dist/completion/review-exit-holds/review-exit-verdict-gate.js +8 -5
  10. package/dist/completion/review-exit-holds/review-exit-verdict-gate.js.map +1 -1
  11. package/dist/completion/state-cascade/review-next-step.d.ts.map +1 -1
  12. package/dist/completion/state-cascade/review-next-step.js +15 -8
  13. package/dist/completion/state-cascade/review-next-step.js.map +1 -1
  14. package/dist/completion/team-exit/status-advance-phase.d.ts.map +1 -1
  15. package/dist/completion/team-exit/status-advance-phase.js +6 -6
  16. package/dist/completion/team-exit/status-advance-phase.js.map +1 -1
  17. package/dist/completion/team-liveness/supervision-firing-record.d.ts +6 -0
  18. package/dist/completion/team-liveness/supervision-firing-record.d.ts.map +1 -1
  19. package/dist/completion/team-liveness/supervision-firing-record.js +10 -1
  20. package/dist/completion/team-liveness/supervision-firing-record.js.map +1 -1
  21. package/dist/completion/team-outcome/decide-close-rows.d.ts +9 -0
  22. package/dist/completion/team-outcome/decide-close-rows.d.ts.map +1 -1
  23. package/dist/completion/team-outcome/decide-close-rows.js +18 -4
  24. package/dist/completion/team-outcome/decide-close-rows.js.map +1 -1
  25. package/dist/composition/completion-event-context.js +2 -2
  26. package/dist/composition/completion-event-context.js.map +1 -1
  27. package/dist/composition/daemon-contexts.d.ts.map +1 -1
  28. package/dist/composition/daemon-contexts.js +5 -1
  29. package/dist/composition/daemon-contexts.js.map +1 -1
  30. package/dist/composition/engine-start-context.d.ts +3 -0
  31. package/dist/composition/engine-start-context.d.ts.map +1 -0
  32. package/dist/composition/engine-start-context.js +24 -0
  33. package/dist/composition/engine-start-context.js.map +1 -0
  34. package/dist/composition/execution-spawn-context.d.ts.map +1 -1
  35. package/dist/composition/execution-spawn-context.js +13 -1
  36. package/dist/composition/execution-spawn-context.js.map +1 -1
  37. package/dist/composition/runtime-delivery-advance-context.js +3 -3
  38. package/dist/composition/runtime-delivery-advance-context.js.map +1 -1
  39. package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
  40. package/dist/composition/runtime-heartbeat-context.js +3 -0
  41. package/dist/composition/runtime-heartbeat-context.js.map +1 -1
  42. package/dist/composition/runtime-poll-context.d.ts +29 -2
  43. package/dist/composition/runtime-poll-context.d.ts.map +1 -1
  44. package/dist/composition/runtime-poll-context.js +51 -4
  45. package/dist/composition/runtime-poll-context.js.map +1 -1
  46. package/dist/composition/runtime-prd-context.d.ts.map +1 -1
  47. package/dist/composition/runtime-prd-context.js +25 -1
  48. package/dist/composition/runtime-prd-context.js.map +1 -1
  49. package/dist/composition/runtime-spawn-pass-context.js +1 -1
  50. package/dist/composition/runtime-spawn-pass-context.js.map +1 -1
  51. package/dist/composition/spawn-pass-deps.d.ts +1 -1
  52. package/dist/composition/spawn-pass-deps.d.ts.map +1 -1
  53. package/dist/composition/spawn-pass-deps.js +3 -0
  54. package/dist/composition/spawn-pass-deps.js.map +1 -1
  55. package/dist/composition/standing-approval-context.d.ts.map +1 -1
  56. package/dist/composition/standing-approval-context.js +2 -1
  57. package/dist/composition/standing-approval-context.js.map +1 -1
  58. package/dist/composition/state-cascade-context.js +1 -1
  59. package/dist/composition/state-cascade-context.js.map +1 -1
  60. package/dist/composition/tower-pass-context.d.ts +9 -0
  61. package/dist/composition/tower-pass-context.d.ts.map +1 -0
  62. package/dist/composition/tower-pass-context.js +53 -0
  63. package/dist/composition/tower-pass-context.js.map +1 -0
  64. package/dist/composition/verify-rework-context.d.ts +26 -2
  65. package/dist/composition/verify-rework-context.d.ts.map +1 -1
  66. package/dist/composition/verify-rework-context.js +34 -10
  67. package/dist/composition/verify-rework-context.js.map +1 -1
  68. package/dist/config/live-daemon-config.d.ts.map +1 -1
  69. package/dist/config/live-daemon-config.js +1 -19
  70. package/dist/config/live-daemon-config.js.map +1 -1
  71. package/dist/daemon-state/awaiting-slot.d.ts.map +1 -1
  72. package/dist/daemon-state/awaiting-slot.js +2 -1
  73. package/dist/daemon-state/awaiting-slot.js.map +1 -1
  74. package/dist/daemon-state/focus-team-state.js +1 -1
  75. package/dist/daemon-state/intake-control.d.ts.map +1 -1
  76. package/dist/daemon-state/intake-control.js +2 -1
  77. package/dist/daemon-state/intake-control.js.map +1 -1
  78. package/dist/delivery/recorded-concerns.d.ts +19 -2
  79. package/dist/delivery/recorded-concerns.d.ts.map +1 -1
  80. package/dist/delivery/recorded-concerns.js +32 -6
  81. package/dist/delivery/recorded-concerns.js.map +1 -1
  82. package/dist/directive/directive-queue.js +1 -1
  83. package/dist/focus/closed-review-window.d.ts +12 -0
  84. package/dist/focus/closed-review-window.d.ts.map +1 -1
  85. package/dist/focus/closed-review-window.js +18 -0
  86. package/dist/focus/closed-review-window.js.map +1 -1
  87. package/dist/focus/control-state.d.ts +30 -26
  88. package/dist/focus/control-state.d.ts.map +1 -1
  89. package/dist/focus/control-state.js +60 -46
  90. package/dist/focus/control-state.js.map +1 -1
  91. package/dist/focus/daemon-contexts.d.ts +23 -0
  92. package/dist/focus/daemon-contexts.d.ts.map +1 -1
  93. package/dist/focus/daemon-contexts.js +1 -1
  94. package/dist/focus/daemon-contexts.js.map +1 -1
  95. package/dist/focus/engine-ready-pass.d.ts +11 -0
  96. package/dist/focus/engine-ready-pass.d.ts.map +1 -0
  97. package/dist/focus/engine-ready-pass.js +25 -0
  98. package/dist/focus/engine-ready-pass.js.map +1 -0
  99. package/dist/focus/failed-head-wedge.d.ts +95 -0
  100. package/dist/focus/failed-head-wedge.d.ts.map +1 -0
  101. package/dist/focus/failed-head-wedge.js +85 -0
  102. package/dist/focus/failed-head-wedge.js.map +1 -0
  103. package/dist/focus/focus-engine.d.ts.map +1 -1
  104. package/dist/focus/focus-engine.js +20 -20
  105. package/dist/focus/focus-engine.js.map +1 -1
  106. package/dist/focus/focus-loop-registry.d.ts.map +1 -1
  107. package/dist/focus/focus-loop-registry.js +2 -1
  108. package/dist/focus/focus-loop-registry.js.map +1 -1
  109. package/dist/focus/focus-poller-auto-advance.d.ts.map +1 -1
  110. package/dist/focus/focus-poller-auto-advance.js +4 -4
  111. package/dist/focus/focus-poller-auto-advance.js.map +1 -1
  112. package/dist/focus/focus-poller-spawn.d.ts +42 -49
  113. package/dist/focus/focus-poller-spawn.d.ts.map +1 -1
  114. package/dist/focus/focus-poller-spawn.js +129 -83
  115. package/dist/focus/focus-poller-spawn.js.map +1 -1
  116. package/dist/focus/focus-poller-state.d.ts.map +1 -1
  117. package/dist/focus/focus-poller-state.js +1 -19
  118. package/dist/focus/focus-poller-state.js.map +1 -1
  119. package/dist/focus/focus-poller.d.ts.map +1 -1
  120. package/dist/focus/focus-poller.js +2 -1
  121. package/dist/focus/focus-poller.js.map +1 -1
  122. package/dist/focus/focus-respawn-guard.d.ts +7 -0
  123. package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
  124. package/dist/focus/focus-respawn-guard.js +20 -1
  125. package/dist/focus/focus-respawn-guard.js.map +1 -1
  126. package/dist/focus/focus-spawn-decision.d.ts +11 -3
  127. package/dist/focus/focus-spawn-decision.d.ts.map +1 -1
  128. package/dist/focus/focus-spawn-decision.js +3 -1
  129. package/dist/focus/focus-spawn-decision.js.map +1 -1
  130. package/dist/focus/heartbeat-metadata.d.ts +3 -0
  131. package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
  132. package/dist/focus/heartbeat-metadata.js +6 -1
  133. package/dist/focus/heartbeat-metadata.js.map +1 -1
  134. package/dist/focus/heartbeat.d.ts.map +1 -1
  135. package/dist/focus/heartbeat.js +2 -0
  136. package/dist/focus/heartbeat.js.map +1 -1
  137. package/dist/focus/pending-directive-gates.d.ts +47 -0
  138. package/dist/focus/pending-directive-gates.d.ts.map +1 -0
  139. package/dist/focus/pending-directive-gates.js +76 -0
  140. package/dist/focus/pending-directive-gates.js.map +1 -0
  141. package/dist/focus/pending-review-approved-head.d.ts +2 -1
  142. package/dist/focus/pending-review-approved-head.d.ts.map +1 -1
  143. package/dist/focus/pending-review-approved-head.js +3 -4
  144. package/dist/focus/pending-review-approved-head.js.map +1 -1
  145. package/dist/focus/pending-spawn-pass-deps.d.ts +5 -0
  146. package/dist/focus/pending-spawn-pass-deps.d.ts.map +1 -1
  147. package/dist/focus/pending-spawn-pass-deps.js +4 -1
  148. package/dist/focus/pending-spawn-pass-deps.js.map +1 -1
  149. package/dist/focus/pending-spawn-verify-hold.d.ts +13 -0
  150. package/dist/focus/pending-spawn-verify-hold.d.ts.map +1 -0
  151. package/dist/focus/pending-spawn-verify-hold.js +30 -0
  152. package/dist/focus/pending-spawn-verify-hold.js.map +1 -0
  153. package/dist/focus/ready-focus-spawn-action.d.ts +15 -2
  154. package/dist/focus/ready-focus-spawn-action.d.ts.map +1 -1
  155. package/dist/focus/ready-focus-spawn-action.js +25 -8
  156. package/dist/focus/ready-focus-spawn-action.js.map +1 -1
  157. package/dist/focus/spawn-demand-probe.d.ts +45 -0
  158. package/dist/focus/spawn-demand-probe.d.ts.map +1 -0
  159. package/dist/focus/spawn-demand-probe.js +74 -0
  160. package/dist/focus/spawn-demand-probe.js.map +1 -0
  161. package/dist/focus/stranded-review-reroute.d.ts.map +1 -1
  162. package/dist/focus/stranded-review-reroute.js +5 -3
  163. package/dist/focus/stranded-review-reroute.js.map +1 -1
  164. package/dist/focus/verify-routing-passes.d.ts +8 -3
  165. package/dist/focus/verify-routing-passes.d.ts.map +1 -1
  166. package/dist/focus/verify-routing-passes.js +1 -0
  167. package/dist/focus/verify-routing-passes.js.map +1 -1
  168. package/dist/git/focus-branch-containment.d.ts +39 -0
  169. package/dist/git/focus-branch-containment.d.ts.map +1 -0
  170. package/dist/git/focus-branch-containment.js +47 -0
  171. package/dist/git/focus-branch-containment.js.map +1 -0
  172. package/dist/git/types.d.ts.map +1 -1
  173. package/dist/git/types.js +1 -0
  174. package/dist/git/types.js.map +1 -1
  175. package/dist/poll-trigger.js +1 -1
  176. package/dist/poll-trigger.js.map +1 -1
  177. package/dist/prd/arm-readiness.d.ts.map +1 -1
  178. package/dist/prd/arm-readiness.js +2 -1
  179. package/dist/prd/arm-readiness.js.map +1 -1
  180. package/dist/prd/controller-shared.d.ts +32 -8
  181. package/dist/prd/controller-shared.d.ts.map +1 -1
  182. package/dist/prd/controller-shared.js +34 -18
  183. package/dist/prd/controller-shared.js.map +1 -1
  184. package/dist/prd/controller.d.ts.map +1 -1
  185. package/dist/prd/controller.js +3 -8
  186. package/dist/prd/controller.js.map +1 -1
  187. package/dist/prd/done-sweep.d.ts.map +1 -1
  188. package/dist/prd/done-sweep.js +2 -7
  189. package/dist/prd/done-sweep.js.map +1 -1
  190. package/dist/prd/frontier-arming.d.ts +13 -1
  191. package/dist/prd/frontier-arming.d.ts.map +1 -1
  192. package/dist/prd/frontier-arming.js +50 -2
  193. package/dist/prd/frontier-arming.js.map +1 -1
  194. package/dist/prd/index.d.ts.map +1 -1
  195. package/dist/prd/index.js +2 -1
  196. package/dist/prd/index.js.map +1 -1
  197. package/dist/queries/api-client/shared.d.ts +1 -0
  198. package/dist/queries/api-client/shared.d.ts.map +1 -1
  199. package/dist/queries/api-client/shared.js +16 -1
  200. package/dist/queries/api-client/shared.js.map +1 -1
  201. package/dist/queries/deliveries/issues.d.ts.map +1 -1
  202. package/dist/queries/deliveries/issues.js +3 -0
  203. package/dist/queries/deliveries/issues.js.map +1 -1
  204. package/dist/queries/focuses/focus-discovery.d.ts +15 -0
  205. package/dist/queries/focuses/focus-discovery.d.ts.map +1 -1
  206. package/dist/queries/focuses/focus-discovery.js +10 -1
  207. package/dist/queries/focuses/focus-discovery.js.map +1 -1
  208. package/dist/queries/prd/prd.d.ts.map +1 -1
  209. package/dist/queries/prd/prd.js +2 -1
  210. package/dist/queries/prd/prd.js.map +1 -1
  211. package/dist/queries/tower/tower-state.d.ts +56 -0
  212. package/dist/queries/tower/tower-state.d.ts.map +1 -0
  213. package/dist/queries/tower/tower-state.js +76 -0
  214. package/dist/queries/tower/tower-state.js.map +1 -0
  215. package/dist/queries/wire-schemas/schemas.d.ts +12 -0
  216. package/dist/queries/wire-schemas/schemas.d.ts.map +1 -1
  217. package/dist/queries/wire-schemas/schemas.js +11 -0
  218. package/dist/queries/wire-schemas/schemas.js.map +1 -1
  219. package/dist/spawn/lead-continuation.d.ts +9 -1
  220. package/dist/spawn/lead-continuation.d.ts.map +1 -1
  221. package/dist/spawn/lead-continuation.js +37 -11
  222. package/dist/spawn/lead-continuation.js.map +1 -1
  223. package/dist/spawn/spawn-decision.d.ts.map +1 -1
  224. package/dist/spawn/spawn-decision.js +4 -1
  225. package/dist/spawn/spawn-decision.js.map +1 -1
  226. package/dist/supervision/spawn-cooldown.js +1 -1
  227. package/dist/supervision/stop-rows-team-session.d.ts.map +1 -1
  228. package/dist/supervision/stop-rows-team-session.js +11 -10
  229. package/dist/supervision/stop-rows-team-session.js.map +1 -1
  230. package/dist/supervision/team-work.d.ts.map +1 -1
  231. package/dist/supervision/team-work.js +3 -1
  232. package/dist/supervision/team-work.js.map +1 -1
  233. package/dist/testing/fixtures/api-client.js +1 -1
  234. package/dist/testing/fixtures/approved-head-inert-deps.js +1 -1
  235. package/dist/testing/fixtures/approved-head-inert-deps.js.map +1 -1
  236. package/dist/testing/fixtures/index.js +1 -1
  237. package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
  238. package/dist/testing/fixtures/pending-spawn-world.js +3 -1
  239. package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
  240. package/dist/testing/fixtures/review-exit-deps.js +1 -1
  241. package/dist/testing/fixtures/review-exit-deps.js.map +1 -1
  242. package/dist/testing/fixtures/verification-feedback-deps.d.ts.map +1 -1
  243. package/dist/testing/fixtures/verification-feedback-deps.js +2 -0
  244. package/dist/testing/fixtures/verification-feedback-deps.js.map +1 -1
  245. package/dist/tower/focus-landed.d.ts +4 -0
  246. package/dist/tower/focus-landed.d.ts.map +1 -0
  247. package/dist/tower/focus-landed.js +45 -0
  248. package/dist/tower/focus-landed.js.map +1 -0
  249. package/dist/tower/tower-admission.d.ts +91 -0
  250. package/dist/tower/tower-admission.d.ts.map +1 -0
  251. package/dist/tower/tower-admission.js +137 -0
  252. package/dist/tower/tower-admission.js.map +1 -0
  253. package/dist/tower/tower-graph.d.ts +23 -0
  254. package/dist/tower/tower-graph.d.ts.map +1 -0
  255. package/dist/tower/tower-graph.js +53 -0
  256. package/dist/tower/tower-graph.js.map +1 -0
  257. package/dist/tower/tower-heartbeat-status.d.ts +28 -0
  258. package/dist/tower/tower-heartbeat-status.d.ts.map +1 -0
  259. package/dist/tower/tower-heartbeat-status.js +11 -0
  260. package/dist/tower/tower-heartbeat-status.js.map +1 -0
  261. package/dist/tower/tower-mode.d.ts +9 -0
  262. package/dist/tower/tower-mode.d.ts.map +1 -0
  263. package/dist/tower/tower-mode.js +16 -0
  264. package/dist/tower/tower-mode.js.map +1 -0
  265. package/dist/tower/tower-pass-standing.d.ts +8 -0
  266. package/dist/tower/tower-pass-standing.d.ts.map +1 -0
  267. package/dist/tower/tower-pass-standing.js +50 -0
  268. package/dist/tower/tower-pass-standing.js.map +1 -0
  269. package/dist/tower/tower-pass.d.ts +55 -0
  270. package/dist/tower/tower-pass.d.ts.map +1 -0
  271. package/dist/tower/tower-pass.js +59 -0
  272. package/dist/tower/tower-pass.js.map +1 -0
  273. package/dist/tower/tower-production-pass.d.ts +3 -0
  274. package/dist/tower/tower-production-pass.d.ts.map +1 -0
  275. package/dist/tower/tower-production-pass.js +24 -0
  276. package/dist/tower/tower-production-pass.js.map +1 -0
  277. package/dist/tower/tower-spawn-intent.d.ts +72 -0
  278. package/dist/tower/tower-spawn-intent.d.ts.map +1 -0
  279. package/dist/tower/tower-spawn-intent.js +138 -0
  280. package/dist/tower/tower-spawn-intent.js.map +1 -0
  281. package/dist/tower/tower-verdicts.d.ts +81 -0
  282. package/dist/tower/tower-verdicts.d.ts.map +1 -0
  283. package/dist/tower/tower-verdicts.js +139 -0
  284. package/dist/tower/tower-verdicts.js.map +1 -0
  285. package/dist/types/index.js +1 -1
  286. package/dist/types/issue-status.d.ts +14 -0
  287. package/dist/types/issue-status.d.ts.map +1 -1
  288. package/dist/types/issue-status.js +14 -0
  289. package/dist/types/issue-status.js.map +1 -1
  290. package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
  291. package/dist/verify/outcome-routing/verification-rework-issue.d.ts +44 -5
  292. package/dist/verify/outcome-routing/verification-rework-issue.d.ts.map +1 -1
  293. package/dist/verify/outcome-routing/verification-rework-issue.js +85 -27
  294. package/dist/verify/outcome-routing/verification-rework-issue.js.map +1 -1
  295. package/dist/worktree/focus-worktree-state.d.ts.map +1 -1
  296. package/dist/worktree/focus-worktree-state.js +1 -0
  297. package/dist/worktree/focus-worktree-state.js.map +1 -1
  298. package/package.json +3 -3
@@ -3,11 +3,12 @@
3
3
  * decideFocusSpawn verdict out. Nothing here imports focus-poller-spawn.
4
4
  */
5
5
  import type { AgentRole, DaemonConfig } from '../types/index.js';
6
- import { type FocusSpawnAction } from './focus-spawn-decision.js';
6
+ import { type FocusSpawnAction, type FocusSpawnGate } from './focus-spawn-decision.js';
7
7
  import type { ReadyFocusWorkRow } from './ready-focus-team-work.js';
8
8
  import type { createReadyFocusCapHoldReader } from '../supervision/review-cycle-cap-hold.js';
9
9
  import type { ReadyFocusPassDeps } from './pending-spawn-pass-deps.js';
10
10
  import { type NextSpawnRoute } from '../spawn/index.js';
11
+ import { type TowerAdmissionFocus, type TowerGateOutcome } from '../tower/tower-admission.js';
11
12
  /** The ready-focus row slice the review-cycle cap hold reader takes. */
12
13
  export type ReadyFocusCapHoldTarget = Parameters<ReturnType<typeof createReadyFocusCapHoldReader>>[0];
13
14
  /** The escapes that spawn past the work fact (see decideFocusSpawn `forced`). */
@@ -22,6 +23,18 @@ type ReadyFocusEscapes = {
22
23
  * focus. The review-cycle cap hold is read only for a focus with no team (the
23
24
  * pass's reader, one count read per product).
24
25
  */
25
- export declare function resolveReadyFocusSpawnAction(focus: ReadyFocusCapHoldTarget & NextSpawnRoute & ReadyFocusWorkRow & ReadyFocusEscapes, role: AgentRole | undefined, deps: ReadyFocusPassDeps, cfg: DaemonConfig, readCapHold: (focus: ReadyFocusCapHoldTarget) => Promise<boolean>): Promise<FocusSpawnAction>;
26
+ /** The ready-focus row a spawn-gate read takes. */
27
+ export type ReadyFocusGateRow = ReadyFocusCapHoldTarget & NextSpawnRoute & ReadyFocusWorkRow & ReadyFocusEscapes;
28
+ /**
29
+ * Read one ready focus's spawn-gate inputs from live state -- every gate but the
30
+ * tower's (towerHolds is left unset). The ONE read both the spawn pass
31
+ * (resolveReadyFocusSpawnAction) and the tower's demand probe
32
+ * (focus/spawn-demand-probe.ts) decide over, so the two cannot disagree on
33
+ * whether a focus could run.
34
+ */
35
+ export declare function readReadyFocusGate(focus: ReadyFocusGateRow, role: AgentRole | undefined, deps: Pick<ReadyFocusPassDeps, 'resolveFocusVerifyHoldFacts' | 'readyFocusHasTeamWork'>, cfg: DaemonConfig, readCapHold: (focus: ReadyFocusCapHoldTarget) => Promise<boolean>): Promise<FocusSpawnGate>;
36
+ export declare function resolveReadyFocusSpawnAction(focus: ReadyFocusGateRow & TowerAdmissionFocus, role: AgentRole | undefined, deps: ReadyFocusPassDeps, cfg: DaemonConfig, readCapHold: (focus: ReadyFocusCapHoldTarget) => Promise<boolean>): Promise<FocusSpawnAction>;
37
+ /** How the tower reads a spawn-gate action: wanting a team (and how it ended) or not. */
38
+ export declare function towerOutcome(action: FocusSpawnAction): TowerGateOutcome;
26
39
  export {};
27
40
  //# sourceMappingURL=ready-focus-spawn-action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ready-focus-spawn-action.d.ts","sourceRoot":"","sources":["../../src/focus/ready-focus-spawn-action.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG/E,wEAAwE;AACxE,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,iFAAiF;AACjF,KAAK,iBAAiB,GAAG;IAAE,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,+BAA+B,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjH;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,uBAAuB,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,EACvF,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,GAChE,OAAO,CAAC,gBAAgB,CAAC,CAe3B"}
1
+ {"version":3,"file":"ready-focus-spawn-action.d.ts","sourceRoot":"","sources":["../../src/focus/ready-focus-spawn-action.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAoB,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAA4C,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAExI,wEAAwE;AACxE,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,iFAAiF;AACjF,KAAK,iBAAiB,GAAG;IAAE,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,+BAA+B,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjH;;;;;;GAMG;AACH,mDAAmD;AACnD,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAEjH;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,6BAA6B,GAAG,uBAAuB,CAAC,EACvF,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,GAChE,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iBAAiB,GAAG,mBAAmB,EAC9C,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,GAChE,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAOvE"}
@@ -5,17 +5,18 @@ import { decideFocusSpawn } from './focus-spawn-decision.js';
5
5
  import { hasActiveTeam, getActiveTeamCount } from '../daemon-state/focus-team-state.js';
6
6
  import { isNextSpawnInCooldown } from '../spawn/index.js';
7
7
  import { installedDaemonContexts } from './daemon-contexts.js';
8
+ import { decideTowerAdmission, noteTowerAdmission } from '../tower/tower-admission.js';
8
9
  /**
9
- * Resolve one ready focus's spawn-gate action from live state (decideFocusSpawn
10
- * is the pure decision). The capacity input is the LIVE team count sampled at
11
- * this focus's turn, so a spawn earlier in the pass is reflected for the next
12
- * focus. The review-cycle cap hold is read only for a focus with no team (the
13
- * pass's reader, one count read per product).
10
+ * Read one ready focus's spawn-gate inputs from live state -- every gate but the
11
+ * tower's (towerHolds is left unset). The ONE read both the spawn pass
12
+ * (resolveReadyFocusSpawnAction) and the tower's demand probe
13
+ * (focus/spawn-demand-probe.ts) decide over, so the two cannot disagree on
14
+ * whether a focus could run.
14
15
  */
15
- export async function resolveReadyFocusSpawnAction(focus, role, deps, cfg, readCapHold) {
16
+ export async function readReadyFocusGate(focus, role, deps, cfg, readCapHold) {
16
17
  const focusId = focus.focus_id;
17
18
  const forced = focus.answer_rearm_requested_at != null || focus.unclaimed_migration_notice_owed === true;
18
- return decideFocusSpawn({
19
+ return {
19
20
  hasRole: role !== undefined,
20
21
  hasActiveTeam: hasActiveTeam(focusId),
21
22
  reviewCycleCapHeld: !hasActiveTeam(focusId) && await readCapHold(focus),
@@ -26,6 +27,22 @@ export async function resolveReadyFocusSpawnAction(focus, role, deps, cfg, readC
26
27
  inSpawnCooldown: await isNextSpawnInCooldown(cfg, focus, installedDaemonContexts().nextSpawnRoute),
27
28
  activeTeamCount: getActiveTeamCount(),
28
29
  maxTotalSessions: cfg.maxTotalSessions,
29
- });
30
+ };
31
+ }
32
+ export async function resolveReadyFocusSpawnAction(focus, role, deps, cfg, readCapHold) {
33
+ const nowMs = Date.now();
34
+ const tower = decideTowerAdmission(focus, deps.tower, nowMs);
35
+ const action = decideFocusSpawn({ ...(await readReadyFocusGate(focus, role, deps, cfg, readCapHold)), towerHolds: tower.holds });
36
+ noteTowerAdmission(focus, tower, towerOutcome(action), nowMs);
37
+ return action;
38
+ }
39
+ /** How the tower reads a spawn-gate action: wanting a team (and how it ended) or not. */
40
+ export function towerOutcome(action) {
41
+ switch (action) {
42
+ case 'spawn': return 'spawn';
43
+ case 'skip_tower_hold': return 'tower_hold';
44
+ case 'stop_capacity': return 'capacity';
45
+ default: return 'not_wanting';
46
+ }
30
47
  }
31
48
  //# sourceMappingURL=ready-focus-spawn-action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ready-focus-spawn-action.js","sourceRoot":"","sources":["../../src/focus/ready-focus-spawn-action.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,yEAAyE;AACzE,gBAAgB;AAQhB,OAAO,EAAE,gBAAgB,EAAyB,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGxF,OAAO,EAAE,qBAAqB,EAAuB,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAO/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAuF,EACvF,IAA2B,EAC3B,IAAwB,EACxB,GAAiB,EACjB,WAAiE;IAEjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,IAAI,IAAI,IAAI,KAAK,CAAC,+BAA+B,KAAK,IAAI,CAAC;IACzG,OAAO,gBAAgB,CAAC;QACtB,OAAO,EAAE,IAAI,KAAK,SAAS;QAC3B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;QACrC,kBAAkB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,MAAM,WAAW,CAAC,KAAK,CAAC;QACvE,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACpD,8FAA8F;QAC9F,MAAM;QACN,WAAW,EAAE,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QACxF,eAAe,EAAE,MAAM,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,cAAc,CAAC;QAClG,eAAe,EAAE,kBAAkB,EAAE;QACrC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;KACvC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ready-focus-spawn-action.js","sourceRoot":"","sources":["../../src/focus/ready-focus-spawn-action.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,yEAAyE;AACzE,gBAAgB;AAQhB,OAAO,EAAE,gBAAgB,EAA8C,MAAM,2BAA2B,CAAC;AAEzG,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGxF,OAAO,EAAE,qBAAqB,EAAuB,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAmD,MAAM,6BAA6B,CAAC;AAiBxI;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,IAA2B,EAC3B,IAAuF,EACvF,GAAiB,EACjB,WAAiE;IAEjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,IAAI,IAAI,IAAI,KAAK,CAAC,+BAA+B,KAAK,IAAI,CAAC;IACzG,OAAO;QACL,OAAO,EAAE,IAAI,KAAK,SAAS;QAC3B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;QACrC,kBAAkB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,MAAM,WAAW,CAAC,KAAK,CAAC;QACvE,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACpD,8FAA8F;QAC9F,MAAM;QACN,WAAW,EAAE,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QACxF,eAAe,EAAE,MAAM,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,cAAc,CAAC;QAClG,eAAe,EAAE,kBAAkB,EAAE;QACrC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAA8C,EAC9C,IAA2B,EAC3B,IAAwB,EACxB,GAAiB,EACjB,WAAiE;IAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACjI,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,iBAAiB,CAAC,CAAC,OAAO,YAAY,CAAC;QAC5C,KAAK,eAAe,CAAC,CAAC,OAAO,UAAU,CAAC;QACxC,OAAO,CAAC,CAAC,OAAO,aAAa,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The tower's demand probe: could this surfaced focus run NOW, if the tower and
3
+ * the host cap let it? Read BEFORE the tower allocates the product's slots
4
+ * (focus-poller-spawn.ts reconcileSpawnDemand), so a slot goes only to a focus
5
+ * whose every other gate is open on this pass, and never past a higher-ranked
6
+ * focus whose gate has just cleared.
7
+ *
8
+ * Each probe walks the gates its spawn pass applies, in the pass's order, bar the
9
+ * tower and the host cap:
10
+ *
11
+ * ready focus -- readReadyFocusGate (the one read the ready pass decides
12
+ * over) through decideFocusSpawn; the demoted-respawn
13
+ * suppression; the review-window guard (a queued review whose
14
+ * window cannot be read withholds the spawn -- the guard's own
15
+ * verdict, so the focus cannot use a slot this pass and does
16
+ * not want one); and the escalation guard spawnFocusTeam
17
+ * applies before it starts a team.
18
+ * queued directive -- the pass's disposals (a stale stage, a closed review
19
+ * window, a coding directive a review supersedes); role and
20
+ * live team; the review budget; the escalation guard; the
21
+ * review's operator-hold park; a review at an approved head; a
22
+ * terminated respawn cycle; the verify hold; the cooldown.
23
+ *
24
+ * The gates that DISPOSE of, PARK or RELEASE a queued directive run for real
25
+ * (focus/pending-directive-gates.ts and the drops): they are idempotent and the
26
+ * pending pass would make the same disposal on this poll, so making it before
27
+ * allocation means a dropped or parked directive reserves no slot and a released
28
+ * review competes for one on the same pass. Every other gate is read without its
29
+ * effects (no log, no filing, no reset): those stay with the pass.
30
+ *
31
+ * A probe that throws answers null (unknown); the reconcile keeps a fresh
32
+ * record and otherwise fails open (tower/tower-spawn-intent.ts).
33
+ */
34
+ import type { DaemonConfig } from '../types/index.js';
35
+ import { type ReadyFocusCapHoldTarget, type ReadyFocusGateRow } from './ready-focus-spawn-action.js';
36
+ import type { PendingSpawnPassDeps, ReadyFocusPassDeps } from './pending-spawn-pass-deps.js';
37
+ import type { ActiveFocusRow } from '../queries/focuses/focus-discovery.js';
38
+ import { type RespawnGuardDeps } from './focus-respawn-guard.js';
39
+ /** A ready focus: wants a slot when every gate but the tower and the host cap would spawn it. */
40
+ export declare function probeReadyFocusDemand(focus: ReadyFocusGateRow & {
41
+ assigned_agent_role_id: string;
42
+ }, deps: Pick<ReadyFocusPassDeps, 'resolveFocusVerifyHoldFacts' | 'readyFocusHasTeamWork' | 'readReviewWindow'>, respawnGuard: RespawnGuardDeps, cfg: DaemonConfig, readCapHold: (focus: ReadyFocusCapHoldTarget) => Promise<boolean>): Promise<boolean | null>;
43
+ /** A focus holding a queued directive: wants a slot when the pending pass's gates (bar tower and host cap) are open. */
44
+ export declare function probePendingFocusDemand(focus: ActiveFocusRow, deps: Pick<PendingSpawnPassDeps, 'reviewNextStep' | 'reviewCycleCapHold' | 'respawnGuard' | 'reviewHoldPark' | 'reviewApprovedHead' | 'verifyHold' | 'nextSpawnRoute'>, cfg: DaemonConfig): Promise<boolean | null>;
45
+ //# sourceMappingURL=spawn-demand-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-demand-probe.d.ts","sourceRoot":"","sources":["../../src/focus/spawn-demand-probe.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAsB,KAAK,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACzH,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAO5E,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAmBpF,iGAAiG;AACjG,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,GAAG;IAAE,sBAAsB,EAAE,MAAM,CAAA;CAAE,EAC7D,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,6BAA6B,GAAG,uBAAuB,GAAG,kBAAkB,CAAC,EAC5G,YAAY,EAAE,gBAAgB,EAC9B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,GAChE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAUzB;AAED,wHAAwH;AACxH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,cAAc,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,YAAY,GAAG,gBAAgB,CAAC,EACtK,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAiBzB"}
@@ -0,0 +1,74 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: none -- no test imports this module directly (baselined; see lint:pinned-by)
3
+ // PINNED-BY-END
4
+ import { decideFocusSpawn } from './focus-spawn-decision.js';
5
+ import { readReadyFocusGate } from './ready-focus-spawn-action.js';
6
+ import { roles } from './focus-poller-state.js';
7
+ import { hasActiveTeam } from '../daemon-state/focus-team-state.js';
8
+ import { focusMayRunTeam } from '../supervision/null-role-spawn.js';
9
+ import { resolveReviewCycleCapHold } from '../supervision/review-cycle-cap-hold.js';
10
+ import { isRespawnCycleTerminated } from '../supervision/spawn-cooldown.js';
11
+ import { getPendingSpawnDirective } from '../directive/directive-queue.js';
12
+ import { respawnGuardHolds } from './focus-respawn-guard.js';
13
+ import { pendingSpawnDeferredByVerifyHold } from './pending-spawn-verify-hold.js';
14
+ import { dropStalePendingSpawnDirective, pendingReviewDeclinedAtApprovedHead, pendingReviewParkedOnOperatorHold } from './pending-directive-gates.js';
15
+ import { dropReviewDirectiveOfClosedWindow, readyReviewWindowWouldWithhold } from './closed-review-window.js';
16
+ import { pendingCodingSpawnSupersededByReview } from './pending-spawn-review-next-step.js';
17
+ import { hasUnclassifiedFiring, isMechanismDemoted, SUPERVISION_MECHANISM } from '../completion/team-liveness/supervision-firing-record.js';
18
+ import { isNextSpawnInCooldown } from '../spawn/index.js';
19
+ /**
20
+ * The demoted-respawn suppression, read without its effects: the ready pass
21
+ * (focus-poller-spawn.ts respawnSuppressedByDemotion) does not respawn a focus
22
+ * whose teardown this pass falsifies while the spawn-gate-vs-exit mechanism is
23
+ * demoted.
24
+ */
25
+ function respawnWouldBeSuppressed(focusId) {
26
+ return hasUnclassifiedFiring(SUPERVISION_MECHANISM.TEARDOWN_AT_FIRST_RESULT, focusId)
27
+ && isMechanismDemoted(SUPERVISION_MECHANISM.SPAWN_GATE_VS_EXIT_RESPAWN);
28
+ }
29
+ /** A ready focus: wants a slot when every gate but the tower and the host cap would spawn it. */
30
+ export async function probeReadyFocusDemand(focus, deps, respawnGuard, cfg, readCapHold) {
31
+ try {
32
+ const gate = await readReadyFocusGate(focus, roles.get(focus.assigned_agent_role_id), deps, cfg, readCapHold);
33
+ if (decideFocusSpawn({ ...gate, towerHolds: false, activeTeamCount: 0, maxTotalSessions: 1 }) !== 'spawn')
34
+ return false;
35
+ if (respawnWouldBeSuppressed(focus.focus_id))
36
+ return false;
37
+ if (await readyReviewWindowWouldWithhold(cfg.organizationId, focus, deps.readReviewWindow))
38
+ return false;
39
+ return !(await respawnGuardHolds(focus.focus_id, respawnGuard));
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ /** A focus holding a queued directive: wants a slot when the pending pass's gates (bar tower and host cap) are open. */
46
+ export async function probePendingFocusDemand(focus, deps, cfg) {
47
+ try {
48
+ const focusId = focus.focus_id;
49
+ if (!getPendingSpawnDirective(focusId) || hasActiveTeam(focusId))
50
+ return false;
51
+ if (dropStalePendingSpawnDirective(focus) || dropReviewDirectiveOfClosedWindow(focus) || await pendingCodingSpawnSupersededByReview(focus, deps.reviewNextStep))
52
+ return false;
53
+ if (!focusMayRunTeam(focus.assigned_agent_role_id) || !roles.has(focus.assigned_agent_role_id))
54
+ return false;
55
+ const capFocus = { focusId, focusName: focus.focus_name, reviewCycleCount: focus.review_cycle_count };
56
+ if (await resolveReviewCycleCapHold(capFocus, deps.reviewCycleCapHold))
57
+ return false;
58
+ if (await respawnGuardHolds(focusId, deps.respawnGuard))
59
+ return false;
60
+ if (await pendingReviewParkedOnOperatorHold(focus, deps.reviewHoldPark))
61
+ return false;
62
+ if (await pendingReviewDeclinedAtApprovedHead(focus, deps.reviewApprovedHead))
63
+ return false;
64
+ if (isRespawnCycleTerminated(focusId))
65
+ return false;
66
+ if (await pendingSpawnDeferredByVerifyHold(focusId, deps.verifyHold))
67
+ return false;
68
+ return !(await isNextSpawnInCooldown(cfg, focus, deps.nextSpawnRoute));
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ //# sourceMappingURL=spawn-demand-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-demand-probe.js","sourceRoot":"","sources":["../../src/focus/spawn-demand-probe.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stranded-review-reroute.d.ts","sourceRoot":"","sources":["../../src/focus/stranded-review-reroute.ts"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAA8B,KAAK,uBAAuB,EAAE,MAAM,wDAAwD,CAAC;AAOlI,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AAExE,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,6GAA6G;AAC7G,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,aAAa,GAAG,IAAI,CAAC;IAC7F,0BAA0B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,uFAAuF;AACvF,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAAE,4BAA4B;IAClI,8GAA8G;IAC9G,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;CACvI;AAKD,qCAAqC;AACrC,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAgBD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC,CAO1C;AAED;;;;;;;GAOG;AACH,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,GAAG;IAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACpE,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,8CAA8C;AAC9C,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAClD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,4BAA4B,CAAC,CAgBvC"}
1
+ {"version":3,"file":"stranded-review-reroute.d.ts","sourceRoot":"","sources":["../../src/focus/stranded-review-reroute.ts"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAA2D,KAAK,uBAAuB,EAAE,MAAM,wDAAwD,CAAC;AAO/J,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AAExE,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,6GAA6G;AAC7G,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,aAAa,GAAG,IAAI,CAAC;IAC7F,0BAA0B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,uFAAuF;AACvF,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAAE,4BAA4B;IAClI,8GAA8G;IAC9G,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;CACvI;AAKD,qCAAqC;AACrC,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAgBD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC,CAO1C;AAED;;;;;;;GAOG;AACH,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,GAAG;IAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACpE,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,8CAA8C;AAC9C,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAClD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,4BAA4B,CAAC,CAgBvC"}
@@ -56,7 +56,7 @@
56
56
  */
57
57
  import { ESCALATION_REASONS } from '@telora/daemon-core';
58
58
  import { DISPOSITION_AGENT_RESOLVABLE } from '../queries/escalations/escalation-dispositions.js';
59
- import { fileReworkForFailedVerdict } from '../verify/outcome-routing/verification-rework-issue.js';
59
+ import { describeFailedVerdictRework, fileReworkForFailedVerdict } from '../verify/outcome-routing/verification-rework-issue.js';
60
60
  import { commitVerdictHeldDeliveryIds } from '../delivery/commit-verdict-hold.js';
61
61
  import { shouldRefireStrandedReview } from '../directive/phase-sync.js';
62
62
  import { createLogger } from '../log/daemon-log.js';
@@ -150,8 +150,10 @@ async function reroute(focus, ctx, { head, verdict }, deps) {
150
150
  (failed
151
151
  ? 'routing the failed verdict to rework (a Bug naming the failure on the verify delivery whose commits caused it) and closing the review window'
152
152
  : `closing the review window and filing a ${STRANDED_REVIEW_REROUTED_KIND} observation`));
153
- if (failed)
154
- await fileReworkForFailedVerdict(focus.focus_id, verdict, deps);
153
+ if (failed) {
154
+ const result = await fileReworkForFailedVerdict(focus.focus_id, verdict, deps);
155
+ log.info(`[directive-executor] "${focus.focus_name}": failed verdict at ${at} -- ${describeFailedVerdictRework(result)}`);
156
+ }
155
157
  else
156
158
  await reportStuckWindow(focus, ctx, head, verdict, deps);
157
159
  deps.clearPendingSpawnDirective(focus.focus_id);
@@ -1 +1 @@
1
- {"version":3,"file":"stranded-review-reroute.js","sourceRoot":"","sources":["../../src/focus/stranded-review-reroute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stranded-review-reroute.js","sourceRoot":"","sources":["../../src/focus/stranded-review-reroute.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,12 @@
6
6
  * in-flight gate wait the review exit applies;
7
7
  * 2. releaseCommitVerdictHolds: a review exit held on its commit's gate verdict
8
8
  * is replayed once that verdict lands (held re-work: once the run is over),
9
- * or its held evidence is dropped when HEAD moved.
9
+ * or its held evidence is dropped when HEAD moved;
10
+ * 3. fileReworkForFailedHeadWedges: an armed focus left with a FAILED gate
11
+ * verdict at its head and nothing to run (no review window, no owed work, no
12
+ * live team) gets the rework Bug for it (focus/failed-head-wedge.ts). It runs
13
+ * after the release pass, so a held exit the release routes this poll is
14
+ * never read as a wedge.
10
15
  *
11
16
  * The release pass is the ONLY production path that routes a held review exit: if
12
17
  * it stops running, every commit-verdict hold waits until its overdue observation
@@ -16,8 +21,7 @@
16
21
  * one function with injectable passes, pinned by verify-routing-passes.test.ts;
17
22
  * the composition root binds the real passes (composition/runtime-poll-context.ts
18
23
  * buildVerifyRoutingPasses) and the focus poll runs the phase once per product per
19
- * poll. Both passes are best-effort
20
- * and never throw.
24
+ * poll. Every pass is best-effort and never throws.
21
25
  *
22
26
  * @module focus/verify-routing-passes
23
27
  */
@@ -26,6 +30,7 @@ import type { DaemonConfig } from '../types/index.js';
26
30
  export interface VerifyRoutingPasses {
27
31
  checkVerifyDeliveriesForOpenIssues: (config: DaemonConfig) => Promise<void>;
28
32
  releaseCommitVerdictHolds: (config: DaemonConfig) => Promise<unknown>;
33
+ fileReworkForFailedHeadWedges: (config: DaemonConfig) => Promise<unknown>;
29
34
  }
30
35
  /** Run the verify-routing phase for one product-scoped config, over the given passes. */
31
36
  export declare function runVerifyRoutingPasses(config: DaemonConfig, passes: VerifyRoutingPasses): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"verify-routing-passes.d.ts","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,yBAAyB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,yFAAyF;AACzF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAGf"}
1
+ {"version":3,"file":"verify-routing-passes.d.ts","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,yBAAyB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,6BAA6B,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED,yFAAyF;AACzF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -7,5 +7,6 @@
7
7
  export async function runVerifyRoutingPasses(config, passes) {
8
8
  await passes.checkVerifyDeliveriesForOpenIssues(config);
9
9
  await passes.releaseCommitVerdictHolds(config);
10
+ await passes.fileReworkForFailedHeadWedges(config);
10
11
  }
11
12
  //# sourceMappingURL=verify-routing-passes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify-routing-passes.js","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,6DAA6D;AAC7D,0EAA0E;AAC1E,gBAAgB;AAkChB,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAoB,EACpB,MAA2B;IAE3B,MAAM,MAAM,CAAC,kCAAkC,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"verify-routing-passes.js","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,6DAA6D;AAC7D,0EAA0E;AAC1E,gBAAgB;AAuChB,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAoB,EACpB,MAA2B;IAE3B,MAAM,MAAM,CAAC,kCAAkC,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Is a focus branch's work contained in the integration branch? Read from git
3
+ * without a checkout, the input the LANDED rule (tower/focus-landed.ts) needs.
4
+ * Only PROOF lands; anything git cannot answer is unknown.
5
+ *
6
+ * contained -- the branch tip is an ancestor of (or equal to) integration:
7
+ * `git rev-list --count <integration>..<branch>` read 0.
8
+ * not_contained -- the branch carries commits integration lacks (count > 0).
9
+ * merged_removed -- no branch ref (none recorded, or the ref is gone), AND the
10
+ * focus's merge record (focus_merges.merge_commit_sha, written
11
+ * by the daemon at merge time) names a merge commit
12
+ * integration contains. The daemon removes a focus branch only
13
+ * after merging it (merge/focus-worktree-removal.ts); the
14
+ * record is the proof it did.
15
+ * unknown -- git could not answer (integration unreadable, a ref or
16
+ * rev-list read that errored, a timeout), the merge record
17
+ * could not be read, or the branch is gone with NO merge
18
+ * record contained in integration (removal unproven). Never
19
+ * read as either answer.
20
+ *
21
+ * Each read is shaped so success and failure cannot be confused: for-each-ref
22
+ * answers "absent" with an empty listing (exit 0), and rev-list --count answers
23
+ * "contained" with 0 -- so a nonzero exit is always an error, never an answer.
24
+ */
25
+ export type FocusBranchContainment = 'contained' | 'not_contained' | 'merged_removed' | 'unknown';
26
+ export interface FocusBranchContainmentGit {
27
+ run: (args: string[], cwd: string) => {
28
+ success: boolean;
29
+ output: string;
30
+ };
31
+ }
32
+ export interface FocusBranchContainmentInput {
33
+ /** product_focuses.branch_name; null = none recorded. */
34
+ branchName: string | null;
35
+ /** focus_merges.merge_commit_sha for the focus; 'unknown' when the record could not be read. */
36
+ mergeCommitShas: readonly string[] | 'unknown';
37
+ }
38
+ export declare function readFocusBranchContainment(input: FocusBranchContainmentInput, integrationBranch: string, repoPath: string, git: FocusBranchContainmentGit): FocusBranchContainment;
39
+ //# sourceMappingURL=focus-branch-containment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-branch-containment.d.ts","sourceRoot":"","sources":["../../src/git/focus-branch-containment.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,eAAe,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAElG,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E;AAED,MAAM,WAAW,2BAA2B;IAC1C,yDAAyD;IACzD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gGAAgG;IAChG,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAkBD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,2BAA2B,EAClC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,yBAAyB,GAC7B,sBAAsB,CAmBxB"}
@@ -0,0 +1,47 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/tower/focus-landed.test.ts,
3
+ // packages/daemon/src/tower/tower-state-ingestion.test.ts
4
+ // PINNED-BY-END
5
+ /** Commits `ref` carries that `integration` lacks; null when git could not answer. */
6
+ function aheadOf(ref, integration, repoPath, git) {
7
+ const r = git.run(['rev-list', '--count', `${integration}..${ref}`], repoPath);
8
+ if (!r.success)
9
+ return null;
10
+ const n = Number.parseInt(r.output.trim(), 10);
11
+ return Number.isInteger(n) && n >= 0 && String(n) === r.output.trim() ? n : null;
12
+ }
13
+ /** 'present' | 'absent' for a local branch ref; null when git could not answer. */
14
+ function branchRef(branchName, repoPath, git) {
15
+ const ref = `refs/heads/${branchName}`;
16
+ const r = git.run(['for-each-ref', '--format=%(refname)', ref], repoPath);
17
+ if (!r.success)
18
+ return null;
19
+ return r.output.split('\n').some((line) => line.trim() === ref) ? 'present' : 'absent';
20
+ }
21
+ export function readFocusBranchContainment(input, integrationBranch, repoPath, git) {
22
+ try {
23
+ if (!git.run(['rev-parse', '--verify', `${integrationBranch}^{commit}`], repoPath).success)
24
+ return 'unknown';
25
+ const present = input.branchName ? branchRef(input.branchName, repoPath, git) : 'absent';
26
+ if (present === null)
27
+ return 'unknown';
28
+ if (present === 'present') {
29
+ const ahead = aheadOf(`refs/heads/${input.branchName}`, integrationBranch, repoPath, git);
30
+ if (ahead === null)
31
+ return 'unknown';
32
+ return ahead === 0 ? 'contained' : 'not_contained';
33
+ }
34
+ // No branch: landed only on proof the daemon merged it before removing it.
35
+ if (input.mergeCommitShas === 'unknown')
36
+ return 'unknown';
37
+ for (const sha of input.mergeCommitShas) {
38
+ if (aheadOf(sha, integrationBranch, repoPath, git) === 0)
39
+ return 'merged_removed';
40
+ }
41
+ return 'unknown';
42
+ }
43
+ catch {
44
+ return 'unknown';
45
+ }
46
+ }
47
+ //# sourceMappingURL=focus-branch-containment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-branch-containment.js","sourceRoot":"","sources":["../../src/git/focus-branch-containment.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6DAA6D;AAC7D,4DAA4D;AAC5D,gBAAgB;AAwChB,sFAAsF;AACtF,SAAS,OAAO,CAAC,GAAW,EAAE,WAAmB,EAAE,QAAgB,EAAE,GAA8B;IACjG,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,WAAW,KAAK,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/E,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAAC,UAAkB,EAAE,QAAgB,EAAE,GAA8B;IACrF,MAAM,GAAG,GAAG,cAAc,UAAU,EAAE,CAAC;IACvC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,qBAAqB,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAkC,EAClC,iBAAyB,EACzB,QAAgB,EAChB,GAA8B;IAE9B,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC7G,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzF,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,KAAK,CAAC,UAAU,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1F,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAC;YACrC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;QACrD,CAAC;QACD,2EAA2E;QAC3E,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,gBAAgB,CAAC;QACpF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AA6BA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,SAAS,CAGX;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEjE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AA8BA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,SAAS,CAGX;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEjE"}
package/dist/git/types.js CHANGED
@@ -8,6 +8,7 @@
8
8
  // packages/daemon/src/migrations/migration-held-set.test.ts,
9
9
  // packages/daemon/src/spawn/integration-reconcile-spawn.test.ts,
10
10
  // packages/daemon/src/supervision/team-stall-reapers.test.ts,
11
+ // packages/daemon/src/tower/focus-landed.test.ts,
11
12
  // packages/daemon/src/verify/attribution/verification-attribution.test.ts,
12
13
  // packages/daemon/src/verify/attribution/verification-baseline-run.test.ts,
13
14
  // packages/daemon/src/verify/deterministic-gate/verification-checkout.test.ts,
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,gGAAgG;AAChG,gFAAgF;AAChF,gEAAgE;AAChE,uDAAuD;AACvD,4DAA4D;AAC5D,wEAAwE;AACxE,+DAA+D;AAC/D,mEAAmE;AACnE,gEAAgE;AAChE,6EAA6E;AAC7E,8EAA8E;AAC9E,iFAAiF;AACjF,yFAAyF;AACzF,2EAA2E;AAC3E,mFAAmF;AACnF,yDAAyD;AACzD,uEAAuE;AACvE,gBAAgB;AAEhB;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,MAAM,EACN,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAoC7B;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,GAAW,EACX,OAA2B;IAE3B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,sBAAsB,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,gGAAgG;AAChG,gFAAgF;AAChF,gEAAgE;AAChE,uDAAuD;AACvD,4DAA4D;AAC5D,wEAAwE;AACxE,+DAA+D;AAC/D,mEAAmE;AACnE,gEAAgE;AAChE,oDAAoD;AACpD,6EAA6E;AAC7E,8EAA8E;AAC9E,iFAAiF;AACjF,yFAAyF;AACzF,2EAA2E;AAC3E,mFAAmF;AACnF,yDAAyD;AACzD,uEAAuE;AACvE,gBAAgB;AAEhB;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,MAAM,EACN,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAoC7B;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,GAAW,EACX,OAA2B;IAE3B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,sBAAsB,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAC5D,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
- // Pinned by: none -- no test imports this module directly (baselined; see lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/tower/tower-entrypoints.test.ts
3
3
  // PINNED-BY-END
4
4
  let registeredTrigger = null;
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"poll-trigger.js","sourceRoot":"","sources":["../src/poll-trigger.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0FAA0F;AAC1F,gBAAgB;AAiBhB,IAAI,iBAAiB,GAAuB,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,iBAAiB,GAAG,OAAO,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,iBAAiB,EAAE,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"poll-trigger.js","sourceRoot":"","sources":["../src/poll-trigger.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iEAAiE;AACjE,gBAAgB;AAiBhB,IAAI,iBAAiB,GAAuB,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,iBAAiB,GAAG,OAAO,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,iBAAiB,EAAE,EAAE,CAAC;AACxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"arm-readiness.d.ts","sourceRoot":"","sources":["../../src/prd/arm-readiness.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAK3F,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,6FAA6F;IAC7F,QAAQ,EAAE,OAAO,CAAC;IAClB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,gBAAgB,CAkDvF;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,iBAAiB,CAGrF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAc3B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAM5B"}
1
+ {"version":3,"file":"arm-readiness.d.ts","sourceRoot":"","sources":["../../src/prd/arm-readiness.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAK3F,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,6FAA6F;IAC7F,QAAQ,EAAE,OAAO,CAAC;IAClB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,gBAAgB,CAkDvF;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,iBAAiB,CAGrF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAc3B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAM5B"}
@@ -4,7 +4,8 @@
4
4
  // packages/daemon/src/prd/prd-arm-readiness.test.ts,
5
5
  // packages/daemon/src/prd/prd-frontier-arm-covers-stated-effects.test.ts,
6
6
  // packages/daemon/src/prd/prd-frontier-arm-refused.test.ts,
7
- // packages/daemon/src/prd/prd-frontier-arming.test.ts
7
+ // packages/daemon/src/prd/prd-frontier-arming.test.ts,
8
+ // packages/daemon/src/tower/tower-prd-merge-record.test.ts
8
9
  // PINNED-BY-END
9
10
  import { createLogger } from '../log/daemon-log.js';
10
11
  const log = createLogger({ module: 'prd-controller' });
@@ -1 +1 @@
1
- {"version":3,"file":"arm-readiness.js","sourceRoot":"","sources":["../../src/prd/arm-readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arm-readiness.js","sourceRoot":"","sources":["../../src/prd/arm-readiness.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,yEAAyE;AACzE,uEAAuE;AACvE,uDAAuD;AACvD,4EAA4E;AAC5E,8DAA8D;AAC9D,yDAAyD;AACzD,6DAA6D;AAC7D,gBAAgB;AAmChB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAmCvD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA+B;IACnE,IAAI,QAAQ,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,6EAA6E;YACrF,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,0BAA0B,IAAI,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC;YAC/B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,mCAAmC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,MAAM,EACJ,uFAAuF;gBACvF,uFAAuF,KAAK,EAAE;YAChG,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,MAAM,EACJ,GAAG,QAAQ,CAAC,MAAM,OAAO,OAAO,wCAAwC;gBACxE,yCAAyC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACvE,kBAAkB,EAAE,OAAO;YAC3B,eAAe;SAChB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,MAAM,EACJ,GAAG,OAAO,iCAAiC,MAAM,YAAY,OAAO,GAAG,MAAM,cAAc;YAC3F,sCAAsC;QACxC,kBAAkB,EAAE,OAAO;QAC3B,eAAe,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,QAA+B;IAChE,MAAM,GAAG,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,IAAsB;IAEtB,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,uDAAuD,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,kDAAkD,OAAO,GAAG;YACpE,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,IAAsB;IAEtB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,GAAG,CAAC,MAAM,sBAAsB,EAAE,CAAC;IACxG,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { FocusBranchContainment } from '../git/focus-branch-containment.js';
1
2
  import type { Prd, PrtNode, PrtEdge, Pathway } from '../queries/prd/prd.js';
2
3
  import type { FileEscalationInput } from '../nexus/file-escalation.js';
3
4
  import type { StewardJudgmentInput, StewardDecision } from './steward.js';
@@ -37,19 +38,27 @@ export declare const DONE_SWEEP_MAX_ATTEMPTS = 3;
37
38
  */
38
39
  export declare function resolveArmRoleIdFromPrd(prd: Prd): string | null;
39
40
  /**
40
- * Compute the set of focus ids whose delivery work is COMPLETE -- at least one
41
- * delivery exists AND every delivery is in execution_status 'done'. PURE.
41
+ * Compute the set of focus ids that have LANDED -- the completion bridge's
42
+ * signal, and the SAME definition the tower holds a depends_on successor on
43
+ * (tower/focus-landed.ts judgeFocusLanded): at least one delivery, every
44
+ * non-cancelled delivery done, and the focus branch contained in integration.
45
+ * A focus with zero deliveries (freshly materialized, never run) is not landed;
46
+ * a focus whose containment git could not answer is not counted this tick.
42
47
  *
43
- * This is the completion bridge's signal: a focus is "done" when all its
44
- * deliveries have passed the verify gate (each against its own worktree). The
45
- * controller uses it to clear the obstacle an overcome remedies, advancing the
46
- * frontier without shelling out to build/test a shared checkout. A focus with
47
- * zero deliveries (freshly materialized, never run) is NOT complete.
48
+ * `containment` is the focus's branch containment, read by the caller
49
+ * (PrdControllerDeps.readFocusBranchContainment) for every focus it passes.
50
+ * PURE.
48
51
  */
49
52
  export declare function computeCompletedFocusIds(deliveries: Array<{
50
53
  focusId: string;
51
54
  executionStatus: string;
52
- }>): Set<string>;
55
+ }>, containment: ReadonlyMap<string, FocusBranchContainment>): Set<string>;
56
+ /**
57
+ * Load the deliveries and branch containment of each focus and return those
58
+ * that have LANDED (computeCompletedFocusIds). Containment is read only for a
59
+ * focus whose deliveries could have landed, so a running focus costs no git.
60
+ */
61
+ export declare function loadLandedFocusIds(focusIds: readonly string[], deps: Pick<PrdControllerDeps, 'loadFocusDeliveries' | 'readFocusBranchContainment'>): Promise<Set<string>>;
53
62
  /**
54
63
  * One PRD scoping run, as the controller's process-lifetime ledger holds it.
55
64
  *
@@ -105,6 +114,12 @@ export interface PrdControllerDeps {
105
114
  focusId: string;
106
115
  executionStatus: string;
107
116
  }>>;
117
+ /**
118
+ * Whether the focus's branch tip is contained in integration -- the git half
119
+ * of the LANDED rule (tower/focus-landed.ts). Read only for a focus whose
120
+ * deliveries are all done; 'unknown' on any failure (never throws).
121
+ */
122
+ readFocusBranchContainment: (focusId: string) => Promise<FocusBranchContainment>;
108
123
  markNodeCleared: (nodeId: string) => Promise<void>;
109
124
  /**
110
125
  * Finalize a completed frontier focus to status=complete via the sanctioned
@@ -216,6 +231,15 @@ export interface PrdControllerDeps {
216
231
  * the `criteria_standing` read here once it lands -- see `prd/arm-readiness.ts`.
217
232
  */
218
233
  loadFocusArmReadiness?: (focusId: string) => Promise<FocusArmReadiness>;
234
+ /**
235
+ * The focus's operator stop (`product_focuses.operator_stopped_at`), or null.
236
+ * The frontier reads it BEFORE anything else and never arms (or scopes) a
237
+ * focus an operator stopped: an unarm is final until a human arms again, and
238
+ * only the arm edge clears the stamp. A throw is read as "stopped" (fail
239
+ * closed). Optional; bound at the composition root to the active-focus read.
240
+ * When ABSENT no stop is known -- the binding is what makes it real.
241
+ */
242
+ loadFocusOperatorStop?: (focusId: string) => Promise<string | null>;
219
243
  /**
220
244
  * Spawn the ONE-SHOT PRD scoping agent for a materialized frontier focus
221
245
  * (fire-and-forget: resolves on spawn, reports the exit via `onExit`).