Honor [scheduler] create_cron_data_intervals when serializing cron schedules in the Go SDK
- Dominant language
- Python
- Stars
- 46.9k
- Forks
- 17.8k
- Avg merge
- 2d 9h
- Merged PRs (30d)
- 472
Description
### Background
The Go bundle serializer always emits `CronTriggerTimetable` for a cron `schedule`, which only matches the **default** deployment (`[scheduler] create_cron_data_intervals = False`). When a deployment sets it to `True`, Python's `_create_timetable` (`task-sdk/src/airflow/sdk/definitions/dag.py`) produces `CronDataIntervalTimetable` instead, so a Go-authored DAG diverges from the equivalent Python DAG.
The Go bundle binary cannot read `airflow.cfg`, so it has no way to branch on the flag today. The relevant scheduler settings must be delivered from the supervisor (Python `ExecutableCoordinator`) to the lang-SDK over the coordinator protocol first.
Current hardcoded branch in `go-sdk/pkg/execution/serde.go` (`serializeTimetable`):
```go
default:
return map[string]any{
"__type": "airflow.timetables.trigger.CronTriggerTimetable",
"__var": map[string]any{
"expression": *schedule,
"timezone": "UTC",
"interval": 0.0,
"run_immediately": false,
},
}
```
### What needs to happen
1. Extend the coordinator protocol so the supervisor sends `create_cron_data_intervals` (and `create_delta_data_intervals`, once timedelta schedules are supported) to the bundle — e.g. as fields on `DagFileParseRequest`.
2. In `serializeTimetable`, emit `CronDataIntervalTimetable` (`{expression, timezone}`) when `create_cron_data_intervals` is `True` and `CronTriggerTimetable` when `False`, mirroring `_create_timetable`.
3. Carry the DAG timezone over the same channel; `serializeTimetable` currently hardcodes `"UTC"`.
### Acceptance criteria
- A cron-scheduled Go DAG serializes to the same timetable `__type` and `__var` as the equivalent Python DAG under both values of `create_cron_data_intervals`.
- DAG timezone is no longer hardcoded to `"UTC"`.
- The `TODO` on `serializeTimetable` in `go-sdk/pkg/execution/serde.go` is removed.
### Context
- Originating PR: #67155 (Go-SDK Dag/Task specs and downstream wiring in the authoring API) — serde parity review.
- Related: #66942 (Cross-SDK DagSerialization compatibility CI for the Go SDK) — a CI harness like that would catch this divergence automatically.
- Python reference: `_create_timetable` in `task-sdk/src/airflow/sdk/definitions/dag.py`; config default in `airflow-core/src/airflow/config_templates/config.yml` (`create_cron_data_intervals`, default `False`).
---
Drafted-by: Claude Code (Opus 4.8); reviewed by @jason810496 before posting
Contributor guide
Assessment
This issue has not been assessed yet.