@@ -590,10 +590,9 @@ function rebuildManageTasksEvent(): ReactorInboundEvent {
590590/**
591591 * The services surface every rebuild path touches: holder swap, fleet store,
592592 * workflow reattach, recorder reset, and a buildAgent that mints a fresh
593- * director from the static `allowIdleWithFleet: true` seed — the same seed
594- * the TUI session assembly uses (fleet lanes may appear mid-session). The
595- * rotation-only stubs (buildSessionSources, hostHolder, the resetters) are
596- * inert on interrupt/reload paths.
593+ * director from the static `allowIdleWithFleet: false` seed — the same seed
594+ * the TUI session assembly uses. The rotation-only stubs (buildSessionSources,
595+ * hostHolder, the resetters) are inert on interrupt/reload paths.
597596 */
598597function wireRebuildServices (
599598 services : RunnerServices ,
@@ -639,7 +638,7 @@ function wireRebuildServices(
639638 services . hostHolder = { } as unknown as RunnerServices [ "hostHolder" ] ;
640639 services . buildAgent = ( async ( ) => {
641640 directorHolder . instance = createChatDirector ( "base" , [ ] , {
642- allowIdleWithFleet : true ,
641+ allowIdleWithFleet : false ,
643642 } ) ;
644643 return agent ;
645644 } ) as unknown as RunnerServices [ "buildAgent" ] ;
@@ -661,7 +660,7 @@ async function expectOpenTaskNudge(director: ChatDirector): Promise<void> {
661660 expect ( list . some ( ( action ) => action . type === "infer" ) ) . toBe ( true ) ;
662661}
663662
664- describe ( "rebuild re-syncs idle-with-fleet while drained " , ( ) => {
663+ describe ( "rebuild re-syncs idle-with-fleet" , ( ) => {
665664 test ( "seed then fleet-0 does not leave idle-with-fleet stuck true" , async ( ) => {
666665 const store = createSubAgentSessionStore ( ) ;
667666 const director = createChatDirector ( "base" , [ ] , {
@@ -674,6 +673,36 @@ describe("rebuild re-syncs idle-with-fleet while drained", () => {
674673 await expectOpenTaskNudge ( director ) ;
675674 } ) ;
676675
676+ test ( "resyncIdleWithFleetFlag promotes false seed to true when a fleet lane is running" , async ( ) => {
677+ const store = createSubAgentSessionStore ( ) ;
678+ store . start ( {
679+ id : "lane-1" ,
680+ description : "work" ,
681+ agentId : "coder" ,
682+ brief : "implement" ,
683+ } ) ;
684+ const director = createChatDirector ( "base" , [ ] , {
685+ allowIdleWithFleet : false ,
686+ } ) ;
687+ resyncIdleWithFleetFlag ( {
688+ directorHolder : { instance : director } ,
689+ subAgentSessions : store ,
690+ } ) ;
691+ await director . decide (
692+ rebuildManageTasksEvent ( ) ,
693+ stubReactorState ,
694+ stubReactorCapabilities ,
695+ ) ;
696+ const actions = await director . decide (
697+ stubTextTurnEvent ( ) ,
698+ stubReactorState ,
699+ stubReactorCapabilities ,
700+ ) ;
701+ const list = Array . isArray ( actions ) ? actions : [ actions ] ;
702+ expect ( list . some ( ( action ) => action . type === "infer" ) ) . toBe ( false ) ;
703+ expect ( list . some ( ( action ) => action . type === "reply" ) ) . toBe ( true ) ;
704+ } ) ;
705+
677706 test ( "first assemble with a drained fleet does not leave idle-with-fleet stuck true" , async ( ) => {
678707 const store = createSubAgentSessionStore ( ) ;
679708 const directorHolder : RunnerServices [ "directorHolder" ] = { } ;
@@ -840,8 +869,6 @@ describe("rebuild re-syncs idle-with-fleet while drained", () => {
840869 const directorHolder : RunnerServices [ "directorHolder" ] = { } ;
841870 const agent = recordingAgent ( [ ] ) ;
842871 const { state, services } = stubSendLifecycle ( agent ) ;
843- // Every rebuild mints a fresh director from the static true seed (fleet
844- // lanes may appear mid-session).
845872 wireRebuildServices ( services , directorHolder , agent , store ) ;
846873 const fleetEvents : unknown [ ] = [ ] ;
847874 services . emitter . on ( "event" , ( event : { type : string } ) => {
@@ -852,13 +879,11 @@ describe("rebuild re-syncs idle-with-fleet while drained", () => {
852879 expectOpenTaskNudge (
853880 defined ( directorHolder . instance , "directorHolder.instance" ) ,
854881 ) ;
855- // Drained fleet: the idle reload rebuilds onto the static true seed.
856882 state . pendingReload = true ;
857883 defined ( state . reloadIfIdle , "reloadIfIdle" ) ( ) ;
858884 await services . sessionOps . awaitTail ( ) ;
859885 expect ( state . fatalBuildError ) . toBeNull ( ) ;
860886 await nudges ( ) ;
861- // The interrupt rebuild inherits the same seed.
862887 defined ( state . interrupt , "interrupt" ) ( ) ;
863888 await services . sessionOps . awaitTail ( ) ;
864889 expect ( state . fatalBuildError ) . toBeNull ( ) ;
0 commit comments