# Continuity

URL: /workflows/processes/continuity · Id: `process:continuity`

> Continuity sets recovery objectives per Capability, fails over between upstreams, names a successor signer, and runs restore drills on a cadence.

Continuity sets recovery objectives per [Capability](/business/nouns/capability), fails over between upstreams, names a successor signer, and runs restore drills on a cadence.

## Outcome
| Part | This Process |
| --- | --- |
| Outcome | Each Capability meets its recovery objectives in a passing restore drill, and a successor signer is on record. |
| Reads | [Recovery Objective](/business/nouns/recovery-objective), [Capability](/business/nouns/capability) |
| Leaves | [Recovery Objective](/business/nouns/recovery-objective), [Issue](/business/nouns/issue) |
| Runs in | Each Startup |

## Accountable
[Reliability Engineer](/agents/engineering/reliability-engineer), [Engineering Team](/agents/engineering).

Responsible: [Reliability Engineer](/agents/engineering/reliability-engineer).

Consulted: [Engineering Lead](/agents/engineering/engineering-lead), [Risk Analyst](/agents/operations/risk-analyst).

Informed: [Founder](/agents/founding/founder).

## Workflows
| Workflow | Runs | Team |
| --- | --- | --- |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | every quarter | [Engineering Team](/agents/engineering) |

## Who does each step

| Workflow | Step | Role | Calls | Approval |
| --- | --- | --- | --- | --- |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | 1. List each Capability whose restore drill is due. | [Reliability Engineer](/agents/engineering/reliability-engineer) | [RecoveryObjective.list](/business/nouns/recovery-objective/list) | None |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | 2. Restore each Capability’s records into an isolated namespace and time it. | [Reliability Engineer](/agents/engineering/reliability-engineer) | [RecoveryObjective.drill](/business/nouns/recovery-objective/drill) | None |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | 3. Fail over to each fallback upstream in test, then back. | [Reliability Engineer](/agents/engineering/reliability-engineer) | [Integration.sync](/business/nouns/integration/sync) | None |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | 4. Confirm the successor signer is named and reachable. | [Reliability Engineer](/agents/engineering/reliability-engineer) | [Role.get](/business/nouns/role/get) | None |
| [Drill a restore](/workflows/processes/continuity/drill-restore) | 5. Open an Issue for every objective the drill missed. | [Reliability Engineer](/agents/engineering/reliability-engineer) | [Issue.create](/business/nouns/issue/create) | None |

## Events
| Direction | When | What happens |
| --- | --- | --- |
| In | Every quarter | Starts [Drill a restore](/workflows/processes/continuity/drill-restore) |
| Out | [`RecoveryObjective.drilled`](/business/events/RecoveryObjective.drilled) | Raised by step 2 of [Drill a restore](/workflows/processes/continuity/drill-restore) |
| Out | [`Integration.synced`](/business/events/Integration.synced) | Raised by step 3 of [Drill a restore](/workflows/processes/continuity/drill-restore) |
| Out | `Issue.created` | Raised by step 5 of [Drill a restore](/workflows/processes/continuity/drill-restore) |

## Plays
No Play names this Process.

## Controls
No Control names this Process or a Workflow of it.

## Settings
| Setting | Type | Default | Say | Set with |
| --- | --- | --- | --- | --- |
| `continuity.drillEvery` | `string` | `quarterly` | Drill a restore every quarter | [Setting.update](/business/nouns/setting/update) |

## Failure
A failed step retries; when retries run out, the Action goes to the [Reliability Engineer](/agents/engineering/reliability-engineer).

## Loop
| Step | Value |
| --- | --- |
| Hypothesis | Quarterly restore drills keep every restore within its recovery objectives. |
| Measure | [Restore drills passed](/agents/engineering#restore-drills-passed) over 1y, at least 4 observations |
| Learn | The learn step reads the Readout, records Evidence and a Decision, and drafts the next Variant. |

## Code

**Ask**

```text
Turn on continuity
```

**API**

```bash
curl -X POST https://api.sb/leaseline.app/processes/process_1/enable \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

**SDK**

```ts
import { $ } from 'startup-builder'

await $.Process.enable({ process: 'process_1' })
```

**CLI**

```bash
npx startup-builder do Process.enable --json '{"process":"process_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Process.enable({ process: 'process_1' })"
  }
}
```

## Enable
On by default for every Product Template. [Process.pause](/business/nouns/process/pause) stops new Actions; Actions in progress finish.

**Ask**

```text
Drill a restore every quarter
```

**API**

```bash
curl -X PATCH https://api.sb/leaseline.app/settings/setting_1 \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"value":"quarterly","key":"continuity.drillEvery"}'
```

**SDK**

```ts
import { $ } from 'startup-builder'

await $.Setting.update({ id: 'setting_1', value: 'quarterly', key: 'continuity.drillEvery' })
```

**CLI**

```bash
npx startup-builder do Setting.update --json '{"id":"setting_1","value":"quarterly","key":"continuity.drillEvery"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Setting.update({ id: 'setting_1', value: 'quarterly', key: 'continuity.drillEvery' })"
  }
}
```

## Example
Each quarter the [Reliability Engineer](/agents/engineering/reliability-engineer) restores the payments records into an isolated namespace. A restore that misses its `1h` objective opens an [Incident](/business/nouns/incident), and service fails over to a second upstream.