You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[external task result envelope](./external-execution.md#published-contract-seams).
11362
+
Workflow tasks, signal/update ordering, replay, and history mutation stay
11363
+
inside the server. The carrier only moves declared input and result envelopes
11364
+
across an HTTPS boundary.
11365
+
11366
+
## What It Is
11367
+
11368
+
The invocable HTTP carrier exists for activity-grade work that an operator
11369
+
team would rather host as an HTTPS handler than as a long-poll worker:
11370
+
11371
+
- operator maintenance activities and platform automation hosted in an internal
11372
+
HTTP service
11373
+
- bounded integration handoffs that already terminate at an HTTPS endpoint
11374
+
- serverless or container-based activity handlers that expose a single POST
11375
+
route per activity type
11376
+
11377
+
Activity execution is delegated to the configured endpoint. Durable workflow
11378
+
state, history, and the activity-completion contract remain server-owned.
11379
+
11380
+
## Activity-Only Scope
11381
+
11382
+
The published manifest fixes the carrier scope to `task_kinds: [activity_task]`
11383
+
and names explicit non-goals so the boundary cannot drift through configuration:
11384
+
11385
+
- `workflow_task_execution` — workflow tasks remain on real workflow runtimes
11386
+
- `workflow_replay` — the carrier never replays workflow history
11387
+
- `history_mutation` — handlers may not edit event history directly
11388
+
- `generic_webhook_ingress` — generic ingress goes through a bridge adapter,
11389
+
not through this carrier
11390
+
11391
+
A handler mapping with a non-activity `kind`, or a carrier mapping with a
11392
+
non-`activity_task` capability, fails configuration validation with
11393
+
`invalid_invocable_carrier_scope` before it can appear on the activity poll
11394
+
response.
11395
+
11396
+
## HTTPS Target And Method
11397
+
11398
+
Carrier `target_fields` are validated by the server before a mapping is
11399
+
exposed:
11400
+
11401
+
| Field | Required | Allowed | Notes |
11402
+
| --- | --- | --- | --- |
11403
+
| `url` | yes | absolute HTTPS URL, or HTTP for loopback dev (`localhost`, `127.0.0.0/8`, `::1`) | URL credentials (`scheme://user:pass@host`) are forbidden. |
11404
+
| `method` | no | `POST` | Defaults to `POST`. No other HTTP method is accepted. |
11405
+
| `timeout_seconds` | no | integer 1–900 | Transport deadline for one handler attempt. The task deadline is enforced separately by the server/runtime. |
11406
+
| `retry_policy` | no | object (see below) | Carrier-owned transport retry budget. |
11407
+
11408
+
Invalid targets fail closed with `invalid_carrier_target` and never appear in
11409
+
discovery output.
11410
+
11411
+
## Auth Model
11412
+
11413
+
Non-loopback `invocable_http` mappings must resolve an `auth_ref` from the
11414
+
external executor configuration. Unauthenticated invocable HTTP is allowed
11415
+
only against loopback HTTP targets so a developer can iterate locally.
11416
+
11417
+
- `auth_refs` are declared once at the top of the config and referenced from
11418
+
defaults or per-mapping. Supported types include `profile`, `env`,
11419
+
`token_file`, `mtls`, and `signed_headers`.
11420
+
- A mapping that resolves to a non-loopback target without an effective
11421
+
`auth_ref` fails configuration validation with `missing_invocable_auth_ref`.
11422
+
- Tokens, secrets, signatures, and authorization headers are never echoed in
11423
+
cluster diagnostics, in `dw server:info` output, or on the activity poll
11424
+
response. The mapping diagnostics report which `auth_ref` resolved and the
11425
+
redacted summary, never the credential value.
11426
+
11427
+
The intent is that an operator can read the redacted runtime diagnostics and
11428
+
confirm which auth secret will be used, without the server ever exposing the
11429
+
secret itself.
11430
+
11431
+
## Transport Retry Versus Durable Activity Retry
11432
+
11433
+
The optional `retry_policy` on an invocable carrier is **transport-only**. It
11434
+
governs the carrier's HTTP delivery before the handler reports a result:
11435
+
11436
+
| `retry_policy` field | Allowed | Default | Meaning |
11437
+
| --- | --- | --- | --- |
11438
+
| `max_attempts` | integer 1–5 | `1` | Maximum HTTP delivery attempts the carrier will make for one task lease. |
11439
+
| `backoff_seconds` | array of integers, each 0–300, up to 5 entries | `[]` | Per-attempt backoff before the next HTTP try. |
11440
+
| `retryable_status_codes` | subset of `[408, 425, 429, "5xx"]` | `[408, 429, "5xx"]` | Response codes that count as transport-retryable. |
11441
+
11442
+
Transport retries never become history events. The server only learns about
11443
+
the carrier's final attempt — either the structured success/failure envelope
11444
+
the handler returned, or a transport timeout that maps to
11445
+
`failure.kind=timeout, classification=deadline_exceeded`, or one of the
11446
+
malformed-output paths.
11447
+
11448
+
Once the handler reports a result, the **durable activity retry policy
11449
+
remains the server/runtime authority**. Task-level retry, scheduling, and
11450
+
backoff continue to follow the activity retry policy declared on the
11451
+
workflow side. The carrier's `retry_policy` does not extend, override, or
11452
+
substitute for it.
11453
+
11454
+
## Request And Response Envelope
11455
+
11456
+
The server sends the carrier-neutral input envelope and expects the
0 commit comments