<!-- llms-explorer concept facts · https://llms-explorer.com/tree/7-state-task-lifecycle/ · pack 2026-09-24 · ~8566 tokens -->

# 7-State Task Lifecycle

> Depth-first rabbithole dossier for 7-State Task Lifecycle; source-anchored research pack.

Parent: [A2A Protocol Interoperability](https://llms-explorer.com/tree/a2a-protocol-interoperability/) · 6 facets · 53 facts · page: https://llms-explorer.com/tree/7-state-task-lifecycle/

## Definitions

- 1. "7-State Task Lifecycle" refers to the A2A `Task` state machine, the `TaskState` enum. [M][H][E][P] 2. Google announced A2A on 2025-04-09 and said a task "has a lifecycle". https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/ [H1] 3. The initial commit, 47b436f on 2025-04-09, defines exactly 7 states: `submitted`, `working`, `input-required`, `completed`, `canceled`, `failed`, `unknown`. https://raw.githubusercontent.com/a2aproject/A2A/47b436f3d469f1763a982518cfe3fcc17a6d1818/specification/json/a2a.json [H2] 4. The same 7 states were still present on 2025-05-14, at — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#a-identity-and-origin`
- "7-state" is a secondary-source label, not the spec's count. The A2A 1.0.0 specification defines 8 meaningful states plus `TASK_STATE_UNSPECIFIED`. The "seven" framing drops `auth-required`. Treat the concept node as "the A2A task lifecycle" and record the count as contested. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#headline-finding-read-first`

## Structure and components

- 19. The spec provides no explicit transition table. A2ABreak had to derive its FSM (37 states, 76 transitions across six stages) from natural-language prose. https://arxiv.org/html/2609.10871 20. AgentRFC (March 2026) classifies A2A's lifecycle specification as "partial" at its session and resilience layer. It marks the gaps as specification-level, not implementation-level. https://arxiv.org/html/2603.23801 21. v0.3.0 described `rejected` as "rejected by the agent and was not started." v1.0 describes REJECTED only as "the agent has decided to not perform the task." The newer text drops the "no — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#d-transitions-are-not-formally-specified`

## How it works

- 1. The synthesis exists only in this response. I did not save it to a file or edit the concept tree. Should I save it as `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/synthesis.md`? (Default: no.) 2. When this is merged into the tree, should the node be renamed from "7-State Task Lifecycle" to "A2A Task Lifecycle", with "7-state" kept as a historical alias? (Default: keep the name and record the count as contested.) — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#needs-input`
- 7. Tag `v0.2.0` is commit 3eda07e, dated 2025-05-20 17:41 UTC. It has 9 states: it adds `rejected` and `auth-required` and keeps `unknown`. https://raw.githubusercontent.com/a2aproject/A2A/v0.2.0/specification/json/a2a.json [H6][M4] 8. PR #599 is the likely change that added the two states. This is an inference: nobody inspected its diff. https://github.com/a2aproject/A2A/pull/599 [H7] 9. The GitHub release objects for v0.1.0 and v0.2.0 were published on 2025-06-09. Those dates were backfilled, so they don't show when the states changed. https://api.github.com/repos/a2aproject/A2A/releases?per — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#b-how-the-state-set-changed`
- 47. `TaskStatus` has a required `state`, an optional `message` and a `timestamp`. https://raw.githubusercontent.com/a2aproject/A2A/main/specification/a2a.proto [M28] 48. In v1.0, `TaskStatusUpdateEvent` has only `task_id`, `context_id`, `status` and `metadata`. There is no `final` field. https://raw.githubusercontent.com/a2aproject/A2A/main/specification/a2a.proto [M29] 49. In v0.1, `final: true` ended one `tasks/sendSubscribe` interaction cycle, not the task itself. https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/docs/specification.md [M31] 50. v1.0 signals the end with each binding's — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#g-how-clients-observe-state`
- 11. v1.0.0 was released on 2026-03-12. v1.0.1 followed on 2026-05-26. — https://raw.githubusercontent.com/a2aproject/A2A/main/CHANGELOG.md 12. v1.0 renames the enum values from lowercase strings to `SCREAMING_SNAKE_CASE` with a `TASK_STATE_` prefix, for example `"input-required"` → `"TASK_STATE_INPUT_REQUIRED"`. — https://a2a-protocol.org/latest/whats-new-v1/ 13. The v1.0 proto defines `TASK_STATE_UNSPECIFIED = 0` and eight real states numbered 1–8: SUBMITTED, WORKING, COMPLETED, FAILED, CANCELED, INPUT_REQUIRED, REJECTED, AUTH_REQUIRED. `unknown` is no longer a named value. — https://raw.gith — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#v1-0-8-states-unspecified`
- - **State count.** Sources give 7 (initial draft; agent2agent.info), 9 (v0.2.0–v0.2.5 schema), or 8 (v1.0 proto excluding UNSPECIFIED; Zuplo). All three counts are correct for some version. The label "7-state" is correct only for 2025-04-09 → 2025-05-20. - **Is `unknown` terminal?** In its terminal-state table, v0.2.5 marks `unknown` as terminal. The same spec's no-restart rule lists only completed, canceled, rejected and failed. v1.0 removes the named value, so the conflict remains in the v0.2.x text and was never resolved there. — https://a2a-protocol.org/v0.2.5/specification/ - **Exact comm — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#unresolved-disagreements`
- 28. `TaskStatus` carries a required `state`, an optional `message`, and a `timestamp`. https://raw.githubusercontent.com/a2aproject/A2A/main/specification/a2a.proto 29. In v1.0, `TaskStatusUpdateEvent` has only `task_id`, `context_id`, `status`, and `metadata`. It no longer has a `final` field. https://raw.githubusercontent.com/a2aproject/A2A/main/specification/a2a.proto 30. v1.0 removed the `final` boolean. Stream termination is now signalled by each protocol binding's own stream-closure mechanism. https://a2a-protocol.org/latest/whats-new-v1/ 31. In v0.1, `final: true` marked "the terminal s — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#e-how-clients-observe-state`
- 35. The reference Python SDK (`a2a-python`) hard-codes `TERMINAL_TASK_STATES = {COMPLETED, CANCELED, FAILED, REJECTED}`. https://raw.githubusercontent.com/a2aproject/a2a-python/main/src/a2a/server/request_handlers/default_request_handler.py 36. As fetched on 2026-09-24, `a2a-python` raises `InvalidParamsError` ("Task {id} is in terminal state") when a message targets a terminal task. It raises `TaskNotCancelableError` for a cancel on a terminal task, and `UnsupportedOperationError` for a subscribe to a terminal task. https://raw.githubusercontent.com/a2aproject/a2a-python/main/src/a2a/server/r — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#f-implementations`

## Problems, failure modes and limitations

- - **Concept:** 7-State Task Lifecycle (A2A `TaskState`) - **Parent context:** A2A Protocol Interoperability - **Pass type:** edge cases only. This pass covers boundary conditions, failure modes, disagreements and disconfirming evidence. - **Researched:** 2026-09-24 — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md`
- 28. A task in a terminal state cannot restart. https://a2a-protocol.org/latest/topics/life-of-a-task/ [M14][E10][P9] 29. A task in a terminal state "cannot accept further messages." https://a2a-protocol.org/latest/specification/ [E9][P10] 30. v0.2.5 already said a terminal task "can't be restarted" and that a message to it returns an error. https://a2a-protocol.org/v0.2.5/specification/ [H10] 31. To refine finished work, the client starts a new task in the same `contextId` and lists the old task in `referenceTaskIds`. The agent may reply with a `Task` or a `Message`. https://a2a-protocol.org/l — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#d-transitions-and-invariants`
- | # | Question | Side A | Side B / C | |---|---|---|---| | D1 | How many states? | **7**: the primary v0.1.0 schema [M][H][E]. agent2agent.info also says 7. | **9**: v0.2.0 to v0.3.0. **8 + UNSPECIFIED**: v1.0. Atlan says 7 but lists a different seven, DeepWiki and Zuplo say 8, DEV says 6. | | D1a | Does any primary source back "seven"? | [P]: "Nothing primary backs 'seven'", because [P] compared only v0.3.0 and v1.0. | [M][H][E]: the v0.1.0 schema backs it, but only for 2025-04-09 to 2025-05-20. | | D2 | Is `unknown`/`UNSPECIFIED` terminal? | v0.1: "effectively terminal" and in the terminal l — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#disagreements-both-sides-kept`
- 14. **Terminal immutability.** If a task reaches a terminal state, it cannot restart. Any refinement must start a new task within the same `contextId`. https://a2a-protocol.org/latest/topics/life-of-a-task/ 15. If a client sends a message to a task in a terminal state, the task does not accept it. Spec §3.1.1 names `UnsupportedOperationError` as the error. https://raw.githubusercontent.com/a2aproject/A2A/main/docs/specification.md 16. **Resuming an interrupted task.** The client resumes an interrupted task by sending a new message with the same `taskId` and `contextId` (§3.4.3). https://raw.gi — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#c-transition-rules-and-invariants`
- - **How many states there are.** - v0.1.0 has seven, including `unknown` (claim 1). - v1.0 has nine values, eight of them named (claim 7). - atlan.com (updated 2026-09-21) still says seven, but its seven drop `unknown` and add `rejected`. It also omits `auth-required`: https://atlan.com/know/google-a2a-protocol/ - DeepWiki lists eight states and never mentions `UNSPECIFIED`/`unknown`: https://deepwiki.com/google/A2A/1.3-task-lifecycle - The counts differ on whether the sentinel value counts as a state and which spec version is meant. No source reconciles them. - **Which error a message to a te — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#unresolved-disagreements`
- - Code against the spec's state set, not the "7-state" list. A client that ignores `AUTH_REQUIRED` will misroute auth prompts (claims 2, 6). - Put terminal-state checks and cancel in the task store as atomic operations. A timeout in the client does not fix a race in the store (claims 23–25). - Treat interrupted states as "stream ends, task stays alive". Keep the task stored and subscribable, and don't reconnect when the server closes the stream cleanly (claims 27–29). - Model follow-ups as new tasks linked by `referenceTaskIds`, never as a restart (claims 9–11). - Interop test matrix: check ev — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#concrete-implications`
- 21. In v1.0 the terminal states are `COMPLETED`, `FAILED`, `CANCELED` and `REJECTED`. https://a2a-protocol.org/latest/specification/ [M10][H15][E8][P3] 22. In v1.0 the interrupted states are `INPUT_REQUIRED` and `AUTH_REQUIRED`. https://a2a-protocol.org/latest/specification/ [M11][E14][P4] 23. `SUBMITTED` and `WORKING` are in-progress states. This comes from a secondary source only. https://deepwiki.com/google/A2A/1.3-task-lifecycle [M12] 24. In v0.1 the terminal states were `completed`, `canceled`, `failed` and `unknown`. `input-required` meant "Task is paused". https://raw.githubusercontent. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#c-groups-of-states`
- 41. In v0.1 the client generated the task ID on a task's first message. https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/docs/specification.md [M19] 42. In v0.3.0 the server generated it (§6.1). https://a2a-protocol.org/v0.3.0/specification/ [M19] 43. In v1.0 the agent MUST generate a unique `taskId`, and clients cannot supply one (§3.4.2). https://a2a-protocol.org/latest/specification/ [M18] — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#e-who-creates-the-task-id`
- 44. `CancelTask` returns `TaskNotCancelableError` if the task can't be canceled, for example because it already finished (§3.1.5). https://a2a-protocol.org/latest/specification/ [M25][E12][P17] 45. The spec says cancellation success "is not guaranteed". https://raw.githubusercontent.com/a2aproject/A2A/main/docs/specification.md [M26] 46. In v0.3.0, `TaskNotCancelableError` is JSON-RPC error `-32002` with the message "Task cannot be canceled". https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specification/json/a2a.json [M27] — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#f-cancellation`
- 76. Task Revival, #1095 (lukehinds, 2025-09-02), proposed a `can_revive_task()` hook. It was closed by consolidation into an umbrella issue, not rejected on its merits. https://github.com/a2aproject/A2A/issues/1095 [M, E] 77. The Expectations draft, #2209 (2026-09-05, open, no replies yet), proposes time-based "expectations". https://github.com/a2aproject/A2A/issues/2209 [M, E] 78. PR #838 proposed a `user-consent-required` interrupted state. https://github.com/a2aproject/A2A/pull/838 [H19] 79. Discussion #1858 proposes `PAUSED`, with a `pause` object (`initiatedBy`, `pausedUntil`, `resumeToke — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#j-proposed-changes-none-adopted`
- 8. v1.0 defines four terminal states: COMPLETED, FAILED, CANCELED, REJECTED. https://a2a-protocol.org/latest/specification/ 9. Tasks in a terminal state "cannot accept further messages." https://a2a-protocol.org/latest/specification/ 10. "Once a task reaches a terminal state (completed, canceled, rejected, or failed), it cannot restart." https://a2a-protocol.org/latest/topics/life-of-a-task/ 11. A refinement of finished work "must initiate a new task within the same `contextId`." The client links the new task to the old one with `referenceTaskIds`. https://a2a-protocol.org/latest/topics/life-o — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#b-terminal-state-boundary`
- 14. v1.0 defines two interrupted states: INPUT_REQUIRED and AUTH_REQUIRED. https://a2a-protocol.org/latest/specification/ 15. The spec defines no timeout for a task that stays in INPUT_REQUIRED or AUTH_REQUIRED. A2ABreak lists this as vulnerability V11 ("No Timeout from Interrupted States"), a denial-of-service risk from indefinite resource holding. https://arxiv.org/html/2609.10871 16. A task can loop between execution and interrupted states without limit. The spec has no cycle or deadlock detection for this. A2ABreak lists this as V10 ("Circular Delegation Deadlock"). https://arxiv.org/html/ — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#c-interrupted-state-boundary`
- 6. Tag `v0.2.0` points to commit 3eda07e (2025-05-20 17:41 UTC). Its schema has 9 values. It adds `rejected` and `auth-required` to the original 7. — https://api.github.com/repos/a2aproject/A2A/commits/v0.2.0 ; https://raw.githubusercontent.com/a2aproject/A2A/v0.2.0/specification/json/a2a.json 7. The expansion happened on 2025-05-20, between the v0.1.0 and v0.2.0 tag commits. PR #599 ("update main with changes from next", merged 2025-05-20 by kthota-g) is the only schema-touching merge that day before the v0.2.0 tag. It is the likely vehicle. This is an inference: the PR description does not n — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#expansion-to-9-states-v0-2-0`
- 1. A2A v0.1.0 defined seven `TaskState` values: `submitted`, `working`, `input-required`, `completed`, `canceled`, `failed`, `unknown`. https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/specification/json/a2a.json 2. In v0.1.0, `unknown` meant "The state of the task cannot be determined (e.g., task ID invalid or expired)". The spec called it "Effectively a terminal state from client's PoV for that ID". https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/docs/specification.md 3. In v0.1.0, the terminal states were `completed`, `canceled`, `failed`, and `unknown`. `input-required` was — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#a-the-state-set-in-each-version`
- 25. `CancelTask` returns `TaskNotCancelableError` if the task is not in a cancelable state, for example because it has already completed, failed, or been canceled (§3.1.5). https://a2a-protocol.org/latest/specification/ 26. Cancellation success "is not guaranteed". The task may already have finished, or the agent may not support cancellation. https://raw.githubusercontent.com/a2aproject/A2A/main/docs/specification.md 27. In v0.3.0, `TaskNotCancelableError` is JSON-RPC code `-32002`, with the message "Task cannot be canceled". https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specificatio — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#d-cancellation`
- 31. `INPUT_REQUIRED` and `AUTH_REQUIRED` cover two different cases: the agent is blocked, or the agent chose to park the task. Dashboards cannot tell which one they are looking at. https://github.com/a2aproject/A2A/discussions/1858 32. Discussion #1858 (May–June 2026) proposes a `PAUSED` state. It comes with a structured `pause` object (`initiatedBy`, `pausedUntil`, `resumeToken`) and cooperative `tasks/pause` and `tasks/resume` methods. The latest reply found (2026-06-27) was still asking maintainers whether to open a PR or an extension proposal. https://github.com/a2aproject/A2A/discussions/ — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#trade-offs-and-proposed-extensions`

## Comparisons and alternatives

- 71. A2ABreak V11: interrupted states have no timeout, which lets a task hold resources indefinitely (a denial-of-service risk). https://arxiv.org/html/2609.10871 [E15] 72. A2ABreak V10: a task can loop between execution and interrupted states without limit, and nothing detects the cycle. https://arxiv.org/html/2609.10871 [E16] 73. A2ABreak V8: `AUTH_REQUIRED` gives no way to limit the scope of forwarded credentials. https://arxiv.org/html/2609.10871 [E17] 74. A2ABreak built its own FSM from the spec's prose: 37 states and 76 transitions across six stages. That FSM covers the protocol, not just — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#i-formal-analyses`
- - **Should terminal states be absorbing?** The spec says terminal tasks cannot restart (claim 10). The Task Revival proposal (2025-09-02) argues this "forces users to start new tasks for modifications, losing context". It proposed a per-agent `can_revive_task()` hook. The issue was closed and consolidated into an umbrella issue, not rejected on the merits. https://github.com/a2aproject/A2A/issues/1095 ; https://a2a-protocol.org/latest/topics/life-of-a-task/ - **What does "lifecycle" mean?** The Ehtesham et al. survey describes A2A's lifecycle as four agent phases (Creation, Operation, Update, — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#unresolved-disagreements`
- 9. A task in a terminal state cannot restart. https://a2a-protocol.org/latest/topics/life-of-a-task/ 10. The spec says tasks in a terminal state "cannot accept further messages." https://a2a-protocol.org/latest/specification/ 11. A refinement or follow-up must start a new task in the same `contextId`. The client can link it to the original task with `referenceTaskIds`. https://a2a-protocol.org/latest/topics/life-of-a-task/ 12. An agent can create separate parallel tasks for each follow-up message in one `contextId`. https://a2a-protocol.org/latest/topics/life-of-a-task/ 13. To resume from `inp — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#transition-and-immutability-rules`
- 57. A common early bug: the agent never emits a terminal state, so the client waits forever. The fix is to emit one on every path, "especially on error paths". https://dev.to/promptmaster/understanding-the-a2a-task-lifecycle-and-the-bug-that-hangs-every-client-2127 [P22] 58. Before a2a-rs PR #126 (merged 2026-09-15), `InMemoryTaskStore::update` let racing events overwrite a terminal task back to a non-terminal state. https://github.com/a2aproject/a2a-rs/pull/126 [E22][P23] 59. a2a-rs cancel was check-then-act. Two cancels, or a cancel and a completion, could both pass the check. The fix is an — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#h-failures-seen-in-implementations`
- 22. Before PR #126 (merged 2026-09-15), the a2a-rs `InMemoryTaskStore::update` let racing executor events overwrite a terminal task back to a non-terminal state. https://github.com/a2aproject/a2a-rs/pull/126 23. Before the same PR, a2a-rs implemented cancel as check-then-act. "Two concurrent cancel requests could both pass the check; a cancel could also race with task completion." The fix is an atomic `begin_cancel`, plus rejecting terminal-state changes with `INVALID_REQUEST`. https://github.com/a2aproject/a2a-rs/pull/126 24. In a2a-python (issue #1175, 2026-08-10), CANCELED and FAILED transi — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#e-observed-implementation-failures`
- 22. A common early bug: an agent never emits a terminal state, so the client waits forever. The fix is to emit a terminal event on every path, "especially on error paths." https://dev.to/promptmaster/understanding-the-a2a-task-lifecycle-and-the-bug-that-hangs-every-client-2127 23. Before PR #126 (merged 2026-09-15), the a2a-rs `InMemoryTaskStore` let other writes "blindly overwrite" terminal states. https://github.com/a2aproject/a2a-rs/pull/126 24. That PR makes the store reject state changes on terminal tasks with `INVALID_REQUEST`. Re-applying the same terminal state is still allowed so repe — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#operational-failure-modes-seen-in-implementations`

## Facts and statements

- **Headline finding:** "7-state" is correct only for A2A v0.1.0. That version had exactly seven states and included `unknown`. The current A2A v1.0 enum has nine values: eight named states plus `TASK_STATE_UNSPECIFIED`. Some secondary sources still say "seven states", but they list a different seven, with `rejected` and without `unknown`. Treat the name "7-State Task Lifecycle" as a historical label, not a description of the current spec. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#scope`
- 1. Google announced A2A on 2025-04-09 and said the protocol defines a "task" object that "has a lifecycle". — https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/ 2. The repository's initial commit (47b436f, 2025-04-09) defines `TaskState` with exactly 7 values: `submitted`, `working`, `input-required`, `completed`, `canceled`, `failed`, `unknown`. — https://raw.githubusercontent.com/a2aproject/A2A/47b436f3d469f1763a982518cfe3fcc17a6d1818/specification/json/a2a.json 3. The same 7 values were still present on 2025-05-14 (commit 8a44cff, #534). — https://raw.githubuserco — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#origin-7-states`
- 22. agent2agent.info, a community site, still lists the original 7 states on a page that links to v1.0 material. It has not been updated since the first draft. — https://agent2agent.info/docs/concepts/task/ 23. Zuplo's A2A guide lists 8 states (`submitted`, `working`, `input-required`, `auth-required`, `completed`, `failed`, `canceled`, `rejected`). That list matches the v1.0 set without `unknown`. — https://zuplo.com/learning-center/agent-to-agent-a2a-protocol-guide 24. The arXiv survey 2505.02279v1 (2025-05-04) describes A2A remote-agent lifecycle phases (Creation, Operation, Update, Termina — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#how-third-party-sources-describe-the-lifecycle`
- 82. Atlan (updated 2026-09-21) says "seven" and lists a different seven: no `unknown`, `rejected` included, `auth-required` missing. https://atlan.com/know/google-a2a-protocol/ [M][P6] 83. DeepWiki lists 8 states and never mentions `UNSPECIFIED`/`unknown`. https://deepwiki.com/google/A2A/1.3-task-lifecycle [M] 84. Zuplo lists 8 states, matching the v1.0 named set. https://zuplo.com/learning-center/agent-to-agent-a2a-protocol-guide [H23] 85. agent2agent.info still lists the original 7 on a page that links to v1.0 material. https://agent2agent.info/docs/concepts/task/ [H22] 86. A DEV Community e — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#k-how-secondary-sources-count-the-states`
- **Siblings for `concept-family-explorer`** (not pursued here): Agent Card, the `contextId` conversation model, A2A push notifications, MCP tasks lifecycle, and A2A security vulnerabilities (A2ABreak as a whole). — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#saturation`
- 1. The v0.1.0 JSON schema defines exactly seven `TaskState` values: `submitted`, `working`, `input-required`, `completed`, `canceled`, `failed`, `unknown`. https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/specification/json/a2a.json 2. By v0.2.5 the enum also includes `rejected` and `auth-required`. The concept name "7-state" therefore describes only the original release. https://a2a-protocol.org/v0.2.5/specification/ 3. The v0.3.0 spec lists nine values: Submitted, Working, InputRequired, Completed, Canceled, Failed, Rejected, AuthRequired, Unknown. https://a2a-protocol.org/v0.3.0/spec — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#a-the-7-states-count-is-version-dependent-disconfirming-the-label`
- Disconfirming evidence was sought and found. The "7-state" count holds only for v0.1.0 (claims 1-4), and the terminal-state rule is disputed (the Task Revival proposal). — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#quality-gate`
- In scope: the A2A `Task` state set, how its states are classified (running, interrupted, terminal), the transition and immutability rules, and what the lifecycle costs and breaks in real SDKs. Out of scope: A2A as a whole, Agent Cards, transports, MCP, and other agent protocols. Those are separate frontier items. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#scope`
- Sibling concepts handed to concept-family-explorer: Agent Card, `contextId` conversation model, A2A push notifications, MCP tasks lifecycle. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#saturation`
- - Run: frontier-2026-09-24 · concept: `7-state-task-lifecycle` · parent: A2A Protocol Interoperability - Written: 2026-09-24 · method: /rabbithole (4 passes, soft stop — see Saturation) — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md`
- **Verdict: `BUDGET_EXHAUSTED`. This is a soft stop, not saturation, and no boundary breach was found.** All four reports researched the same thing: the A2A `Task` state machine, the `TaskState` enum. None of them strayed into sibling concepts. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md`
- **Main finding:** "7-state" is correct only for A2A's first draft. That covers the initial commit on 2025-04-09 through tag `v0.1.0` on 2025-05-20. Versions v0.2.0 through v0.3.0 have 9 lowercase states. v1.0 has 8 named states plus `TASK_STATE_UNSPECIFIED`. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md`
- - https://a2a-protocol.org/latest/specification/ - https://a2a-protocol.org/latest/topics/life-of-a-task/ - https://a2a-protocol.org/latest/whats-new-v1/ - https://a2a-protocol.org/v0.3.0/specification/ - https://a2a-protocol.org/v0.2.5/specification/ - https://raw.githubusercontent.com/a2aproject/A2A/main/specification/a2a.proto - https://raw.githubusercontent.com/a2aproject/A2A/main/docs/specification.md - https://raw.githubusercontent.com/a2aproject/A2A/main/CHANGELOG.md - https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/specification/json/a2a.json - https://raw.githubusercontent.com — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/rabbithole-synthesis.md#sources-45-unique-all-taken-from-the-four-reports`
- **In scope:** the A2A task state set and its transition rules. That covers terminal and interrupted states, cancel semantics, and how the state set changed between spec versions. It also covers failures observed in SDKs and deployments, and published analyses of the state machine. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#scope`
- **Out of scope:** Agent Cards and discovery, auth schemes in general, streaming transport design, MCP, and other protocols' task models. Those are separate frontier items. I mention them only where they directly change a task-state claim. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/edge-cases.md#scope`
- Main finding: "7-state" describes only the first A2A draft, from 2025-04-09 to 2025-05-20. Every tagged version from v0.2.0 through v0.2.5 has 9 string states. v1.0 has 8 real states plus a zero-value `UNSPECIFIED`. The concept name is therefore a historical label, not a description of the current spec. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#scope`
- Met. Sources come from 7 hosts: github.com / raw.githubusercontent.com / api.github.com (primary schema, proto, and git history), a2a-protocol.org (official spec), developers.googleblog.com (launch announcement), arxiv.org, agent2agent.info, and zuplo.com. The disconfirming source was the official v0.2.0+ schema and the v1.0 proto: both contradict the "7-state" framing for every version after the initial draft. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#quality-gate`
- - https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/ - https://raw.githubusercontent.com/a2aproject/A2A/47b436f3d469f1763a982518cfe3fcc17a6d1818/specification/json/a2a.json - https://raw.githubusercontent.com/a2aproject/A2A/8a44cfffd93b994f70f551d36cdeb188c1bebf48/specification/json/a2a.json - https://raw.githubusercontent.com/a2aproject/A2A/v0.1.0/specification/json/a2a.json - https://raw.githubusercontent.com/a2aproject/A2A/v0.2.0/specification/json/a2a.json - https://api.github.com/repos/a2aproject/A2A/commits/v0.1.0 - https://api.github.com/repos/a2aproject/A2A/c — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/history.md#sources`
- - **In scope:** the A2A `Task` state machine. That covers its state set, the terminal and interrupted groups, the transition rules, the invariants, how clients observe state, and how the state set changed between spec versions. - **Out of scope:** the rest of A2A (Agent Card, transports, security schemes, push-notification setup), other agent protocols, and generic workflow state machines. Those are separate frontier items. — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#scope`
- 10. In v1.0 the terminal states are `COMPLETED`, `FAILED`, `CANCELED`, and `REJECTED`. https://a2a-protocol.org/latest/specification/ 11. In v1.0 the interrupted states are `INPUT_REQUIRED` and `AUTH_REQUIRED`. https://raw.githubusercontent.com/a2aproject/A2A/main/docs/specification.md 12. `SUBMITTED` and `WORKING` are in-progress states: the task exists, and the agent has either not started it yet or is actively processing it. https://deepwiki.com/google/A2A/1.3-task-lifecycle 13. v1.0 no longer lists `UNSPECIFIED`/`unknown` as terminal. In v0.1, `unknown` was "effectively terminal", but the — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/mechanism.md#b-groups-of-states`
- 1. The latest released A2A specification is version `1.0.0`. https://a2a-protocol.org/latest/specification/ 2. The 1.0.0 `TaskState` enum lists `SUBMITTED`, `WORKING`, `INPUT_REQUIRED`, `AUTH_REQUIRED`, `COMPLETED`, `FAILED`, `CANCELED`, `REJECTED`, plus `TASK_STATE_UNSPECIFIED`. https://a2a-protocol.org/latest/specification/ 3. The spec classifies `COMPLETED`, `FAILED`, `CANCELED` and `REJECTED` as terminal states. https://a2a-protocol.org/latest/specification/ 4. The spec classifies `INPUT_REQUIRED` and `AUTH_REQUIRED` as "interrupted" states, not terminal ones. https://a2a-protocol.org/late — source: `~/.global-ai-hub/research-runs/frontier-2026-09-24/7-state-task-lifecycle/reports/practice.md#state-set-and-classification`

## Related concepts

- Task — is a part of 7-State Task Lifecycle
- Lifecycle — is a part of 7-State Task Lifecycle
- 7-State — is a part of 7-State Task Lifecycle
