@greatwait/contracts 0.3.1 → 0.3.3

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.
Files changed (95) hide show
  1. package/dist/attempt-diagnostics.d.ts +1 -1
  2. package/dist/attempt-diagnostics.js +13 -1
  3. package/dist/attempt-search.d.ts +2 -0
  4. package/dist/billing.d.ts +46 -0
  5. package/dist/billing.js +29 -0
  6. package/dist/callback-safety.js +5 -1
  7. package/dist/configuration.d.ts +2 -2
  8. package/dist/configuration.js +6 -3
  9. package/dist/delivery.d.ts +12 -1
  10. package/dist/delivery.js +1 -0
  11. package/dist/effective-limits.d.ts +4 -4
  12. package/dist/endpoints.d.ts +29 -0
  13. package/dist/endpoints.js +32 -1
  14. package/dist/forecast.d.ts +2 -2
  15. package/dist/http-request.d.ts +12 -2
  16. package/dist/http-request.js +31 -1
  17. package/dist/index.d.ts +8 -7
  18. package/dist/index.js +8 -7
  19. package/dist/mcp.js +1 -0
  20. package/dist/operational-config.d.ts +174 -22
  21. package/dist/operational-config.js +207 -74
  22. package/dist/operations.d.ts +334 -52
  23. package/dist/operations.js +195 -34
  24. package/dist/project-notifications.d.ts +35 -9
  25. package/dist/project-notifications.js +43 -12
  26. package/dist/protocol.d.ts +28 -0
  27. package/dist/protocol.js +23 -0
  28. package/dist/scheduling-records.d.ts +106 -16
  29. package/dist/scheduling-records.js +36 -12
  30. package/dist/scheduling.d.ts +155 -43
  31. package/dist/scheduling.js +188 -50
  32. package/dist/service-mode.d.ts +88 -0
  33. package/dist/service-mode.js +130 -0
  34. package/dist/tenancy.d.ts +54 -30
  35. package/dist/tenancy.js +35 -17
  36. package/dist/timing.d.ts +39 -0
  37. package/dist/timing.js +51 -0
  38. package/dist/zod-values.d.ts +1 -1
  39. package/dist/zod-values.js +1 -1
  40. package/dist/zod.d.ts +1 -1
  41. package/dist/zod.js +1 -1
  42. package/generated/v1/examples/billing.noticesdismiss.request.json +3 -0
  43. package/generated/v1/examples/billing.noticesdismiss.response.json +6 -0
  44. package/generated/v1/examples/billing.reconcile.response.json +12 -0
  45. package/generated/v1/examples/billing.summary.response.json +12 -0
  46. package/generated/v1/examples/executions.list.response.json +1 -0
  47. package/generated/v1/examples/limits.read.response.json +1 -1
  48. package/generated/v1/examples/projectnotifications.rotateSigningKey.response.json +1 -0
  49. package/generated/v1/examples/projects.list.response.json +0 -6
  50. package/generated/v1/examples/projects.read.response.json +14 -0
  51. package/generated/v1/examples/schedules.list.response.json +1 -3
  52. package/generated/v1/examples/schedules.summary.response.json +174 -0
  53. package/generated/v1/examples/timing.summary.response.json +33 -1
  54. package/generated/v1/manifest.json +79 -2
  55. package/generated/v1/openapi.json +4084 -2023
  56. package/generated/v1/policy-matrix.json +22 -1
  57. package/generated/v1/schemas/attempts.list.response.json +10 -0
  58. package/generated/v1/schemas/attempts.read.response.json +10 -0
  59. package/generated/v1/schemas/attempts.search.response.json +4 -0
  60. package/generated/v1/schemas/billing.notices.query.json +4 -0
  61. package/generated/v1/schemas/billing.noticesdismiss.request.json +12 -0
  62. package/generated/v1/schemas/billing.noticesdismiss.response.json +22 -0
  63. package/generated/v1/schemas/billing.reconcile.response.json +43 -0
  64. package/generated/v1/schemas/billing.summary.response.json +43 -0
  65. package/generated/v1/schemas/endpoints.list.query.json +15 -0
  66. package/generated/v1/schemas/executions.list.response.json +4 -0
  67. package/generated/v1/schemas/occurrences.list.response.json +4 -0
  68. package/generated/v1/schemas/occurrences.read.response.json +4 -0
  69. package/generated/v1/schemas/occurrences.redeliver.response.json +10 -0
  70. package/generated/v1/schemas/projectnotifications.read.response.json +4 -0
  71. package/generated/v1/schemas/projectnotifications.rotateSigningKey.response.json +4 -0
  72. package/generated/v1/schemas/projectnotifications.update.request.json +41 -17
  73. package/generated/v1/schemas/projectnotifications.update.response.json +4 -0
  74. package/generated/v1/schemas/projects.list.response.json +0 -27
  75. package/generated/v1/schemas/projects.read.response-headers.json +11 -0
  76. package/generated/v1/schemas/projects.read.response.json +79 -0
  77. package/generated/v1/schemas/schedules.archive.response.json +8 -0
  78. package/generated/v1/schemas/schedules.cancel.response.json +8 -0
  79. package/generated/v1/schemas/schedules.create.request.json +1 -1
  80. package/generated/v1/schemas/schedules.create.response.json +8 -0
  81. package/generated/v1/schemas/schedules.list.query.json +6 -0
  82. package/generated/v1/schemas/schedules.list.response.json +4 -0
  83. package/generated/v1/schemas/schedules.pause.response.json +8 -0
  84. package/generated/v1/schemas/schedules.read.response.json +8 -0
  85. package/generated/v1/schemas/schedules.replace.request.json +1 -1
  86. package/generated/v1/schemas/schedules.replace.response.json +8 -0
  87. package/generated/v1/schemas/schedules.resume.response.json +8 -0
  88. package/generated/v1/schemas/schedules.summary.query.json +11 -0
  89. package/generated/v1/schemas/schedules.summary.response.json +144 -0
  90. package/generated/v1/schemas/timing.summary.response.json +69 -0
  91. package/generated/v1/snippets/billing.noticesdismiss.json +6 -0
  92. package/generated/v1/snippets/projectnotifications.rotateSigningKey.json +1 -1
  93. package/generated/v1/snippets/projects.read.json +6 -0
  94. package/generated/v1/snippets/schedules.summary.json +6 -0
  95. package/package.json +1 -1
package/dist/tenancy.js CHANGED
@@ -116,6 +116,31 @@ export const provisionedProjectSchema = z.object({
116
116
  .length(2, "a project has exactly two environments"),
117
117
  project: projectSchema,
118
118
  });
119
+ /** Exactly what a permanent deletion of the project would destroy now. */
120
+ export const projectDeletionCountsSchema = z.object({
121
+ endpoints: z.number().int().nonnegative(),
122
+ keys: z.number().int().nonnegative(),
123
+ runs: z.number().int().nonnegative(),
124
+ schedules: z.number().int().nonnegative(),
125
+ });
126
+ /**
127
+ * One project, with the exact counts a permanent deletion would destroy now.
128
+ *
129
+ * Returned by the single-project read (`projects.read`) and by the writes that
130
+ * answer with the project they changed. Never by the list: see
131
+ * `projectListItemSchema`.
132
+ */
133
+ export const projectSummarySchema = z.object({
134
+ createdAt: timestampSchema.nullable(),
135
+ deletionCounts: projectDeletionCountsSchema,
136
+ environmentKinds: z
137
+ .array(environmentKindSchema)
138
+ .length(2, "a project has exactly two environments"),
139
+ id: projectIdSchema,
140
+ name: projectNameSchema,
141
+ status: projectStatusSchema.exclude(["deleted"]),
142
+ version: versionSchema,
143
+ });
119
144
  /**
120
145
  * What a signed-in member is told about a project they may act in.
121
146
  *
@@ -130,24 +155,17 @@ export const provisionedProjectSchema = z.object({
130
155
  * list shows, the authority for a request is re-resolved from the member's
131
156
  * organization when the request arrives. Lifecycle state and version make an
132
157
  * archived row manageable without making it a valid work target.
158
+ *
159
+ * **No deletion counts (W9-88).** Counting a project's schedules and runs
160
+ * reads every one of them, so a list that counted every project cost the sum
161
+ * of the organization's whole history — 2.2 s for an organization with
162
+ * 290,000 schedules, longer than the API's pool would wait, and the landing
163
+ * page failed every time. Exact counts are a deletion preview; they belong to
164
+ * the one project somebody is about to delete: `projectSummarySchema`.
133
165
  */
134
- export const projectSummarySchema = z.object({
135
- createdAt: timestampSchema.nullable(),
136
- deletionCounts: z.object({
137
- endpoints: z.number().int().nonnegative(),
138
- keys: z.number().int().nonnegative(),
139
- runs: z.number().int().nonnegative(),
140
- schedules: z.number().int().nonnegative(),
141
- }),
142
- environmentKinds: z
143
- .array(environmentKindSchema)
144
- .length(2, "a project has exactly two environments"),
145
- id: projectIdSchema,
146
- name: projectNameSchema,
147
- status: projectStatusSchema.exclude(["deleted"]),
148
- version: versionSchema,
166
+ export const projectListItemSchema = projectSummarySchema.omit({
167
+ deletionCounts: true,
149
168
  });
150
- export const projectDeletionCountsSchema = projectSummarySchema.shape.deletionCounts;
151
169
  /**
152
170
  * Every active or archived project the member can access. Administrators see all.
153
171
  *
@@ -162,7 +180,7 @@ export const projectDeletionCountsSchema = projectSummarySchema.shape.deletionCo
162
180
  export const PROJECT_LIST_LIMIT = 200;
163
181
  export const projectListSchema = z.object({
164
182
  data: z
165
- .array(projectSummarySchema)
183
+ .array(projectListItemSchema)
166
184
  .max(PROJECT_LIST_LIMIT, "more projects than this response can carry; paging is required"),
167
185
  /** Active and archived projects occupy a plan slot; deleted projects do not. */
168
186
  total: z.number().int().nonnegative().max(PROJECT_LIST_LIMIT),
package/dist/timing.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from "./zod.js";
2
+ export declare const DELIVERY_TIMING_POLICY_VERSION = "timing-v2-service-bands";
2
3
  export declare const DELIVERY_TIMING_TARGETS_MS: readonly [5000, 15000];
3
4
  export declare const DELIVERY_TIMING_VERDICTS: readonly ["met", "missed", "unknown"];
4
5
  export declare const timingThresholdSummarySchema: import("zod").ZodObject<{
@@ -15,6 +16,26 @@ export declare const timingThresholdSummarySchema: import("zod").ZodObject<{
15
16
  withinTargetCount: import("zod").ZodInt;
16
17
  }, import("zod/v4/core").$strip>;
17
18
  export type TimingThresholdView = z.infer<typeof timingThresholdSummarySchema>;
19
+ /** One concrete band's first-outbound p95 objective, measured from plannedFor. */
20
+ export declare const bandTimingSummarySchema: import("zod").ZodObject<{
21
+ serviceBand: import("zod").ZodEnum<{
22
+ short_bulk: "short_bulk";
23
+ bulk: "bulk";
24
+ realtime: "realtime";
25
+ }>;
26
+ targetMs: import("zod").ZodUnion<readonly [import("zod").ZodLiteral<1000>, import("zod").ZodLiteral<10000>, import("zod").ZodLiteral<60000>]>;
27
+ breachCount: import("zod").ZodInt;
28
+ customerBlockedCount: import("zod").ZodInt;
29
+ eligibleOutstandingBreachCount: import("zod").ZodInt;
30
+ maturedCount: import("zod").ZodInt;
31
+ verdict: import("zod").ZodEnum<{
32
+ unknown: "unknown";
33
+ met: "met";
34
+ missed: "missed";
35
+ }>;
36
+ withinTargetCount: import("zod").ZodInt;
37
+ }, import("zod/v4/core").$strip>;
38
+ export type BandTimingSummaryView = z.infer<typeof bandTimingSummarySchema>;
18
39
  /**
19
40
  * Exact rolling 24-hour due-time cohort for one project and timing policy.
20
41
  *
@@ -23,6 +44,24 @@ export type TimingThresholdView = z.infer<typeof timingThresholdSummarySchema>;
23
44
  * samples only and remain separate from the exact threshold counters.
24
45
  */
25
46
  export declare const deliveryTimingSummarySchema: import("zod").ZodObject<{
47
+ bandTargets: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
48
+ serviceBand: import("zod").ZodEnum<{
49
+ short_bulk: "short_bulk";
50
+ bulk: "bulk";
51
+ realtime: "realtime";
52
+ }>;
53
+ targetMs: import("zod").ZodUnion<readonly [import("zod").ZodLiteral<1000>, import("zod").ZodLiteral<10000>, import("zod").ZodLiteral<60000>]>;
54
+ breachCount: import("zod").ZodInt;
55
+ customerBlockedCount: import("zod").ZodInt;
56
+ eligibleOutstandingBreachCount: import("zod").ZodInt;
57
+ maturedCount: import("zod").ZodInt;
58
+ verdict: import("zod").ZodEnum<{
59
+ unknown: "unknown";
60
+ met: "met";
61
+ missed: "missed";
62
+ }>;
63
+ withinTargetCount: import("zod").ZodInt;
64
+ }, import("zod/v4/core").$strip>>>;
26
65
  customerBlockedCount: import("zod").ZodInt;
27
66
  deliveredSampleCount: import("zod").ZodInt;
28
67
  freshness: import("zod").ZodObject<{
package/dist/timing.js CHANGED
@@ -1,5 +1,8 @@
1
1
  import { z } from "./zod.js";
2
2
  import { timestampSchema } from "./time.js";
3
+ import { SERVICE_MODE_POLICY } from "./operational-config.js";
4
+ import { SERVICE_BANDS } from "./service-mode.js";
5
+ export const DELIVERY_TIMING_POLICY_VERSION = "timing-v2-service-bands";
3
6
  export const DELIVERY_TIMING_TARGETS_MS = [5_000, 15_000];
4
7
  export const DELIVERY_TIMING_VERDICTS = ["met", "missed", "unknown"];
5
8
  const integerSchema = z.int();
@@ -49,6 +52,41 @@ export const timingThresholdSummarySchema = z
49
52
  });
50
53
  }
51
54
  });
55
+ /** One concrete band's first-outbound p95 objective, measured from plannedFor. */
56
+ export const bandTimingSummarySchema = z
57
+ .object({
58
+ serviceBand: z.enum(SERVICE_BANDS),
59
+ targetMs: z.union([
60
+ z.literal(SERVICE_MODE_POLICY.firstOutboundP95TargetMs.realtime),
61
+ z.literal(SERVICE_MODE_POLICY.firstOutboundP95TargetMs.short_bulk),
62
+ z.literal(SERVICE_MODE_POLICY.firstOutboundP95TargetMs.bulk),
63
+ ]),
64
+ breachCount: countSchema,
65
+ customerBlockedCount: countSchema,
66
+ eligibleOutstandingBreachCount: countSchema,
67
+ maturedCount: countSchema,
68
+ verdict: z.enum(DELIVERY_TIMING_VERDICTS),
69
+ withinTargetCount: countSchema,
70
+ })
71
+ .superRefine((value, context) => {
72
+ const matured = BigInt(value.maturedCount);
73
+ const within = BigInt(value.withinTargetCount);
74
+ const expected = matured === 0n
75
+ ? "unknown"
76
+ : within * 100n >= matured * 95n
77
+ ? "met"
78
+ : "missed";
79
+ if (value.targetMs !==
80
+ SERVICE_MODE_POLICY.firstOutboundP95TargetMs[value.serviceBand] ||
81
+ within + BigInt(value.breachCount) !== matured ||
82
+ value.eligibleOutstandingBreachCount > value.breachCount ||
83
+ value.verdict !== expected) {
84
+ context.addIssue({
85
+ code: z.ZodIssueCode.custom,
86
+ message: "band target and verdict must match the exact service-band counts",
87
+ });
88
+ }
89
+ });
52
90
  /**
53
91
  * Exact rolling 24-hour due-time cohort for one project and timing policy.
54
92
  *
@@ -57,6 +95,19 @@ export const timingThresholdSummarySchema = z
57
95
  * samples only and remain separate from the exact threshold counters.
58
96
  */
59
97
  export const deliveryTimingSummarySchema = z.object({
98
+ /** Present on timing-v2: banded work is judged here, legacy work in targets. */
99
+ bandTargets: z
100
+ .array(bandTimingSummarySchema)
101
+ .length(3)
102
+ .superRefine((targets, context) => {
103
+ if (targets.some((target, index) => target.serviceBand !== SERVICE_BANDS[index])) {
104
+ context.addIssue({
105
+ code: z.ZodIssueCode.custom,
106
+ message: "band targets must contain realtime, short_bulk and bulk in order",
107
+ });
108
+ }
109
+ })
110
+ .optional(),
60
111
  customerBlockedCount: countSchema,
61
112
  deliveredSampleCount: countSchema,
62
113
  freshness: z.object({ kind: z.literal("authoritative") }),
@@ -1,3 +1,3 @@
1
- /** The exact Zod constructors used by delivery-runtime contract modules. */
1
+ /** The exact Zod constructors the contract modules use. */
2
2
  export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, never, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
3
3
  export type { RefinementCtx, ZodType, ZodTypeAny, infer, input } from "zod";
@@ -1,2 +1,2 @@
1
- /** The exact Zod constructors used by delivery-runtime contract modules. */
1
+ /** The exact Zod constructors the contract modules use. */
2
2
  export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, never, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
package/dist/zod.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- /** Tree-shakeable namespace for delivery-runtime contract modules. */
1
+ /** Tree-shakeable Zod namespace for the contract modules. */
2
2
  export * as z from "./zod-values.js";
package/dist/zod.js CHANGED
@@ -1,2 +1,2 @@
1
- /** Tree-shakeable namespace for delivery-runtime contract modules. */
1
+ /** Tree-shakeable Zod namespace for the contract modules. */
2
2
  export * as z from "./zod-values.js";
@@ -0,0 +1,3 @@
1
+ {
2
+ "through": "2026-09-10T12:00:00.000Z"
3
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "dismissed": 3,
3
+ "freshness": {
4
+ "kind": "authoritative"
5
+ }
6
+ }
@@ -3,6 +3,18 @@
3
3
  "boundary": "2026-09-01T00:00:00.000Z",
4
4
  "mode": "shadow"
5
5
  },
6
+ "attemptPrice": {
7
+ "bulk": {
8
+ "currency": "USD",
9
+ "microdollars": "10",
10
+ "scale": 6
11
+ },
12
+ "realtime": {
13
+ "currency": "USD",
14
+ "microdollars": "10",
15
+ "scale": 6
16
+ }
17
+ },
6
18
  "blockingReasons": [],
7
19
  "budgetPolicy": {
8
20
  "desired": {
@@ -3,6 +3,18 @@
3
3
  "boundary": "2026-09-01T00:00:00.000Z",
4
4
  "mode": "shadow"
5
5
  },
6
+ "attemptPrice": {
7
+ "bulk": {
8
+ "currency": "USD",
9
+ "microdollars": "10",
10
+ "scale": 6
11
+ },
12
+ "realtime": {
13
+ "currency": "USD",
14
+ "microdollars": "10",
15
+ "scale": 6
16
+ }
17
+ },
6
18
  "blockingReasons": [],
7
19
  "budgetPolicy": {
8
20
  "desired": {
@@ -6,6 +6,7 @@
6
6
  "id": "occ_01h8xyz9k2m4n6p8r0t2v4w6y8",
7
7
  "plannedFor": "2026-07-28T15:00:00.000Z",
8
8
  "schedule": "sch_01h8xyz9k2m4n6p8r0t2v4w6y8",
9
+ "scheduleName": "Nightly report",
9
10
  "sequence": 1,
10
11
  "settledAt": "2026-07-28T15:00:01.000Z",
11
12
  "state": "succeeded"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "limits": {
3
- "inlinePayloadBytes": 65536,
3
+ "inlinePayloadBytes": 8192,
4
4
  "forecastHorizonSeconds": 90000,
5
5
  "usageWindowDays": 366
6
6
  },
@@ -13,6 +13,7 @@
13
13
  "statusWebhook": {
14
14
  "url": "https://hooks.example.com/status",
15
15
  "events": ["failed"],
16
+ "endpoint": "ep_01h8xyz9k2m4n6p8r0t2v4w6y8",
16
17
  "signingKey": {
17
18
  "id": "csk_01h8xyz9k2m4n6p8r0t2v4w6y8"
18
19
  },
@@ -2,12 +2,6 @@
2
2
  "data": [
3
3
  {
4
4
  "createdAt": "2026-08-14T11:00:00.000Z",
5
- "deletionCounts": {
6
- "endpoints": 2,
7
- "keys": 4,
8
- "runs": 37,
9
- "schedules": 5
10
- },
11
5
  "environmentKinds": ["test", "live"],
12
6
  "id": "proj_01h8xyz9k2m4n6p8r0t2v4w6y8",
13
7
  "name": "Billing reminders",
@@ -0,0 +1,14 @@
1
+ {
2
+ "createdAt": "2026-08-14T11:00:00.000Z",
3
+ "deletionCounts": {
4
+ "endpoints": 2,
5
+ "keys": 4,
6
+ "runs": 37,
7
+ "schedules": 5
8
+ },
9
+ "environmentKinds": ["test", "live"],
10
+ "id": "proj_01h8xyz9k2m4n6p8r0t2v4w6y8",
11
+ "name": "Billing reminders",
12
+ "status": "archived",
13
+ "version": 2
14
+ }
@@ -18,9 +18,7 @@
18
18
  }
19
19
  ],
20
20
  "freshness": {
21
- "asOf": "2026-07-28T15:00:00.000Z",
22
- "kind": "projected",
23
- "lagSeconds": 0
21
+ "kind": "authoritative"
24
22
  },
25
23
  "nextCursor": "eyJhIjoxNzg1MjUwODAwMDAwLCJpIjoic2NoXzAxaDh4eXo5azJtNG42cDhyMHQydjR3Nnk4IiwiayI6Ijk1MTM1NDZmIn0"
26
24
  }
@@ -0,0 +1,174 @@
1
+ {
2
+ "counts": {
3
+ "active": 4863,
4
+ "paused": 3,
5
+ "completed": 148738,
6
+ "cancelled": 212
7
+ },
8
+ "pausedAfterFailures": {
9
+ "count": 0,
10
+ "schedules": []
11
+ },
12
+ "days": [
13
+ {
14
+ "date": "2026-09-25",
15
+ "created": 0,
16
+ "finished": 0
17
+ },
18
+ {
19
+ "date": "2026-09-26",
20
+ "created": 0,
21
+ "finished": 0
22
+ },
23
+ {
24
+ "date": "2026-09-27",
25
+ "created": 0,
26
+ "finished": 0
27
+ },
28
+ {
29
+ "date": "2026-09-28",
30
+ "created": 0,
31
+ "finished": 0
32
+ },
33
+ {
34
+ "date": "2026-09-29",
35
+ "created": 0,
36
+ "finished": 0
37
+ },
38
+ {
39
+ "date": "2026-09-30",
40
+ "created": 0,
41
+ "finished": 0
42
+ },
43
+ {
44
+ "date": "2026-10-01",
45
+ "created": 0,
46
+ "finished": 0
47
+ },
48
+ {
49
+ "date": "2026-10-02",
50
+ "created": 0,
51
+ "finished": 0
52
+ },
53
+ {
54
+ "date": "2026-10-03",
55
+ "created": 0,
56
+ "finished": 0
57
+ },
58
+ {
59
+ "date": "2026-10-04",
60
+ "created": 0,
61
+ "finished": 0
62
+ },
63
+ {
64
+ "date": "2026-10-05",
65
+ "created": 0,
66
+ "finished": 0
67
+ },
68
+ {
69
+ "date": "2026-10-06",
70
+ "created": 0,
71
+ "finished": 0
72
+ },
73
+ {
74
+ "date": "2026-10-07",
75
+ "created": 0,
76
+ "finished": 0
77
+ },
78
+ {
79
+ "date": "2026-10-08",
80
+ "created": 0,
81
+ "finished": 0
82
+ },
83
+ {
84
+ "date": "2026-10-09",
85
+ "created": 0,
86
+ "finished": 0
87
+ },
88
+ {
89
+ "date": "2026-10-10",
90
+ "created": 0,
91
+ "finished": 0
92
+ },
93
+ {
94
+ "date": "2026-10-11",
95
+ "created": 0,
96
+ "finished": 0
97
+ },
98
+ {
99
+ "date": "2026-10-12",
100
+ "created": 0,
101
+ "finished": 0
102
+ },
103
+ {
104
+ "date": "2026-10-13",
105
+ "created": 0,
106
+ "finished": 0
107
+ },
108
+ {
109
+ "date": "2026-10-14",
110
+ "created": 0,
111
+ "finished": 0
112
+ },
113
+ {
114
+ "date": "2026-10-15",
115
+ "created": 0,
116
+ "finished": 0
117
+ },
118
+ {
119
+ "date": "2026-10-16",
120
+ "created": 0,
121
+ "finished": 0
122
+ },
123
+ {
124
+ "date": "2026-10-17",
125
+ "created": 0,
126
+ "finished": 0
127
+ },
128
+ {
129
+ "date": "2026-10-18",
130
+ "created": 0,
131
+ "finished": 0
132
+ },
133
+ {
134
+ "date": "2026-10-19",
135
+ "created": 0,
136
+ "finished": 0
137
+ },
138
+ {
139
+ "date": "2026-10-20",
140
+ "created": 0,
141
+ "finished": 0
142
+ },
143
+ {
144
+ "date": "2026-10-21",
145
+ "created": 0,
146
+ "finished": 0
147
+ },
148
+ {
149
+ "date": "2026-10-22",
150
+ "created": 0,
151
+ "finished": 0
152
+ },
153
+ {
154
+ "date": "2026-10-23",
155
+ "created": 0,
156
+ "finished": 0
157
+ },
158
+ {
159
+ "date": "2026-10-24",
160
+ "created": 5,
161
+ "finished": 2
162
+ }
163
+ ],
164
+ "window": {
165
+ "from": "2026-09-25",
166
+ "to": "2026-10-24",
167
+ "timeZone": "America/Chicago"
168
+ },
169
+ "freshness": {
170
+ "asOf": "2026-10-24T14:58:00.000Z",
171
+ "kind": "projected",
172
+ "lagSeconds": 120
173
+ }
174
+ }
@@ -1,4 +1,36 @@
1
1
  {
2
+ "bandTargets": [
3
+ {
4
+ "serviceBand": "realtime",
5
+ "targetMs": 1000,
6
+ "breachCount": 0,
7
+ "customerBlockedCount": 0,
8
+ "eligibleOutstandingBreachCount": 0,
9
+ "maturedCount": 0,
10
+ "verdict": "unknown",
11
+ "withinTargetCount": 0
12
+ },
13
+ {
14
+ "serviceBand": "short_bulk",
15
+ "targetMs": 10000,
16
+ "breachCount": 0,
17
+ "customerBlockedCount": 0,
18
+ "eligibleOutstandingBreachCount": 0,
19
+ "maturedCount": 0,
20
+ "verdict": "unknown",
21
+ "withinTargetCount": 0
22
+ },
23
+ {
24
+ "serviceBand": "bulk",
25
+ "targetMs": 60000,
26
+ "breachCount": 0,
27
+ "customerBlockedCount": 0,
28
+ "eligibleOutstandingBreachCount": 0,
29
+ "maturedCount": 0,
30
+ "verdict": "unknown",
31
+ "withinTargetCount": 0
32
+ }
33
+ ],
2
34
  "customerBlockedCount": 2,
3
35
  "deliveredSampleCount": 98,
4
36
  "freshness": {
@@ -8,7 +40,7 @@
8
40
  "p95LatenessMs": 4200,
9
41
  "p99LatenessMs": 12000,
10
42
  "platformBlockedCount": 1,
11
- "policyVersion": "timing-v1",
43
+ "policyVersion": "timing-v2-service-bands",
12
44
  "skippedCount": 3,
13
45
  "targets": [
14
46
  {