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
cmd/entire/cli
benchutil
Mbench_test.go+5/-5
Mbenchutil.go+1/-1
checkpoint
Mcheckpoint_test.go+21/-21
Mephemeral_write.go+10/-10
Mexplain_test.go+6/-6
strategy
Mmanual_commit_git.go+4/-4
Mmanual_commit_hooks.go+1/-1
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",