fix checkpoint reader edge cases · Entire
fix checkpoint reader edge cases
c17199d→main·
pfleidi·4w ago·4 files·+76 added/-3 removed
Keep empty-session checkpoints distinct from missing checkpoints when reading latest session content.
Also narrow resume checkpoint metadata resolution to the methods it actually uses so the split store interfaces stay precise.
Sessions
8e67ab6c5252View transcript
[?
Refactor Checkpoint Storage Interfaces and Domain AdaptersCodex·GPT-5.5·6 steps](/content/gh/entireio/cli/session/019edcc1-ea65-7431-89c5-c3bfe3140f75#timeline-8e67ab6c5252/index.html)
Changes
4
cmd/entire/cli
checkpoint
Mcommitted_reader_resolve.go+4/-1
Mcommitted_reader_resolve_test.go+13
Mresume.go+7/-2
Mresume_test.go+52
60 unmodified lines
61
62
63
64
64
65
66
67
68
69
70
71
72
60 unmodified lines
// ReadLatestSessionContent reads the latest session from an already-resolved
// committed reader and summary.
func ReadLatestSessionContent(ctx context.Context, reader CommittedReader, checkpointID id.CheckpointID, summary *CheckpointSummary) (*SessionContent, error) {
if summary == nil || len(summary.Sessions) == 0 {
if summary == nil {
return nil, ErrCheckpointNotFound
}
if len(summary.Sessions) == 0 {
return nil, fmt.Errorf("checkpoint has no sessions: %s", checkpointID)
}
latestIndex := len(summary.Sessions) - 1
content, err := reader.ReadSessionContent(ctx, checkpointID, latestIndex)
if err != nil {
Mcmd/entire/cli/checkpoint/committed_reader_resolve.go+4/-1
31 unmodified lines
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
31 unmodified lines
require.ErrorContains(t, err, "read committed checkpoint")
}
func TestReadLatestSessionContentEmptySummaryReturnsDistinctError(t *testing.T) {
t.Parallel()
cpID := id.MustCheckpointID("111111111111")
summary := &CheckpointSummary{}
reader := &committedReaderStub{summary: summary}
content, err := ReadLatestSessionContent(context.Background(), reader, cpID, summary)
require.Nil(t, content)
require.ErrorContains(t, err, "checkpoint has no sessions")
require.NotErrorIs(t, err, ErrCheckpointNotFound)
}
func TestReadRawSessionLogForCheckpointReadsLatestV1Session(t *testing.T) {
t.Parallel()
Mcmd/entire/cli/checkpoint/committed_reader_resolve_test.go+13
328 unmodified lines
329
330
331
332
332
333
334
335
13 unmodified lines
349
350
351
352
352
353
354
355
356
357
358
359
360
328 unmodified lines
// resolveLatestCheckpoint reads metadata for each checkpoint ID and returns
// the checkpoint with the latest CreatedAt.
func resolveLatestCheckpoint(ctx context.Context, store checkpoint.CommittedListReader, checkpointIDs []id.CheckpointID) (*strategy.CheckpointInfo, error) {
func resolveLatestCheckpoint(ctx context.Context, store checkpointInfoReader, checkpointIDs []id.CheckpointID) (*strategy.CheckpointInfo, error) {
infoMap := make(map[id.CheckpointID]strategy.CheckpointInfo, len(checkpointIDs))
for _, cpID := range checkpointIDs {
metadata, readErr := readCheckpointInfoFromStore(ctx, store, cpID)
13 unmodified lines
return &latest, nil
}
func readCheckpointInfoFromStore(ctx context.Context, store checkpoint.CommittedListReader, checkpointID id.CheckpointID) (*strategy.CheckpointInfo, error) {
type checkpointInfoReader interface {
checkpoint.CommittedReader
ReadSessionMetadata(ctx context.Context, checkpointID id.CheckpointID, sessionIndex int) (*checkpoint.CommittedMetadata, error)
}
func readCheckpointInfoFromStore(ctx context.Context, store checkpointInfoReader, checkpointID id.CheckpointID) (*strategy.CheckpointInfo, error) {
summary, err := checkpoint.ReadCommittedCheckpoint(ctx, store, checkpointID)
if err != nil {
return nil, fmt.Errorf("read checkpoint: %w", err)
Mcmd/entire/cli/resume.go+7/-2
591 unmodified lines
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
591 unmodified lines
}
}
func TestResolveLatestCheckpointUsesCheckpointInfoReader(t *testing.T) {
t.Parallel()
oldID := id.MustCheckpointID("aaa111bbb222")
newID := id.MustCheckpointID("ccc333ddd444")
reader := &resumeCheckpointInfoReaderStub{
summaries: map[id.CheckpointID]*checkpoint.CheckpointSummary{
oldID: {Sessions: []checkpoint.SessionFilePaths{{Metadata: "old"}}},
newID: {Sessions: []checkpoint.SessionFilePaths{{Metadata: "new"}}},
},
metadata: map[id.CheckpointID][]checkpoint.CommittedMetadata{
oldID: {{
SessionID: "old-session",
CreatedAt: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC),
}},
newID: {{
SessionID: "new-session",
CreatedAt: time.Date(2025, 1, 1, 11, 0, 0, 0, time.UTC),
}},
},
}
latest, err := resolveLatestCheckpoint(context.Background(), reader, []id.CheckpointID{oldID, newID})
if err != nil {
t.Fatalf("resolveLatestCheckpoint() error = %v", err)
}
if latest.CheckpointID != newID {
t.Errorf("resolveLatestCheckpoint() = %s, want %s", latest.CheckpointID, newID)
}
}
type resumeCheckpointInfoReaderStub struct {
summaries map[id.CheckpointID]*checkpoint.CheckpointSummary
metadata map[id.CheckpointID][]checkpoint.CommittedMetadata
}
func (r *resumeCheckpointInfoReaderStub) ReadCommitted(_ context.Context, checkpointID id.CheckpointID) (*checkpoint.CheckpointSummary, error) {
return r.summaries[checkpointID], nil
}
func (r *resumeCheckpointInfoReaderStub) ReadSessionContent(_ context.Context, _ id.CheckpointID, _ int) (*checkpoint.SessionContent, error) {
return nil, checkpoint.ErrCheckpointNotFound
}
func (r *resumeCheckpointInfoReaderStub) ReadSessionMetadata(_ context.Context, checkpointID id.CheckpointID, sessionIndex int) (*checkpoint.CommittedMetadata, error) {
sessions := r.metadata[checkpointID]
if sessionIndex < 0 || sessionIndex >= len(sessions) {
return nil, checkpoint.ErrCheckpointNotFound
}
return &sessions[sessionIndex], nil
}
func TestReadCheckpointInfoFromStoreUsesLatestSessionMetadata(t *testing.T) {
tmpDir := t.TempDir()
t.Chdir(tmpDir)