--- name: dag_parse kind: function lang: go domain: core version: "1.1.0" purity: pure signature: "func DagParse(data []byte) (DagDefinition, error)" description: "Parsea YAML de definicion de DAG en formato compatible con Dagu. Soporta schedule como string o lista, env como lista de maps single-key (formato Dagu), handler_on y handlers como aliases, steps con command/script/depends/continue_on (failure, skipped y exit_code) y retry_policy (limit, interval_sec), y type graph." tags: [dag, yaml, parsing, workflow, dagu, pure, scheduler] uses_functions: [] uses_types: [dag_definition_go_core, dag_step_go_core, dag_handlers_go_core] returns: [] returns_optional: false error_type: "" imports: [fmt, strings, gopkg.in/yaml.v3] params: - name: data desc: "contenido YAML de un archivo de definicion de DAG en formato Dagu" output: "DagDefinition con todos los campos normalizados; error si el YAML es sintaticamente invalido" tested: true tests: - "parsea DAG simple con steps y depends" - "parsea schedule como string y como lista" - "parsea env en formato lista de maps" - "parsea handler_on y handlers como alias" - "parsea continue_on y working_dir a nivel step" - "parsea continue_on.exit_code y retry_policy" - "parsea type graph" test_file_path: "functions/core/dag_parse_test.go" file_path: "functions/core/dag_parse.go" --- ## Ejemplo ```go data := []byte(` name: mi-dag schedule: "0 9 * * *" steps: - name: hello command: echo "hello" - name: world command: echo "world" depends: [hello] `) dag, err := DagParse(data) // dag.Name = "mi-dag" // dag.Schedule = ["0 9 * * *"] // dag.Steps[1].Depends = ["hello"] ``` Step con tolerancia de fallos y reintentos: ```go data := []byte(` name: backup steps: - name: snapshot command: ./backup.sh continue_on: exit_code: [4] # exit 4 = "ok con avisos", no rompe el DAG retry_policy: limit: 3 # hasta 3 reintentos interval_sec: 10 # 10s entre intentos `) dag, _ := DagParse(data) // dag.Steps[0].ContinueOn.ExitCodes = [4] // dag.Steps[0].RetryPolicy.Limit = 3 ``` ## Notas Funcion pura (el YAML es inmutable, no hay I/O). Internamente usa un struct rawDag para deserializar loosely y luego normaliza campos polimorficos. La estrategia de normalizacion: schedule string->[]string, env lista->map, handlers single-o-lista->[]DagStep. handler_on tiene precedencia sobre handlers si ambos estan presentes. `continue_on` y `retry_policy` son declarativos: `DagParse` solo los normaliza al modelo `DagDefinition`. Quien los interpreta (reintentar, tolerar exit codes) es el executor que consuma el DAG — en este ecosistema, `apps/dag_engine`. ## Capability growth log - v1.1.0 (2026-06-03) — minor: parsea `continue_on.exit_code` (lista de codigos de salida tolerados) y expone `retry_policy` ya existente en el modelo. Habilita reintentos y tolerancia de fallos reales en el executor de `dag_engine`.