# Worked examples

Four complete runs against the real endpoints: a design that passes, a fix loop, the human handoff, and
retries. The request/response pairs are exactly what the API's code answered.

> **How these were produced.** The runs went through the API's own code — the routes, the PNG gate, the
> validator, the framing step, the views — with the database and the tracer replaced by in-memory fakes.
> The tracer fake replays what the real tracer returned for the sample PNGs
> ([bracelet](../assets/samples/bracelet-160x18-valid.png),
> [bracelet with a detached region](../assets/samples/bracelet-160x18-disconnected.png),
> [ring](../assets/samples/ring-56x6-valid.png)); ids, secrets and approval tokens were replaced by fixed
> example values, and timestamps come from a test clock. **Live runs require the API to be switched on**
> — until it is, every `/api/agent/v1` path answers the site's own `404` page, like any unknown path.
> Numbers are a snapshot at contract `2026-09`; the live ones are in `GET /capabilities`.

```sh
BASE=https://aperta-designs.com/api/agent/v1
```

---

## 1. A successful design

A person wants a bracelet: wrist 165 mm, comfortable fit, 18 mm wide.

**1.1 — Capabilities** (once per session). The parts this run uses:

```json
{
  "minOpeningMm": 0.2,
  "minMetalMm": 0.6,
  "recommendedPixels": "1536x1024",
  "marginPct": 5,
  "submissionsPerJob": 10
}
```

**1.2 — Open the job.**

```sh
curl -sS -X POST "$BASE/jobs" -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0b8e2c4d-1f3a-4c5b-9d6e-7f8a9b0c1d2e" \
  -d '{"productType":"bracelet","size":{"wristMm":165,"fit":"comfort"},"widthMm":18,"attribution":{"agentPlatform":"openclaw","integration":"gift-concierge","skillVersion":"1.0.0","apiVersion":"v1"}}'
```

```http
HTTP/1.1 201
content-type: application/json

{
  "job": {
    "id": "1b4e7c2a-5d3f-4e6a-9b8c-2d1e0f3a4b5c",
    "status": "open",
    "productType": "bracelet",
    "dims": { "lengthMm": 160.4, "widthMm": 18, "gapMm": 25.4, "thicknessMm": 1.5 },
    "sizeInput": { "wristMm": 165, "fit": "comfort" },
    "drawing": {
      "ratio": 8.91,
      "recommendedPixels": "1536x1024",
      "orientation": "landscape",
      "minOpeningAreaMm2": 1.155
    },
    "limits": { "submissionsLeft": 10 },
    "latestSubmission": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "attribution": {
      "agentPlatform": "openclaw",
      "integration": "gift-concierge",
      "skillVersion": "1.0.0",
      "apiVersion": "v1"
    },
    "createdAt": "2026-09-25T12:00:00.000Z",
    "expiresAt": "2026-10-02T12:00:00.000Z"
  },
  "credentials": { "jobSecret": "ajs_RXhhbXBsZVNlY3JldE9uZUZvclRoZURvY3NfX19fXzE" }
}
```

The blank is 160.4 × 18 mm, so the
piece is drawn at ratio **8.91**. The agent stores the secret.

**1.3 — Generate** a 1536 × 1024 image at that ratio ([prompting.md](prompting.md)), clean it to pure black
and white, and check it against [image-contract.md](image-contract.md). Here the image is the sample
[`bracelet-160x18-valid.png`](../assets/samples/bracelet-160x18-valid.png) — drawn at 160 : 18 = 8.89, within
5% of 8.91.

**1.4 — Submit.**

```sh
curl -sS -X POST "$BASE/jobs/$JOB/submissions" -H "Authorization: Bearer $SECRET" \
  -H "Content-Type: image/png" --data-binary @bracelet-160x18-valid.png
```

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 1,
    "status": "ready",
    "validation": { "valid": true, "errors": [], "warnings": [] },
    "geometry": {
      "lengthMm": 160.4,
      "widthMm": 18.04,
      "drawnRatio": 8.89,
      "stretch": 1,
      "cuts": 12,
      "openAreaPct": 9.25,
      "estWeightGrams": 33.6
    },
    "files": {
      "cutoutsSvg": "https://aperta-designs.com/api/agent/v1/jobs/1b4e7c2a-5d3f-4e6a-9b8c-2d1e0f3a4b5c/submissions/1/cutouts.svg",
      "previewSvg": "https://aperta-designs.com/api/agent/v1/jobs/1b4e7c2a-5d3f-4e6a-9b8c-2d1e0f3a4b5c/submissions/1/preview.svg"
    },
    "approval": {
      "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
      "status": "pending",
      "expiresAt": "2026-10-02T12:00:00.000Z"
    },
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-25T12:00:25.000Z",
    "durationMs": 6200
  }
}
```

`ready`, no errors, no warnings. The framed strip kept the drawing's own width
(18.04 mm — within 5% of the declared 18) and was not stretched
(`stretch` 1).

**1.5 — Look at the preview** before handing it over (or show it to the person):

```sh
curl -sS "$BASE/jobs/$JOB/submissions/1/preview.svg" -H "Authorization: Bearer $SECRET" -o preview.svg
```

```http
HTTP/1.1 200
content-type: image/svg+xml; charset=utf-8

<svg xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 162.4 20.04" role="img"><path d="M0,7.8L0.2,7.4L0.3,6.9L0.6,5.8L1.1,4.8L1.7,3.8L2.4,3L3.2,2.2L4.4,1.3L5.8,0.6L6.9,0.3L7.4,0.2L7.8,0L152.5,0L153,0.2L153.5,0.3L154.6,0…  (2445 bytes in all)
```

**1.6 — Hand off.** The agent tells the person, in their language: "Your bracelet design is ready:
160.4 × 18 mm brass cuff, ₪434 including VAT and shipping. Open this link to see it and approve it — the
page is in Hebrew; approving asks you to sign in on Aperta, then continues to the order:
https://aperta-designs.com/a/Rk3vW9pQ2sLm". Then it reads the job now and then:

```http
HTTP/1.1 200
content-type: application/json

{
  "job": {
    "id": "1b4e7c2a-5d3f-4e6a-9b8c-2d1e0f3a4b5c",
    "status": "ready",
    "productType": "bracelet",
    "dims": { "lengthMm": 160.4, "widthMm": 18, "gapMm": 25.4, "thicknessMm": 1.5 },
    "sizeInput": { "wristMm": 165, "fit": "comfort" },
    "drawing": {
      "ratio": 8.91,
      "recommendedPixels": "1536x1024",
      "orientation": "landscape",
      "minOpeningAreaMm2": 1.155
    },
    "limits": { "submissionsLeft": 9 },
    "latestSubmission": {
      "no": 1,
      "status": "ready",
      "errorCodes": [],
      "warningCodes": [],
      "createdAt": "2026-09-25T12:00:25.000Z"
    },
    "approval": {
      "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
      "status": "pending",
      "expiresAt": "2026-10-02T12:00:00.000Z"
    },
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "attribution": {
      "agentPlatform": "openclaw",
      "integration": "gift-concierge",
      "skillVersion": "1.0.0",
      "apiVersion": "v1"
    },
    "createdAt": "2026-09-25T12:00:00.000Z",
    "expiresAt": "2026-10-02T12:00:00.000Z"
  }
}
```

---

## 2. An invalid design, then a fix

Same size, a new job (no attribution this time).

```http
HTTP/1.1 201
content-type: application/json

{
  "job": {
    "id": "8e2d4f6a-1c3b-4a5d-8e7f-9a0b1c2d3e4f",
    "status": "open",
    "productType": "bracelet",
    "dims": { "lengthMm": 160.4, "widthMm": 18, "gapMm": 25.4, "thicknessMm": 1.5 },
    "sizeInput": { "wristMm": 165, "fit": "comfort" },
    "drawing": {
      "ratio": 8.91,
      "recommendedPixels": "1536x1024",
      "orientation": "landscape",
      "minOpeningAreaMm2": 1.155
    },
    "limits": { "submissionsLeft": 10 },
    "latestSubmission": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "attribution": null,
    "createdAt": "2026-09-26T12:00:00.000Z",
    "expiresAt": "2026-10-03T12:00:00.000Z"
  },
  "credentials": { "jobSecret": "ajs_RXhhbXBsZVNlY3JldFR3b0ZvclRoZURvY3NfX19fXzI" }
}
```

**2.1 — The first drawing has a hairline slit.** One opening is far narrower than 0.2 mm. (This drawing is
a test fixture from Aperta's suite, not one of the shipped samples.)

```http
HTTP/1.1 422
content-type: application/json

{
  "submission": {
    "no": 1,
    "status": "failed_validation",
    "validation": {
      "valid": false,
      "errors": [
        {
          "code": "OPENING_TOO_SMALL",
          "severity": "error",
          "message": "1 opening(s) are narrower than 0.2 mm.",
          "agent_instruction": "Widen each marked opening to at least 0.2 mm at its narrowest point, or remove it. The cutter cannot open anything finer.",
          "locations": [{ "x": 28.07000000000008, "y": 9.020000000000078, "r": 3.5067 }],
          "details": "1 cutout(s) smaller than the minimum opening 0.2mm at (mm): (28.1, 9.0). Enlarge or remove them."
        }
      ],
      "warnings": []
    },
    "geometry": null,
    "files": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-26T12:00:30.000Z",
    "durationMs": 4900
  }
}
```

The agent reads the error: one opening at x ≈ 28 mm from the left end, y ≈ 9 mm from the top edge — the
middle of the strip — is below the 0.2 mm floor. It regenerates, asking the model for bolder openings.

**2.2 — The second drawing passes, with a warning.** This time the image is
[`bracelet-160x18-disconnected.png`](../assets/samples/bracelet-160x18-disconnected.png), sent as multipart:

```sh
curl -sS -X POST "$BASE/jobs/$JOB/submissions" -H "Authorization: Bearer $SECRET" \
  -F "image=@bracelet-160x18-disconnected.png;type=image/png"
```

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 2,
    "status": "ready",
    "validation": {
      "valid": true,
      "errors": [],
      "warnings": [
        {
          "code": "DISCONNECTED_REGIONS",
          "severity": "warning",
          "message": "The design has more than one separate black region.",
          "agent_instruction": "Connect every black region to the main body with a bridge of metal, or remove the stragglers. Only the largest region is traced; the rest vanish.",
          "details": "2 separate regions; the largest holds 96.39% of the ink."
        }
      ]
    },
    "geometry": {
      "lengthMm": 160.4,
      "widthMm": 18.04,
      "drawnRatio": 8.89,
      "stretch": 1,
      "cuts": 12,
      "openAreaPct": 9.25,
      "estWeightGrams": 33.6
    },
    "files": {
      "cutoutsSvg": "https://aperta-designs.com/api/agent/v1/jobs/8e2d4f6a-1c3b-4a5d-8e7f-9a0b1c2d3e4f/submissions/2/cutouts.svg",
      "previewSvg": "https://aperta-designs.com/api/agent/v1/jobs/8e2d4f6a-1c3b-4a5d-8e7f-9a0b1c2d3e4f/submissions/2/preview.svg"
    },
    "approval": {
      "url": "https://aperta-designs.com/a/Tn5bX8cJ4hGd",
      "status": "pending",
      "expiresAt": "2026-10-03T12:00:00.000Z"
    },
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-26T12:01:34.900Z",
    "durationMs": 5940
  }
}
```

`ready` — but `DISCONNECTED_REGIONS` says a second black region (a blob floating above the strip) was
dropped before tracing. The piece that will be cut is the strip alone. If the blob mattered, the agent
redraws it connected to the body; here it was a stray mark, so the agent removes it and submits the clean
drawing:

**2.3 — The fix.**

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 3,
    "status": "ready",
    "validation": { "valid": true, "errors": [], "warnings": [] },
    "geometry": {
      "lengthMm": 160.4,
      "widthMm": 18.04,
      "drawnRatio": 8.89,
      "stretch": 1,
      "cuts": 12,
      "openAreaPct": 9.25,
      "estWeightGrams": 33.6
    },
    "files": {
      "cutoutsSvg": "https://aperta-designs.com/api/agent/v1/jobs/8e2d4f6a-1c3b-4a5d-8e7f-9a0b1c2d3e4f/submissions/3/cutouts.svg",
      "previewSvg": "https://aperta-designs.com/api/agent/v1/jobs/8e2d4f6a-1c3b-4a5d-8e7f-9a0b1c2d3e4f/submissions/3/preview.svg"
    },
    "approval": {
      "url": "https://aperta-designs.com/a/Tn5bX8cJ4hGd",
      "status": "pending",
      "expiresAt": "2026-10-03T12:00:00.000Z"
    },
    "price": {
      "currency": "ILS",
      "base": 399,
      "shipping": 35,
      "total": 434,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-26T12:02:40.840Z",
    "durationMs": 6200
  }
}
```

No warnings. The job now points at submission 3; the approval link is the same one and shows the newest
passing design:

```json
{
  "status": "ready",
  "limits": { "submissionsLeft": 7 },
  "latestSubmission": {
    "no": 3,
    "status": "ready",
    "errorCodes": [],
    "warningCodes": [],
    "createdAt": "2026-09-26T12:02:40.840Z"
  },
  "approval": {
    "url": "https://aperta-designs.com/a/Tn5bX8cJ4hGd",
    "status": "pending",
    "expiresAt": "2026-10-03T12:00:00.000Z"
  }
}
```

Three submissions were counted (one failed, two passed), so 7 are
left.

---

## 3. The human handoff

Back to the job of example 1. The person has the link; the agent polls, at most once every
`capabilities.limits.pollIntervalSec` seconds (30).

**3.1 — Pending.**

```json
{
  "status": "ready",
  "approval": {
    "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
    "status": "pending",
    "expiresAt": "2026-10-02T12:00:00.000Z"
  }
}
```

**3.2 — The person declines** on the approval page. (The page makes this call, with the token only; agents
never call it.)

```http
HTTP/1.1 200
content-type: application/json

{ "ok": true, "status": "declined" }
```

The agent's next poll sees it — and the link now expires 24 hours after the decline:

```json
{
  "status": "declined",
  "approval": {
    "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
    "status": "declined",
    "expiresAt": "2026-09-26T13:00:00.000Z"
  },
  "expiresAt": "2026-09-26T13:00:00.000Z"
}
```

**3.3 — The agent asks what to change and submits a new design to the same job.** It passes (here with a
warning), and the same link is live again with the new design:

```json
{
  "no": 2,
  "status": "ready",
  "validation": {
    "valid": true,
    "errors": [],
    "warnings": [
      {
        "code": "DISCONNECTED_REGIONS",
        "severity": "warning",
        "message": "The design has more than one separate black region.",
        "agent_instruction": "Connect every black region to the main body with a bridge of metal, or remove the stragglers. Only the largest region is traced; the rest vanish.",
        "details": "2 separate regions; the largest holds 96.39% of the ink."
      }
    ]
  },
  "approval": {
    "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
    "status": "pending",
    "expiresAt": "2026-10-02T12:00:00.000Z"
  }
}
```

**3.4 — The person approves.** If their page still showed the old design, the approval is refused and the
page reloads to show the current one (the page's call, shown for completeness):

```http
HTTP/1.1 409
content-type: application/json

{
  "error": {
    "code": "SUBMISSION_SUPERSEDED",
    "message": "The submission on the approval page is no longer the job's current design.",
    "agent_instruction": "This answer goes to the approval page, not to the agent: a newer passing submission replaced the design the person was looking at. Reload the page so the person sees and decides on the current design; nothing was approved."
  }
}
```

On the reloaded page they approve submission 2; the design is copied into their Aperta account:

```http
HTTP/1.1 201
content-type: application/json

{ "designId": "d15ea5e0-2a3b-4c5d-8e9f-0a1b2c3d4e5f" }
```

**3.5 — The agent sees the approval:**

```json
{
  "status": "approved",
  "limits": { "submissionsLeft": 0 },
  "latestSubmission": {
    "no": 2,
    "status": "ready",
    "errorCodes": [],
    "warningCodes": ["DISCONNECTED_REGIONS"],
    "createdAt": "2026-09-25T13:10:00.000Z"
  },
  "approval": {
    "url": "https://aperta-designs.com/a/Rk3vW9pQ2sLm",
    "status": "approved",
    "expiresAt": "2027-03-24T13:40:05.940Z"
  }
}
```

The job is locked (`submissionsLeft` 0; a new upload answers `409 JOB_LOCKED`). The person continues to the
order on aperta-designs.com; the agent's part is done. It tells the person the order continues on the site
and does not poll any more.

---

## 4. Retries

A ring, US size 7, 6 mm wide, drawn from
[`ring-56x6-valid.png`](../assets/samples/ring-56x6-valid.png) (56 : 6 = 9.33).

```http
HTTP/1.1 201
content-type: application/json

{
  "job": {
    "id": "3f6a9c2e-8b1d-4f7a-a2c5-6e9b0d3f1a8c",
    "status": "open",
    "productType": "ring",
    "dims": { "lengthMm": 55.95, "widthMm": 6, "gapMm": 3, "thicknessMm": 1.5 },
    "sizeInput": { "usRingSize": 7 },
    "drawing": {
      "ratio": 9.33,
      "recommendedPixels": "1536x1024",
      "orientation": "landscape",
      "minOpeningAreaMm2": 0.134
    },
    "limits": { "submissionsLeft": 10 },
    "latestSubmission": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 299,
      "shipping": 35,
      "total": 334,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "attribution": null,
    "createdAt": "2026-09-27T12:00:00.000Z",
    "expiresAt": "2026-10-04T12:00:00.000Z"
  },
  "credentials": { "jobSecret": "ajs_RXhhbXBsZVNlY3JldFRocmVlRm9yVGhlRG9jc19fXzM" }
}
```

**4.1 — The tracer is down.**

```http
HTTP/1.1 502
content-type: application/json
retry-after: 30

{
  "error": {
    "code": "VECTORIZER_UNAVAILABLE",
    "message": "The tracing service is unavailable.",
    "agent_instruction": "Wait 30 seconds and resubmit the same bytes to the same job. Attempts that fail this way do not count against the job's submissions.",
    "retryable": true
  }
}
```

Technical, retryable, not counted — the job still has all its submissions:

```json
{
  "limits": { "submissionsLeft": 10 },
  "latestSubmission": {
    "no": 1,
    "status": "failed_processing",
    "errorCodes": ["VECTORIZER_UNAVAILABLE"],
    "warningCodes": [],
    "createdAt": "2026-09-27T12:00:00.000Z"
  }
}
```

**4.2 — The agent waits 30 seconds and resends the same bytes; the connection drops mid-processing.** Not
knowing whether the upload arrived, it sends the same bytes once more — while the first is still running:

```http
HTTP/1.1 409
content-type: application/json
retry-after: 10

{
  "error": {
    "code": "SUBMISSION_IN_PROGRESS",
    "message": "The same image is still being processed in this job. Submission 2 is processing these bytes.",
    "agent_instruction": "Do not resubmit these bytes: an earlier upload of the same image is still running as submission 2. Wait 10 seconds, then read GET /api/agent/v1/jobs/<jobId>/submissions/2 (the number in this message) until its status leaves processing; that response is this image's result. The running attempt counts once, not twice.",
    "retryable": true
  }
}
```

It does not upload again. After 10 seconds it reads submission 2:

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 2,
    "status": "processing",
    "validation": { "valid": false, "errors": [], "warnings": [] },
    "geometry": null,
    "files": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 299,
      "shipping": 35,
      "total": 334,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-27T12:00:00.000Z",
    "durationMs": null
  }
}
```

**4.3 — The first upload never finishes** (the worker running it was cut off). Three minutes after it
started, the job shows it as interrupted:

```json
{
  "limits": { "submissionsLeft": 10 },
  "latestSubmission": {
    "no": 2,
    "status": "failed_processing",
    "errorCodes": ["PROCESSING_INTERRUPTED"],
    "warningCodes": [],
    "createdAt": "2026-09-27T12:00:00.000Z"
  }
}
```

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 2,
    "status": "failed_processing",
    "validation": {
      "valid": false,
      "errors": [
        {
          "code": "PROCESSING_INTERRUPTED",
          "severity": "error",
          "message": "The previous submission was interrupted before it finished.",
          "agent_instruction": "Resubmit the same bytes to the same job; the interrupted attempt is not counted and the image is processed again from scratch. Only an image that already reached ready or failed_validation is answered from its stored result instead of being processed again.",
          "retryable": true
        }
      ],
      "warnings": []
    },
    "geometry": null,
    "files": null,
    "approval": null,
    "price": {
      "currency": "ILS",
      "base": 299,
      "shipping": 35,
      "total": 334,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-27T12:00:00.000Z",
    "durationMs": null
  }
}
```

**4.4 — The agent resends the same bytes.** They are processed from scratch:

```http
HTTP/1.1 200
content-type: application/json

{
  "submission": {
    "no": 3,
    "status": "ready",
    "validation": { "valid": true, "errors": [], "warnings": [] },
    "geometry": {
      "lengthMm": 55.95,
      "widthMm": 5.99,
      "drawnRatio": 9.33,
      "stretch": 1,
      "cuts": 8,
      "openAreaPct": 12.81,
      "estWeightGrams": 3.74
    },
    "files": {
      "cutoutsSvg": "https://aperta-designs.com/api/agent/v1/jobs/3f6a9c2e-8b1d-4f7a-a2c5-6e9b0d3f1a8c/submissions/3/cutouts.svg",
      "previewSvg": "https://aperta-designs.com/api/agent/v1/jobs/3f6a9c2e-8b1d-4f7a-a2c5-6e9b0d3f1a8c/submissions/3/preview.svg"
    },
    "approval": {
      "url": "https://aperta-designs.com/a/Pw2eY6uK9fZa",
      "status": "pending",
      "expiresAt": "2026-10-04T12:00:00.000Z"
    },
    "price": {
      "currency": "ILS",
      "base": 299,
      "shipping": 35,
      "total": 334,
      "vatIncluded": true,
      "note": "Referral codes and pickup are applied by the person at checkout."
    },
    "createdAt": "2026-09-27T12:04:00.000Z",
    "durationMs": 4570
  }
}
```

**4.5 — And once more by mistake:** the same bytes of a finished submission return the stored answer
(the same body, same status) — not processed again, not counted:

```json
{ "no": 3, "status": "ready", "createdAt": "2026-09-27T12:04:00.000Z" }
```

```json
{
  "status": "ready",
  "limits": { "submissionsLeft": 9 },
  "latestSubmission": {
    "no": 3,
    "status": "ready",
    "errorCodes": [],
    "warningCodes": [],
    "createdAt": "2026-09-27T12:04:00.000Z"
  }
}
```

One counted submission (the ready one); the outage and the interrupted attempt cost nothing.
