Problem
The gateway logic in taktora-medkit-gateway is pure (&MergedView, params) -> SovdResponse functions with no transport. There is no running server, so "drop-in client compatibility" is untestable end-to-end. We need the thinnest vertical slice that takes HTTP in and emits contract-correct SOVD JSON out — backed by the existing mock provider so it runs with no taktora wiring, no hardware, and no iceoryx2.
Proposal
Build taktora-medkit-gateway-axum: a tokio/axum transport that mounts the pure gateway handlers over the in-process MockProvider + MergePipeline, serving the read-diagnostic core families on the /api/v1 prefix:
GET /api/v1/, /api/v1/version-info, /api/v1/health
- Entity tree (read):
areas, components, apps, functions, each with {id} and the relationship sub-resources the contract defines (/contains, /components, /hosts, /depends-on, /is-located-on, /belongs-to).
- Faults:
GET /faults, GET /components/{id}/faults, GET/DELETE /components/{id}/faults/{fault_code}, with the ?status= filter (pending|confirmed|cleared|healed|all).
data (read): GET /components/{id}/data[/{topic_path}] sourced from what the (mock for now) provider exposes.
Deferred families return a contract-shaped 501 Not Implemented (ros2_medkit itself uses 501 for disabled features): operations, configurations-write, bulk-data, locks, scripts, updates/OTA, and the x-medkit-* vendor endpoints. Wire the routes so a path-hardcoding client gets a clean documented 501, not a 404/parse error.
Fold in the baseline transport hardening here rather than a separate slice: CORS, a token-bucket rate limit, and optional TLS — all configurable, all off the control path (this process is free to heap-allocate and run tokio).
Responses are diffed against contract/golden/ so the served bytes match the captured contract.
Acceptance
Why
This is the walking skeleton: once HTTP-in/SOVD-JSON-out works against the mock and passes contract diffing, every later slice (manifest, bindings, triggers, auth) is an incremental, independently-demoable addition to a server that already proves the wire contract.
Blocked by
Problem
The gateway logic in
taktora-medkit-gatewayis pure(&MergedView, params) -> SovdResponsefunctions with no transport. There is no running server, so "drop-in client compatibility" is untestable end-to-end. We need the thinnest vertical slice that takes HTTP in and emits contract-correct SOVD JSON out — backed by the existing mock provider so it runs with no taktora wiring, no hardware, and no iceoryx2.Proposal
Build
taktora-medkit-gateway-axum: a tokio/axum transport that mounts the pure gateway handlers over the in-processMockProvider+MergePipeline, serving the read-diagnostic core families on the/api/v1prefix:GET /api/v1/,/api/v1/version-info,/api/v1/healthareas,components,apps,functions, each with{id}and the relationship sub-resources the contract defines (/contains,/components,/hosts,/depends-on,/is-located-on,/belongs-to).GET /faults,GET /components/{id}/faults,GET/DELETE /components/{id}/faults/{fault_code}, with the?status=filter (pending|confirmed|cleared|healed|all).data(read):GET /components/{id}/data[/{topic_path}]sourced from what the (mock for now) provider exposes.Deferred families return a contract-shaped
501 Not Implemented(ros2_medkit itself uses 501 for disabled features): operations, configurations-write, bulk-data, locks, scripts, updates/OTA, and thex-medkit-*vendor endpoints. Wire the routes so a path-hardcoding client gets a clean documented 501, not a 404/parse error.Fold in the baseline transport hardening here rather than a separate slice: CORS, a token-bucket rate limit, and optional TLS — all configurable, all off the control path (this process is free to heap-allocate and run tokio).
Responses are diffed against
contract/golden/so the served bytes match the captured contract.Acceptance
cargo runstarts an axum server on the documented default bind that serves the read-core families over/api/v1backed by the mock provider, with no taktora deps in the core path.contract/golden/*.jsonshape (integration test hits the live server and diffs).501with a contract-shaped body; a smoke test asserts 501 (not 404) on at least one route per deferred family.REQ_0900endpoint requirements andTEST_0900IDs;cargo test+ Linux clippy green.Why
This is the walking skeleton: once HTTP-in/SOVD-JSON-out works against the mock and passes contract diffing, every later slice (manifest, bindings, triggers, auth) is an incremental, independently-demoable addition to a server that already proves the wire contract.
Blocked by