# Ambiguity of "type: manual" steps

**URL:** https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140
**Category:** Pipelines
**Created:** [January 3, 2025, 4:41pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140 "2025-01-03T16:41:44Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![thejcannon](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.buildkite.community/thejcannon/32/1567_2.png) [@thejcannon](https://forum.buildkite.community/u/thejcannon)
#### Post date: [January 3, 2025, 4:41pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140/1 "2025-01-03T16:41:44Z")

</div>

If you set a pipeline to the following YAML:

```yaml
steps:
  - "input"
  - command: echo "hi mom"

```

then using the API for “[Get Pipeline](https://buildkite.com/docs/apis/rest-api/pipelines#get-a-pipeline)”, I see the `"steps": [{"type": "manual", "label": null}, ...]` and when I run the pipeline, I see the two steps run in parallel (e.g. no dependency between the two). 👍

Then, let’s set the pipeline to:

```yaml
steps:
  - "block"
  - command: echo "hi mom"

```

then using the API, I see the `"steps": [{"type": "manual", "label": null}, ...]` and when I run the pipeline, I see the the second step blocked by the first.

Which means the pipeline itself is doing the right thing, but `"type": "manual"` in the API is ambiguous. Is it a Block step or is it an Input step?

(as a bonus test I tried a pipeline with `- "manual"` and when run it looks like its a Block step, so I think `- “input” likely should be coerced to an input step?)

---

<div class="post-metadata">

### Author: ![thejcannon](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.buildkite.community/thejcannon/32/1567_2.png) [@thejcannon](https://forum.buildkite.community/u/thejcannon)
#### Post date: [January 3, 2025, 5:03pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140/2 "2025-01-03T17:03:19Z")

</div>

This is also true for:

```yaml
steps:
  - type: input

```

---

<div class="post-metadata">

### Author: ![thejcannon](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.buildkite.community/thejcannon/32/1567_2.png) [@thejcannon](https://forum.buildkite.community/u/thejcannon)
#### Post date: [January 3, 2025, 5:15pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140/3 "2025-01-03T17:15:48Z")

</div>

Ohh it gets juicier!

Both of these:

```yaml
steps:
  - type: manual
    input: foobar

```

```yaml
steps:
  - type: manual
    block: foobar

```

produces:

```json
[
  {
    "type": "manual",
    "label": "foobar"
  }
]

```

---

<div class="post-metadata">

### Author: ![thejcannon](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.buildkite.community/thejcannon/32/1567_2.png) [@thejcannon](https://forum.buildkite.community/u/thejcannon)
#### Post date: [January 3, 2025, 5:19pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140/4 "2025-01-03T17:19:53Z")

</div>

I think the thing-that-coerces-for-API-sake is just shoving all the inputs into a `type: manual` which loses the nuance of Input/Block steps

Because this pipeline:

```yaml
steps:
  - block: label
    blocked_state: "failed"

```

turns into:

```json
[
  {
    "type": "manual",
    "label": "label"
  }
]

```

---

<div class="post-metadata">

### Author: ![amna](https://avatars.discourse-cdn.com/v4/letter/a/47e85d/32.png) [@amna](https://forum.buildkite.community/u/amna)
#### Post date: [January 3, 2025, 10:35pm UTC](https://forum.buildkite.community/t/ambiguity-of-type-manual-steps/4140/5 "2025-01-03T22:35:47Z")

</div>

Hi @thejcannon👋 thank you for raising this!

It’s interesting how Buildkite’s API keeps things simple by treating all manual steps the same way. This makes the API easier to understand and use, which is always a plus for developers! By using a single field for all manual steps, the API stays consistent and avoids getting too complicated. This also makes it easier for Buildkite to add new types of manual steps in the future without causing problems for existing integrations.

Basically, the API focuses on the main idea of manual steps – needing a person to do something – while letting the specific details be handled in the YAML. This keeps things clean and user-friendly for everyone!

For more detailed information on Input and Block Steps, feel free to refer to Buildkite’s official documentation:

> **[Input step](https://buildkite.com/docs/pipelines/configure/step-types/input-step)**
>
> An input step is used to collect information from a user.

> **[Block step](https://buildkite.com/docs/pipelines/configure/step-types/block-step)**
>
> A block step is used to pause the execution of a build and wait on a team member to unblock it using the web or the API.
