Root cause: ServiceAdapter dispatcher sets X-Upstream-Path to template strings like /v1/poimen/executions/{id}/stream with literal {id}. The handler extracted {id} as the workflow ID instead of the actual value.
Fix: All handlers read workflow_id from query params (?workflow_id=xxx). Paths changed to flat resource names without path parameters.
API contract:
GET /executions — list
GET /executions/detail?workflow_id=xxx — describe
GET /executions/history?workflow_id=xxx — history
GET /executions/stream?workflow_id=xxx — SSE
POST /executions/signal?workflow_id=xxx — signal
DELETE /executions/detail?workflow_id=xxx — terminate
All accessed via X-Service: poimen + X-Resource: <name> headers.
**Root cause:** ServiceAdapter dispatcher sets X-Upstream-Path to template strings like `/v1/poimen/executions/{id}/stream` with literal `{id}`. The handler extracted `{id}` as the workflow ID instead of the actual value.
**Fix:** All handlers read `workflow_id` from query params (`?workflow_id=xxx`). Paths changed to flat resource names without path parameters.
**API contract:**
```
GET /executions — list
GET /executions/detail?workflow_id=xxx — describe
GET /executions/history?workflow_id=xxx — history
GET /executions/stream?workflow_id=xxx — SSE
POST /executions/signal?workflow_id=xxx — signal
DELETE /executions/detail?workflow_id=xxx — terminate
```
All accessed via `X-Service: poimen` + `X-Resource: <name>` headers.
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
rock
merged commit aaa9a5d1cb into main2026-09-26 12:52:21 +00:00
rock
deleted branch fix/poimen-path-param-routing2026-09-26 12:52:21 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Root cause: ServiceAdapter dispatcher sets X-Upstream-Path to template strings like
/v1/poimen/executions/{id}/streamwith literal{id}. The handler extracted{id}as the workflow ID instead of the actual value.Fix: All handlers read
workflow_idfrom query params (?workflow_id=xxx). Paths changed to flat resource names without path parameters.API contract:
All accessed via
X-Service: poimen+X-Resource: <name>headers.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