@@ -89,7 +89,7 @@ describe("observeFleet", () => {
8989 ] ,
9090 T0 + 1000 ,
9191 ) ;
92- expect ( updates ) . toEqual ( [ "2 done · nothing running " ] ) ;
92+ expect ( updates ) . toEqual ( [ "2 done" ] ) ;
9393 } ) ;
9494
9595 test ( "a failure names what went wrong while the fleet is still live" , ( ) => {
@@ -155,7 +155,7 @@ describe("observeFleet", () => {
155155 : { ...l , status : "failed" as const , error : "boom" } ,
156156 ) ;
157157 const { updates } = observeFleet ( seeded , after , T0 + 1000 ) ;
158- expect ( updates ) . toEqual ( [ "9 done, 3 failed · nothing running " ] ) ;
158+ expect ( updates ) . toEqual ( [ "9 done, 3 failed" ] ) ;
159159 } ) ;
160160
161161 test ( "a cancelled-only dry fleet counts cancelled, not failed" , ( ) => {
@@ -172,7 +172,7 @@ describe("observeFleet", () => {
172172 ] ,
173173 T0 + 1000 ,
174174 ) ;
175- expect ( updates ) . toEqual ( [ "0 done, 2 cancelled · nothing running " ] ) ;
175+ expect ( updates ) . toEqual ( [ "0 done, 2 cancelled" ] ) ;
176176 } ) ;
177177
178178 test ( "a mixed dry fleet names done, failed, and cancelled separately" , ( ) => {
@@ -190,9 +190,7 @@ describe("observeFleet", () => {
190190 ] ,
191191 T0 + 1000 ,
192192 ) ;
193- expect ( updates ) . toEqual ( [
194- "1 done, 1 failed, 1 cancelled · nothing running" ,
195- ] ) ;
193+ expect ( updates ) . toEqual ( [ "1 done, 1 failed, 1 cancelled" ] ) ;
196194 } ) ;
197195
198196 test ( "a burst of live cancels coalesces as cancelled, not failed" , ( ) => {
@@ -216,6 +214,46 @@ describe("observeFleet", () => {
216214 const { updates } = observeFleet ( seeded , after , T0 + 1000 ) ;
217215 expect ( updates ) . toEqual ( [ "2 failed, 2 cancelled" ] ) ;
218216 } ) ;
217+
218+ test ( "a dry fleet appends orchestrator continuing only when the parent is still working" , ( ) => {
219+ const seeded = observeFleet (
220+ createFleetWatch ( ) ,
221+ [ lane ( { id : "api" } ) , lane ( { id : "docs" , status : "done" } ) ] ,
222+ T0 ,
223+ ) . watch ;
224+ const lanes = [
225+ lane ( { id : "api" , status : "done" as const , report : "done" } ) ,
226+ lane ( { id : "docs" , status : "done" as const } ) ,
227+ ] ;
228+ expect ( observeFleet ( seeded , lanes , T0 + 1000 ) . updates ) . toEqual ( [ "2 done" ] ) ;
229+ expect (
230+ observeFleet ( seeded , lanes , T0 + 1000 , {
231+ orchestratorContinuing : true ,
232+ } ) . updates ,
233+ ) . toEqual ( [ "2 done · orchestrator continuing" ] ) ;
234+ } ) ;
235+
236+ test ( "orchestrator continuing is not added while a specialist lane is still running" , ( ) => {
237+ const seeded = observeFleet (
238+ createFleetWatch ( ) ,
239+ [ lane ( { id : "build" } ) , lane ( { id : "docs" } ) ] ,
240+ T0 ,
241+ ) . watch ;
242+ const { updates } = observeFleet (
243+ seeded ,
244+ [
245+ lane ( {
246+ id : "build" ,
247+ status : "failed" ,
248+ error : "typecheck exited 1" ,
249+ } ) ,
250+ lane ( { id : "docs" } ) ,
251+ ] ,
252+ T0 + 1000 ,
253+ { orchestratorContinuing : true } ,
254+ ) ;
255+ expect ( updates ) . toEqual ( [ "build failed — typecheck exited 1" ] ) ;
256+ } ) ;
219257} ) ;
220258
221259describe ( "fleetDigest" , ( ) => {
@@ -236,11 +274,11 @@ describe("fleetDigest", () => {
236274 expect ( digest ) . toBe ( "2 running (api 1:20, docs 0:20) · 1 done · 1 failed" ) ;
237275 } ) ;
238276
239- test ( "a fleet with nothing left running says so rather than going blank " , ( ) => {
277+ test ( "a dry fleet with outcomes is the tally only — idle does not claim the job closed " , ( ) => {
240278 expect ( fleetDigest ( [ lane ( { id : "api" , status : "done" } ) ] , T0 ) ) . toBe (
241- "nothing running · 1 done" ,
279+ "1 done" ,
242280 ) ;
243- expect ( fleetDigest ( [ ] , T0 ) ) . toBe ( "nothing running " ) ;
281+ expect ( fleetDigest ( [ ] , T0 ) ) . toBe ( "" ) ;
244282 } ) ;
245283
246284 test ( "cancelled lanes are named separately from failed" , ( ) => {
@@ -252,7 +290,32 @@ describe("fleetDigest", () => {
252290 ] ,
253291 T0 ,
254292 ) ,
255- ) . toBe ( "nothing running · 1 failed · 1 cancelled" ) ;
293+ ) . toBe ( "1 failed · 1 cancelled" ) ;
294+ } ) ;
295+
296+ test ( "orchestrator continuing is a dry-fleet suffix, never a live-lane claim" , ( ) => {
297+ expect (
298+ fleetDigest ( [ lane ( { id : "api" , status : "done" } ) ] , T0 , {
299+ orchestratorContinuing : true ,
300+ } ) ,
301+ ) . toBe ( "1 done · orchestrator continuing" ) ;
302+ expect ( fleetDigest ( [ ] , T0 , { orchestratorContinuing : true } ) ) . toBe (
303+ "orchestrator continuing" ,
304+ ) ;
305+ expect (
306+ fleetDigest (
307+ [
308+ lane ( {
309+ id : "api" ,
310+ startedAt : T0 - 80_000 ,
311+ lastActivityAt : T0 - 1000 ,
312+ } ) ,
313+ lane ( { id : "web" , status : "done" } ) ,
314+ ] ,
315+ T0 ,
316+ { orchestratorContinuing : true } ,
317+ ) ,
318+ ) . toBe ( "1 running (api 1:20) · 1 done" ) ;
256319 } ) ;
257320} ) ;
258321
0 commit comments