@roarkanalytics/sdk 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,6 +40,32 @@ export class SimulationRunPlanJob extends APIResource {
40
40
  return this._client.post(path`/v1/simulation/plan/job/${jobID}/cancel`, options);
41
41
  }
42
42
 
43
+ /**
44
+ * Request the written debrief for a settled run: executive summary, failure themes
45
+ * and recommendations. Runs with graded calls get one automatically, so this is
46
+ * for regenerating one (`regenerate: true`) or retrying one that failed.
47
+ *
48
+ * Returns immediately. Generation takes a few minutes: poll GET
49
+ * /v1/simulation/plan/job/{jobId}/results until `debrief.status` is READY or
50
+ * FAILED. Without `regenerate`, a debrief that is ready or already being written
51
+ * is returned as-is.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const response =
56
+ * await client.simulationRunPlanJob.createDebrief(
57
+ * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
58
+ * );
59
+ * ```
60
+ */
61
+ createDebrief(
62
+ jobID: string,
63
+ body: SimulationRunPlanJobCreateDebriefParams | null | undefined = {},
64
+ options?: RequestOptions,
65
+ ): APIPromise<SimulationRunPlanJobCreateDebriefResponse> {
66
+ return this._client.post(path`/v1/simulation/plan/job/${jobID}/debrief`, { body, ...options });
67
+ }
68
+
43
69
  /**
44
70
  * Retrieve details of a simulation plan job including all associated simulation
45
71
  * jobs (calls)
@@ -55,6 +81,33 @@ export class SimulationRunPlanJob extends APIResource {
55
81
  return this._client.get(path`/v1/simulation/plan/job/${jobID}`, options);
56
82
  }
57
83
 
84
+ /**
85
+ * Everything the run report shows, in one request: the summary and score, the
86
+ * pass/fail verdict, per-metric aggregates, every simulation with its check
87
+ * results, breakdowns by agent and persona, the comparison against the previous
88
+ * run (or `compareToJobId`), the sweep attribution, and the written debrief with
89
+ * its executive summary, failure themes and recommendations.
90
+ *
91
+ * Safe to call while the run is in progress: counts reflect what has landed so
92
+ * far. `verdict` and `sweepAttribution` stay null until the run ends. The debrief
93
+ * is generated automatically a few minutes after a run with graded calls settles;
94
+ * poll until `debrief.status` is READY, or request one with POST
95
+ * /v1/simulation/plan/job/{jobId}/debrief.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * const response =
100
+ * await client.simulationRunPlanJob.getResults('jobId');
101
+ * ```
102
+ */
103
+ getResults(
104
+ jobID: string,
105
+ query: SimulationRunPlanJobGetResultsParams | null | undefined = {},
106
+ options?: RequestOptions,
107
+ ): APIPromise<SimulationRunPlanJobGetResultsResponse> {
108
+ return this._client.get(path`/v1/simulation/plan/job/${jobID}/results`, { query, ...options });
109
+ }
110
+
58
111
  /**
59
112
  * Deprecated: use POST /v1/simulation/run, which does the same thing and can also
60
113
  * take the plan configuration inline, so a one-off run does not have to create a
@@ -200,6 +253,202 @@ export namespace SimulationRunPlanJobCancelResponse {
200
253
  }
201
254
  }
202
255
 
256
+ export interface SimulationRunPlanJobCreateDebriefResponse {
257
+ /**
258
+ * The run’s written debrief: executive summary, failure themes and
259
+ * recommendations. Generated automatically when a run with graded calls settles.
260
+ */
261
+ data: SimulationRunPlanJobCreateDebriefResponse.Data;
262
+ }
263
+
264
+ export namespace SimulationRunPlanJobCreateDebriefResponse {
265
+ /**
266
+ * The run’s written debrief: executive summary, failure themes and
267
+ * recommendations. Generated automatically when a run with graded calls settles.
268
+ */
269
+ export interface Data {
270
+ completedAt: string | null;
271
+
272
+ createdAt: string;
273
+
274
+ debriefId: string;
275
+
276
+ errorMessage: string | null;
277
+
278
+ /**
279
+ * Present once READY.
280
+ */
281
+ report: Data.Report | null;
282
+
283
+ /**
284
+ * PENDING and GENERATING while it is written (usually a few minutes), then READY
285
+ * or FAILED.
286
+ */
287
+ status: 'PENDING' | 'GENERATING' | 'READY' | 'FAILED';
288
+ }
289
+
290
+ export namespace Data {
291
+ /**
292
+ * Present once READY.
293
+ */
294
+ export interface Report {
295
+ executiveSummary: Report.ExecutiveSummary;
296
+
297
+ generatedAt: string;
298
+
299
+ keyFindings: Array<Report.KeyFinding>;
300
+
301
+ recommendations: Array<Report.Recommendation>;
302
+
303
+ /**
304
+ * Failure themes, clustered across the run’s failing calls.
305
+ */
306
+ themes: Array<Report.Theme>;
307
+
308
+ /**
309
+ * The checks against the previous run, as of generation.
310
+ */
311
+ trend: Report.Trend | null;
312
+
313
+ verdict: 'PASSED' | 'THRESHOLD_FAILED';
314
+
315
+ /**
316
+ * One-paragraph verdict, e.g. "Not ready to promote. ..."
317
+ */
318
+ verdictSummary: string;
319
+
320
+ wentWell: Array<Report.WentWell>;
321
+ }
322
+
323
+ export namespace Report {
324
+ export interface ExecutiveSummary {
325
+ paragraphs: Array<string>;
326
+
327
+ sections: Array<ExecutiveSummary.Section>;
328
+ }
329
+
330
+ export namespace ExecutiveSummary {
331
+ export interface Section {
332
+ body: string;
333
+
334
+ heading: string | null;
335
+ }
336
+ }
337
+
338
+ export interface KeyFinding {
339
+ body: string;
340
+
341
+ /**
342
+ * The calls the finding is about.
343
+ */
344
+ callIds: Array<string>;
345
+
346
+ title: string;
347
+ }
348
+
349
+ export interface Recommendation {
350
+ body: string;
351
+
352
+ channel:
353
+ | 'PROMPT'
354
+ | 'VOICE_CONFIG'
355
+ | 'STT'
356
+ | 'SPEECH_MODEL'
357
+ | 'LLM_MODEL'
358
+ | 'INFRA'
359
+ | 'EXTERNAL'
360
+ | null;
361
+
362
+ /**
363
+ * For a prompt fix: the text to replace.
364
+ */
365
+ currentText: string | null;
366
+
367
+ order: number;
368
+
369
+ severity: 'HIGH' | 'MEDIUM' | 'LOW' | null;
370
+
371
+ /**
372
+ * For a prompt fix: the replacement.
373
+ */
374
+ suggestedText: string | null;
375
+
376
+ themeSlugs: Array<string>;
377
+
378
+ title: string;
379
+ }
380
+
381
+ export interface Theme {
382
+ affectedCallCount: number;
383
+
384
+ analysis: string;
385
+
386
+ callIds: Array<string>;
387
+
388
+ checkNames: Array<string>;
389
+
390
+ impact: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | null;
391
+
392
+ lifecycle: 'NEW' | 'PERSISTENT' | 'IMPROVING' | 'FIXED' | null;
393
+
394
+ prevalence: 'WIDESPREAD' | 'RECURRING' | 'ISOLATED' | null;
395
+
396
+ rootCauseChannel:
397
+ | 'PROMPT'
398
+ | 'VOICE_CONFIG'
399
+ | 'STT'
400
+ | 'SPEECH_MODEL'
401
+ | 'LLM_MODEL'
402
+ | 'INFRA'
403
+ | 'EXTERNAL'
404
+ | null;
405
+
406
+ severity: 'HIGH' | 'MEDIUM' | 'LOW';
407
+
408
+ slug: string;
409
+
410
+ title: string;
411
+
412
+ totalCallCount: number;
413
+ }
414
+
415
+ /**
416
+ * The checks against the previous run, as of generation.
417
+ */
418
+ export interface Trend {
419
+ baselineRunNumber: number | null;
420
+
421
+ baselineRunPlanJobId: string;
422
+
423
+ rows: Array<Trend.Row>;
424
+ }
425
+
426
+ export namespace Trend {
427
+ export interface Row {
428
+ checkName: string;
429
+
430
+ currentPassRate: number | null;
431
+
432
+ lifecycle: 'NEW' | 'PERSISTENT' | 'IMPROVING' | 'FIXED' | null;
433
+
434
+ previousPassRate: number | null;
435
+ }
436
+ }
437
+
438
+ export interface WentWell {
439
+ body: string;
440
+
441
+ /**
442
+ * The calls the finding is about.
443
+ */
444
+ callIds: Array<string>;
445
+
446
+ title: string;
447
+ }
448
+ }
449
+ }
450
+ }
451
+
203
452
  export interface SimulationRunPlanJobGetByIDResponse {
204
453
  /**
205
454
  * Simulation run plan job with all associated simulation jobs
@@ -1303,97 +1552,1260 @@ export namespace SimulationRunPlanJobGetByIDResponse {
1303
1552
  }
1304
1553
  }
1305
1554
 
1306
- export interface SimulationRunPlanJobStartResponse {
1555
+ export interface SimulationRunPlanJobGetResultsResponse {
1307
1556
  /**
1308
- * Response when triggering a simulation run plan
1557
+ * Everything the run report shows, in one response.
1309
1558
  */
1310
- data: SimulationRunPlanJobStartResponse.Data;
1559
+ data: SimulationRunPlanJobGetResultsResponse.Data;
1311
1560
  }
1312
1561
 
1313
- export namespace SimulationRunPlanJobStartResponse {
1562
+ export namespace SimulationRunPlanJobGetResultsResponse {
1314
1563
  /**
1315
- * Response when triggering a simulation run plan
1564
+ * Everything the run report shows, in one response.
1316
1565
  */
1317
1566
  export interface Data {
1318
1567
  /**
1319
- * When the job was created
1568
+ * The run’s simulations against its test cases. Differs from a plain job count
1569
+ * only when the plan retries simulations your agent never spoke on.
1320
1570
  */
1321
- createdAt: string;
1571
+ attemptSummary: Data.AttemptSummary;
1572
+
1573
+ breakdowns: Data.Breakdowns;
1574
+
1575
+ calls: Array<Data.Call>;
1322
1576
 
1323
1577
  /**
1324
- * ID of the simulation run plan that was executed
1578
+ * Null when there is no earlier run of the plan to compare against.
1325
1579
  */
1326
- simulationRunPlanId: string;
1580
+ comparison: Data.Comparison | null;
1327
1581
 
1328
1582
  /**
1329
- * ID of the simulation run plan job that was created
1583
+ * The run’s written debrief: executive summary, failure themes and
1584
+ * recommendations. Generated automatically when a run with graded calls settles.
1330
1585
  */
1331
- simulationRunPlanJobId: string;
1586
+ debrief: Data.Debrief | null;
1332
1587
 
1333
1588
  /**
1334
- * Initial status of the job
1589
+ * Checks first, then other metrics.
1335
1590
  */
1336
- status:
1337
- | 'PENDING'
1338
- | 'QUEUED'
1339
- | 'CREATING_SNAPSHOTS'
1340
- | 'CREATING_SIMULATIONS'
1341
- | 'PREPARING_CAPACITY'
1342
- | 'RUNNING_SIMULATIONS'
1343
- | 'COMPLETED'
1344
- | 'FAILED'
1345
- | 'TIMED_OUT'
1346
- | 'CANCELLED'
1347
- | 'CANCELLING'
1348
- | 'ENDING_SIMULATIONS';
1591
+ metrics: Array<Data.Metric>;
1592
+
1593
+ run: Data.Run;
1594
+
1595
+ summary: Data.Summary;
1596
+
1597
+ /**
1598
+ * For a run that swept a property (accent, background noise, speech pace and so
1599
+ * on): which check failures the property caused.
1600
+ *
1601
+ * Each value is compared with every other value combined using a one-sided Fisher
1602
+ * exact test, and every comparison in the run is corrected together with
1603
+ * Benjamini-Hochberg. A value is only called worse when the difference is
1604
+ * statistically significant, so a value that happened to fail a few more
1605
+ * simulations by chance is not reported as a problem. Invalidated simulations and
1606
+ * simulations that failed on the Roark platform are left out.
1607
+ */
1608
+ sweepAttribution: Data.SweepAttribution | null;
1609
+
1610
+ /**
1611
+ * Pass/fail verdict for the run, judged against the success criteria pinned on the
1612
+ * run plan when the run started.
1613
+ */
1614
+ verdict: Data.Verdict | null;
1349
1615
  }
1350
- }
1351
1616
 
1352
- export interface SimulationRunPlanJobListParams {
1353
- /**
1354
- * Cursor for pagination - use the nextCursor value from a previous response
1355
- */
1356
- after?: string;
1617
+ export namespace Data {
1618
+ /**
1619
+ * The run’s simulations against its test cases. Differs from a plain job count
1620
+ * only when the plan retries simulations your agent never spoke on.
1621
+ */
1622
+ export interface AttemptSummary {
1623
+ /**
1624
+ * Every simulation placed, retries included. Each is a separate, billed call.
1625
+ */
1626
+ attemptCount: number;
1357
1627
 
1358
- /**
1359
- * Filter by label ID attached to the plan job. Use this if you know the label ID.
1360
- */
1361
- labelId?: string;
1628
+ /**
1629
+ * Simulations placed as a retry of one your agent never spoke on.
1630
+ */
1631
+ retryCount: number;
1362
1632
 
1363
- /**
1364
- * Filter by label name attached to the plan job. More user-friendly alternative to
1365
- * labelId. Case-insensitive.
1366
- */
1367
- labelName?: string;
1633
+ /**
1634
+ * Simulations your agent never spoke on, including the ones a retry replaced.
1635
+ */
1636
+ silentAttemptCount: number;
1368
1637
 
1369
- /**
1370
- * Maximum number of plan jobs to return (default: 20, max: 50)
1371
- */
1372
- limit?: number;
1638
+ /**
1639
+ * Test cases whose final attempt your agent still never spoke on. This is what the
1640
+ * `AGENT_NEVER_SPOKE` verdict failure counts.
1641
+ */
1642
+ stillSilentTestCaseCount: number;
1373
1643
 
1374
- /**
1375
- * Filter by simulation run plan ID
1376
- */
1377
- simulationRunPlanId?: string;
1644
+ /**
1645
+ * Test cases in the run. Each one has a single final attempt that its result is
1646
+ * read from.
1647
+ */
1648
+ testCaseCount: number;
1649
+ }
1378
1650
 
1379
- /**
1380
- * Filter by plan job status (PENDING, QUEUED, CREATING_SNAPSHOTS,
1381
- * CREATING_SIMULATIONS, PREPARING_CAPACITY, RUNNING_SIMULATIONS, COMPLETED,
1382
- * FAILED, TIMED_OUT, CANCELLED, CANCELLING, ENDING_SIMULATIONS)
1383
- */
1384
- status?:
1385
- | 'PENDING'
1386
- | 'QUEUED'
1387
- | 'CREATING_SNAPSHOTS'
1388
- | 'CREATING_SIMULATIONS'
1389
- | 'PREPARING_CAPACITY'
1390
- | 'RUNNING_SIMULATIONS'
1391
- | 'COMPLETED'
1392
- | 'FAILED'
1393
- | 'TIMED_OUT'
1394
- | 'CANCELLED'
1395
- | 'CANCELLING'
1396
- | 'ENDING_SIMULATIONS';
1651
+ export interface Breakdowns {
1652
+ byAgent: Array<Breakdowns.ByAgent>;
1653
+
1654
+ byPersona: Array<Breakdowns.ByPersona>;
1655
+ }
1656
+
1657
+ export namespace Breakdowns {
1658
+ export interface ByAgent {
1659
+ /**
1660
+ * 0-100. Null when nothing was evaluated.
1661
+ */
1662
+ callPassRate: number | null;
1663
+
1664
+ /**
1665
+ * Counted simulations in the group.
1666
+ */
1667
+ calls: number;
1668
+
1669
+ evaluatedCalls: number;
1670
+
1671
+ /**
1672
+ * The agent or persona ID.
1673
+ */
1674
+ key: string;
1675
+
1676
+ label: string;
1677
+
1678
+ passedCalls: number;
1679
+
1680
+ /**
1681
+ * The group’s own score. 0-100. Null when nothing was evaluated.
1682
+ */
1683
+ score: number | null;
1684
+ }
1685
+
1686
+ export interface ByPersona {
1687
+ /**
1688
+ * 0-100. Null when nothing was evaluated.
1689
+ */
1690
+ callPassRate: number | null;
1691
+
1692
+ /**
1693
+ * Counted simulations in the group.
1694
+ */
1695
+ calls: number;
1696
+
1697
+ evaluatedCalls: number;
1698
+
1699
+ /**
1700
+ * The agent or persona ID.
1701
+ */
1702
+ key: string;
1703
+
1704
+ label: string;
1705
+
1706
+ passedCalls: number;
1707
+
1708
+ /**
1709
+ * The group’s own score. 0-100. Null when nothing was evaluated.
1710
+ */
1711
+ score: number | null;
1712
+ }
1713
+ }
1714
+
1715
+ export interface Call {
1716
+ agentName: string | null;
1717
+
1718
+ attemptNumber: number;
1719
+
1720
+ /**
1721
+ * Use with GET /v1/call/{callId} for the transcript, recording and every metric
1722
+ * value.
1723
+ */
1724
+ callId: string | null;
1725
+
1726
+ checks: Array<Call.Check>;
1727
+
1728
+ /**
1729
+ * False for an invalidated simulation: listed, never scored.
1730
+ */
1731
+ counted: boolean;
1732
+
1733
+ durationMs: number | null;
1734
+
1735
+ /**
1736
+ * Passed every check that graded it. Null when no check graded it, or it does not
1737
+ * count.
1738
+ */
1739
+ passed: boolean | null;
1740
+
1741
+ personaName: string | null;
1742
+
1743
+ retryOfSimulationJobId: string | null;
1744
+
1745
+ simulationJobId: string;
1746
+
1747
+ /**
1748
+ * QUEUED, CONNECTING, IN_CALL and PROCESSING while the simulation runs. Once
1749
+ * settled: COMPLETED, TIMED_OUT (ran to the maximum duration, still graded), ERROR
1750
+ * (failed on the agent’s side), NOT_RUN (failed on Roark’s side), CANCELLED, or
1751
+ * INVALIDATED (ran, but does not count).
1752
+ */
1753
+ status:
1754
+ | 'QUEUED'
1755
+ | 'CONNECTING'
1756
+ | 'IN_CALL'
1757
+ | 'PROCESSING'
1758
+ | 'COMPLETED'
1759
+ | 'ERROR'
1760
+ | 'TIMED_OUT'
1761
+ | 'CANCELLED'
1762
+ | 'INVALIDATED'
1763
+ | 'NOT_RUN';
1764
+
1765
+ /**
1766
+ * Call-level values of the run’s other metrics. Empty without the `metric:read`
1767
+ * permission. Per-turn values are on GET /v1/call/{callId}/metrics.
1768
+ */
1769
+ values: Array<Call.Value>;
1770
+ }
1771
+
1772
+ export namespace Call {
1773
+ export interface Check {
1774
+ metricDefinitionId: string;
1775
+
1776
+ metricName: string;
1777
+
1778
+ passed: boolean;
1779
+ }
1780
+
1781
+ export interface Value {
1782
+ metricDefinitionId: string;
1783
+
1784
+ metricName: string;
1785
+
1786
+ outputType: 'COUNT' | 'NUMERIC' | 'BOOLEAN' | 'SCALE' | 'TEXT' | 'CLASSIFICATION' | 'OFFSET';
1787
+
1788
+ participantRole: 'AGENT' | 'CUSTOMER' | 'SIMULATED_CUSTOMER' | 'BACKGROUND_SPEAKER' | null;
1789
+
1790
+ reasoning: string | null;
1791
+
1792
+ value: number | boolean | string | null;
1793
+ }
1794
+ }
1795
+
1796
+ /**
1797
+ * Null when there is no earlier run of the plan to compare against.
1798
+ */
1799
+ export interface Comparison {
1800
+ baselineCallPassRate: number | null;
1801
+
1802
+ baselineRun: Comparison.BaselineRun;
1803
+
1804
+ baselineScore: number | null;
1805
+
1806
+ /**
1807
+ * REQUESTED when `compareToJobId` picked the baseline, PREVIOUS_RUN otherwise.
1808
+ */
1809
+ baselineSource: 'PREVIOUS_RUN' | 'REQUESTED';
1810
+
1811
+ callPassRateDelta: number | null;
1812
+
1813
+ /**
1814
+ * Every check either run was graded on. A side that did not grade it reads null.
1815
+ */
1816
+ checks: Array<Comparison.Check>;
1817
+
1818
+ currentCallPassRate: number | null;
1819
+
1820
+ currentScore: number | null;
1821
+
1822
+ /**
1823
+ * Current minus baseline, in points.
1824
+ */
1825
+ scoreDelta: number | null;
1826
+ }
1827
+
1828
+ export namespace Comparison {
1829
+ export interface BaselineRun {
1830
+ endedAt: string | null;
1831
+
1832
+ runNumber: number | null;
1833
+
1834
+ simulationRunPlanJobId: string;
1835
+
1836
+ status:
1837
+ | 'PENDING'
1838
+ | 'QUEUED'
1839
+ | 'CREATING_SNAPSHOTS'
1840
+ | 'CREATING_SIMULATIONS'
1841
+ | 'PREPARING_CAPACITY'
1842
+ | 'RUNNING_SIMULATIONS'
1843
+ | 'COMPLETED'
1844
+ | 'FAILED'
1845
+ | 'TIMED_OUT'
1846
+ | 'CANCELLED'
1847
+ | 'CANCELLING'
1848
+ | 'ENDING_SIMULATIONS';
1849
+ }
1850
+
1851
+ export interface Check {
1852
+ baselinePassRate: number | null;
1853
+
1854
+ currentPassRate: number | null;
1855
+
1856
+ delta: number | null;
1857
+
1858
+ metricDefinitionId: string;
1859
+
1860
+ metricName: string;
1861
+ }
1862
+ }
1863
+
1864
+ /**
1865
+ * The run’s written debrief: executive summary, failure themes and
1866
+ * recommendations. Generated automatically when a run with graded calls settles.
1867
+ */
1868
+ export interface Debrief {
1869
+ completedAt: string | null;
1870
+
1871
+ createdAt: string;
1872
+
1873
+ debriefId: string;
1874
+
1875
+ errorMessage: string | null;
1876
+
1877
+ /**
1878
+ * Present once READY.
1879
+ */
1880
+ report: Debrief.Report | null;
1881
+
1882
+ /**
1883
+ * PENDING and GENERATING while it is written (usually a few minutes), then READY
1884
+ * or FAILED.
1885
+ */
1886
+ status: 'PENDING' | 'GENERATING' | 'READY' | 'FAILED';
1887
+ }
1888
+
1889
+ export namespace Debrief {
1890
+ /**
1891
+ * Present once READY.
1892
+ */
1893
+ export interface Report {
1894
+ executiveSummary: Report.ExecutiveSummary;
1895
+
1896
+ generatedAt: string;
1897
+
1898
+ keyFindings: Array<Report.KeyFinding>;
1899
+
1900
+ recommendations: Array<Report.Recommendation>;
1901
+
1902
+ /**
1903
+ * Failure themes, clustered across the run’s failing calls.
1904
+ */
1905
+ themes: Array<Report.Theme>;
1906
+
1907
+ /**
1908
+ * The checks against the previous run, as of generation.
1909
+ */
1910
+ trend: Report.Trend | null;
1911
+
1912
+ verdict: 'PASSED' | 'THRESHOLD_FAILED';
1913
+
1914
+ /**
1915
+ * One-paragraph verdict, e.g. "Not ready to promote. ..."
1916
+ */
1917
+ verdictSummary: string;
1918
+
1919
+ wentWell: Array<Report.WentWell>;
1920
+ }
1921
+
1922
+ export namespace Report {
1923
+ export interface ExecutiveSummary {
1924
+ paragraphs: Array<string>;
1925
+
1926
+ sections: Array<ExecutiveSummary.Section>;
1927
+ }
1928
+
1929
+ export namespace ExecutiveSummary {
1930
+ export interface Section {
1931
+ body: string;
1932
+
1933
+ heading: string | null;
1934
+ }
1935
+ }
1936
+
1937
+ export interface KeyFinding {
1938
+ body: string;
1939
+
1940
+ /**
1941
+ * The calls the finding is about.
1942
+ */
1943
+ callIds: Array<string>;
1944
+
1945
+ title: string;
1946
+ }
1947
+
1948
+ export interface Recommendation {
1949
+ body: string;
1950
+
1951
+ channel:
1952
+ | 'PROMPT'
1953
+ | 'VOICE_CONFIG'
1954
+ | 'STT'
1955
+ | 'SPEECH_MODEL'
1956
+ | 'LLM_MODEL'
1957
+ | 'INFRA'
1958
+ | 'EXTERNAL'
1959
+ | null;
1960
+
1961
+ /**
1962
+ * For a prompt fix: the text to replace.
1963
+ */
1964
+ currentText: string | null;
1965
+
1966
+ order: number;
1967
+
1968
+ severity: 'HIGH' | 'MEDIUM' | 'LOW' | null;
1969
+
1970
+ /**
1971
+ * For a prompt fix: the replacement.
1972
+ */
1973
+ suggestedText: string | null;
1974
+
1975
+ themeSlugs: Array<string>;
1976
+
1977
+ title: string;
1978
+ }
1979
+
1980
+ export interface Theme {
1981
+ affectedCallCount: number;
1982
+
1983
+ analysis: string;
1984
+
1985
+ callIds: Array<string>;
1986
+
1987
+ checkNames: Array<string>;
1988
+
1989
+ impact: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | null;
1990
+
1991
+ lifecycle: 'NEW' | 'PERSISTENT' | 'IMPROVING' | 'FIXED' | null;
1992
+
1993
+ prevalence: 'WIDESPREAD' | 'RECURRING' | 'ISOLATED' | null;
1994
+
1995
+ rootCauseChannel:
1996
+ | 'PROMPT'
1997
+ | 'VOICE_CONFIG'
1998
+ | 'STT'
1999
+ | 'SPEECH_MODEL'
2000
+ | 'LLM_MODEL'
2001
+ | 'INFRA'
2002
+ | 'EXTERNAL'
2003
+ | null;
2004
+
2005
+ severity: 'HIGH' | 'MEDIUM' | 'LOW';
2006
+
2007
+ slug: string;
2008
+
2009
+ title: string;
2010
+
2011
+ totalCallCount: number;
2012
+ }
2013
+
2014
+ /**
2015
+ * The checks against the previous run, as of generation.
2016
+ */
2017
+ export interface Trend {
2018
+ baselineRunNumber: number | null;
2019
+
2020
+ baselineRunPlanJobId: string;
2021
+
2022
+ rows: Array<Trend.Row>;
2023
+ }
2024
+
2025
+ export namespace Trend {
2026
+ export interface Row {
2027
+ checkName: string;
2028
+
2029
+ currentPassRate: number | null;
2030
+
2031
+ lifecycle: 'NEW' | 'PERSISTENT' | 'IMPROVING' | 'FIXED' | null;
2032
+
2033
+ previousPassRate: number | null;
2034
+ }
2035
+ }
2036
+
2037
+ export interface WentWell {
2038
+ body: string;
2039
+
2040
+ /**
2041
+ * The calls the finding is about.
2042
+ */
2043
+ callIds: Array<string>;
2044
+
2045
+ title: string;
2046
+ }
2047
+ }
2048
+ }
2049
+
2050
+ export interface Metric {
2051
+ /**
2052
+ * The check’s tally. Null for a metric that is not a check.
2053
+ */
2054
+ check: Metric.Check | null;
2055
+
2056
+ /**
2057
+ * How many values took each reading, for BOOLEAN, SCALE and CLASSIFICATION
2058
+ * metrics. Null without the `metric:read` permission.
2059
+ */
2060
+ distribution: Array<Metric.Distribution> | null;
2061
+
2062
+ /**
2063
+ * Counted simulations with at least one value.
2064
+ */
2065
+ evaluatedCalls: number;
2066
+
2067
+ /**
2068
+ * A threshold: one of the checks the run is judged on.
2069
+ */
2070
+ isCheck: boolean;
2071
+
2072
+ metricDefinitionId: string;
2073
+
2074
+ /**
2075
+ * The metric’s slug.
2076
+ */
2077
+ metricId: string;
2078
+
2079
+ name: string;
2080
+
2081
+ /**
2082
+ * For NUMERIC, SCALE, COUNT and OFFSET metrics. Null when nothing was captured, or
2083
+ * without the `metric:read` permission.
2084
+ */
2085
+ numeric: Metric.Numeric | null;
2086
+
2087
+ outputType: 'COUNT' | 'NUMERIC' | 'BOOLEAN' | 'SCALE' | 'TEXT' | 'CLASSIFICATION' | 'OFFSET';
2088
+
2089
+ /**
2090
+ * Values across those simulations. A per-turn metric has several per call.
2091
+ */
2092
+ sampleSize: number;
2093
+
2094
+ /**
2095
+ * Unit of `numeric`, e.g. `ms`.
2096
+ */
2097
+ unitSymbol: string | null;
2098
+ }
2099
+
2100
+ export namespace Metric {
2101
+ /**
2102
+ * The check’s tally. Null for a metric that is not a check.
2103
+ */
2104
+ export interface Check {
2105
+ evaluatedCalls: number;
2106
+
2107
+ failedCalls: number;
2108
+
2109
+ /**
2110
+ * 0-100. Null when nothing was evaluated.
2111
+ */
2112
+ passRate: number | null;
2113
+
2114
+ passedCalls: number;
2115
+ }
2116
+
2117
+ export interface Distribution {
2118
+ count: number;
2119
+
2120
+ value: string;
2121
+ }
2122
+
2123
+ /**
2124
+ * For NUMERIC, SCALE, COUNT and OFFSET metrics. Null when nothing was captured, or
2125
+ * without the `metric:read` permission.
2126
+ */
2127
+ export interface Numeric {
2128
+ average: number;
2129
+
2130
+ max: number;
2131
+
2132
+ median: number;
2133
+
2134
+ min: number;
2135
+
2136
+ p95: number;
2137
+ }
2138
+ }
2139
+
2140
+ export interface Run {
2141
+ createdAt: string;
2142
+
2143
+ /**
2144
+ * Wall-clock run time. Null until the run ends.
2145
+ */
2146
+ durationMs: number | null;
2147
+
2148
+ endedAt: string | null;
2149
+
2150
+ /**
2151
+ * Per-project run number, shown as SR-42 in the app.
2152
+ */
2153
+ runNumber: number | null;
2154
+
2155
+ simulationRunPlanId: string;
2156
+
2157
+ simulationRunPlanJobId: string;
2158
+
2159
+ /**
2160
+ * The run plan’s name. Null when the plan has since been deleted.
2161
+ */
2162
+ simulationRunPlanName: string | null;
2163
+
2164
+ startedAt: string | null;
2165
+
2166
+ status:
2167
+ | 'PENDING'
2168
+ | 'QUEUED'
2169
+ | 'CREATING_SNAPSHOTS'
2170
+ | 'CREATING_SIMULATIONS'
2171
+ | 'PREPARING_CAPACITY'
2172
+ | 'RUNNING_SIMULATIONS'
2173
+ | 'COMPLETED'
2174
+ | 'FAILED'
2175
+ | 'TIMED_OUT'
2176
+ | 'CANCELLED'
2177
+ | 'CANCELLING'
2178
+ | 'ENDING_SIMULATIONS';
2179
+
2180
+ triggeredBy: 'SCHEDULED' | 'USER_TRIGGERED_FROM_UI' | 'RE_RUN' | 'TRIGGERED_FROM_API' | 'SYSTEM';
2181
+ }
2182
+
2183
+ export interface Summary {
2184
+ /**
2185
+ * passedCalls / evaluatedCalls, 0-100. Null when nothing was evaluated.
2186
+ */
2187
+ callPassRate: number | null;
2188
+
2189
+ /**
2190
+ * Every (check, simulation) verdict pooled. 0-100. Null when nothing was
2191
+ * evaluated.
2192
+ */
2193
+ checkPassRate: number | null;
2194
+
2195
+ /**
2196
+ * Counted simulations that connected and produced a conversation.
2197
+ */
2198
+ completedCalls: number;
2199
+
2200
+ /**
2201
+ * Simulations whose results count: all but the invalidated ones.
2202
+ */
2203
+ countedCalls: number;
2204
+
2205
+ /**
2206
+ * Counted simulations at least one check graded.
2207
+ */
2208
+ evaluatedCalls: number;
2209
+
2210
+ /**
2211
+ * Evaluated simulations that failed at least one check.
2212
+ */
2213
+ failedCalls: number;
2214
+
2215
+ /**
2216
+ * Evaluated simulations that passed every check.
2217
+ */
2218
+ passedCalls: number;
2219
+
2220
+ /**
2221
+ * The run’s score: the mean of each check’s pass rate, the same number as
2222
+ * `verdict.score`. 0-100. Null when nothing was evaluated.
2223
+ */
2224
+ score: number | null;
2225
+
2226
+ /**
2227
+ * Every simulation of the run, retries included.
2228
+ */
2229
+ totalCalls: number;
2230
+ }
2231
+
2232
+ /**
2233
+ * For a run that swept a property (accent, background noise, speech pace and so
2234
+ * on): which check failures the property caused.
2235
+ *
2236
+ * Each value is compared with every other value combined using a one-sided Fisher
2237
+ * exact test, and every comparison in the run is corrected together with
2238
+ * Benjamini-Hochberg. A value is only called worse when the difference is
2239
+ * statistically significant, so a value that happened to fail a few more
2240
+ * simulations by chance is not reported as a problem. Invalidated simulations and
2241
+ * simulations that failed on the Roark platform are left out.
2242
+ */
2243
+ export interface SweepAttribution {
2244
+ /**
2245
+ * Plain sentences on what this run could not see, ready to show to a reader.
2246
+ */
2247
+ caveats: Array<string>;
2248
+
2249
+ /**
2250
+ * Every check the run was graded on: `PROPERTY_ATTRIBUTABLE` first, then
2251
+ * `FOUND_UNATTRIBUTED`, then `WITHIN_NOISE`.
2252
+ */
2253
+ checks: Array<SweepAttribution.Check>;
2254
+
2255
+ /**
2256
+ * The Benjamini-Hochberg false discovery rate the comparisons are held to.
2257
+ */
2258
+ falseDiscoveryRate: number;
2259
+
2260
+ /**
2261
+ * The overall failure rate, 0-100, at which a check with no standout value is
2262
+ * reported as `FOUND_UNATTRIBUTED`.
2263
+ */
2264
+ foundUnattributedFailureRate: number;
2265
+
2266
+ /**
2267
+ * Counted simulations a value needs before it is compared.
2268
+ */
2269
+ minArmCalls: number;
2270
+
2271
+ /**
2272
+ * Roughly how many percentage points more often a value would need to fail than
2273
+ * the rest of the run to be flagged at this sample size. Optimistic: it uses
2274
+ * simulation counts rather than the verdicts on each check and ignores the
2275
+ * correction, so checks graded on fewer simulations need larger gaps. Large when
2276
+ * few simulations ran per value: finding no significant difference then means the
2277
+ * run could not see one, not that none exists.
2278
+ */
2279
+ minimumDetectableGap: number | null;
2280
+
2281
+ /**
2282
+ * The values your agent never spoke on significantly more often than the rest of
2283
+ * the run, most significant first, tested the same way as `worseValues`. Empty on
2284
+ * a run with no silent simulations.
2285
+ */
2286
+ neverSpokeValues: Array<SweepAttribution.NeverSpokeValue>;
2287
+
2288
+ /**
2289
+ * How many values had enough counted simulations to be compared.
2290
+ */
2291
+ testableValueCount: number;
2292
+
2293
+ /**
2294
+ * How many value and check pairs were actually tested. A value can have enough
2295
+ * simulations and still go untested (no other value graded that check, or too few
2296
+ * verdicts on it). When this is 0 no comparison ran, so an empty `worseValues`
2297
+ * everywhere means nothing was tested, not that no value did worse.
2298
+ */
2299
+ testedComparisonCount: number;
2300
+
2301
+ /**
2302
+ * Every value of the swept property, baseline first.
2303
+ */
2304
+ values: Array<SweepAttribution.Value>;
2305
+ }
2306
+
2307
+ export namespace SweepAttribution {
2308
+ /**
2309
+ * How one check's failures relate to the swept property.
2310
+ */
2311
+ export interface Check {
2312
+ /**
2313
+ * How this check relates to the swept property:
2314
+ *
2315
+ * - `PROPERTY_ATTRIBUTABLE`: at least one value failed it significantly more often
2316
+ * than every other value combined. `worseValues` names them. This is the only
2317
+ * case in which a value is called worse.
2318
+ * - `FOUND_UNATTRIBUTED`: no value stands out, but the check failed on at least
2319
+ * `foundUnattributedFailureRate`% of counted simulations overall. A real issue
2320
+ * with the agent on which no value stood out, so the run cannot tie it to the
2321
+ * property. It does not show the property had no effect: a small run may be
2322
+ * unable to see one.
2323
+ * - `WITHIN_NOISE`: neither. Any differences between values are within what chance
2324
+ * produces.
2325
+ */
2326
+ attribution: 'PROPERTY_ATTRIBUTABLE' | 'FOUND_UNATTRIBUTED' | 'WITHIN_NOISE';
2327
+
2328
+ evaluated: number;
2329
+
2330
+ failed: number;
2331
+
2332
+ /**
2333
+ * Share of counted simulations across every value that failed the check, 0-100.
2334
+ */
2335
+ failureRate: number | null;
2336
+
2337
+ metricDefinitionId: string;
2338
+
2339
+ metricName: string;
2340
+
2341
+ /**
2342
+ * The values significantly worse than the rest, most significant first. Empty
2343
+ * unless `attribution` is `PROPERTY_ATTRIBUTABLE`.
2344
+ */
2345
+ worseValues: Array<Check.WorseValue>;
2346
+ }
2347
+
2348
+ export namespace Check {
2349
+ /**
2350
+ * A value that failed a check significantly more often than the rest of the run.
2351
+ */
2352
+ export interface WorseValue {
2353
+ /**
2354
+ * How likely a difference at least this large would be by chance alone, after
2355
+ * correcting for every comparison in the run (Benjamini-Hochberg). The value is
2356
+ * called worse only when this is at most `falseDiscoveryRate`.
2357
+ */
2358
+ adjustedPValue: number;
2359
+
2360
+ evaluated: number;
2361
+
2362
+ failed: number;
2363
+
2364
+ /**
2365
+ * Share of the counted simulations at this value that failed the check, 0-100.
2366
+ */
2367
+ failureRate: number | null;
2368
+
2369
+ /**
2370
+ * The arm's identity: the override signature its calls ran with, e.g.
2371
+ * `BACKGROUND_NOISE=DRIVING;BACKGROUND_NOISE_VOLUME=0.7`. Join on this rather than
2372
+ * on `value`: a sweep can run one value as several arms (Driving at 70% and at
2373
+ * 100%), and those share a value.
2374
+ */
2375
+ key: string;
2376
+
2377
+ label: string;
2378
+
2379
+ /**
2380
+ * The same share across every other value combined, 0-100. This is what the value
2381
+ * is compared with.
2382
+ */
2383
+ restFailureRate: number | null;
2384
+
2385
+ value: string;
2386
+ }
2387
+ }
2388
+
2389
+ /**
2390
+ * A value your agent never spoke on significantly more often than the rest of the
2391
+ * run.
2392
+ */
2393
+ export interface NeverSpokeValue {
2394
+ /**
2395
+ * How likely a difference at least this large would be by chance alone, after
2396
+ * correcting across the values (Benjamini-Hochberg).
2397
+ */
2398
+ adjustedPValue: number;
2399
+
2400
+ /**
2401
+ * Simulations run at this value.
2402
+ */
2403
+ attempted: number;
2404
+
2405
+ /**
2406
+ * The arm's identity: the override signature its calls ran with, e.g.
2407
+ * `BACKGROUND_NOISE=DRIVING;BACKGROUND_NOISE_VOLUME=0.7`. Join on this rather than
2408
+ * on `value`: a sweep can run one value as several arms (Driving at 70% and at
2409
+ * 100%), and those share a value.
2410
+ */
2411
+ key: string;
2412
+
2413
+ label: string;
2414
+
2415
+ /**
2416
+ * Simulations run across every other value combined.
2417
+ */
2418
+ restAttempted: number;
2419
+
2420
+ /**
2421
+ * Simulations your agent never spoke on across every other value combined.
2422
+ */
2423
+ restSilentAttempts: number;
2424
+
2425
+ /**
2426
+ * Retries placed at this value because your agent never spoke.
2427
+ */
2428
+ retries: number;
2429
+
2430
+ /**
2431
+ * Simulations at this value your agent never spoke on, retried or not.
2432
+ */
2433
+ silentAttempts: number;
2434
+
2435
+ value: string;
2436
+ }
2437
+
2438
+ /**
2439
+ * One value of the swept property.
2440
+ */
2441
+ export interface Value {
2442
+ /**
2443
+ * Simulations run at this value. Simulations that failed on the Roark platform are
2444
+ * left out, since they say nothing about your agent.
2445
+ */
2446
+ attempted: number;
2447
+
2448
+ /**
2449
+ * Simulations that actually tested the property: not invalidated, and graded by at
2450
+ * least one check. Only these are used in the comparison.
2451
+ */
2452
+ counted: number;
2453
+
2454
+ /**
2455
+ * Whether this is the baseline the plan named.
2456
+ */
2457
+ isBaseline: boolean;
2458
+
2459
+ /**
2460
+ * The arm's identity: the override signature its calls ran with, e.g.
2461
+ * `BACKGROUND_NOISE=DRIVING;BACKGROUND_NOISE_VOLUME=0.7`. Join on this rather than
2462
+ * on `value`: a sweep can run one value as several arms (Driving at 70% and at
2463
+ * 100%), and those share a value.
2464
+ */
2465
+ key: string;
2466
+
2467
+ /**
2468
+ * The value in words, with what else the arm pinned, e.g. `American` or
2469
+ * `Driving (70% noise)`.
2470
+ */
2471
+ label: string;
2472
+
2473
+ /**
2474
+ * Of `attempted`, the retries of simulations your agent never spoke on. Zero
2475
+ * unless the plan retries silent simulations.
2476
+ */
2477
+ retries: number;
2478
+
2479
+ /**
2480
+ * The mean of each check's pass rate at this value, 0-100, the same rule as the
2481
+ * run's `score`. Descriptive only: a lower score alone never makes a value worse.
2482
+ * Null when nothing counted.
2483
+ */
2484
+ score: number | null;
2485
+
2486
+ /**
2487
+ * Of `attempted`, the simulations your agent never spoke on, whether or not a
2488
+ * retry followed. They are invalidated, so they are never in `counted`.
2489
+ */
2490
+ silentAttempts: number;
2491
+
2492
+ /**
2493
+ * Whether this value had at least `minArmCalls` counted simulations. A value below
2494
+ * that is "insufficient data": it is reported with its numbers but never compared
2495
+ * or ranked, because a rate from one or two calls cannot be told apart from luck.
2496
+ */
2497
+ testable: boolean;
2498
+
2499
+ /**
2500
+ * The stored value of the swept property, e.g. `US`.
2501
+ */
2502
+ value: string;
2503
+ }
2504
+ }
2505
+
2506
+ /**
2507
+ * Pass/fail verdict for the run, judged against the success criteria pinned on the
2508
+ * run plan when the run started.
2509
+ */
2510
+ export interface Verdict {
2511
+ /**
2512
+ * Every check the run was judged on, with its rate and the minimum it had to
2513
+ * reach.
2514
+ *
2515
+ * Thresholds and authored yes/no metrics only. See `SimulationRunPlanJobCheck` for
2516
+ * why a provider reading is not one.
2517
+ */
2518
+ checks: Array<Verdict.Check>;
2519
+
2520
+ /**
2521
+ * Every criterion the run missed. Empty when it passed.
2522
+ */
2523
+ failures: Array<
2524
+ | Verdict.UnionMember0
2525
+ | Verdict.UnionMember1
2526
+ | Verdict.UnionMember2
2527
+ | Verdict.UnionMember3
2528
+ | Verdict.UnionMember4
2529
+ >;
2530
+
2531
+ /**
2532
+ * Whether every check cleared its own `minPassRate` (and the run completed with
2533
+ * full coverage). Use this as the CI exit status.
2534
+ *
2535
+ * Never derived from `score`: a run can score 95 and still fail, or score 40 and
2536
+ * still pass.
2537
+ */
2538
+ passed: boolean;
2539
+
2540
+ /**
2541
+ * The run's headline quality number, 0-100: the mean of each check's own pass
2542
+ * rate.
2543
+ *
2544
+ * Every check weighs the same, however many simulations it evaluated, which is the
2545
+ * same way `passed` treats them. It is the number the Roark dashboard shows for
2546
+ * this run.
2547
+ *
2548
+ * REPORTING ONLY, for dashboards and trend lines. Nothing is judged against it.
2549
+ * Null when nothing was evaluated.
2550
+ */
2551
+ score: number | null;
2552
+ }
2553
+
2554
+ export namespace Verdict {
2555
+ /**
2556
+ * How one check did. Present for every check the run was judged on, passing or
2557
+ * not.
2558
+ *
2559
+ * A check is a metric that yields a pass/fail: a threshold
2560
+ * (`Silence Duration <= 2s`) or a yes/no metric you authored. Provider readings
2561
+ * such as `Comprehension Failure` are observations, not checks: their `true` is
2562
+ * whatever the underlying field happens to mean, so they carry no passing side and
2563
+ * never appear here. Put a threshold on one to judge it.
2564
+ */
2565
+ export interface Check {
2566
+ evaluatedSims: number;
2567
+
2568
+ /**
2569
+ * Whether `minPassRate` is the 80% default (`true`) or a minimum this metric set
2570
+ * for itself.
2571
+ */
2572
+ inherited: boolean;
2573
+
2574
+ metricDefinitionId: string;
2575
+
2576
+ /**
2577
+ * THE BAR it was judged against: the share of the run's simulations it had to
2578
+ * pass.
2579
+ */
2580
+ minPassRate: number;
2581
+
2582
+ /**
2583
+ * This check's own pass rate, 0-100: the share of sims it evaluated that passed
2584
+ * it. Null when it evaluated nothing.
2585
+ */
2586
+ passRate: number | null;
2587
+
2588
+ /**
2589
+ * `passRate >= minPassRate`.
2590
+ */
2591
+ passed: boolean;
2592
+
2593
+ passedSims: number;
2594
+
2595
+ metricName?: string | null;
2596
+ }
2597
+
2598
+ export interface UnionMember0 {
2599
+ /**
2600
+ * The status the run actually ended in.
2601
+ */
2602
+ status:
2603
+ | 'PENDING'
2604
+ | 'QUEUED'
2605
+ | 'CREATING_SNAPSHOTS'
2606
+ | 'CREATING_SIMULATIONS'
2607
+ | 'PREPARING_CAPACITY'
2608
+ | 'RUNNING_SIMULATIONS'
2609
+ | 'COMPLETED'
2610
+ | 'FAILED'
2611
+ | 'TIMED_OUT'
2612
+ | 'CANCELLED'
2613
+ | 'CANCELLING'
2614
+ | 'ENDING_SIMULATIONS';
2615
+
2616
+ type: 'RUN_NOT_COMPLETED';
2617
+ }
2618
+
2619
+ export interface UnionMember1 {
2620
+ evaluatedCalls: number;
2621
+
2622
+ expectedCalls: number;
2623
+
2624
+ type: 'INCOMPLETE_COVERAGE';
2625
+ }
2626
+
2627
+ /**
2628
+ * Your agent never spoke on more than `maxShare` percent of the run. Those
2629
+ * simulations are left out of every check, so the run fails on them whatever the
2630
+ * checks say.
2631
+ */
2632
+ export interface UnionMember2 {
2633
+ /**
2634
+ * The largest share of simulations, 0-100, your agent may never speak on while the
2635
+ * run can pass.
2636
+ */
2637
+ maxShare: number;
2638
+
2639
+ /**
2640
+ * Test cases your agent never spoke on, judged on each test case’s last attempt: a
2641
+ * silent simulation a retry later reached your agent on does not count here.
2642
+ */
2643
+ neverSpokeCalls: number;
2644
+
2645
+ /**
2646
+ * Every test case of the run whose last attempt reached your agent.
2647
+ */
2648
+ totalCalls: number;
2649
+
2650
+ type: 'AGENT_NEVER_SPOKE';
2651
+
2652
+ /**
2653
+ * The agent as the run tested it. Null when the simulations tested more than one
2654
+ * agent.
2655
+ */
2656
+ agentName?: string | null;
2657
+
2658
+ /**
2659
+ * Every simulation your agent never spoke on, including the ones a retry replaced.
2660
+ * Above `neverSpokeCalls` only when the plan retries silent simulations
2661
+ * (`maxNoResponseRetries`).
2662
+ */
2663
+ silentAttempts?: number;
2664
+ }
2665
+
2666
+ export interface UnionMember3 {
2667
+ metricDefinitionId: string;
2668
+
2669
+ type: 'METRIC_NOT_EVALUATED';
2670
+
2671
+ /**
2672
+ * The check’s name, for rendering the failure.
2673
+ */
2674
+ metricName?: string | null;
2675
+ }
2676
+
2677
+ export interface UnionMember4 {
2678
+ /**
2679
+ * Whether the missed minimum was the 80% default (`true`) or this metric's own.
2680
+ */
2681
+ inherited: boolean;
2682
+
2683
+ metricDefinitionId: string;
2684
+
2685
+ minPassRate: number;
2686
+
2687
+ passRate: number;
2688
+
2689
+ type: 'METRIC_BELOW_MIN_PASS_RATE';
2690
+
2691
+ /**
2692
+ * The check’s name, for rendering the failure.
2693
+ */
2694
+ metricName?: string | null;
2695
+ }
2696
+ }
2697
+ }
2698
+ }
2699
+
2700
+ export interface SimulationRunPlanJobStartResponse {
2701
+ /**
2702
+ * Response when triggering a simulation run plan
2703
+ */
2704
+ data: SimulationRunPlanJobStartResponse.Data;
2705
+ }
2706
+
2707
+ export namespace SimulationRunPlanJobStartResponse {
2708
+ /**
2709
+ * Response when triggering a simulation run plan
2710
+ */
2711
+ export interface Data {
2712
+ /**
2713
+ * When the job was created
2714
+ */
2715
+ createdAt: string;
2716
+
2717
+ /**
2718
+ * ID of the simulation run plan that was executed
2719
+ */
2720
+ simulationRunPlanId: string;
2721
+
2722
+ /**
2723
+ * ID of the simulation run plan job that was created
2724
+ */
2725
+ simulationRunPlanJobId: string;
2726
+
2727
+ /**
2728
+ * Initial status of the job
2729
+ */
2730
+ status:
2731
+ | 'PENDING'
2732
+ | 'QUEUED'
2733
+ | 'CREATING_SNAPSHOTS'
2734
+ | 'CREATING_SIMULATIONS'
2735
+ | 'PREPARING_CAPACITY'
2736
+ | 'RUNNING_SIMULATIONS'
2737
+ | 'COMPLETED'
2738
+ | 'FAILED'
2739
+ | 'TIMED_OUT'
2740
+ | 'CANCELLED'
2741
+ | 'CANCELLING'
2742
+ | 'ENDING_SIMULATIONS';
2743
+ }
2744
+ }
2745
+
2746
+ export interface SimulationRunPlanJobListParams {
2747
+ /**
2748
+ * Cursor for pagination - use the nextCursor value from a previous response
2749
+ */
2750
+ after?: string;
2751
+
2752
+ /**
2753
+ * Filter by label ID attached to the plan job. Use this if you know the label ID.
2754
+ */
2755
+ labelId?: string;
2756
+
2757
+ /**
2758
+ * Filter by label name attached to the plan job. More user-friendly alternative to
2759
+ * labelId. Case-insensitive.
2760
+ */
2761
+ labelName?: string;
2762
+
2763
+ /**
2764
+ * Maximum number of plan jobs to return (default: 20, max: 50)
2765
+ */
2766
+ limit?: number;
2767
+
2768
+ /**
2769
+ * Filter by simulation run plan ID
2770
+ */
2771
+ simulationRunPlanId?: string;
2772
+
2773
+ /**
2774
+ * Filter by plan job status (PENDING, QUEUED, CREATING_SNAPSHOTS,
2775
+ * CREATING_SIMULATIONS, PREPARING_CAPACITY, RUNNING_SIMULATIONS, COMPLETED,
2776
+ * FAILED, TIMED_OUT, CANCELLED, CANCELLING, ENDING_SIMULATIONS)
2777
+ */
2778
+ status?:
2779
+ | 'PENDING'
2780
+ | 'QUEUED'
2781
+ | 'CREATING_SNAPSHOTS'
2782
+ | 'CREATING_SIMULATIONS'
2783
+ | 'PREPARING_CAPACITY'
2784
+ | 'RUNNING_SIMULATIONS'
2785
+ | 'COMPLETED'
2786
+ | 'FAILED'
2787
+ | 'TIMED_OUT'
2788
+ | 'CANCELLED'
2789
+ | 'CANCELLING'
2790
+ | 'ENDING_SIMULATIONS';
2791
+ }
2792
+
2793
+ export interface SimulationRunPlanJobCreateDebriefParams {
2794
+ /**
2795
+ * Generate a new debrief even when a ready one exists. Without it, an existing
2796
+ * ready or in-progress debrief is returned as-is.
2797
+ */
2798
+ regenerate?: boolean;
2799
+ }
2800
+
2801
+ export interface SimulationRunPlanJobGetResultsParams {
2802
+ /**
2803
+ * Simulation run plan job to compare this run against, e.g. the last run on your
2804
+ * main branch. Defaults to the plan's previous settled run. Any run in the project
2805
+ * works, including another plan's: checks are matched by metric, and a check only
2806
+ * one run graded reads null on the other side.
2807
+ */
2808
+ compareToJobId?: string;
1397
2809
  }
1398
2810
 
1399
2811
  export interface SimulationRunPlanJobStartParams {
@@ -1468,9 +2880,13 @@ export declare namespace SimulationRunPlanJob {
1468
2880
  export {
1469
2881
  type SimulationRunPlanJobListResponse as SimulationRunPlanJobListResponse,
1470
2882
  type SimulationRunPlanJobCancelResponse as SimulationRunPlanJobCancelResponse,
2883
+ type SimulationRunPlanJobCreateDebriefResponse as SimulationRunPlanJobCreateDebriefResponse,
1471
2884
  type SimulationRunPlanJobGetByIDResponse as SimulationRunPlanJobGetByIDResponse,
2885
+ type SimulationRunPlanJobGetResultsResponse as SimulationRunPlanJobGetResultsResponse,
1472
2886
  type SimulationRunPlanJobStartResponse as SimulationRunPlanJobStartResponse,
1473
2887
  type SimulationRunPlanJobListParams as SimulationRunPlanJobListParams,
2888
+ type SimulationRunPlanJobCreateDebriefParams as SimulationRunPlanJobCreateDebriefParams,
2889
+ type SimulationRunPlanJobGetResultsParams as SimulationRunPlanJobGetResultsParams,
1474
2890
  type SimulationRunPlanJobStartParams as SimulationRunPlanJobStartParams,
1475
2891
  };
1476
2892
  }