Viewing files at commit b76ab8b42dfdCommit detailsView latest

scenarios/core.yaml 1035 lines · 31.4 KB · yaml
1
schema_version: 1
2
scenario_set: core-vcs
3
description: Core version-control scenarios for comparing Git and Oak across file-count, blob-size, history, branch, and conflict stressors.
4
5
units:
6
  sizes: bytes
7
  runtimes: wall_clock_milliseconds
8
  disk: bytes
9
10
runtime_classes:
11
  smoke:
12
    intent: Run on every local change or push.
13
    target_wall_time: under 5 minutes on a fast local SSD
14
    minimum_runs: 1
15
    recommended_runs: 5
16
  standard:
17
    intent: Run nightly or before important merges.
18
    target_wall_time: under 90 minutes on pinned hardware
19
    minimum_runs: 3
20
    recommended_runs: 7
21
  large:
22
    intent: Run on a dedicated machine for weekly, release, or claim-validation benchmarks.
23
    target_wall_time: several hours is acceptable
24
    minimum_runs: 3
25
    recommended_runs: 5
26
27
profiles:
28
  smoke:
29
    scenarios:
30
      - tiny
31
  standard:
32
    scenarios:
33
      - tiny
34
      - normal
35
      - large-tree
36
      - deep-tree
37
      - ignored-heavy
38
      - rename-heavy
39
      - delete-heavy
40
      - conflict-heavy
41
  large:
42
    scenarios:
43
      - huge-tree
44
      - long-history
45
      - many-branches
46
      - single-huge-blob
47
      - many-large-blobs
48
      - binary-history
49
50
operation_catalog:
51
  repo.init:
52
    description: Initialize VCS metadata in an already materialized fixture directory.
53
    timed: true
54
  snapshot.initial:
55
    description: Create the first committed snapshot of all tracked fixture files.
56
    timed: true
57
  status.clean:
58
    description: Report status immediately after a committed snapshot.
59
    timed: true
60
  status.dirty:
61
    description: Report status after the scenario dirty-shape mutation has been applied.
62
    timed: true
63
  status.dirty.p01:
64
    description: Report status after a deterministic 1 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
65
    timed: true
66
  status.dirty.p10:
67
    description: Report status after a deterministic 10 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
68
    timed: true
69
  status.dirty.p50:
70
    description: Report status after a deterministic 50 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
71
    timed: true
72
  status.ignored:
73
    description: Report status with large ignored and untracked trees present.
74
    timed: true
75
  diff.dirty:
76
    description: Produce a dirty diff or diff summary for text changes.
77
    timed: true
78
  diff.dirty.p01:
79
    description: Produce the dirty diff after a deterministic 1 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
80
    timed: true
81
  diff.dirty.p10:
82
    description: Produce the dirty diff after a deterministic 10 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
83
    timed: true
84
  diff.dirty.p50:
85
    description: Produce the dirty diff after a deterministic 50 percent (ceil) of tracked files have one fixed line appended. Opt-in via --dirty-spectrum; dirtying and restore are untimed.
86
    timed: true
87
  diff.binary_stat:
88
    description: Produce a binary-safe dirty diff summary without dumping blob contents.
89
    timed: true
90
  diff.renames:
91
    description: Detect or summarize mass renames.
92
    timed: true
93
  diff.deletes:
94
    description: Detect or summarize mass deletions.
95
    timed: true
96
  snapshot.dirty:
97
    description: Commit or snapshot dirty modifications, additions, deletions, and renames.
98
    timed: true
99
  snapshot.renames:
100
    description: Commit or snapshot the rename-heavy mutation set.
101
    timed: true
102
  snapshot.deletes:
103
    description: Commit or snapshot the delete-heavy mutation set.
104
    timed: true
105
  branch.create:
106
    description: Create one task branch from the current head.
107
    timed: true
108
  branch.create_many:
109
    description: Create the configured number of task branches from the same base.
110
    timed: true
111
  branch.list:
112
    description: Enumerate branches in a non-interactive machine-readable form.
113
    timed: true
114
  branch.switch:
115
    description: Switch to an existing branch and restore its working-tree state.
116
    timed: true
117
  branch.switch_many:
118
    description: Switch through a deterministic sample of existing branches.
119
    timed: true
120
  task.snapshot:
121
    description: Commit or snapshot one task-branch mutation.
122
    timed: true
123
  history.log.tip:
124
    description: Read recent log entries from the tip of a long history.
125
    timed: true
126
  history.log.range:
127
    description: Read a deterministic commit range from a long history.
128
    timed: true
129
  history.checkout_old:
130
    description: Restore an old revision or equivalent historical view.
131
    timed: true
132
  history.restore_head:
133
    description: Return from the old revision to the branch head.
134
    timed: true
135
  blob.checkout:
136
    description: Restore large binary blobs from the committed snapshot.
137
    timed: true
138
  merge.clean_base:
139
    description: Create divergent branches from a common base before merge timing starts.
140
    timed: false
141
  merge.conflict:
142
    description: Attempt a merge that must produce deterministic conflicts.
143
    timed: true
144
  status.conflicted:
145
    description: Report status while conflicts are present.
146
    timed: true
147
  diff.conflicted:
148
    description: Produce a conflict-aware diff or summary.
149
    timed: true
150
  merge.abort:
151
    description: Abort the conflicted merge and restore the pre-merge state.
152
    timed: true
153
  merge.resolve:
154
    description: Apply deterministic resolutions to all conflicted paths.
155
    timed: false
156
  snapshot.resolution:
157
    description: Commit or snapshot the resolved merge.
158
    timed: true
159
160
check_catalog:
161
  repository_initialized: VCS metadata exists and later commands run inside the expected repository root.
162
  initial_snapshot_matches_manifest: The initial snapshot contains exactly the tracked manifest paths and content hashes.
163
  clean_status_empty: Clean status reports no tracked, untracked, ignored, or conflicted changes unless the operation explicitly asks for ignored paths.
164
  dirty_status_counts_match: Dirty status reports the expected modified, added, deleted, renamed, and untracked counts.
165
  diff_mentions_expected_paths: Dirty diff output mentions the expected changed paths and omits unchanged paths.
166
  binary_diff_is_summary_only: Binary diff timing does not emit full binary payloads.
167
  snapshot_cleans_tree: Snapshotting dirty changes returns the repository to a clean status.
168
  branch_head_isolated: Changes committed on a task branch are not visible after switching back to the base branch.
169
  ignored_files_excluded: Ignored paths are not included in snapshots and are reported only by ignored-aware status operations.
170
  rename_content_hashes_preserved: Renamed files keep the same content hashes and old paths disappear from the tracked manifest.
171
  delete_paths_removed: Deleted paths are absent from the new tracked manifest and unchanged paths keep their hashes.
172
  history_count_matches_fixture: The visible history length and tip identity match the generated history manifest.
173
  historical_checkout_matches_manifest: Restoring an old revision yields the file hashes recorded for that revision.
174
  branch_count_matches_fixture: Branch enumeration returns the generated branch count and branch names.
175
  large_blob_hash_matches_manifest: Large binary files match the generated content hashes after checkout and snapshot operations.
176
  binary_history_hashes_match: Binary blobs restored from historical revisions match the generated revision hashes.
177
  conflict_paths_match_fixture: Merge conflict output and status include exactly the generated conflicted paths.
178
  merge_abort_restores_premerge: Aborting a conflicted merge restores the pre-merge content hashes and branch head.
179
  merge_resolution_cleans_tree: Applying deterministic resolutions and snapshotting leaves a clean repository at the expected merge result.
180
181
mode_catalog:
182
  git:
183
    git_default:
184
      description: Plain Git repository using default index behavior, with auto-gc disabled during timing.
185
      setup:
186
        - git init
187
        - git config gc.auto 0
188
      applies_to:
189
        - all
190
    git_split_index:
191
      description: Git with split index enabled for large tracked-file working trees.
192
      setup:
193
        - git config core.splitIndex true
194
        - git config gc.auto 0
195
      applies_to:
196
        - large-tree
197
        - huge-tree
198
        - deep-tree
199
        - ignored-heavy
200
        - rename-heavy
201
        - delete-heavy
202
    git_untracked_cache:
203
      description: Git with untracked cache enabled for ignored and untracked status pressure.
204
      setup:
205
        - git config core.untrackedCache true
206
        - git config gc.auto 0
207
      applies_to:
208
        - ignored-heavy
209
        - large-tree
210
        - huge-tree
211
    git_sparse_cone:
212
      description: Git sparse checkout in cone mode, used only when a scenario defines a sparse visible subset.
213
      setup:
214
        - git sparse-checkout init --cone --sparse-index
215
      applies_to:
216
        - huge-tree
217
        - deep-tree
218
    git_worktree:
219
      description: Git branch isolation using git worktree for task-branch workflows.
220
      setup:
221
        - git worktree add
222
      applies_to:
223
        - many-branches
224
        - conflict-heavy
225
  oak:
226
    oak_default:
227
      description: Plain Oak repository commands against a materialized fixture directory.
228
      setup:
229
        - oak init .
230
      applies_to:
231
        - all
232
    oak_virtual_branch:
233
      description: Oak task-branch workflow using oak switch -c from a committed base.
234
      setup:
235
        - oak switch -c
236
      applies_to:
237
        - tiny
238
        - normal
239
        - many-branches
240
        - conflict-heavy
241
    oak_space_mount:
242
      description: Oak mount or space workflow for lazy materialization and branch-per-task agent work.
243
      setup:
244
        - oak mount
245
      applies_to:
246
        - large-tree
247
        - huge-tree
248
        - deep-tree
249
        - many-branches
250
        - single-huge-blob
251
        - many-large-blobs
252
253
scenarios:
254
  - id: tiny
255
    name: Tiny text repository
256
    purpose: Measure fixed command overhead and catch obvious correctness regressions on an agent-sized toy repository.
257
    runtime_class: smoke
258
    fixture_shape:
259
      tracked_files: 24
260
      tracked_bytes: 24576
261
      text_files:
262
        count: 24
263
        size_bytes: 1024
264
      binary_files:
265
        count: 0
266
        size_bytes: 0
267
      ignored_files: 0
268
      max_path_depth: 2
269
      path_fanout: 6
270
      history_commits: 1
271
      branches: 1
272
      dirty_shape:
273
        modified_files: 4
274
        added_files: 2
275
        deleted_files: 1
276
        renamed_files: 1
277
    operations_to_time:
278
      - repo.init
279
      - snapshot.initial
280
      - status.clean
281
      - status.dirty
282
      - diff.dirty
283
      - snapshot.dirty
284
      - branch.create
285
      - branch.switch
286
      - task.snapshot
287
    correctness_checks:
288
      - repository_initialized
289
      - initial_snapshot_matches_manifest
290
      - clean_status_empty
291
      - dirty_status_counts_match
292
      - diff_mentions_expected_paths
293
      - snapshot_cleans_tree
294
      - branch_head_isolated
295
    git_modes:
296
      - git_default
297
    oak_modes:
298
      - oak_default
299
      - oak_virtual_branch
300
    disk_requirements:
301
      fixture_bytes: 1048576
302
      scratch_bytes_per_subject_run: 67108864
303
      recommended_free_bytes: 1073741824
304
      human: 1 MiB fixture, 64 MiB scratch per subject run, 1 GiB free recommended.
305
306
  - id: normal
307
    name: Normal developer repository
308
    purpose: Represent a medium application repository with enough files and mixed content to exercise normal status, diff, commit, and branch workflows.
309
    runtime_class: standard
310
    fixture_shape:
311
      tracked_files: 10010
312
      tracked_bytes: 51445760
313
      text_files:
314
        count: 10000
315
        size_bytes: 4096
316
      binary_files:
317
        count: 10
318
        size_bytes: 1048576
319
      ignored_files: 2000
320
      max_path_depth: 6
321
      path_fanout: 40
322
      history_commits: 50
323
      branches: 8
324
      dirty_shape:
325
        modified_files: 1000
326
        added_files: 250
327
        deleted_files: 100
328
        renamed_files: 100
329
        binary_files_modified: 2
330
    operations_to_time:
331
      - repo.init
332
      - snapshot.initial
333
      - status.clean
334
      - status.dirty
335
      - diff.dirty
336
      - diff.binary_stat
337
      - snapshot.dirty
338
      - branch.create
339
      - branch.switch
340
      - task.snapshot
341
    correctness_checks:
342
      - repository_initialized
343
      - initial_snapshot_matches_manifest
344
      - clean_status_empty
345
      - dirty_status_counts_match
346
      - diff_mentions_expected_paths
347
      - binary_diff_is_summary_only
348
      - snapshot_cleans_tree
349
      - branch_head_isolated
350
    git_modes:
351
      - git_default
352
      - git_split_index
353
    oak_modes:
354
      - oak_default
355
      - oak_virtual_branch
356
    disk_requirements:
357
      fixture_bytes: 134217728
358
      scratch_bytes_per_subject_run: 536870912
359
      recommended_free_bytes: 5368709120
360
      human: 128 MiB fixture, 512 MiB scratch per subject run, 5 GiB free recommended.
361
362
  - id: large-tree
363
    name: Large tracked tree
364
    purpose: Stress index and metadata behavior for a repository with tens of thousands of tracked files but modest content size.
365
    runtime_class: standard
366
    fixture_shape:
367
      tracked_files: 50000
368
      tracked_bytes: 51200000
369
      text_files:
370
        count: 50000
371
        size_bytes: 1024
372
      binary_files:
373
        count: 0
374
        size_bytes: 0
375
      ignored_files: 10000
376
      max_path_depth: 8
377
      path_fanout: 100
378
      history_commits: 20
379
      branches: 16
380
      dirty_shape:
381
        modified_files: 5000
382
        added_files: 1000
383
        deleted_files: 500
384
        renamed_files: 500
385
    operations_to_time:
386
      - repo.init
387
      - snapshot.initial
388
      - status.clean
389
      - status.dirty
390
      - diff.dirty
391
      - snapshot.dirty
392
      - branch.create
393
      - branch.switch
394
      - task.snapshot
395
    correctness_checks:
396
      - repository_initialized
397
      - initial_snapshot_matches_manifest
398
      - clean_status_empty
399
      - dirty_status_counts_match
400
      - diff_mentions_expected_paths
401
      - snapshot_cleans_tree
402
      - branch_head_isolated
403
    git_modes:
404
      - git_default
405
      - git_split_index
406
      - git_untracked_cache
407
    oak_modes:
408
      - oak_default
409
      - oak_space_mount
410
    disk_requirements:
411
      fixture_bytes: 268435456
412
      scratch_bytes_per_subject_run: 4294967296
413
      recommended_free_bytes: 21474836480
414
      human: 256 MiB fixture, 4 GiB scratch per subject run, 20 GiB free recommended.
415
416
  - id: huge-tree
417
    name: Huge tracked tree
418
    purpose: Validate file-count scalability at hundreds of thousands of paths where index scans, path hashing, and metadata hydration dominate.
419
    runtime_class: large
420
    fixture_shape:
421
      tracked_files: 250000
422
      tracked_bytes: 128000000
423
      text_files:
424
        count: 250000
425
        size_bytes: 512
426
      binary_files:
427
        count: 0
428
        size_bytes: 0
429
      ignored_files: 50000
430
      max_path_depth: 10
431
      path_fanout: 250
432
      history_commits: 10
433
      branches: 32
434
      sparse_visible_files: 25000
435
      dirty_shape:
436
        modified_files: 25000
437
        added_files: 5000
438
        deleted_files: 2500
439
        renamed_files: 2500
440
    operations_to_time:
441
      - repo.init
442
      - snapshot.initial
443
      - status.clean
444
      - status.dirty
445
      - diff.dirty
446
      - snapshot.dirty
447
      - branch.create
448
      - branch.switch
449
      - task.snapshot
450
    correctness_checks:
451
      - repository_initialized
452
      - initial_snapshot_matches_manifest
453
      - clean_status_empty
454
      - dirty_status_counts_match
455
      - diff_mentions_expected_paths
456
      - snapshot_cleans_tree
457
      - branch_head_isolated
458
    git_modes:
459
      - git_default
460
      - git_split_index
461
      - git_untracked_cache
462
      - git_sparse_cone
463
    oak_modes:
464
      - oak_default
465
      - oak_space_mount
466
    disk_requirements:
467
      fixture_bytes: 1073741824
468
      scratch_bytes_per_subject_run: 17179869184
469
      recommended_free_bytes: 85899345920
470
      human: 1 GiB fixture, 16 GiB scratch per subject run, 80 GiB free recommended.
471
472
  - id: deep-tree
473
    name: Deep path tree
474
    purpose: Exercise path traversal, canonicalization, and checkout behavior with deep directory nesting and long but portable paths.
475
    runtime_class: standard
476
    fixture_shape:
477
      tracked_files: 30000
478
      tracked_bytes: 30720000
479
      text_files:
480
        count: 30000
481
        size_bytes: 1024
482
      binary_files:
483
        count: 0
484
        size_bytes: 0
485
      ignored_files: 5000
486
      max_path_depth: 64
487
      max_path_length: 220
488
      path_fanout: 4
489
      history_commits: 20
490
      branches: 8
491
      sparse_visible_files: 3000
492
      dirty_shape:
493
        modified_files: 3000
494
        added_files: 500
495
        deleted_files: 300
496
        renamed_files: 300
497
    operations_to_time:
498
      - repo.init
499
      - snapshot.initial
500
      - status.clean
501
      - status.dirty
502
      - diff.dirty
503
      - snapshot.dirty
504
      - branch.create
505
      - branch.switch
506
      - task.snapshot
507
    correctness_checks:
508
      - repository_initialized
509
      - initial_snapshot_matches_manifest
510
      - clean_status_empty
511
      - dirty_status_counts_match
512
      - diff_mentions_expected_paths
513
      - snapshot_cleans_tree
514
      - branch_head_isolated
515
    git_modes:
516
      - git_default
517
      - git_split_index
518
      - git_sparse_cone
519
    oak_modes:
520
      - oak_default
521
      - oak_space_mount
522
    disk_requirements:
523
      fixture_bytes: 134217728
524
      scratch_bytes_per_subject_run: 3221225472
525
      recommended_free_bytes: 16106127360
526
      human: 128 MiB fixture, 3 GiB scratch per subject run, 15 GiB free recommended.
527
528
  - id: ignored-heavy
529
    name: Ignored and untracked heavy tree
530
    purpose: Measure status and snapshot behavior when large generated directories are present but must remain outside version control.
531
    runtime_class: standard
532
    fixture_shape:
533
      tracked_files: 5000
534
      tracked_bytes: 5120000
535
      text_files:
536
        count: 5000
537
        size_bytes: 1024
538
      binary_files:
539
        count: 0
540
        size_bytes: 0
541
      ignored_files: 200000
542
      ignored_bytes: 102400000
543
      untracked_files: 25000
544
      max_path_depth: 8
545
      path_fanout: 200
546
      history_commits: 5
547
      branches: 4
548
      ignore_patterns:
549
        - build/
550
        - dist/
551
        - node_modules/
552
        - target/
553
        - "*.tmp"
554
      dirty_shape:
555
        modified_files: 500
556
        added_files: 100
557
        deleted_files: 50
558
        renamed_files: 50
559
        ignored_files_touched: 20000
560
        untracked_files_added: 5000
561
    operations_to_time:
562
      - repo.init
563
      - snapshot.initial
564
      - status.clean
565
      - status.ignored
566
      - status.dirty
567
      - diff.dirty
568
      - snapshot.dirty
569
      - branch.create
570
      - task.snapshot
571
    correctness_checks:
572
      - repository_initialized
573
      - initial_snapshot_matches_manifest
574
      - clean_status_empty
575
      - ignored_files_excluded
576
      - dirty_status_counts_match
577
      - diff_mentions_expected_paths
578
      - snapshot_cleans_tree
579
      - branch_head_isolated
580
    git_modes:
581
      - git_default
582
      - git_untracked_cache
583
      - git_split_index
584
    oak_modes:
585
      - oak_default
586
    disk_requirements:
587
      fixture_bytes: 536870912
588
      scratch_bytes_per_subject_run: 8589934592
589
      recommended_free_bytes: 42949672960
590
      human: 512 MiB fixture including ignored data, 8 GiB scratch per subject run, 40 GiB free recommended.
591
592
  - id: rename-heavy
593
    name: Rename heavy tree
594
    purpose: Measure rename detection, manifest updates, and snapshot cost for large refactors that preserve file contents.
595
    runtime_class: standard
596
    fixture_shape:
597
      tracked_files: 30000
598
      tracked_bytes: 30720000
599
      text_files:
600
        count: 30000
601
        size_bytes: 1024
602
      binary_files:
603
        count: 0
604
        size_bytes: 0
605
      ignored_files: 2000
606
      max_path_depth: 8
607
      path_fanout: 100
608
      history_commits: 10
609
      branches: 4
610
      dirty_shape:
611
        modified_files: 1000
612
        added_files: 500
613
        deleted_files: 0
614
        renamed_files: 15000
615
        rename_preserves_content: true
616
    operations_to_time:
617
      - repo.init
618
      - snapshot.initial
619
      - status.clean
620
      - status.dirty
621
      - diff.renames
622
      - snapshot.renames
623
      - branch.create
624
      - task.snapshot
625
    correctness_checks:
626
      - repository_initialized
627
      - initial_snapshot_matches_manifest
628
      - clean_status_empty
629
      - dirty_status_counts_match
630
      - rename_content_hashes_preserved
631
      - snapshot_cleans_tree
632
      - branch_head_isolated
633
    git_modes:
634
      - git_default
635
      - git_split_index
636
    oak_modes:
637
      - oak_default
638
    disk_requirements:
639
      fixture_bytes: 268435456
640
      scratch_bytes_per_subject_run: 4294967296
641
      recommended_free_bytes: 21474836480
642
      human: 256 MiB fixture, 4 GiB scratch per subject run, 20 GiB free recommended.
643
644
  - id: delete-heavy
645
    name: Delete heavy tree
646
    purpose: Measure deletion discovery and snapshot cost for large cleanups where most path metadata disappears at once.
647
    runtime_class: standard
648
    fixture_shape:
649
      tracked_files: 100000
650
      tracked_bytes: 51200000
651
      text_files:
652
        count: 100000
653
        size_bytes: 512
654
      binary_files:
655
        count: 0
656
        size_bytes: 0
657
      ignored_files: 5000
658
      max_path_depth: 8
659
      path_fanout: 200
660
      history_commits: 5
661
      branches: 4
662
      dirty_shape:
663
        modified_files: 5000
664
        added_files: 1000
665
        deleted_files: 50000
666
        renamed_files: 0
667
    operations_to_time:
668
      - repo.init
669
      - snapshot.initial
670
      - status.clean
671
      - status.dirty
672
      - diff.deletes
673
      - snapshot.deletes
674
      - branch.create
675
      - task.snapshot
676
    correctness_checks:
677
      - repository_initialized
678
      - initial_snapshot_matches_manifest
679
      - clean_status_empty
680
      - dirty_status_counts_match
681
      - delete_paths_removed
682
      - snapshot_cleans_tree
683
      - branch_head_isolated
684
    git_modes:
685
      - git_default
686
      - git_split_index
687
    oak_modes:
688
      - oak_default
689
    disk_requirements:
690
      fixture_bytes: 536870912
691
      scratch_bytes_per_subject_run: 8589934592
692
      recommended_free_bytes: 42949672960
693
      human: 512 MiB fixture, 8 GiB scratch per subject run, 40 GiB free recommended.
694
695
  - id: long-history
696
    name: Long linear history
697
    purpose: Measure log, historical checkout, and incremental snapshot behavior after thousands of commits.
698
    runtime_class: large
699
    fixture_shape:
700
      tracked_files: 5000
701
      tracked_bytes: 5120000
702
      text_files:
703
        count: 5000
704
        size_bytes: 1024
705
      binary_files:
706
        count: 0
707
        size_bytes: 0
708
      ignored_files: 1000
709
      max_path_depth: 6
710
      path_fanout: 50
711
      history_commits: 5000
712
      files_touched_per_commit: 25
713
      branches: 16
714
      dirty_shape:
715
        modified_files: 500
716
        added_files: 100
717
        deleted_files: 50
718
        renamed_files: 50
719
    operations_to_time:
720
      - repo.init
721
      - snapshot.initial
722
      - history.log.tip
723
      - history.log.range
724
      - history.checkout_old
725
      - history.restore_head
726
      - status.clean
727
      - status.dirty
728
      - diff.dirty
729
      - snapshot.dirty
730
      - branch.create
731
      - task.snapshot
732
    correctness_checks:
733
      - repository_initialized
734
      - initial_snapshot_matches_manifest
735
      - history_count_matches_fixture
736
      - historical_checkout_matches_manifest
737
      - clean_status_empty
738
      - dirty_status_counts_match
739
      - diff_mentions_expected_paths
740
      - snapshot_cleans_tree
741
      - branch_head_isolated
742
    git_modes:
743
      - git_default
744
    oak_modes:
745
      - oak_default
746
    disk_requirements:
747
      fixture_bytes: 1073741824
748
      scratch_bytes_per_subject_run: 10737418240
749
      recommended_free_bytes: 53687091200
750
      human: 1 GiB generated history fixture, 10 GiB scratch per subject run, 50 GiB free recommended.
751
752
  - id: many-branches
753
    name: Many task branches
754
    purpose: Measure branch metadata and task-isolation performance when thousands of short-lived agent branches exist.
755
    runtime_class: large
756
    fixture_shape:
757
      tracked_files: 2000
758
      tracked_bytes: 4096000
759
      text_files:
760
        count: 2000
761
        size_bytes: 2048
762
      binary_files:
763
        count: 0
764
        size_bytes: 0
765
      ignored_files: 1000
766
      max_path_depth: 5
767
      path_fanout: 40
768
      history_commits: 100
769
      branches: 5000
770
      branch_mutations:
771
        files_modified_per_branch: 3
772
        files_added_per_branch: 1
773
      dirty_shape:
774
        modified_files: 100
775
        added_files: 25
776
        deleted_files: 10
777
        renamed_files: 10
778
    operations_to_time:
779
      - repo.init
780
      - snapshot.initial
781
      - branch.create_many
782
      - branch.list
783
      - branch.switch_many
784
      - status.clean
785
      - branch.create
786
      - task.snapshot
787
    correctness_checks:
788
      - repository_initialized
789
      - initial_snapshot_matches_manifest
790
      - branch_count_matches_fixture
791
      - branch_head_isolated
792
      - clean_status_empty
793
      - snapshot_cleans_tree
794
    git_modes:
795
      - git_default
796
      - git_worktree
797
    oak_modes:
798
      - oak_default
799
      - oak_virtual_branch
800
      - oak_space_mount
801
    disk_requirements:
802
      fixture_bytes: 268435456
803
      scratch_bytes_per_subject_run: 4294967296
804
      recommended_free_bytes: 21474836480
805
      human: 256 MiB fixture plus branch metadata, 4 GiB scratch per subject run, 20 GiB free recommended.
806
807
  - id: single-huge-blob
808
    name: Single huge binary blob
809
    purpose: Measure snapshot, status, checkout, and binary diff-summary behavior for one asset-sized file.
810
    runtime_class: large
811
    fixture_shape:
812
      tracked_files: 2
813
      tracked_bytes: 1073742848
814
      text_files:
815
        count: 1
816
        size_bytes: 1024
817
      binary_files:
818
        count: 1
819
        size_bytes: 1073741824
820
      ignored_files: 0
821
      max_path_depth: 2
822
      path_fanout: 2
823
      history_commits: 3
824
      branches: 4
825
      dirty_shape:
826
        modified_files: 1
827
        added_files: 0
828
        deleted_files: 0
829
        renamed_files: 0
830
        binary_files_modified: 1
831
        binary_mutation_bytes: 1048576
832
    operations_to_time:
833
      - repo.init
834
      - snapshot.initial
835
      - status.clean
836
      - blob.checkout
837
      - status.dirty
838
      - diff.binary_stat
839
      - snapshot.dirty
840
      - branch.create
841
      - task.snapshot
842
    correctness_checks:
843
      - repository_initialized
844
      - initial_snapshot_matches_manifest
845
      - clean_status_empty
846
      - large_blob_hash_matches_manifest
847
      - dirty_status_counts_match
848
      - binary_diff_is_summary_only
849
      - snapshot_cleans_tree
850
      - branch_head_isolated
851
    git_modes:
852
      - git_default
853
      - git_lfs
854
    oak_modes:
855
      - oak_default
856
      - oak_space_mount
857
    disk_requirements:
858
      fixture_bytes: 2147483648
859
      scratch_bytes_per_subject_run: 12884901888
860
      recommended_free_bytes: 34359738368
861
      human: 2 GiB fixture workspace, 12 GiB scratch per subject run, 32 GiB free recommended.
862
863
  - id: many-large-blobs
864
    name: Many large binary blobs
865
    purpose: Measure repository behavior for media, model, archive, and artifact-heavy trees where many large files change independently.
866
    runtime_class: large
867
    fixture_shape:
868
      tracked_files: 128
869
      tracked_bytes: 4294967296
870
      text_files:
871
        count: 0
872
        size_bytes: 0
873
      binary_files:
874
        count: 128
875
        size_bytes: 33554432
876
      ignored_files: 0
877
      max_path_depth: 4
878
      path_fanout: 16
879
      history_commits: 5
880
      branches: 4
881
      dirty_shape:
882
        modified_files: 32
883
        added_files: 8
884
        deleted_files: 8
885
        renamed_files: 8
886
        binary_files_modified: 32
887
        binary_mutation_bytes_per_file: 1048576
888
    operations_to_time:
889
      - repo.init
890
      - snapshot.initial
891
      - status.clean
892
      - blob.checkout
893
      - status.dirty
894
      - diff.binary_stat
895
      - snapshot.dirty
896
      - branch.create
897
      - task.snapshot
898
    correctness_checks:
899
      - repository_initialized
900
      - initial_snapshot_matches_manifest
901
      - clean_status_empty
902
      - large_blob_hash_matches_manifest
903
      - dirty_status_counts_match
904
      - binary_diff_is_summary_only
905
      - snapshot_cleans_tree
906
      - branch_head_isolated
907
    git_modes:
908
      - git_default
909
      - git_lfs
910
    oak_modes:
911
      - oak_default
912
      - oak_space_mount
913
    disk_requirements:
914
      fixture_bytes: 8589934592
915
      scratch_bytes_per_subject_run: 34359738368
916
      recommended_free_bytes: 137438953472
917
      human: 8 GiB fixture workspace, 32 GiB scratch per subject run, 128 GiB free recommended.
918
919
  - id: binary-history
920
    name: Binary history churn
921
    purpose: Measure history and checkout behavior when a large binary changes repeatedly across many snapshots.
922
    runtime_class: large
923
    fixture_shape:
924
      tracked_files: 4
925
      tracked_bytes: 268438528
926
      text_files:
927
        count: 3
928
        size_bytes: 1024
929
      binary_files:
930
        count: 1
931
        size_bytes: 268435456
932
      ignored_files: 0
933
      max_path_depth: 2
934
      path_fanout: 4
935
      history_commits: 200
936
      binary_mutation_bytes_per_commit: 4194304
937
      branches: 4
938
      dirty_shape:
939
        modified_files: 1
940
        added_files: 0
941
        deleted_files: 0
942
        renamed_files: 0
943
        binary_files_modified: 1
944
        binary_mutation_bytes: 4194304
945
    operations_to_time:
946
      - repo.init
947
      - snapshot.initial
948
      - history.log.tip
949
      - history.log.range
950
      - history.checkout_old
951
      - history.restore_head
952
      - blob.checkout
953
      - status.dirty
954
      - diff.binary_stat
955
      - snapshot.dirty
956
    correctness_checks:
957
      - repository_initialized
958
      - initial_snapshot_matches_manifest
959
      - history_count_matches_fixture
960
      - historical_checkout_matches_manifest
961
      - binary_history_hashes_match
962
      - large_blob_hash_matches_manifest
963
      - dirty_status_counts_match
964
      - binary_diff_is_summary_only
965
      - snapshot_cleans_tree
966
    git_modes:
967
      - git_default
968
      - git_lfs
969
    oak_modes:
970
      - oak_default
971
    disk_requirements:
972
      fixture_bytes: 2147483648
973
      scratch_bytes_per_subject_run: 68719476736
974
      recommended_free_bytes: 274877906944
975
      human: 2 GiB generated fixture input, 64 GiB scratch per subject run, 256 GiB free recommended.
976
977
  - id: conflict-heavy
978
    name: Conflict heavy merge
979
    purpose: Measure merge, conflicted status, abort, and deterministic resolution behavior for many simultaneous textual conflicts.
980
    runtime_class: standard
981
    fixture_shape:
982
      tracked_files: 20000
983
      tracked_bytes: 40960000
984
      text_files:
985
        count: 20000
986
        size_bytes: 2048
987
      binary_files:
988
        count: 0
989
        size_bytes: 0
990
      ignored_files: 2000
991
      max_path_depth: 7
992
      path_fanout: 100
993
      history_commits: 20
994
      branches: 3
995
      conflict_shape:
996
        base_branch: main
997
        ours_branch: bench-ours
998
        theirs_branch: bench-theirs
999
        conflicting_files: 5000
1000
        non_conflicting_ours_files: 1000
1001
        non_conflicting_theirs_files: 1000
1002
        conflict_regions_per_file: 3
1003
      dirty_shape:
1004
        modified_files: 5000
1005
        added_files: 200
1006
        deleted_files: 100
1007
        renamed_files: 100
1008
    operations_to_time:
1009
      - repo.init
1010
      - snapshot.initial
1011
      - merge.clean_base
1012
      - merge.conflict
1013
      - status.conflicted
1014
      - diff.conflicted
1015
      - merge.abort
1016
      - merge.conflict
1017
      - merge.resolve
1018
      - snapshot.resolution
1019
    correctness_checks:
1020
      - repository_initialized
1021
      - initial_snapshot_matches_manifest
1022
      - conflict_paths_match_fixture
1023
      - merge_abort_restores_premerge
1024
      - merge_resolution_cleans_tree
1025
    git_modes:
1026
      - git_default
1027
      - git_worktree
1028
    oak_modes:
1029
      - oak_default
1030
      - oak_virtual_branch
1031
    disk_requirements:
1032
      fixture_bytes: 268435456
1033
      scratch_bytes_per_subject_run: 6442450944
1034
      recommended_free_bytes: 32212254720
1035
      human: 256 MiB fixture, 6 GiB scratch per subject run, 30 GiB free recommended.