From be76b332c923bd4257a4185e1044bcba9a62a2d1 Mon Sep 17 00:00:00 2001 From: 777genius Date: Thu, 23 Apr 2026 04:06:01 +0300 Subject: [PATCH] fix(team): expose richer launch member sets --- .../services/team/TeamProvisioningService.ts | 4 +- .../team/TeamProvisioningService.test.ts | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/main/services/team/TeamProvisioningService.ts b/src/main/services/team/TeamProvisioningService.ts index 32df8b7c..99fc0668 100644 --- a/src/main/services/team/TeamProvisioningService.ts +++ b/src/main/services/team/TeamProvisioningService.ts @@ -6132,7 +6132,7 @@ export class TeamProvisioningService { runId: null, teamLaunchState: snapshot?.teamLaunchState, launchPhase: snapshot?.launchPhase, - expectedMembers: snapshot?.expectedMembers, + expectedMembers: snapshot ? this.getPersistedLaunchMemberNames(snapshot) : undefined, updatedAt: snapshot?.updatedAt, summary: snapshot?.summary, source: snapshot ? 'persisted' : 'persisted', @@ -6169,7 +6169,7 @@ export class TeamProvisioningService { runId, teamLaunchState: snapshot.teamLaunchState, launchPhase: snapshot.launchPhase, - expectedMembers: snapshot.expectedMembers, + expectedMembers: this.getPersistedLaunchMemberNames(snapshot), updatedAt: snapshot.updatedAt, summary: snapshot.summary, source: persisted ? 'merged' : 'live', diff --git a/test/main/services/team/TeamProvisioningService.test.ts b/test/main/services/team/TeamProvisioningService.test.ts index 421ce209..fb919037 100644 --- a/test/main/services/team/TeamProvisioningService.test.ts +++ b/test/main/services/team/TeamProvisioningService.test.ts @@ -5738,6 +5738,54 @@ describe('TeamProvisioningService', () => { }); }); + it('returns persisted expectedMembers as the union of expected and materialized launch members', async () => { + const teamName = 'persisted-union-member-spawn-team'; + const teamDir = path.join(tempTeamsBase, teamName); + fs.mkdirSync(teamDir, { recursive: true }); + fs.writeFileSync( + path.join(teamDir, 'launch-state.json'), + JSON.stringify( + createPersistedLaunchSnapshot({ + teamName, + leadSessionId: 'lead-session', + launchPhase: 'active', + expectedMembers: ['alice'], + members: { + alice: { + name: 'alice', + launchState: 'confirmed_alive', + agentToolAccepted: true, + runtimeAlive: true, + bootstrapConfirmed: true, + hardFailure: false, + lastEvaluatedAt: '2026-04-23T10:00:00.000Z', + }, + bob: { + name: 'bob', + launchState: 'runtime_pending_permission', + agentToolAccepted: true, + runtimeAlive: true, + bootstrapConfirmed: false, + hardFailure: false, + pendingPermissionRequestIds: ['perm-bob'], + lastEvaluatedAt: '2026-04-23T10:00:00.000Z', + }, + }, + updatedAt: '2026-04-23T10:00:00.000Z', + }) + ), + 'utf8' + ); + + const svc = new TeamProvisioningService(); + const result = await svc.getMemberSpawnStatuses(teamName); + + expect(result.expectedMembers).toEqual(['alice', 'bob']); + expect(result.statuses.bob).toMatchObject({ + launchState: 'runtime_pending_permission', + }); + }); + it('recovers stale mixed secondary lanes when lanes.json says active but lane state is missing', async () => { const teamName = 'signal-ops-6212'; writeTeamMeta(teamName, {