@btrc/contracts 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,462 @@
1
+ import { z } from 'zod';
2
+ import { BulletinActionId, BulletinId, ChampionshipId, CircuitId, CircuitLayoutId, DriverId, EntryId, EventId, EventPermitId, Id, IsoDate, IsoDateTime, JudicialDecisionId, LapId, NoticeboardDocumentId, NoticeboardSnapshotId, NullableNumber, NullableText, OfficialId, ProvenanceSchema, PublicJson, PublicationVersionSchema, QualitySchema, SanctionId, SessionId, SessionPublicationId, SourceDocumentId, SourcePageId, TeamId, Uuid, VehicleId, } from './primitives.js';
3
+ export const ChampionshipSchema = z.object({
4
+ id: ChampionshipId,
5
+ name: z.string(),
6
+ shortName: z.string(),
7
+ organiser: NullableText,
8
+ });
9
+ export const SeasonSchema = z.object({
10
+ year: z.number().int(),
11
+ isComplete: z.boolean(),
12
+ eventCount: z.number().int().nonnegative(),
13
+ sessionCount: z.number().int().nonnegative(),
14
+ });
15
+ export const CircuitLayoutSummarySchema = z.object({
16
+ id: CircuitLayoutId,
17
+ name: z.string(),
18
+ lengthM: NullableNumber,
19
+ lengthMiles: NullableNumber,
20
+ });
21
+ export const CircuitSchema = z.object({
22
+ id: CircuitId,
23
+ name: z.string(),
24
+ countryCode: z.string().length(2),
25
+ latitudeDeg: NullableNumber,
26
+ longitudeDeg: NullableNumber,
27
+ layouts: z.array(CircuitLayoutSummarySchema).optional(),
28
+ });
29
+ export const CircuitLayoutSchema = CircuitLayoutSummarySchema.extend({
30
+ circuitId: CircuitId,
31
+ startFinishDistanceM: NullableNumber,
32
+ pitEntryDistanceM: NullableNumber,
33
+ pitExitOffsetM: NullableNumber,
34
+ pitLaneDistanceM: NullableNumber,
35
+ pitTime50KphMs: NullableNumber,
36
+ pitTime60KphMs: NullableNumber,
37
+ });
38
+ export const TimingPointSchema = z.object({
39
+ id: Id,
40
+ layoutId: CircuitLayoutId,
41
+ name: z.string(),
42
+ distance: NullableText,
43
+ distanceM: NullableNumber,
44
+ offsetDescription: NullableText,
45
+ latitudeDeg: NullableNumber,
46
+ longitudeDeg: NullableNumber,
47
+ provenance: ProvenanceSchema,
48
+ });
49
+ export const CircuitFeatureSchema = z.object({
50
+ id: Id,
51
+ layoutId: CircuitLayoutId,
52
+ sequence: z.number().int(),
53
+ name: z.string(),
54
+ type: NullableText,
55
+ provenance: ProvenanceSchema,
56
+ });
57
+ export const EventStatusSchema = z.enum(['scheduled', 'completed', 'cancelled', 'provisional']);
58
+ export const EventSchema = z.object({
59
+ id: EventId,
60
+ championshipId: ChampionshipId,
61
+ seasonYear: z.number().int(),
62
+ circuitLayoutId: CircuitLayoutId.nullable(),
63
+ timingProviderEventId: NullableText,
64
+ name: z.string(),
65
+ startDate: IsoDate,
66
+ endDate: IsoDate,
67
+ timezone: z.string(),
68
+ status: EventStatusSchema,
69
+ resultsIndexUrl: NullableText,
70
+ updatedAt: IsoDateTime,
71
+ });
72
+ export const SessionTypeSchema = z.enum(['practice', 'qualifying', 'warmup', 'race', 'test', 'other']);
73
+ export const SessionStatusSchema = z.enum(['scheduled', 'provisional', 'official', 'cancelled', 'abandoned']);
74
+ export const SessionSchema = z.object({
75
+ id: SessionId,
76
+ eventId: EventId,
77
+ code: NullableText,
78
+ name: z.string(),
79
+ type: SessionTypeSchema,
80
+ weekendRaceNumber: NullableNumber,
81
+ championshipRoundNumber: NullableNumber,
82
+ scheduledStart: IsoDateTime.nullable(),
83
+ actualStart: IsoDateTime.nullable(),
84
+ finishTime: IsoDateTime.nullable(),
85
+ competitorsStarted: NullableNumber,
86
+ totalLaps: NullableNumber,
87
+ totalDistanceMiles: NullableNumber,
88
+ weather: NullableText,
89
+ trackCondition: NullableText,
90
+ status: SessionStatusSchema,
91
+ publicationVersion: PublicationVersionSchema,
92
+ updatedAt: IsoDateTime,
93
+ });
94
+ export const DriverSchema = z.object({
95
+ id: DriverId,
96
+ name: z.string(),
97
+ givenName: NullableText,
98
+ familyName: NullableText,
99
+ nationalityCode: NullableText,
100
+ aliases: z.array(z.string()).optional(),
101
+ });
102
+ export const TeamSchema = z.object({ id: TeamId, name: z.string() });
103
+ export const VehicleSchema = z.object({
104
+ id: VehicleId,
105
+ manufacturer: NullableText,
106
+ model: NullableText,
107
+ description: z.string(),
108
+ });
109
+ export const EntrySchema = z.object({
110
+ id: EntryId,
111
+ eventId: EventId,
112
+ driverId: DriverId,
113
+ teamId: TeamId.nullable(),
114
+ vehicleId: VehicleId.nullable(),
115
+ raceNumber: z.string(),
116
+ competitionClass: NullableText,
117
+ transponder: NullableText,
118
+ provenance: ProvenanceSchema,
119
+ });
120
+ export const SectorTimeSchema = z.object({
121
+ id: Id,
122
+ lapId: LapId,
123
+ sectorNumber: z.number().int().positive(),
124
+ time: NullableText,
125
+ timeMs: NullableNumber,
126
+ isPersonalBest: z.boolean().nullable(),
127
+ isSessionBest: z.boolean().nullable(),
128
+ provenance: ProvenanceSchema,
129
+ });
130
+ export const LapSchema = z.object({
131
+ id: LapId,
132
+ sessionId: SessionId,
133
+ entryId: EntryId,
134
+ lapNumber: z.number().int().nonnegative(),
135
+ sessionPosition: NullableNumber,
136
+ lapRank: NullableNumber,
137
+ lapTime: NullableText,
138
+ lapTimeMs: NullableNumber,
139
+ elapsedTimeMs: NullableNumber,
140
+ averageMph: NullableNumber,
141
+ personalBestDiff: NullableText,
142
+ personalBestDiffMs: NullableNumber,
143
+ timeOfDay: NullableText,
144
+ pitMarker: NullableText,
145
+ isDisallowed: z.boolean(),
146
+ isOutLap: z.boolean(),
147
+ isInPit: z.boolean(),
148
+ sectors: z.array(SectorTimeSchema).optional(),
149
+ quality: QualitySchema,
150
+ provenance: ProvenanceSchema,
151
+ });
152
+ export const ClassificationSchema = z.object({
153
+ id: Id,
154
+ sessionId: SessionId,
155
+ entryId: EntryId.nullable(),
156
+ publicationVersion: PublicationVersionSchema,
157
+ status: NullableText,
158
+ position: NullableNumber,
159
+ classPosition: NullableNumber,
160
+ laps: NullableNumber,
161
+ time: NullableText,
162
+ timeMs: NullableNumber,
163
+ gap: NullableText,
164
+ gapMs: NullableNumber,
165
+ difference: NullableText,
166
+ differenceMs: NullableNumber,
167
+ averageMph: NullableNumber,
168
+ bestLap: NullableText,
169
+ bestLapMs: NullableNumber,
170
+ bestOnLap: NullableNumber,
171
+ gridPosition: NullableNumber,
172
+ positionsChanged: NullableNumber,
173
+ rawNumber: NullableText,
174
+ rawDriverName: NullableText,
175
+ rawVehicle: NullableText,
176
+ provenance: ProvenanceSchema,
177
+ });
178
+ export const GridEntrySchema = z.object({
179
+ id: Id,
180
+ sessionId: SessionId,
181
+ entryId: EntryId.nullable(),
182
+ publicationVersion: PublicationVersionSchema,
183
+ position: NullableNumber,
184
+ row: NullableNumber,
185
+ side: NullableText,
186
+ qualifyingTime: NullableText,
187
+ qualifyingTimeMs: NullableNumber,
188
+ startInstruction: NullableText,
189
+ rawNumber: NullableText,
190
+ rawDriverName: NullableText,
191
+ provenance: ProvenanceSchema,
192
+ });
193
+ export const RunningOrderSchema = z.object({
194
+ id: Id,
195
+ sessionId: SessionId,
196
+ entryId: EntryId.nullable(),
197
+ lapNumber: NullableNumber,
198
+ timingPoint: z.string(),
199
+ position: z.number().int().positive(),
200
+ lapTime: NullableText,
201
+ lapTimeMs: NullableNumber,
202
+ behind: NullableText,
203
+ behindMs: NullableNumber,
204
+ crossingTime: NullableText,
205
+ provenance: ProvenanceSchema,
206
+ });
207
+ export const FlagSchema = z.object({
208
+ id: Id,
209
+ sessionId: SessionId,
210
+ recordType: NullableText,
211
+ type: z.string(),
212
+ timeOfDay: NullableText,
213
+ occurrenceCount: NullableNumber,
214
+ totalLaps: NullableNumber,
215
+ totalTime: NullableText,
216
+ totalTimeMs: NullableNumber,
217
+ provenance: ProvenanceSchema,
218
+ });
219
+ export const PenaltySchema = z.object({
220
+ id: Id,
221
+ eventId: EventId,
222
+ sessionId: SessionId.nullable(),
223
+ entryId: EntryId.nullable(),
224
+ decisionNumber: NullableText,
225
+ infringement: NullableText,
226
+ penalty: z.string(),
227
+ positionPenalty: NullableNumber,
228
+ timePenaltyMs: NullableNumber,
229
+ pointsPenalty: NullableNumber,
230
+ decisionTime: IsoDateTime.nullable(),
231
+ status: NullableText,
232
+ provenance: ProvenanceSchema,
233
+ });
234
+ export const StandingSchema = z.object({
235
+ seasonYear: z.number().int(),
236
+ competitionClass: z.enum(['class-1', 'class-2']),
237
+ position: z.number().int().positive(),
238
+ driverId: DriverId,
239
+ driverName: z.string(),
240
+ points: z.number(),
241
+ starts: z.number().int().nonnegative(),
242
+ wins: z.number().int().nonnegative(),
243
+ podiums: z.number().int().nonnegative(),
244
+ fastestLaps: z.number().int().nonnegative(),
245
+ calculationVersion: z.string(),
246
+ asOf: IsoDateTime,
247
+ isVerified: z.boolean(),
248
+ });
249
+ export const AnalysisMetricSchema = z.object({
250
+ entryId: EntryId,
251
+ driverId: DriverId,
252
+ raceNumber: z.string(),
253
+ sampleSize: z.number().int().nonnegative(),
254
+ bestLapMs: NullableNumber,
255
+ meanLapMs: NullableNumber,
256
+ medianLapMs: NullableNumber,
257
+ standardDeviationMs: NullableNumber,
258
+ coefficientOfVariation: NullableNumber,
259
+ percentile25Ms: NullableNumber,
260
+ percentile75Ms: NullableNumber,
261
+ theoreticalBestMs: NullableNumber.optional(),
262
+ });
263
+ export const SourceDocumentSchema = z.object({
264
+ id: SourceDocumentId,
265
+ eventId: EventId.nullable(),
266
+ provider: z.string(),
267
+ type: z.string(),
268
+ publicationVersion: z.string(),
269
+ sourceUrl: z.string().url(),
270
+ fileName: NullableText,
271
+ sha256: NullableText,
272
+ byteSize: NullableNumber,
273
+ pageCount: NullableNumber,
274
+ publishedAt: IsoDateTime.nullable(),
275
+ discoveredAt: IsoDateTime,
276
+ downloadedAt: IsoDateTime.nullable(),
277
+ status: z.string(),
278
+ isCurrent: z.boolean(),
279
+ });
280
+ export const SourcePageSchema = z.object({
281
+ id: SourcePageId,
282
+ documentId: SourceDocumentId,
283
+ pageNumber: z.number().int().positive(),
284
+ sessionId: SessionId.nullable(),
285
+ reportType: NullableText,
286
+ reportTitle: NullableText,
287
+ publicationVersion: NullableText,
288
+ imageSha256: NullableText,
289
+ widthPx: NullableNumber,
290
+ heightPx: NullableNumber,
291
+ dpi: NullableNumber,
292
+ extractionStatus: z.string(),
293
+ });
294
+ export const CoverageSchema = z.object({
295
+ asOf: IsoDateTime,
296
+ seasons: z.array(z.object({
297
+ year: z.number().int(),
298
+ isComplete: z.boolean(),
299
+ events: z.number().int().nonnegative(),
300
+ sessions: z.number().int().nonnegative(),
301
+ laps: z.number().int().nonnegative(),
302
+ sectors: z.number().int().nonnegative(),
303
+ openQualityExceptions: z.number().int().nonnegative(),
304
+ })),
305
+ totals: z.record(z.number().int().nonnegative()),
306
+ });
307
+ export const DatasetSchema = z.object({
308
+ id: z.string(),
309
+ createdAt: IsoDateTime,
310
+ schemaVersion: z.string(),
311
+ calculationVersion: NullableText,
312
+ seasons: z.array(z.number().int()),
313
+ formats: z.array(z.enum(['csv', 'jsonl'])),
314
+ files: z.array(z.object({
315
+ format: z.enum(['csv', 'jsonl']),
316
+ fileName: z.string(),
317
+ byteSize: z.number().int().nonnegative(),
318
+ sha256: z.string().length(64),
319
+ })),
320
+ });
321
+ export const SearchResultSchema = z.object({
322
+ type: z.enum(['driver', 'event', 'circuit', 'session', 'publication', 'judicial-decision', 'bulletin', 'official']),
323
+ id: z.string(),
324
+ label: z.string(),
325
+ description: NullableText,
326
+ });
327
+ export const NoticeboardSnapshotSchema = z.object({
328
+ id: NoticeboardSnapshotId, eventId: EventId, sourceUrl: z.string().url(), pageTitle: z.string(),
329
+ fetchedAt: IsoDateTime, documentCount: z.number().int().nonnegative(), scope: z.string(),
330
+ });
331
+ export const NoticeboardDocumentSchema = z.object({
332
+ id: NoticeboardDocumentId, snapshotId: NoticeboardSnapshotId, sourceDocumentId: SourceDocumentId,
333
+ sequence: z.number().int().positive(), displayedTitle: z.string(), sourceUrl: z.string().url(),
334
+ sectionTitle: NullableText, selectionStatus: z.string(), scope: z.string(), selectionReason: z.string(),
335
+ });
336
+ export const EventPermitSchema = z.object({
337
+ id: EventPermitId, eventId: EventId, permitNumber: z.string(), eventName: NullableText,
338
+ permitType: NullableText, permitGrade: NullableText, venueLocation: NullableText,
339
+ organisingClub: NullableText, startDate: IsoDate.nullable(), endDate: IsoDate.nullable(),
340
+ issuedDate: IsoDate.nullable(), permitNotes: NullableText, provenance: ProvenanceSchema,
341
+ });
342
+ export const OfficialSchema = z.object({ id: OfficialId, name: z.string() });
343
+ export const OfficialAssignmentSchema = z.object({
344
+ id: Uuid, eventId: EventId, officialId: OfficialId, officialName: z.string(), role: z.string(),
345
+ jurisdiction: NullableText, factCategory: NullableText, locationDescription: NullableText,
346
+ effectiveFrom: IsoDateTime.nullable(), effectiveTo: IsoDateTime.nullable(), provenance: ProvenanceSchema,
347
+ });
348
+ export const OperationalRuleSchema = z.object({
349
+ id: Uuid, eventId: EventId, ruleType: z.string(), valueNumeric: NullableNumber, valueText: NullableText,
350
+ unit: NullableText, locationDescription: NullableText, effectiveFrom: IsoDateTime.nullable(),
351
+ effectiveTo: IsoDateTime.nullable(), provenance: ProvenanceSchema,
352
+ });
353
+ export const BulletinSchema = z.object({
354
+ id: BulletinId, eventId: EventId, number: z.string(), series: z.string(), title: z.string(), scope: z.string(),
355
+ issuingAuthority: NullableText, issuedAt: IsoDateTime.nullable(), postedAt: IsoDateTime.nullable(),
356
+ issuerOfficialId: OfficialId.nullable(), issuerOfficialName: NullableText, provenance: ProvenanceSchema,
357
+ });
358
+ export const BulletinActionSchema = z.object({
359
+ id: BulletinActionId, bulletinId: BulletinId, sequence: z.number().int().positive(), actionType: z.string(),
360
+ targetType: z.string(), targetReference: NullableText, beforeValue: PublicJson, afterValue: PublicJson,
361
+ effectiveAt: IsoDateTime.nullable(), reason: NullableText,
362
+ });
363
+ export const EntryStatusHistorySchema = z.object({
364
+ id: Uuid, eventId: EventId, driverId: DriverId.nullable(), entryId: EntryId.nullable(),
365
+ printedDriverName: z.string(), raceNumber: NullableText, competitionClass: NullableText, vehicle: NullableText,
366
+ status: z.string(), effectiveAt: IsoDateTime.nullable(), bulletinActionId: BulletinActionId.nullable(), provenance: ProvenanceSchema,
367
+ });
368
+ export const ProgrammeSlotSchema = z.object({
369
+ id: Uuid, eventId: EventId, sessionId: SessionId.nullable(), programmeRaceNumber: NullableNumber,
370
+ championshipRoundNumber: NullableNumber, seriesName: z.string(), scheduledStart: IsoDateTime.nullable(),
371
+ intendedDurationSeconds: NullableNumber, provenance: ProvenanceSchema,
372
+ });
373
+ export const EligibilityDecisionSchema = z.object({
374
+ id: Uuid, eventId: EventId, driverId: DriverId.nullable(), entryId: EntryId.nullable(), raceNumber: NullableText,
375
+ printedDriverName: z.string(), decisionType: z.string(), beforeValue: PublicJson, afterValue: PublicJson,
376
+ effectiveAt: IsoDateTime.nullable(), bulletinActionId: BulletinActionId.nullable(), provenance: ProvenanceSchema,
377
+ });
378
+ export const SessionPublicationSchema = z.object({
379
+ id: SessionPublicationId, eventId: EventId, sessionId: SessionId.nullable(), type: z.string(),
380
+ version: z.string(), title: z.string(), printedAt: IsoDateTime.nullable(), issuedAt: IsoDateTime.nullable(),
381
+ postedAt: IsoDateTime.nullable(), status: z.string(), isCurrent: z.boolean(),
382
+ supersedesPublicationId: SessionPublicationId.nullable(), provenance: ProvenanceSchema,
383
+ });
384
+ export const PublicationClassificationRowSchema = z.object({
385
+ id: Id, publicationId: SessionPublicationId, driverId: DriverId.nullable(), entryId: EntryId.nullable(),
386
+ position: NullableNumber, status: NullableText, raceNumber: NullableText, competitionClass: NullableText,
387
+ classPosition: NullableNumber, printedDriverName: NullableText, vehicle: NullableText, laps: NullableNumber,
388
+ time: NullableText, timeMs: NullableNumber, gap: NullableText, gapMs: NullableNumber,
389
+ difference: NullableText, differenceMs: NullableNumber, averageMph: NullableNumber,
390
+ bestLap: NullableText, bestLapMs: NullableNumber, bestOnLap: NullableNumber,
391
+ gridPosition: NullableNumber, positionsChanged: NullableNumber, provenance: ProvenanceSchema,
392
+ });
393
+ export const PublicationGridRowSchema = z.object({
394
+ id: Id, publicationId: SessionPublicationId, driverId: DriverId.nullable(), entryId: EntryId.nullable(),
395
+ gridPosition: NullableNumber, gridRow: NullableNumber, gridSide: NullableText, raceNumber: NullableText,
396
+ printedDriverName: NullableText, qualifyingTime: NullableText, qualifyingTimeMs: NullableNumber,
397
+ startInstruction: NullableText, provenance: ProvenanceSchema,
398
+ });
399
+ export const PublicationChangeSchema = z.object({
400
+ id: Uuid, previousPublicationId: SessionPublicationId, replacementPublicationId: SessionPublicationId,
401
+ driverId: DriverId.nullable(), entryId: EntryId.nullable(), raceNumber: NullableText, fieldName: z.string(),
402
+ beforeValue: PublicJson, afterValue: PublicJson, reason: NullableText, sourceSanctionId: SanctionId.nullable(),
403
+ });
404
+ export const PublicationReconciliationSchema = z.object({
405
+ id: Uuid, publicationId: SessionPublicationId, weekendBookSourceDocumentId: SourceDocumentId.nullable(),
406
+ status: z.string(), comparedAt: IsoDateTime,
407
+ });
408
+ export const ResultStatusHistorySchema = z.object({
409
+ id: Uuid, eventId: EventId, sessionId: SessionId.nullable(), programmeRaceNumber: NullableNumber,
410
+ status: z.string(), effectiveAt: IsoDateTime, reason: NullableText, bulletinId: BulletinId.nullable(), provenance: ProvenanceSchema,
411
+ });
412
+ export const DecisionParticipantSchema = z.object({
413
+ id: Uuid, driverId: DriverId.nullable(), entryId: EntryId.nullable(), printedDriverName: z.string(),
414
+ raceNumber: NullableText, role: z.string(), sequence: z.number().int().positive(),
415
+ });
416
+ export const RegulationCitationSchema = z.object({
417
+ id: Uuid, governingRuleSet: NullableText, chapter: NullableText, appendix: NullableText,
418
+ article: NullableText, citation: z.string(), sequence: z.number().int().positive(),
419
+ });
420
+ export const DecisionEvidenceSchema = z.object({
421
+ id: Uuid, evidenceType: z.string(), associatedRaceNumber: NullableText, sequence: z.number().int().positive(),
422
+ });
423
+ export const DecisionOfficialSchema = z.object({
424
+ id: Uuid, officialId: OfficialId, officialName: z.string(), role: z.string(),
425
+ signatoryOrder: NullableNumber, signed: z.boolean(),
426
+ });
427
+ export const SanctionSchema = z.object({
428
+ id: SanctionId, judicialDecisionId: JudicialDecisionId, eventId: EventId, sessionId: SessionId.nullable(),
429
+ driverId: DriverId.nullable(), entryId: EntryId.nullable(), type: z.string(), value: NullableNumber,
430
+ unit: NullableText, appliesToEventId: EventId.nullable(), appliesToSessionId: SessionId.nullable(),
431
+ effectiveAt: IsoDateTime.nullable(), status: z.string(), provenance: ProvenanceSchema,
432
+ });
433
+ export const JudicialDecisionSchema = z.object({
434
+ id: JudicialDecisionId, eventId: EventId, hearingEventId: EventId.nullable(), sessionId: SessionId.nullable(),
435
+ eventPermitId: EventPermitId.nullable(), noticeboardSnapshotId: NoticeboardSnapshotId.nullable(),
436
+ decisionNumber: NullableText, authority: z.string(), type: z.string(), issueTime: IsoDateTime.nullable(),
437
+ incidentTime: IsoDateTime.nullable(), outcomeCode: NullableText, status: z.string(),
438
+ supersedesDecisionId: JudicialDecisionId.nullable(), provenance: ProvenanceSchema,
439
+ participants: z.array(DecisionParticipantSchema).optional(), citations: z.array(RegulationCitationSchema).optional(),
440
+ evidence: z.array(DecisionEvidenceSchema).optional(), officials: z.array(DecisionOfficialSchema).optional(),
441
+ sanctions: z.array(SanctionSchema).optional(),
442
+ });
443
+ export const LicencePenaltyPointSchema = z.object({
444
+ id: Uuid, sanctionId: SanctionId, driverId: DriverId, points: z.number(), imposedAt: IsoDateTime,
445
+ effectiveAt: IsoDateTime, expiresAt: IsoDateTime.nullable(), status: z.string(), reversesRecordId: Uuid.nullable(), provenance: ProvenanceSchema,
446
+ });
447
+ export const DriverPenaltyBalanceSchema = z.object({
448
+ driverId: DriverId, driverName: z.string(), activeLicencePoints: z.number(), licencePointIncidents: z.number().int(), championshipPointsDeducted: z.number(),
449
+ });
450
+ export const ChampionshipAdjustmentSchema = z.object({
451
+ id: Id, championshipId: ChampionshipId, seasonYear: z.number().int(), competitionClass: z.string(),
452
+ driverId: DriverId, adjustmentType: z.string(), pointsDelta: z.number(), reason: z.string(),
453
+ decisionNumber: NullableText, decisionTime: IsoDateTime.nullable(), sourceSanctionId: SanctionId.nullable(),
454
+ sourceLicencePenaltyPointId: Uuid.nullable(), deductionMultiplier: NullableNumber,
455
+ calculationVersion: NullableText, provenance: ProvenanceSchema,
456
+ });
457
+ export const DataQualitySummarySchema = z.object({
458
+ resourceType: z.string(), resourceId: z.string(), pages: z.number().int().nonnegative(),
459
+ verified: z.number().int().nonnegative(), rejected: z.number().int().nonnegative(),
460
+ rerenderRequired: z.number().int().nonnegative(), notApplicable: z.number().int().nonnegative(),
461
+ latestReviewAt: IsoDateTime.nullable(),
462
+ });