> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bijection.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Module: experiments

> Reference for the bijection/experiments entry point.

## References

### defineExperiment

Re-exports [defineExperiment](/api/modules/server#defineexperiment)

***

### ExperimentDefinition

Re-exports [ExperimentDefinition](/api/modules/server#experimentdefinition)

***

### ExperimentProtocol

Re-exports [ExperimentProtocol](/api/modules/server#experimentprotocol)

***

### ScenarioCollectionBudget

Re-exports [ScenarioCollectionBudget](/api/modules/scenarios#scenariocollectionbudget)

## Type Aliases

### ExperimentCandidate

Ƭ **ExperimentCandidate**: `Object`

A captured program, optionally with exact model replacements for its
candidate decisions. Keys are `model.dependency...` paths, so
`{"policy.demand": demandV2}` changes only that dependency: every other part
of the program, its fixed environment and its evaluator stay the same.

#### Type declaration

| Name | Type |
| :- | :- |
| `name` | `string` |
| `release` | `ReleaseRef` |

***

### CapturedExperimentCandidate

Ƭ **CapturedExperimentCandidate**: `Object`

Not exported: an exported type refers to it.

#### Type declaration

| Name | Type |
| :- | :- |
| `name` | `string` |
| `release` | `ReleaseRef` |

***

### ExperimentCapture

Ƭ **ExperimentCapture**: `Object`

#### Type declaration

| Name | Type |
| :- | :- |
| `protocol` | `Readonly`\<[`ExperimentProtocol`](/api/modules/server#experimentprotocol)> |
| `candidates` | readonly [`CapturedExperimentCandidate`](/api/modules/experiments#capturedexperimentcandidate)\[] |
| `collection` | [`ScenarioCollectionCapture`](/api/modules/scenarios#scenariocollectioncapture) |

***

### ExperimentMetricSummary

Ƭ **ExperimentMetricSummary**: \{ `case`: `string`  } & \{ `status`: `"complete"` ; `unit`: `string` | `null` ; `difference`: [`PairedSummary`](/api/modules/experiments#pairedsummary)  } | \{ `status`: `"unavailable"` ; `reason`: `string`  }

***

### ExperimentAttributionOptions

Ƭ **ExperimentAttributionOptions**: `Object`

#### Type declaration

| Name | Type | Description |
| :- | :- | :- |
| `baseline` | `string` | - |
| `candidate` | `string` | - |
| `vary` | readonly `string`\[] | Exact captured binding paths to copy from candidate into baseline. |

***

### ExperimentRun

Ƭ **ExperimentRun**: `Omit`\<[`ScenarioCollection`](/api/modules/experiments#scenariocollection), `"capture"` | `"order"` | `"select"` | `"start"` | `"request"` | `"training"`> & \{ `capture`: `Readonly`\<[`ExperimentCapture`](/api/modules/experiments#experimentcapture)> | `null` ; `recover`: (`signal?`: `AbortSignal`) => `ReturnType`\<[`ScenarioCollection`](/api/modules/experiments#scenariocollection)\[`"start"`]> ; `order`: (`signal?`: `AbortSignal`) => `ReturnType`\<[`ScenarioCollection`](/api/modules/experiments#scenariocollection)\[`"order"`]> ; `select`: (`signal?`: `AbortSignal`) => `ReturnType`\<[`ScenarioCollection`](/api/modules/experiments#scenariocollection)\[`"select"`]> ; `compare`: (`options`: \{ `baseline`: `string` ; `candidate`: `string` ; `metric`: `string` ; `bootstrapDraws?`: `number`  }, `signal?`: `AbortSignal`) => `Promise`\<[`ExperimentMetricSummary`](/api/modules/experiments#experimentmetricsummary)\[]> ; `recompute`: (`signal?`: `AbortSignal`) => `Promise`\<[`ExperimentRun`](/api/modules/experiments#experimentrun)> ; `resample`: (`seed`: `string`, `signal?`: `AbortSignal`) => `Promise`\<[`ExperimentRun`](/api/modules/experiments#experimentrun)> ; `attribute`: (`options`: [`ExperimentAttributionOptions`](/api/modules/experiments#experimentattributionoptions), `signal?`: `AbortSignal`) => `Promise`\<[`ExperimentRun`](/api/modules/experiments#experimentrun)>  }

One admitted experiment: its paired runs, their order and selection.

***

### PairedSummary

Ƭ **PairedSummary**: `Object`

Exact paired differences; the interval describes sampled simulation variation.

#### Type declaration

| Name | Type |
| :- | :- |
| `pairs` | `number` |
| `sum` | `bigint` |
| `mean` | \{ `numerator`: `bigint` ; `denominator`: `bigint`  } |
| `mean.numerator` | `bigint` |
| `mean.denominator` | `bigint` |
| `minimum` | `bigint` |
| `maximum` | `bigint` |
| `interval` | \{ `method`: `"paired-percentile-bootstrap"` ; `level`: `0.95` ; `lower`: `bigint` ; `upper`: `bigint` ; `denominator`: `bigint` ; `draws`: `number`  } \| `null` |

***

### ScenarioCollection

Ƭ **ScenarioCollection**: `Object`

Not exported: an exported type refers to it.

#### Type declaration

| Name | Type |
| :- | :- |
| `collectionId` | `string` |
| `request` | `Readonly`\<[`ScenarioCollectionStartRequest`](/api/modules/scenarios#scenariocollectionstartrequest)> |
| `training` | `Readonly`\<[`ScenarioSelectionReference`](/api/modules/scenarios#scenarioselectionreference)> \| `undefined` |
| `capture` | `Readonly`\<[`ScenarioCollectionCapture`](/api/modules/scenarios#scenariocollectioncapture)> |
| `start` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionStatus`](/api/modules/scenarios#scenariocollectionstatus)> |
| `status` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionStatus`](/api/modules/scenarios#scenariocollectionstatus)> |
| `resume` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionStatus`](/api/modules/scenarios#scenariocollectionstatus)> |
| `cancel` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionStatus`](/api/modules/scenarios#scenariocollectionstatus)> |
| `report` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionReport`](/api/modules/scenarios#scenariocollectionreport)> |
| `wait` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionStatus`](/api/modules/scenarios#scenariocollectionstatus)> |
| `retire` | (`signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionRetirementResult`](/api/modules/browser#scenariocollectionretirementresult)> |
| `order` | (`measurementId`: `string`, `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioCollectionOrder`](/api/modules/scenarios#scenariocollectionorder)> |
| `select` | (`measurementId`: `string`, `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioSelection`](/api/modules/scenarios#scenarioselection)> |

## Variables

### MAX\_COLLECTION\_RUNS

• `Const` **MAX\_COLLECTION\_RUNS**: `64`

***

### MAX\_COLLECTION\_CONCURRENCY

• `Const` **MAX\_COLLECTION\_CONCURRENCY**: `16`

***

### MAX\_COLLECTION\_WORK

• `Const` **MAX\_COLLECTION\_WORK**: `1073741824`

***

### MAX\_COLLECTION\_DURATION\_MS

• `Const` **MAX\_COLLECTION\_DURATION\_MS**: `1800000`

***

### COLLECTION\_BRANCH\_BYTES

• `Const` **COLLECTION\_BRANCH\_BYTES**: `8589934592`

***

### MAX\_SCENARIO\_CANDIDATES

• `Const` **MAX\_SCENARIO\_CANDIDATES**: `16`

***

### MAX\_CASE\_WEIGHT

• `Const` **MAX\_CASE\_WEIGHT**: `1000`

The largest weight one case contributes to a summed metric.

## Functions

### createExperimentClient

▸ **createExperimentClient**(`call`, `readProtocol`): `Readonly`\<\{ `promote`: (`request`: [`ScenarioPromotionRequest`](/api/modules/scenarios#scenariopromotionrequest), `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioPromotionStatus`](/api/modules/scenarios#scenariopromotionstatus)> = scenarios.promote; `promotion`: (`request`: [`ScenarioPromotionRequest`](/api/modules/scenarios#scenariopromotionrequest), `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioPromotionStatus`](/api/modules/scenarios#scenariopromotionstatus)> = scenarios.promotion; `get`: (`experiment`: `string` | [`ExperimentCapture`](/api/modules/experiments#experimentcapture)) => [`ExperimentRun`](/api/modules/experiments#experimentrun) ; `start`: (`name`: `string`, `options`: \{ `candidates`: readonly [`ExperimentCandidate`](/api/modules/experiments#experimentcandidate)\[] ; `simulation`: [`ScenarioSimulation`](/api/modules/scenarios#scenariosimulation) ; `from?`: [`SnapshotRef`](/api/modules/browser#snapshotref) ; `start?`: [`ScenarioStart`](/api/modules/browser#scenariostart) ; `retain?`: `boolean` ; `budget?`: [`ScenarioCollectionBudget`](/api/modules/scenarios#scenariocollectionbudget) ; `protocol?`: [`ExperimentProtocol`](/api/modules/server#experimentprotocol) ; `collectionId?`: `string` ; `training?`: [`ScenarioSelectionReference`](/api/modules/scenarios#scenarioselectionreference) ; `signal?`: `AbortSignal`  }) => `Promise`\<[`ExperimentRun`](/api/modules/experiments#experimentrun)>  }>

Authoring and observation only: native collections own admission, execution and selection.

#### Parameters

| Name | Type |
| :- | :- |
| `call` | [`ScenarioCall`](/api/modules/scenarios#scenariocall) |
| `readProtocol` | (`name`: `string`, `signal?`: `AbortSignal`) => `Promise`\<`unknown`> |

#### Returns

`Readonly`\<\{ `promote`: (`request`: [`ScenarioPromotionRequest`](/api/modules/scenarios#scenariopromotionrequest), `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioPromotionStatus`](/api/modules/scenarios#scenariopromotionstatus)> = scenarios.promote; `promotion`: (`request`: [`ScenarioPromotionRequest`](/api/modules/scenarios#scenariopromotionrequest), `signal?`: `AbortSignal`) => `Promise`\<[`ScenarioPromotionStatus`](/api/modules/scenarios#scenariopromotionstatus)> = scenarios.promotion; `get`: (`experiment`: `string` | [`ExperimentCapture`](/api/modules/experiments#experimentcapture)) => [`ExperimentRun`](/api/modules/experiments#experimentrun) ; `start`: (`name`: `string`, `options`: \{ `candidates`: readonly [`ExperimentCandidate`](/api/modules/experiments#experimentcandidate)\[] ; `simulation`: [`ScenarioSimulation`](/api/modules/scenarios#scenariosimulation) ; `from?`: [`SnapshotRef`](/api/modules/browser#snapshotref) ; `start?`: [`ScenarioStart`](/api/modules/browser#scenariostart) ; `retain?`: `boolean` ; `budget?`: [`ScenarioCollectionBudget`](/api/modules/scenarios#scenariocollectionbudget) ; `protocol?`: [`ExperimentProtocol`](/api/modules/server#experimentprotocol) ; `collectionId?`: `string` ; `training?`: [`ScenarioSelectionReference`](/api/modules/scenarios#scenarioselectionreference) ; `signal?`: `AbortSignal`  }) => `Promise`\<[`ExperimentRun`](/api/modules/experiments#experimentrun)>  }>

***

### summarizePairs

▸ **summarizePairs**(`differences`, `seed`, `draws?`): [`PairedSummary`](/api/modules/experiments#pairedsummary)

Deterministic bootstrap over complete paired repetitions of one declared case.

#### Parameters

| Name | Type | Default value |
| :- | :- | :- |
| `differences` | readonly `bigint`\[] | `undefined` |
| `seed` | `string` | `undefined` |
| `draws` | `number` | `1000` |

#### Returns

[`PairedSummary`](/api/modules/experiments#pairedsummary)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.