fix(binjovi): admit the dashboard command routes at the gateway #88

Merged
binjovi-bot merged 1 commit from fix/binjovi-dashboard-command-routes into trunk 2026-09-10 13:51:52 +00:00
Owner

The dashboard cancel Build button does nothing. So do cancel release, retry
release, cancel Deploy, retry Deploy, and the release batch button.

The dashboard sends every command through the /api/v1/ui alias.
Binjovi.Api.DashboardHTTP rewrites that alias to the canonical API path and
answers with an HTML fragment for htmx. Oathkeeper matches the alias, and no
rule admitted it, so the gateway answered 404 before the request reached
Binjovi. The earlier app-side cancel fixes (CTRL-BUILD-01, CTRL-BUILD-02)
landed on a path that no request could reach.

Measured on the live gateway before this change:

POST /api/v1/releases/<id>/cancel       409  reached Binjovi
POST /api/v1/deployments/<id>/retry     409  reached Binjovi
POST /api/v1/ui/builds/<id>/cancel      404  gateway
POST /api/v1/ui/releases/<id>/cancel    404  gateway
POST /api/v1/ui/releases/<id>/retry     404  gateway
POST /api/v1/ui/deployments/<id>/cancel 404  gateway
POST /api/v1/ui/deployments/<id>/retry  404  gateway

Two POST rules now admit the alias. Both need a browser session or a service
JWT, and both emit the signed id_token. The API router keeps the state,
actor, origin, and idempotency checks.

tests/binjovi-dashboard-command-route-contract.sh holds the command path set,
asserts POST only, and rejects a broader URL.

https://claude.ai/code/session_01Cjo1R6zUbrgs2NM7SnnrDQ

The dashboard cancel Build button does nothing. So do cancel release, retry release, cancel Deploy, retry Deploy, and the release batch button. The dashboard sends every command through the `/api/v1/ui` alias. `Binjovi.Api.DashboardHTTP` rewrites that alias to the canonical API path and answers with an HTML fragment for htmx. Oathkeeper matches the alias, and no rule admitted it, so the gateway answered 404 before the request reached Binjovi. The earlier app-side cancel fixes (CTRL-BUILD-01, CTRL-BUILD-02) landed on a path that no request could reach. Measured on the live gateway before this change: ``` POST /api/v1/releases/<id>/cancel 409 reached Binjovi POST /api/v1/deployments/<id>/retry 409 reached Binjovi POST /api/v1/ui/builds/<id>/cancel 404 gateway POST /api/v1/ui/releases/<id>/cancel 404 gateway POST /api/v1/ui/releases/<id>/retry 404 gateway POST /api/v1/ui/deployments/<id>/cancel 404 gateway POST /api/v1/ui/deployments/<id>/retry 404 gateway ``` Two POST rules now admit the alias. Both need a browser session or a service JWT, and both emit the signed `id_token`. The API router keeps the state, actor, origin, and idempotency checks. `tests/binjovi-dashboard-command-route-contract.sh` holds the command path set, asserts POST only, and rejects a broader URL. https://claude.ai/code/session_01Cjo1R6zUbrgs2NM7SnnrDQ
fix(binjovi): admit the dashboard command routes at the gateway
All checks were successful
binjovi/ci Binjovi completed the frozen plan
653ba5b716
The Binjovi dashboard sends every command through the /api/v1/ui alias.
Binjovi.Api.DashboardHTTP rewrites that alias to the canonical API path and
answers with an HTML fragment for htmx. Oathkeeper matches the alias, and no
rule admitted it. The gateway answered 404 before the request reached Binjovi,
so the cancel Build, cancel release, retry release, cancel Deploy, retry Deploy
and release batch buttons all did nothing.

Two POST rules now admit the alias. Both need a browser session or a service
JWT, and both emit the signed id_token. The API router keeps the state, actor,
origin, and idempotency checks.

Measured on the live gateway before this change:

    POST /api/v1/releases/<id>/cancel       409  reached Binjovi
    POST /api/v1/deployments/<id>/retry     409  reached Binjovi
    POST /api/v1/ui/builds/<id>/cancel      404  gateway
    POST /api/v1/ui/releases/<id>/cancel    404  gateway
    POST /api/v1/ui/deployments/<id>/retry  404  gateway

tests/binjovi-dashboard-command-route-contract.sh holds the command path set
and rejects a broader URL.

Claude-Session: https://claude.ai/code/session_01Cjo1R6zUbrgs2NM7SnnrDQ
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/ory!88
No description provided.