# Task Dependencies

This page explains how a task waits on prerequisites and what happens when a prerequisite fails.

## Declaring Prerequisites

```go
prepareID, err := c.Add("@every 1m", prepare, "prepare")
if err != nil {
	log.Fatal(err)
}

_, err = c.Add("@every 1m", process, "process", []core.Wait{
	{ID: prepareID, State: core.Skip},
})
if err != nil {
	log.Fatal(err)
}
```

The dependent task's action must be `func() error`; `Add` rejects `func()` combined with prerequisites.

## Evaluation Rules

When a dependent task fires, it enters the wait queue and a worker checks prerequisite states every 1ms:

| Prerequisite state | `State: core.Stop` | `State: core.Skip` |
|---|---|---|
| `TaskCompleted` | Satisfied | Satisfied |
| `TaskFailed` | Dependent task marked `TaskFailed` | Prerequisite ignored |
| `TaskPending` / `TaskRunning` | Keep waiting | Keep waiting |
| ID missing | Dependent task marked `TaskFailed` | Dependent task marked `TaskFailed` |

- The wait limit is fixed at 1 minute; `Wait.Delay` is currently not applied
- Evaluation uses each prerequisite's current state, not a run in the same trigger cycle
- Prerequisites registered with `func()` are `TaskCompleted` from the moment they are added
- A dependent task whose state is `TaskRunning` or `TaskCompleted` skips the trigger without checking prerequisites, so after one successful run it is not executed again; a `TaskFailed` dependent task is evaluated again on its next trigger

See [Dependency API](/api-reference-dependencies) for the `Wait` and `WaitState` types.
