Description
When an approval-required tool call is denied, the resulting query phase differs depending on how it was denied:
| Denial method |
Query phase |
A2ATask status |
POST /approval {"action":"rejected"} |
done |
failed |
| Timeout (no approval submitted) |
error |
failed |
Both cases represent "approval was denied." The A2ATask ends in failed in both cases, but the Query resource phase is inconsistent — operators monitoring for failed approvals must check two different phases.
Steps to Reproduce
Reject path:
- Submit a query that triggers an approval-required tool
- Wait for
input-required
curl -X POST .../v1/queries/$QNAME/approval -d '{"action":"rejected"}'
- Observe: query phase →
done, LLM generates a "not approved" acknowledgement response
Timeout path:
- Submit a query that triggers an approval-required tool (use a short timeout, e.g.
qa-delete-database has 30s)
- Wait for
input-required
- Do NOT approve — wait for timeout to expire
- Observe: query phase →
error
Expected
Both cases should result in the same query phase (either both error or both done). Since rejection is intentional and timeout is a failure condition, error for timeout and done for explicit reject may be defensible — but it should be documented and consistent.
Actual
done for explicit reject, error for timeout — same A2ATask failed status, different Query phase.
Context
Discovered during HITL QA regression testing on feat/hitl-tool-calls-apply (2026-06-17). All 4 functional test scenarios (approve, reject, timeout, no-approval tool) passed correctly.
Description
When an approval-required tool call is denied, the resulting query phase differs depending on how it was denied:
POST /approval {"action":"rejected"}donefailederrorfailedBoth cases represent "approval was denied." The A2ATask ends in
failedin both cases, but the Query resource phase is inconsistent — operators monitoring for failed approvals must check two different phases.Steps to Reproduce
Reject path:
input-requiredcurl -X POST .../v1/queries/$QNAME/approval -d '{"action":"rejected"}'done, LLM generates a "not approved" acknowledgement responseTimeout path:
qa-delete-databasehas 30s)input-requirederrorExpected
Both cases should result in the same query phase (either both
erroror bothdone). Since rejection is intentional and timeout is a failure condition,errorfor timeout anddonefor explicit reject may be defensible — but it should be documented and consistent.Actual
donefor explicit reject,errorfor timeout — same A2ATaskfailedstatus, different Query phase.Context
Discovered during HITL QA regression testing on
feat/hitl-tool-calls-apply(2026-06-17). All 4 functional test scenarios (approve, reject, timeout, no-approval tool) passed correctly.