Root cause: ServiceAdapter dispatcher sets X-Upstream-Path to template
strings like /v1/poimen/executions/{id}/stream with literal {id}.
extractWorkflowID() returned '{id}' instead of the actual workflow ID.
Fix:
- All handlers read workflow_id from ?workflow_id=xxx query param
- Remove path param extraction (extractWorkflowID)
- Update spec paths: remove {id} segments, use flat resource paths
/v1/poimen/executions/detail?workflow_id=xxx
/v1/poimen/executions/stream?workflow_id=xxx
/v1/poimen/executions/history?workflow_id=xxx
/v1/poimen/executions/signal?workflow_id=xxx
- Exact path matching in ServeHTTP (no prefix/suffix matching)
API contract:
GET /v1/poimen/executions — list all
GET /v1/poimen/executions/detail?workflow_id=xxx — describe one
GET /v1/poimen/executions/history?workflow_id=xxx — event history
GET /v1/poimen/executions/stream?workflow_id=xxx — SSE events
POST /v1/poimen/executions/signal?workflow_id=xxx — signal
DELETE /v1/poimen/executions/detail?workflow_id=xxx — terminate