---
id: "external-call-inline-without-durable-path"
type: "rule"
severity: "warning"
url: "https://localhost:3000/catalogue/rules/external-call-inline-without-durable-path"
---

# Inline external call without durable fallback

A service calls a third party synchronously and has no queue or workflow engine to hand the request to on failure.

| | |
|---|---|
| Severity | warning |
| Selects | every node of kind app-server |
| Components in scope | 99 |

## Why

A service that calls a third party synchronously, with no queue or workflow engine attached, has nowhere to park the request when the third party is slow or down. The failure becomes the user's problem instead of a retried job.

## What it checks

It looks at every node of kind app-server, and fires when:

- all of these hold:
  - the node has at least one synchronous outgoing edge to a third-party-api
  - this does not hold:
    - the node has at least one connected edge joining a workflow-engine or queue

Message template:

```
Service '{{node.id}}' calls a third party inline with no queue or workflow engine to fall back to when that call fails.
```

## Applies to

- [Application server](https://localhost:3000/catalogue/kinds/app-server.md) `app-server`

99 catalogue components fall under it.

## Tripped by

Reference designs whose broken twin names this rule in its header:

- [coinbase-exchange](https://localhost:3000/d/zeema/coinbase-exchange)
- [doordash-delivery](https://localhost:3000/d/zeema/doordash-delivery)
- [grab-geo](https://localhost:3000/d/zeema/grab-geo)
- [hotel-reservation](https://localhost:3000/d/zeema/hotel-reservation)
- [hotstar-streaming](https://localhost:3000/d/zeema/hotstar-streaming)
- [metrics-monitoring](https://localhost:3000/d/zeema/metrics-monitoring)
- [monzo-platform](https://localhost:3000/d/zeema/monzo-platform)
- [nubank-core](https://localhost:3000/d/zeema/nubank-core)
- [snapchat-platform](https://localhost:3000/d/zeema/snapchat-platform)
- [stripe-payments](https://localhost:3000/d/zeema/stripe-payments)
- [whatsapp-messaging](https://localhost:3000/d/zeema/whatsapp-messaging)
- [zerodha-kite](https://localhost:3000/d/zeema/zerodha-kite)

## Source (`rule` YAML, verbatim)

```yaml
# yaml-language-server: $schema=../schema/rule.schema.json
# A service that calls a third party synchronously and has no queue or workflow engine
# attached has nowhere to park the request when the third party is slow or down. The
# failure becomes the user's problem instead of a retried job.
# Tripped by: designs/doordash-delivery.broken.yaml
schemaVersion: "1"
type: "rule"
id: "external-call-inline-without-durable-path"
severity: "warning"
select:
  node:
    kind: "app-server"
when:
  all:
    - hasEdge:
        direction: "out"
        mode: "sync"
        peerKind: "third-party-api"
    - not:
        hasEdge:
          direction: "any"
          peerKind: ["workflow-engine", "queue"]
message: "Service '{{node.id}}' calls a third party inline with no queue or workflow engine to fall back to when that call fails."
```

Human page: https://localhost:3000/catalogue/rules/external-call-inline-without-durable-path
