HTTP+JSON CancelTask returns 409 Conflict instead of 400 Bad Request for TaskNotCancelableError
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 76/100
Direção de pesquisa
Comece rastreando como o transporte HTTP+JSON associa TaskNotCancelableError a um status HTTP e, em seguida, compare essa associação com a tabela de erros da especificação na seção 3.3.2. Execute tests/compatibility/core_operations/test_task_lifecycle.py::TestCancelTask::test_cancel_terminal_task_returns_error[http_json] para reproduzir o problema; o resultado esperado é uma resposta HTTP 400 com o código 400 e o motivo TASK_NOT_CANCELABLE.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
When canceling a task that is already in a terminal state (TASK_STATE_COMPLETED), the HTTP+JSON transport returns 409 Conflict instead of 400 Bad Request as required by the A2A specification's error mapping table.
Requirement
- ID: CORE-CANCEL-002
- Section: 3.1.5 — CancelTask returns TaskNotCancelableError for terminal tasks
- Level: MUST
- Spec: https://github.com/a2aproject/A2A/blob/3303592588e388e62e0f69f701af531d2f4e3991/docs/specification.md#315-cancel-task
Specification
CancelTask MUST return TaskNotCancelableError when the task is not in a cancelable state (already completed, failed, or canceled).
The error mapping table in section 3.3.2 specifies:
| Error Name | JSON-RPC | gRPC | HTTP |
|---|---|---|---|
TaskNotCancelableError |
-32002 |
FAILED_PRECONDITION |
400 Bad Request |
Expected behavior
The HTTP+JSON transport should return HTTP status 400 Bad Request with an AIP-193 error body containing "code": 400 and an ErrorInfo detail with "reason": "TASK_NOT_CANCELABLE".
Actual behavior
The SUT returns HTTP 409 Conflict with "code": 409 and "status": "FAILED_PRECONDITION":
{
"error": {
"code": 409,
"status": "FAILED_PRECONDITION",
"message": "Task cannot be canceled - current state: TASK_STATE_COMPLETED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "TASK_NOT_CANCELABLE",
"domain": "a2a-protocol.org",
"metadata": {}
}
]
}
}
Note: The reason and error structure are correct — only the HTTP status code is wrong.
Reproducer
# 1. Create a task that completes immediately
TASK_ID=$(curl -s -X POST "http://localhost:9999/message:send" \
-H "Content-Type: application/json" \
-H "A2A-Version: 1.0" \
-d '{"message":{"role":"ROLE_USER","parts":[{"text":"TCK prerequisite task creation"}],"messageId":"tck-complete-task-repro"},"configuration":{"acceptedOutputModes":["text"]}}' \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['task']['id'])")
# 2. Verify the task is completed
curl -s -X GET "http://localhost:9999/tasks/$TASK_ID" \
-H "A2A-Version: 1.0" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['status']['state'])"
# → TASK_STATE_COMPLETED
# 3. Attempt to cancel the completed task (expect 400, get 409)
curl -s -w "\nHTTP Status: %{http_code}\n" -X POST "http://localhost:9999/tasks/$TASK_ID:cancel" \
-H "A2A-Version: 1.0"
# → HTTP Status: 409 (should be 400)
TCK test
tests/compatibility/core_operations/test_task_lifecycle.py::TestCancelTask::test_cancel_terminal_task_returns_error[http_json]
- Linguagem predominante
- Java
- Estrelas
- 510
- Forks
- 196
- Merge médio
- 2d 4h
- PRs com merge (30d)
- 57
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de a2aproject/a2a-java
-
fix: handle blank push notification config id consistently across transportsTalvez já em andamento @prachisinghal-1 assumiu há 15 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
a2aproject/a2a-java#1012 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
a2aproject/a2a-java#464 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Create a sample that demonstrates how to use a shared contextId across multiple tasksTalvez livre de novo @tanish111 assumiu há 382 dias e não há nenhum pull request aberto. Abertasample
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
a2aproject/a2a-java#375 · 5 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 30/100
a2aproject/a2a-java#1299 ·
Mantenedores costumam responder em até 1 dia
-
Task state transitions are not trackedTalvez livre de novo @sumitvairagar assumiu há 21 dias e não há nenhum pull request aberto. Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 45/100
a2aproject/a2a-java#1222 · 4 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de a2aproject/a2a-java
Issues semelhantes
-
getRawTextContent() returns the lines of every page in reverse order (bottom to top) since 4.0.3Aberta
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 90/100
-
bug subsystem:agent-harness triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
ShaftHQ/SHAFT_ENGINE#7797 ·
Mantenedores costumam responder em até 1 dia
-
ARM: Q flag should be stickyAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 73/100
NationalSecurityAgency/ghidra#10155 ·
Mantenedores costumam responder em até 2 dias
-
area:data coverage
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 67/100
reacher-z/Awesome-CUA#4864 ·
Mantenedores costumam responder em até 19 dias
-
bug web-ui
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 67/100
jenkinsci/jenkins#27705 · 3 comentários ·
Mantenedores costumam responder em até 1 dia