conductor-oss / conductor-oss/javascript-sdk

forkTaskJoin() generates JOIN with empty joinOn — join completes immediately without waiting for branches

Abierto Apto para principiantes
#135 0 comentarios 0 reacciones 0 asignados Ver en GitHub
bug
Lenguaje dominante
TypeScript
Estrellas
58
Forks
20
Merge medio
1 d 13 h
PR fusionados (30 d)
7

Descripción

## Summary

`forkTaskJoin()` creates a JOIN task with `joinOn: []` (empty array). The Conductor
server's JOIN executor uses `joinOn.stream().allMatch(...)` to check if all listed tasks
are terminal — on an empty stream, `allMatch` short-circuits to `true` immediately,
so the JOIN transitions to **COMPLETED without waiting for any fork branches**.

## Server baseline

Conductor **3.32.0-rc.9**

## Root cause

```typescript
// forkJoin.ts:22
export const forkTaskJoin = (
taskReferenceName: string,
forkTasks: TaskDefTypes[],
optional?: boolean
): [ForkJoinTaskDef, JoinTaskDef] => [
forkTask(taskReferenceName, forkTasks),
generateJoinTask({ name: `${taskReferenceName}_join`, optional }),
// ^^^ no joinOn passed — defaults to []
];
```

`generateJoinTask` defaults to `joinOn: []`. The existing test (`factory.test.ts:141`)
explicitly asserts `joinOn: []`, locking in the broken behavior.

## Live evidence

Tested against Conductor OSS 3.32.0-rc.9 with a 10-second WAIT task as the fork branch:

```
After 2 seconds:
forkTaskJoin (joinOn=[]) → join=COMPLETED wait_branch=IN_PROGRESS ← BUG
manual joinOn=['wait_branch'] → join=IN_PROGRESS wait_branch=IN_PROGRESS ← CORRECT
```

The JOIN with `joinOn: []` reached COMPLETED while the fork branch was still running.

## Impact

Any workflow that uses `forkTaskJoin()` will have a JOIN that completes immediately
when first evaluated. Fork branches continue running concurrently, but the downstream
workflow does not wait for them.

## Proposed fix

Infer `joinOn` from the last task reference name in the fork branch:

```typescript
export const forkTaskJoin = (
taskReferenceName: string,
forkTasks: TaskDefTypes[],
optional?: boolean
): [ForkJoinTaskDef, JoinTaskDef] => {
const joinOn = forkTasks.length > 0
? [forkTasks[forkTasks.length - 1].taskReferenceName]
: [];
return [
forkTask(taskReferenceName, forkTasks),
generateJoinTask({ name: `${taskReferenceName}_join`, joinOn, optional }),
];
};
```

`factory.test.ts` should also be updated to assert `joinOn: ['forkTaskJoin']` (the last
task's ref name) rather than `joinOn: []`.

## Related

Discovered during systematic SDK audit against Conductor OSS 3.32.0-rc.9.
The multi-branch limitation of `forkTask()` is separately tracked in #94.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Empieza en forkJoin.ts, en forkTaskJoin(), e inspecciona cómo generateJoinTask() proporciona joinOn. Después, lee el caso existente en factory.test.ts alrededor de la línea 141 y ejecuta esa prueba. Se considera terminado cuando el JOIN generado hace referencia a la tarea fork final, si existe, mientras que las ramas vacías conservan un joinOn vacío, y la prueba refleja el comportamiento corregido.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
typescript
Área
backend-api-design
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Tranquilo
Claridad
Bien especificado
Aptitud para principiantes
78/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.