← All Reports

HTTP Endpoint Response Body — ENG-5117

Designer (TC1) + End-to-End (sync / idempotency / fire-and-forget)

📅 2026-06-18 🌐 admin.automate.dev + api.automate.dev.sense.engineering 🤖 Claude Opus 4.8 + playwright-cli + GraphQL 👤 Paul Wagner
PARTIAL
Overall result
ENG-5117
Ticket under test
In Progress
Ticket status
3
Bugs (1 Major, 2 Minor) — after dev triage
6 / 6
E2E happy-path checks passed

📝 Verdict — PARTIAL

The core request/response feature works end-to-end: a deployed HTTP Endpoint returns 200 with a request-derived body and application/json; wrong method → 405; body > 1 MB → 413; and the X-Request-Id idempotency layer returns a cached response on match and 422 on mismatch. Fire-and-forget keeps its legacy behaviour (immediate 200, empty body) and is long-lived.

After dev triage: the “single-use endpoint” behaviour is by design (not a bug) — you poll while the branch is executing, before it reaches Return. Three bugs stand: ContentType input missing (Major), 503 on idempotent replay (Minor), and the package-icon 404 (Minor). Several apparent designer “failures” were also confirmed by-design. The response-body and request $input shapes are slated to change alongside the ContentType fix.

Bugs to raise (3)

🟡 Minor — 503 on idempotent replay of a failed X-Request-Id

From the E2E run (TC4). Replaying an X-Request-Id whose first attempt didn’t complete returns 503 Service Unavailable. The dev confirmed 410 Gone is intended here but 503 is not. Filed as ENG-5117-BUG3.

🟠 Major — ContentType input missing from the HTTP Endpoint activity

From TC1. No ContentType control exists on the activity in any Mode — the response Content-Type can’t be configured. Confirmed by the dev: it existed, was removed when planning to relocate it, and was not re-added. Filed as ENG-5117-BUG2.

🟡 Minor — HTTP Endpoint package icon 404

From TC1 regression. assets/shared-ui/icons/designer-packages/http.svg returns 404; the activity falls back to the default icon. Filed as ENG-5117-BUG1.

TC1 — Verify HTTP Endpoint Activity Inputs in Designer

Overall: PARTIAL — 9 pass / 4 fail / 4 blocked (verdicts are build-vs-test-case; several “fails” are test-case errors — see Not-bugs)

AreaResultDetail
Drag onto canvas + node rendersPASSHTTP Endpoint adds with ports On Created / On Request Received
Inputs present (Method, ContentType, Mode)FAILOnly Methods + Mode present; no ContentType (BUG2)
Mode optionsFAIL vs TCThree options (Fire and forget default, Sync, Async) — by design (backwards compat)
Set Mode Sync/Async; Methods POST/GETPASSAccepted; Methods is a multi-select (POST/GET/PUT/PATCH/DELETE)
Save + reload persistencePASSMethods & Mode persisted across save + reload
Return response-value inputFAIL vs TCNo body property — response body is the value wired into Return ($input), by design
ContentType stepsBLOCKEDNo ContentType input to set (BUG2)

E2E — TC2 / TC4 / TC5 (deployed via GraphQL)

The GoJS canvas can’t be wired by automation, so probe workflows were authored as SerializedDefinition JSON and deployed via the admin GraphQL API (workflowCreatedraftSaveinstallationDeploy). The endpoint URL is minted per endpoint and surfaced only via $scope.endpoint.url in the On Created branch. URL scheme: https://api.automate.<env>.sense.engineering/package/http/endpoint/<token> (public API host, not behind Basic Auth).

TC2 — Synchronous mode

CheckResultEvidence
POST valid JSON → 200, request-derived body, Content-TypePASSHTTP 200, ~0.5–1.5s, application/json, body echoes the sent payload
Wrong method (GET) → 405PASSGET → 405
Body > 1 MB → rejectedPASS1.3 MB → 413 (no run created)
Subsequent requests after the firstFAILInstance completes after 1 request → 410/503 (High finding)
Sync 5-min timeoutNOT RUNNeeds a 5-minute wait; deferred

TC4 — Idempotency (X-Request-Id)

CheckResultEvidence
Same id + same body → cached 200, no re-execPASSReplay returned byte-identical 200 (0.17s, from the grain)
Same id + different body → 422PASSExistsMismatch → 422

TC5 — Fire-and-forget (backwards compatibility)

CheckResultEvidence
POST → immediate 200, empty bodyPASSHTTP 200, Content-Length: 0, ~0.2s
Endpoint handles multiple requestsPASSTwo POSTs both 200; instance stayed Executing and logged both

Single-use endpoint — resolved (by design)

Observed: the Sync probe instance went Executing → Completed after one request; further requests got 410 Gone / 503. The fire-and-forget probe (no Return) stayed Executing and served many — isolating the cause to Return ending the instance.

Dev triage: by design. A request is served while its branch executes; you poll while the branch is executing, before it reaches Return. 410 Gone is intended; only the 503 on replay is a defect (filed as ENG-5117-BUG3). The response-body shape and the request $input shape (→ { body, headers }) are slated to change alongside the ContentType fix.

Confirmed not-bugs (by design — per dev)

The 7 test cases were updated to match this confirmed design.

Deferred / not run

Need multi-minute / 1-hour waits or an async-polling harness: TC2 sync 5-minute timeout, TC3 async (202 + Location polling + 1-hour TTL), TC6 fault paths, TC7 missing/partial Return. Two probe workflows were left deployed in the Dev New org (QA ENG-5117 E2E Sync, QA ENG-5117 E2E FireForget).