checkpoint: name ephemeral writes by scope (Step / TaskStep) · Entire

checkpoint: name ephemeral writes by scope (Step / TaskStep)

99982c4→main· Sophia·3w ago·7 files·+48 added/-48 removed

Mirror the persistent union's verb-free, scope-based naming on the ephemeral side. The store method is already Write, so the request noun should say what is written, not repeat the verb: WriteCheckpoint -> Step (a session step) and WriteTask -> TaskStep (a subagent task step). Both still produce an ephemeral shadow-branch checkpoint; the names match the strategy's SaveStep / SaveTaskStep vocabulary. Bare nouns like checkpoint.Checkpoint were rejected — they stutter on the package's own central domain noun and read as a distinct kind when both requests write the same artifact from different sources.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

Sessions

ed0141adaf02View transcript

Changes

7

62 unmodified lines

63
64
65
66
66
67
68
69
54 unmodified lines

124
125
126
127
127
128
129
130
42 unmodified lines

173
174
175
176
176
177
178
179
29 unmodified lines

209
210
211
212
212
213
214
215
40 unmodified lines

256
257
258
259
259
260
261
262

62 unmodified lines

// measure the first-checkpoint path (which runs collectChangedFiles).
 // We use a unique session ID per iteration to get a fresh shadow branch.
 sid := fmt.Sprintf("bench-first-%d", i)
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.WriteCheckpoint{
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.Step{
 SessionID:         sid,
 BaseCommit:        repo.HeadHash,
 WorktreeID:        repo.WorktreeID,

54 unmodified lines

ctx := context.Background()
 b.ResetTimer()
 for range b.N {
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.WriteCheckpoint{
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.Step{
 SessionID:         sessionID,
 BaseCommit:        repo.HeadHash,
 WorktreeID:        repo.WorktreeID,

42 unmodified lines

29 unmodified lines

ctx := context.Background()
 b.ResetTimer()
 for range b.N {
 result, writeErr := repo.Ephemeral.Write(ctx, checkpoint.WriteCheckpoint{
 result, writeErr := repo.Ephemeral.Write(ctx, checkpoint.Step{
 SessionID:         sessionID,
 BaseCommit:        repo.HeadHash,
 WorktreeID:        repo.WorktreeID,

40 unmodified lines

ctx := context.Background()
 b.ResetTimer()
 for range b.N {
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.WriteCheckpoint{
 _, writeErr := repo.Ephemeral.Write(ctx, checkpoint.Step{
 SessionID:         sessionID,
 BaseCommit:        repo.HeadHash,
 WorktreeID:        repo.WorktreeID,

Mcmd/entire/cli/benchutil/bench_test.go+5/-5

360 unmodified lines

361
362
363
364
364
365
366
367

360 unmodified lines

b.Fatalf("write transcript: %v", err)
 }

_, err := br.Ephemeral.Write(context.Background(), checkpoint.WriteCheckpoint{
 _, err := br.Ephemeral.Write(context.Background(), checkpoint.Step{
 SessionID:         sessionID,
 BaseCommit:        br.HeadHash,
 WorktreeID:        br.WorktreeID,

Mcmd/entire/cli/benchutil/benchutil.go+1/-1

349 unmodified lines

350
351
352
353
353
354
355
356
15 unmodified lines

372
373
374
375
375
376
377
378
20 unmodified lines

399
400
401
402
402
403
404
405
1397 unmodified lines

1803
1804
1805
1806
1806
1807
1808
1809
121 unmodified lines

1931
1932
1933
1934
1934
1935
1936
1937
95 unmodified lines

2033
2034
2035
2036
2036
2037
2038
2039
109 unmodified lines

2149
2150
2151
2152
2152
2153
2154
2155
110 unmodified lines

2266
2267
2268
2269
2269
2270
2271
2272
94 unmodified lines

2367
2368
2369
2370
2370
2371
2372
2373
12 unmodified lines

2386
2387
2388
2389
2389
2390
2391
2392
95 unmodified lines

2488
2489
2490
2491
2491
2492
2493
2494
9 unmodified lines

2504
2505
2506
2507
2507
2508
2509
2510
88 unmodified lines

2599
2600
2601
2602
2602
2603
2604
2605
9 unmodified lines

2615
2616
2617
2618
2618
2619
2620
2621
100 unmodified lines

2722
2723
2724
2725
2725
2726
2727
2728
108 unmodified lines

2837
2838
2839
2840
2840
2841
2842
2843
92 unmodified lines

2936
2937
2938
2939
2939
2940
2941
2942
90 unmodified lines

3033
3034
3035
3036
3036
3037
3038
3039
1100 unmodified lines

4140
4141
4142
4143
4143
4144
4145
4146
281 unmodified lines

4428
4429
4430
4431
4431
4432
4433
4434
100 unmodified lines

4535
4536
4537
4538
4538
4539
4540
4541

349 unmodified lines

// First checkpoint should be created
 baseCommit := initialCommit.String()
 result1, err := store.Write(context.Background(), WriteCheckpoint{
 result1, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"test.go"},
15 unmodified lines

}

// Second checkpoint with identical content should be skipped
 result2, err := store.Write(context.Background(), WriteCheckpoint{
 result2, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"test.go"},
20 unmodified lines

t.Fatalf("failed to modify test file: %v", err)
 }

result3, err := store.Write(context.Background(), WriteCheckpoint{
 result3, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"test.go"},
1397 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{}, // Agent hasn't modified anything
121 unmodified lines

}

store := newEphemeralStore(repo, DefaultV1Refs())
 result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        initialCommit.String(),
 ModifiedFiles:  tt.modifiedFiles(tempDir, mainFile),
95 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
109 unmodified lines

}

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
94 unmodified lines

baseCommit := initialCommit.String()

// Write first checkpoint to establish the shadow branch
 firstResult, err := store.Write(context.Background(), WriteCheckpoint{
 firstResult, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
12 unmodified lines

// Now write a subsequent checkpoint where the agent reports .env and db.secret
 // as modified files (e.g., agent touched them during its turn).
 // These gitignored files must NOT appear in the checkpoint tree.
 result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"main.go", ".env", "db.secret"}, // Agent reports these
95 unmodified lines

baseCommit := initialCommit.String()

// First checkpoint
 firstResult, err := store.Write(context.Background(), WriteCheckpoint{
 firstResult, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 MetadataDir:       ".entire/metadata/test-session",
9 unmodified lines

require.False(t, firstResult.Skipped)

// Subsequent checkpoint with .env reported as a new file
 result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
88 unmodified lines

baseCommit := initialCommit.String()

require.False(t, firstResult.Skipped)

// Subsequent checkpoint with node_modules file reported as modified
 result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"index.js", "node_modules/pkg/index.js"},
100 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{"main.go"}, // Only agent-modified file in list
108 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
92 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
90 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

result, err := store.Write(context.Background(), WriteCheckpoint{
 result, err := store.Write(context.Background(), Step{
 SessionID:         "test-session",
 BaseCommit:        baseCommit,
 ModifiedFiles:     []string{},
1100 unmodified lines

store := newEphemeralStore(repo, DefaultV1Refs())
 baseCommit := initialCommit.String()

_, err = store.Write(context.Background(), WriteTask{
 _, err = store.Write(context.Background(), TaskStep{
 SessionID:              "test-session",
 BaseCommit:             baseCommit,
 ToolUseID:              "toolu_test456",
281 unmodified lines

t.Chdir(tempDir)

store := newEphemeralStore(repo, DefaultV1Refs())
 writeRes, err := store.Write(context.Background(), WriteTask{
 writeRes, err := store.Write(context.Background(), TaskStep{
 SessionID:      "test-session",
 BaseCommit:     initialCommit.String(),
 ToolUseID:      "toolu_symlink123",
100 unmodified lines

baseCommit := initialCommit.String()

// Write task checkpoint where subagent reports .env as modified
 writeRes, err := store.Write(context.Background(), WriteTask{
 writeRes, err := store.Write(context.Background(), TaskStep{
 SessionID:              "test-session",
 BaseCommit:             baseCommit,
 ToolUseID:              "toolu_test789",