fix remote unsupported checkpoint resume · Entire

fix remote unsupported checkpoint resume

24df573→main·

pfleidi·3w ago·4 files·+60 added/-5 removed

Preserve unsupported checkpoint-version errors while checking remote metadata during resume.

This keeps remote-only checkpoints consistent with local reads: if the checkpoint exists but uses a format this CLI cannot decode, resume returns the explicit compatibility error instead of falling through to a generic missing-metadata message.

Sessions

fb873cd67d32View transcript

?\Implement Checkpoint Policy Management SystemCodex·GPT-5.5·2 steps

Changes

4

78 unmodified lines

79
80
81
82
82
83
84
85
11 unmodified lines

97
98
99
100
100
101
102
103
48 unmodified lines

152
153
154
155
155
156
157
158
149 unmodified lines

308
309
310
311
311
312
313
314

78 unmodified lines

require.NoError(t, store.WriteCommitted(context.Background(), opts))
}

func rewriteExportCheckpointVersion(t *testing.T, repo *git.Repository, cpID id.CheckpointID, version string) {
func rewriteExportCheckpointVersionToRefsV1(t *testing.T, repo *git.Repository, cpID id.CheckpointID) {
    t.Helper()
    ctx := context.Background()
    refName := plumbing.NewBranchReferenceName(paths.MetadataBranchName)
11 unmodified lines

require.NoError(t, err)
    var summary checkpoint.CheckpointSummary
    require.NoError(t, json.Unmarshal([]byte(content), &summary))
    summary.CheckpointVersion = version
    summary.CheckpointVersion = "refs-v1"
    metadataJSON, err := json.Marshal(summary)
    require.NoError(t, err)
    metadataHash, err := checkpoint.CreateBlobFromContent(repo, metadataJSON)
48 unmodified lines

SessionID:  "session-json-unsupported",
    Transcript: redact.AlreadyRedacted([]byte(`{"type":"user","message":{"content":[{"type":"text","text":"hi"}]}}` + "\n")),
    })
    rewriteExportCheckpointVersion(t, repo, cpID, "refs-v1")
    rewriteExportCheckpointVersionToRefsV1(t, repo, cpID)

var stdout, stderr bytes.Buffer
    err := runExplainExport(context.Background(), &stdout, &stderr, explainExportOptions{
149 unmodified lines

SessionID:  "session-unsupported-transcript",
        Transcript: redact.AlreadyRedacted(raw),
        })
        rewriteExportCheckpointVersion(t, repo, cpID, "refs-v1")
        rewriteExportCheckpointVersionToRefsV1(t, repo, cpID)

var stdout, stderr bytes.Buffer
        err := runExplainExport(context.Background(), &stdout, &stderr, tt.opts)

Mcmd/entire/cli/explain_export_test.go+4/-4

1001 unmodified lines

1002
1003
1004
1005
1005
1006
1007
1008

1001 unmodified lines

SessionID:  "session-explain-unsupported",
    Transcript: redact.AlreadyRedacted([]byte(`{"type":"user","message":{"content":[{"type":"text","text":"hi"}]}}` + "\n")),
    })
    rewriteExportCheckpointVersion(t, repo, cpID, "refs-v1")
    rewriteExportCheckpointVersionToRefsV1(t, repo, cpID)

lookup, err := newExplainCheckpointLookup(context.Background())
    require.NoError(t, err)

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

739 unmodified lines

740
741
742
743
744
745
746
11 unmodified lines

758
759
760
761
762
763
764
765
766
16 unmodified lines

783
784
785
786
787
788
789
790
791
9 unmodified lines

801
802
803
804
805
806
807
808
809
7 unmodified lines

817
818
819
820
821
822
823
824
825

739 unmodified lines

// Resolve checkpoint remote URL once; reuse for both fetch and error message.
    hasCheckpointRemote := remote.Configured(ctx)
    var unsupportedVersionErr error

// Try checkpoint_remote first if configured and resolved (that's where checkpoints are stored)
    var checkpointURL string
11 unmodified lines

defer freshRepo.Close()
        metadata, err := readCheckpointInfoFromRef(ctx, freshRepo, refs, checkpointID)
        if err != nil {
            if checkpointpolicy.IsUnsupportedVersion(err) {
                unsupportedVersionErr = err
            }
            logging.Debug(logCtx, "checkpoint remote: fetch succeeded but checkpoint metadata read failed",
                slog.String("checkpoint_id", checkpointID.String()),
                slog.String("error", err.Error()),
            )
16 unmodified lines

if metadataErr == nil {
        return resumeSession(ctx, w, errW, metadata, false)
    }
    if checkpointpolicy.IsUnsupportedVersion(metadataErr) {
        unsupportedVersionErr = metadataErr
    }
    logging.Debug(logCtx, "remote-tracking metadata read failed",
                              slog.String("checkpoint_id", checkpointID.String()),
                              slog.String("error", metadataErr.Error()),
            )
9 unmodified lines

defer freshRepo.Close()
        metadata, err := readCheckpointInfoFromRef(ctx, freshRepo, refs, checkpointID)
        if err != nil {
            if checkpointpolicy.IsUnsupportedVersion(err) && unsupportedVersionErr == nil {
                unsupportedVersionErr = err
            }
            logging.Debug(logCtx, "origin metadata fetch succeeded but checkpoint metadata read failed",
                slog.String("checkpoint_id", checkpointID.String()),
                slog.String("error", err.Error()),
            )
7 unmodified lines

slog.String("error", fetchErr.Error()),
    )
    }
    if unsupportedVersionErr != nil {
        return unsupportedVersionErr
    }

// Nothing worked — print helpful error message
    if hasCheckpointRemote {

Mcmd/entire/cli/resume.go+13

1063 unmodified lines

1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111

1063 unmodified lines

}

func TestCheckRemoteMetadata_ReturnsUnsupportedVersionFromRemote(t *testing.T) {
    tmpDir := t.TempDir()
    t.Chdir(tmpDir)

repo, _, _ := setupResumeTestRepo(t, tmpDir, false)

checkpointID := id.MustCheckpointID("abc123def456")
    writeCommittedResumeCheckpointWithAgent(
        t,
        repo,
        checkpointID,
        "2025-01-01-test-session",
        time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
        agent.AgentTypeClaudeCode,
    )
    rewriteExportCheckpointVersionToRefsV1(t, repo, checkpointID)

localRef, err := repo.Reference(plumbing.NewBranchReferenceName(paths.MetadataBranchName), true)
    if err != nil {
        t.Fatalf("Failed to get local metadata branch: %%v", err)
    }
    remoteRef := plumbing.NewHashReference(
        plumbing.NewRemoteReferenceName("origin", paths.MetadataBranchName),
        localRef.Hash(),
    )
    if err := repo.Storer.SetReference(remoteRef); err != nil {
        t.Fatalf("Failed to create remote ref: %%v", err)
    }
    if err := repo.Storer.RemoveReference(plumbing.NewBranchReferenceName(paths.MetadataBranchName)); err != nil {
        t.Fatalf("Failed to remove local metadata branch: %%v", err)
    }

var stdout, stderr bytes.Buffer
    err = checkRemoteMetadata(context.Background(), &stdout, &stderr, checkpointID, checkpoint.DefaultV1Refs())
    if err == nil {
        t.Fatal("checkRemoteMetadata() error = nil, want unsupported checkpoint version")
    }
    if !checkpointpolicy.IsUnsupportedVersion(err) {
        t.Fatalf("checkRemoteMetadata() error = %%v, want unsupported checkpoint version", err)
    }
}

func TestCheckRemoteMetadata_NoRemoteMetadataBranch(t *testing.T) {
    tmpDir := t.TempDir()
    t.Chdir(tmpDir)