---
title: "Drain the milestone-merge GitHub outbox (every 10 minutes)"
method: POST
path: "/cron/milestone-merge-sync"
tags: ["Cron"]
---

# Drain the milestone-merge GitHub outbox (every 10 minutes)

`POST /cron/milestone-merge-sync`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/cron/milestone-merge-sync`
- Auth: none required

HO-15660. Runs one bounded drain of the milestone-merge GitHub outbox (roadmap_sync_intents): at most 10 intents, two at a time, each GitHub exchange capped at 10 s, legacy direct-send recovery first. While any intent of a merge is unsynced, every edit of its survivor is refused (MILESTONE_SYNC_UNRESOLVED). A GitHub refusal is a count, retried with backoff on a later run; ok is false only when the drain itself threw. Protected by CRON_SECRET via the x-cron-secret header. Scheduled by the milestone-merge-sync stage of the embedding-drain schedule in .slipstream.json.

## Response `200`

Run result

- object
  - `ok` boolean, required
  - `claimed` integer
  - `sent` integer
  - `reconciled` integer
  - `uncertain` integer
  - `failed` integer
  - `error` string

## Other responses

- `401`: Missing or invalid CRON_SECRET

---

[API](https://skmtc.dev/apphandoff/apis/apphandoff-api.md) · [All operations](https://skmtc.dev/apphandoff/apis/apphandoff-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apphandoff/apis/apphandoff-api/revisions/9f138fe46d56?raw)
