@peasant-labs/schema 0.1.0-rc6
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.
- package/LICENSE +13 -0
- package/README.md +56 -0
- package/dist/fixtures/quality.d.ts +81 -0
- package/dist/fixtures/quality.js +36 -0
- package/dist/fixtures/timeline.d.ts +22 -0
- package/dist/fixtures/timeline.js +2 -0
- package/dist/fixtures.d.ts +2 -0
- package/dist/fixtures.js +2 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +36 -0
- package/dist/internal/generated/contract/zod.gen.d.ts +2740 -0
- package/dist/internal/generated/contract/zod.gen.js +1196 -0
- package/dist/internal/generated/enums.gen.d.ts +318 -0
- package/dist/internal/generated/enums.gen.js +348 -0
- package/dist/internal/generated/local-api.d.ts +946 -0
- package/dist/internal/generated/local-api.js +1 -0
- package/dist/internal/generated/public-contract.gen.d.ts +2 -0
- package/dist/internal/generated/public-contract.gen.js +2 -0
- package/dist/internal/generated/quality-fixtures.gen.d.ts +2 -0
- package/dist/internal/generated/quality-fixtures.gen.js +367 -0
- package/dist/internal/generated/testcase.gen.d.ts +17 -0
- package/dist/internal/generated/testcase.gen.js +20 -0
- package/dist/internal/generated/timeline-fixtures.gen.d.ts +2 -0
- package/dist/internal/generated/timeline-fixtures.gen.js +542 -0
- package/dist/internal/generated/versions.gen.d.ts +4 -0
- package/dist/internal/generated/versions.gen.js +5 -0
- package/dist/internal/generated/village-api.d.ts +585 -0
- package/dist/internal/generated/village-api.js +1 -0
- package/dist/local-api.d.ts +4 -0
- package/dist/local-api.js +1 -0
- package/dist/testcase.d.ts +32 -0
- package/dist/testcase.js +144 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +2 -0
- package/dist/village-api.d.ts +4 -0
- package/dist/village-api.js +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
export const canonicalTimelineFixtures = {
|
|
2
|
+
"cases": [
|
|
3
|
+
{
|
|
4
|
+
"family": "many-to-many-bindings",
|
|
5
|
+
"name": "many_to_many_bindings",
|
|
6
|
+
"input": {
|
|
7
|
+
"sessions": [
|
|
8
|
+
{
|
|
9
|
+
"sessionId": "session-a",
|
|
10
|
+
"title": "first task",
|
|
11
|
+
"harness": "claude-code",
|
|
12
|
+
"startMs": 2000,
|
|
13
|
+
"hasCommitBinding": true
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"sessionId": "session-b",
|
|
17
|
+
"title": "second task",
|
|
18
|
+
"harness": "codex",
|
|
19
|
+
"startMs": 1000,
|
|
20
|
+
"hasCommitBinding": true
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"commits": [
|
|
24
|
+
{
|
|
25
|
+
"hash": "commit-2",
|
|
26
|
+
"subject": "follow-up",
|
|
27
|
+
"hasSession": true,
|
|
28
|
+
"sessionIds": [
|
|
29
|
+
"session-a",
|
|
30
|
+
"session-b"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"hash": "commit-1",
|
|
35
|
+
"subject": "setup",
|
|
36
|
+
"hasSession": true,
|
|
37
|
+
"sessionIds": [
|
|
38
|
+
"session-a"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"expected": {},
|
|
44
|
+
"classification": "must-pass",
|
|
45
|
+
"provenance": {
|
|
46
|
+
"source": "requirement",
|
|
47
|
+
"ref": "authoritative many-to-many commit bindings"
|
|
48
|
+
},
|
|
49
|
+
"mutation": {
|
|
50
|
+
"description": "binds two sessions to one commit and one session to two commits"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"family": "unattached-session",
|
|
55
|
+
"name": "session_not_linked_to_commit",
|
|
56
|
+
"input": {
|
|
57
|
+
"sessions": [
|
|
58
|
+
{
|
|
59
|
+
"sessionId": "session-unlinked",
|
|
60
|
+
"title": "exploration",
|
|
61
|
+
"harness": "opencode",
|
|
62
|
+
"startMs": 3000,
|
|
63
|
+
"hasCommitBinding": false
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"commits": [
|
|
67
|
+
{
|
|
68
|
+
"hash": "commit-empty",
|
|
69
|
+
"subject": "manual change",
|
|
70
|
+
"hasSession": false,
|
|
71
|
+
"sessionIds": []
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
"expected": {},
|
|
76
|
+
"classification": "must-pass",
|
|
77
|
+
"provenance": {
|
|
78
|
+
"source": "requirement",
|
|
79
|
+
"ref": "unattached sessions remain discoverable"
|
|
80
|
+
},
|
|
81
|
+
"mutation": {
|
|
82
|
+
"description": "includes a visible session with no commit association"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"family": "binding-outside-window",
|
|
87
|
+
"name": "binding_outside_default_branch_window",
|
|
88
|
+
"input": {
|
|
89
|
+
"sessions": [
|
|
90
|
+
{
|
|
91
|
+
"sessionId": "session-old",
|
|
92
|
+
"title": "older recorded work",
|
|
93
|
+
"harness": "claude-code",
|
|
94
|
+
"hasCommitBinding": true
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"commits": [
|
|
98
|
+
{
|
|
99
|
+
"hash": "commit-recent",
|
|
100
|
+
"subject": "recent manual change",
|
|
101
|
+
"hasSession": false,
|
|
102
|
+
"sessionIds": []
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"expected": {},
|
|
107
|
+
"classification": "must-pass",
|
|
108
|
+
"provenance": {
|
|
109
|
+
"source": "requirement",
|
|
110
|
+
"ref": "complete binding truth exceeds bounded commit window"
|
|
111
|
+
},
|
|
112
|
+
"mutation": {
|
|
113
|
+
"description": "keeps binding truth when the associated commit is outside the returned window"
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"family": "non-default-branch-binding",
|
|
118
|
+
"name": "binding_on_non_default_branch",
|
|
119
|
+
"input": {
|
|
120
|
+
"sessions": [
|
|
121
|
+
{
|
|
122
|
+
"sessionId": "session-branch",
|
|
123
|
+
"title": "branch work",
|
|
124
|
+
"harness": "codex",
|
|
125
|
+
"hasCommitBinding": true
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"commits": []
|
|
129
|
+
},
|
|
130
|
+
"expected": {},
|
|
131
|
+
"classification": "must-pass",
|
|
132
|
+
"provenance": {
|
|
133
|
+
"source": "requirement",
|
|
134
|
+
"ref": "branch bindings are authoritative without inference"
|
|
135
|
+
},
|
|
136
|
+
"mutation": {
|
|
137
|
+
"description": "keeps binding truth when no default-branch commit is visible"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"family": "stable-session-order",
|
|
142
|
+
"name": "stable_equal_timestamp_and_missing_timestamp_order",
|
|
143
|
+
"input": {
|
|
144
|
+
"sessions": [
|
|
145
|
+
{
|
|
146
|
+
"sessionId": "session-a",
|
|
147
|
+
"title": "first tie",
|
|
148
|
+
"harness": "claude-code",
|
|
149
|
+
"startMs": 4000,
|
|
150
|
+
"hasCommitBinding": false
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"sessionId": "session-b",
|
|
154
|
+
"title": "second tie",
|
|
155
|
+
"harness": "codex",
|
|
156
|
+
"startMs": 4000,
|
|
157
|
+
"hasCommitBinding": false
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"sessionId": "session-c",
|
|
161
|
+
"title": "unknown time",
|
|
162
|
+
"harness": "opencode",
|
|
163
|
+
"hasCommitBinding": false
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"commits": []
|
|
167
|
+
},
|
|
168
|
+
"expected": {},
|
|
169
|
+
"classification": "must-pass",
|
|
170
|
+
"provenance": {
|
|
171
|
+
"source": "requirement",
|
|
172
|
+
"ref": "deterministic session timeline ordering"
|
|
173
|
+
},
|
|
174
|
+
"mutation": {
|
|
175
|
+
"description": "combines timestamp ties and a missing timestamp in canonical order"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"family": "descending-timestamp-order",
|
|
180
|
+
"name": "newer_timestamp_must_precede_older",
|
|
181
|
+
"input": {
|
|
182
|
+
"sessions": [
|
|
183
|
+
{
|
|
184
|
+
"sessionId": "session-old",
|
|
185
|
+
"title": "older",
|
|
186
|
+
"harness": "claude-code",
|
|
187
|
+
"startMs": 1000,
|
|
188
|
+
"hasCommitBinding": false
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"sessionId": "session-new",
|
|
192
|
+
"title": "newer",
|
|
193
|
+
"harness": "codex",
|
|
194
|
+
"startMs": 2000,
|
|
195
|
+
"hasCommitBinding": false
|
|
196
|
+
}
|
|
197
|
+
],
|
|
198
|
+
"commits": []
|
|
199
|
+
},
|
|
200
|
+
"expected": {
|
|
201
|
+
"errorContains": "violate canonical ordering"
|
|
202
|
+
},
|
|
203
|
+
"classification": "must-fail",
|
|
204
|
+
"provenance": {
|
|
205
|
+
"source": "boundary",
|
|
206
|
+
"ref": "descending known start timestamp order"
|
|
207
|
+
},
|
|
208
|
+
"mutation": {
|
|
209
|
+
"description": "places a newer timestamp after an older timestamp"
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"family": "equal-timestamp-tiebreak",
|
|
214
|
+
"name": "equal_timestamp_uses_session_identity_tiebreak",
|
|
215
|
+
"input": {
|
|
216
|
+
"sessions": [
|
|
217
|
+
{
|
|
218
|
+
"sessionId": "session-b",
|
|
219
|
+
"title": "second",
|
|
220
|
+
"harness": "codex",
|
|
221
|
+
"startMs": 3000,
|
|
222
|
+
"hasCommitBinding": false
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"sessionId": "session-a",
|
|
226
|
+
"title": "first",
|
|
227
|
+
"harness": "claude-code",
|
|
228
|
+
"startMs": 3000,
|
|
229
|
+
"hasCommitBinding": false
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
"commits": []
|
|
233
|
+
},
|
|
234
|
+
"expected": {
|
|
235
|
+
"errorContains": "violate canonical ordering"
|
|
236
|
+
},
|
|
237
|
+
"classification": "must-fail",
|
|
238
|
+
"provenance": {
|
|
239
|
+
"source": "boundary",
|
|
240
|
+
"ref": "stable equal-timestamp tie break"
|
|
241
|
+
},
|
|
242
|
+
"mutation": {
|
|
243
|
+
"description": "reverses session identity order for equal timestamps"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"family": "missing-timestamp-order",
|
|
248
|
+
"name": "missing_timestamp_follows_known_timestamp",
|
|
249
|
+
"input": {
|
|
250
|
+
"sessions": [
|
|
251
|
+
{
|
|
252
|
+
"sessionId": "session-unknown",
|
|
253
|
+
"title": "unknown",
|
|
254
|
+
"harness": "opencode",
|
|
255
|
+
"hasCommitBinding": false
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"sessionId": "session-known",
|
|
259
|
+
"title": "known",
|
|
260
|
+
"harness": "claude-code",
|
|
261
|
+
"startMs": 3000,
|
|
262
|
+
"hasCommitBinding": false
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
"commits": []
|
|
266
|
+
},
|
|
267
|
+
"expected": {
|
|
268
|
+
"errorContains": "violate canonical ordering"
|
|
269
|
+
},
|
|
270
|
+
"classification": "must-fail",
|
|
271
|
+
"provenance": {
|
|
272
|
+
"source": "boundary",
|
|
273
|
+
"ref": "missing timestamps sort after known timestamps"
|
|
274
|
+
},
|
|
275
|
+
"mutation": {
|
|
276
|
+
"description": "places a missing timestamp before a known timestamp"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"family": "compatibility-boolean",
|
|
281
|
+
"name": "boolean_mirror_mismatch",
|
|
282
|
+
"input": {
|
|
283
|
+
"sessions": [
|
|
284
|
+
{
|
|
285
|
+
"sessionId": "session-a",
|
|
286
|
+
"title": "work",
|
|
287
|
+
"harness": "claude-code",
|
|
288
|
+
"hasCommitBinding": true
|
|
289
|
+
}
|
|
290
|
+
],
|
|
291
|
+
"commits": [
|
|
292
|
+
{
|
|
293
|
+
"hash": "commit-a",
|
|
294
|
+
"subject": "work",
|
|
295
|
+
"hasSession": false,
|
|
296
|
+
"sessionIds": [
|
|
297
|
+
"session-a"
|
|
298
|
+
]
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
"expected": {
|
|
303
|
+
"errorContains": "hasSession must mirror"
|
|
304
|
+
},
|
|
305
|
+
"classification": "must-fail",
|
|
306
|
+
"provenance": {
|
|
307
|
+
"source": "requirement",
|
|
308
|
+
"ref": "compatibility boolean mirrors authoritative bindings"
|
|
309
|
+
},
|
|
310
|
+
"mutation": {
|
|
311
|
+
"description": "clears hasSession while retaining a session binding"
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"family": "complete-binding-truth",
|
|
316
|
+
"name": "visible_reference_requires_complete_binding_truth",
|
|
317
|
+
"input": {
|
|
318
|
+
"sessions": [
|
|
319
|
+
{
|
|
320
|
+
"sessionId": "session-a",
|
|
321
|
+
"title": "work",
|
|
322
|
+
"harness": "claude-code",
|
|
323
|
+
"hasCommitBinding": false
|
|
324
|
+
}
|
|
325
|
+
],
|
|
326
|
+
"commits": [
|
|
327
|
+
{
|
|
328
|
+
"hash": "commit-a",
|
|
329
|
+
"subject": "work",
|
|
330
|
+
"hasSession": true,
|
|
331
|
+
"sessionIds": [
|
|
332
|
+
"session-a"
|
|
333
|
+
]
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
"expected": {
|
|
338
|
+
"errorContains": "hasCommitBinding=false"
|
|
339
|
+
},
|
|
340
|
+
"classification": "must-fail",
|
|
341
|
+
"provenance": {
|
|
342
|
+
"source": "requirement",
|
|
343
|
+
"ref": "visible binding proves complete session binding truth"
|
|
344
|
+
},
|
|
345
|
+
"mutation": {
|
|
346
|
+
"description": "marks a visibly bound session as having no authoritative binding"
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"family": "known-session-reference",
|
|
351
|
+
"name": "unknown_session_reference",
|
|
352
|
+
"input": {
|
|
353
|
+
"sessions": [],
|
|
354
|
+
"commits": [
|
|
355
|
+
{
|
|
356
|
+
"hash": "commit-a",
|
|
357
|
+
"subject": "work",
|
|
358
|
+
"hasSession": true,
|
|
359
|
+
"sessionIds": [
|
|
360
|
+
"session-missing"
|
|
361
|
+
]
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
"expected": {
|
|
366
|
+
"errorContains": "references unknown sessionId"
|
|
367
|
+
},
|
|
368
|
+
"classification": "must-fail",
|
|
369
|
+
"provenance": {
|
|
370
|
+
"source": "requirement",
|
|
371
|
+
"ref": "commit bindings reference normalized session identities"
|
|
372
|
+
},
|
|
373
|
+
"mutation": {
|
|
374
|
+
"description": "points a commit binding at a session absent from the session catalog"
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"family": "unique-session-identity",
|
|
379
|
+
"name": "duplicate_session_identity",
|
|
380
|
+
"input": {
|
|
381
|
+
"sessions": [
|
|
382
|
+
{
|
|
383
|
+
"sessionId": "session-a",
|
|
384
|
+
"title": "first",
|
|
385
|
+
"harness": "claude-code",
|
|
386
|
+
"hasCommitBinding": false
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"sessionId": "session-a",
|
|
390
|
+
"title": "duplicate",
|
|
391
|
+
"harness": "claude-code",
|
|
392
|
+
"hasCommitBinding": false
|
|
393
|
+
}
|
|
394
|
+
],
|
|
395
|
+
"commits": []
|
|
396
|
+
},
|
|
397
|
+
"expected": {
|
|
398
|
+
"errorContains": "duplicate timeline session"
|
|
399
|
+
},
|
|
400
|
+
"classification": "must-fail",
|
|
401
|
+
"provenance": {
|
|
402
|
+
"source": "boundary",
|
|
403
|
+
"ref": "normalized session identity uniqueness"
|
|
404
|
+
},
|
|
405
|
+
"mutation": {
|
|
406
|
+
"description": "repeats one session identity in the session catalog"
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"family": "unique-commit-binding",
|
|
411
|
+
"name": "duplicate_binding",
|
|
412
|
+
"input": {
|
|
413
|
+
"sessions": [
|
|
414
|
+
{
|
|
415
|
+
"sessionId": "session-a",
|
|
416
|
+
"title": "work",
|
|
417
|
+
"harness": "claude-code",
|
|
418
|
+
"hasCommitBinding": true
|
|
419
|
+
}
|
|
420
|
+
],
|
|
421
|
+
"commits": [
|
|
422
|
+
{
|
|
423
|
+
"hash": "commit-a",
|
|
424
|
+
"subject": "work",
|
|
425
|
+
"hasSession": true,
|
|
426
|
+
"sessionIds": [
|
|
427
|
+
"session-a",
|
|
428
|
+
"session-a"
|
|
429
|
+
]
|
|
430
|
+
}
|
|
431
|
+
]
|
|
432
|
+
},
|
|
433
|
+
"expected": {
|
|
434
|
+
"errorContains": "repeats sessionId"
|
|
435
|
+
},
|
|
436
|
+
"classification": "must-fail",
|
|
437
|
+
"provenance": {
|
|
438
|
+
"source": "boundary",
|
|
439
|
+
"ref": "commit binding set uniqueness"
|
|
440
|
+
},
|
|
441
|
+
"mutation": {
|
|
442
|
+
"description": "repeats one session identity in a commit binding list"
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"family": "non-null-commit-bindings",
|
|
447
|
+
"name": "null_commit_bindings",
|
|
448
|
+
"input": {
|
|
449
|
+
"sessions": [],
|
|
450
|
+
"commits": [
|
|
451
|
+
{
|
|
452
|
+
"hash": "commit-a",
|
|
453
|
+
"subject": "work",
|
|
454
|
+
"hasSession": false,
|
|
455
|
+
"sessionIds": null
|
|
456
|
+
}
|
|
457
|
+
]
|
|
458
|
+
},
|
|
459
|
+
"expected": {
|
|
460
|
+
"errorContains": "null sessionIds"
|
|
461
|
+
},
|
|
462
|
+
"classification": "must-fail",
|
|
463
|
+
"provenance": {
|
|
464
|
+
"source": "boundary",
|
|
465
|
+
"ref": "non-null commit binding arrays"
|
|
466
|
+
},
|
|
467
|
+
"mutation": {
|
|
468
|
+
"description": "omits the required sessionIds array from a commit"
|
|
469
|
+
}
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
"family": "known-harness",
|
|
473
|
+
"name": "unknown_timeline_harness",
|
|
474
|
+
"input": {
|
|
475
|
+
"sessions": [
|
|
476
|
+
{
|
|
477
|
+
"sessionId": "session-a",
|
|
478
|
+
"title": "work",
|
|
479
|
+
"harness": "unknown-harness",
|
|
480
|
+
"hasCommitBinding": false
|
|
481
|
+
}
|
|
482
|
+
],
|
|
483
|
+
"commits": []
|
|
484
|
+
},
|
|
485
|
+
"expected": {
|
|
486
|
+
"errorContains": "unknown harness"
|
|
487
|
+
},
|
|
488
|
+
"classification": "must-fail",
|
|
489
|
+
"provenance": {
|
|
490
|
+
"source": "boundary",
|
|
491
|
+
"ref": "timeline sessions use the canonical harness closed set"
|
|
492
|
+
},
|
|
493
|
+
"mutation": {
|
|
494
|
+
"description": "replaces a known harness with an unknown harness token"
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"family": "canonical-binding-order",
|
|
499
|
+
"name": "noncanonical_binding_order",
|
|
500
|
+
"input": {
|
|
501
|
+
"sessions": [
|
|
502
|
+
{
|
|
503
|
+
"sessionId": "session-a",
|
|
504
|
+
"title": "first",
|
|
505
|
+
"harness": "claude-code",
|
|
506
|
+
"startMs": 2000,
|
|
507
|
+
"hasCommitBinding": true
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
"sessionId": "session-b",
|
|
511
|
+
"title": "second",
|
|
512
|
+
"harness": "codex",
|
|
513
|
+
"startMs": 1000,
|
|
514
|
+
"hasCommitBinding": true
|
|
515
|
+
}
|
|
516
|
+
],
|
|
517
|
+
"commits": [
|
|
518
|
+
{
|
|
519
|
+
"hash": "commit-a",
|
|
520
|
+
"subject": "work",
|
|
521
|
+
"hasSession": true,
|
|
522
|
+
"sessionIds": [
|
|
523
|
+
"session-b",
|
|
524
|
+
"session-a"
|
|
525
|
+
]
|
|
526
|
+
}
|
|
527
|
+
]
|
|
528
|
+
},
|
|
529
|
+
"expected": {
|
|
530
|
+
"errorContains": "noncanonical sessionIds order"
|
|
531
|
+
},
|
|
532
|
+
"classification": "must-fail",
|
|
533
|
+
"provenance": {
|
|
534
|
+
"source": "boundary",
|
|
535
|
+
"ref": "commit bindings follow normalized timeline session rank"
|
|
536
|
+
},
|
|
537
|
+
"mutation": {
|
|
538
|
+
"description": "reverses two valid bindings relative to the canonical session order"
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
]
|
|
542
|
+
};
|