luc-pimentel opened a new issue, #76093:
URL: https://github.com/apache/airflow/issues/76093
### Under which category would you file this issue?
Task SDK
### Apache Airflow version
3.4.0b2 with `apache-airflow-task-sdk` 1.4.0b2 and `apache-airflow-ts-sdk`
1.0.0-beta1; the serializer code is the same on main as of October 30, 2026.
### What happened and how to reproduce it?
The TypeScript guide says a task inherits the Dag's `queue` when it sets
none. That holds when the task passes no `queue` option, but not when it passes
`queue: undefined`, which is what optional configuration produces and which
compiles under `--strict`. The serialized task then has no queue, so the task
instance gets the default queue, the worker routes it to the Python
coordinator, and it fails on its first try with no retry.
Three Dags in one bundle show it:
```ts
import { Bundle, Dag } from "apache-airflow-ts-sdk";
const optionalQueue: string | undefined = undefined;
const omitted = new Dag("queue_omitted", { queue: "typescript" });
omitted.task("work", async () => 42, {})();
const undefinedQueue = new Dag("queue_undefined", { queue: "typescript" });
undefinedQueue.task("work", async () => 42, { queue: optionalQueue })();
const explicit = new Dag("queue_explicit", { queue: "typescript" });
explicit.task("work", async () => 42, { queue: "typescript" })();
await new Bundle(omitted, undefinedQueue, explicit).serve();
```
Pack it with `npx airflow-ts-pack src/main.ts --outdir dist`, put
`dist/bundle.min.mjs` in the dags folder, run `airflow standalone`
(LocalExecutor, SQLite) with
```ini
[sdk]
coordinators = {"ts": {"classpath":
"airflow.sdk.coordinators.node.NodeCoordinator"}}
queue_to_coordinator = {"typescript": "ts"}
```
and trigger the three Dags once each.
| Dag | Task options | Task instance queue | State |
|---|---|---|---|
| `queue_omitted` | `{}` | `typescript` | success |
| `queue_undefined` | `{ queue: undefined }` | `default` | failed |
| `queue_explicit` | `{ queue: "typescript" }` | `typescript` | success |
The failed task's log: `This task belongs to a native Lang-SDK Dag and
cannot run in Python. Give the Dag's tasks their own queue and route it to a
NodeCoordinator in [sdk] queue_to_coordinator`.
The cause is in `ts-sdk/src/coordinator/serde.ts`: `withDagQueue` leaves the
spec alone when the `queue` key is present, even with an undefined value, and
the field writer then skips the undefined value, so nothing writes a queue.
Elsewhere the SDK treats an undefined option as unset.
### What you think should happen instead?
A task whose `queue` option is undefined should inherit the Dag's queue, the
same as a task that leaves the option out, so all three Dags above run on the
Node coordinator.
### Operating System
macOS 26.2
### Deployment
Virtualenv installation
### Versions of Apache Airflow Providers
None involved.
### Anything else?
Node.js 26.12.1, TypeScript 6.0.3. The same serialized output appears with
the SDK alone (`serializeDag` on the three Dags), on 1.0.0-beta1 and on main,
so it is not a regression from the recent blank-queue validation (#75573). No
duplicate found in open and closed issue and PR searches for `queue undefined`,
`withDagQueue` and `queue inherit` in the TypeScript SDK; #74094 and #75267 are
about config-backed defaults and leave this condition unchanged.
### Are you willing to submit PR?
- [x] Yes I am willing to submit a PR!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]