# feat(import): deterministic per-turn checkpoint IDs

`d658cc8`→[main](/content/gh/entireio/cli/commits/main/index.html)·

computermode·3w ago·2 files·+39 added/-0 removed

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

## Sessions

d027d2f148a0View transcript

[?\
Implement Claude History Import FeatureClaude Code·Opus 4.8·3 steps](/content/gh/entireio/cli/session/897809d4-ecab-4dc6-aa21-97661cb62607#timeline-d027d2f148a0/index.html)

## Changes

2

- cmd/entire/cli/importclaude

- Aid.go+20

- Aid_test.go+19

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

// Package importclaude imports pre-existing Claude Code transcripts into Entire
// as read-only, commit-less ("orphaned") checkpoints on the local-only
// entire/imports/v1 ref.
package importclaude

import (
	"crypto/sha256"
	"encoding/hex"

"github.com/entireio/cli/cmd/entire/cli/checkpoint/id"
)

// DeriveCheckpointID produces a stable 12-hex checkpoint ID for an imported
// turn. Re-importing the same (sessionID, turnUUID) yields the same ID, which
// is how import stays idempotent.
func DeriveCheckpointID(sessionID, turnUUID string) id.CheckpointID {
	sum := sha256.Sum256([]byte(sessionID + "/" + turnUUID))
	hexID := hex.EncodeToString(sum[:6]) // 6 bytes = 12 lowercase hex chars
	return id.MustCheckpointID(hexID)
}
```

Acmd/entire/cli/importclaude/id.go+20

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

package importclaude

import "testing"

func TestDeriveCheckpointID_StableAndDistinct(t *testing.T) {
	t.Parallel()
	a := DeriveCheckpointID("sess", "turn-1")
	b := DeriveCheckpointID("sess", "turn-1")
	c := DeriveCheckpointID("sess", "turn-2")
	if a != b {
		t.Errorf("not deterministic: %s != %s", a, b)
	}
	if a == c {
		t.Errorf("collision across turns: %s == %s", a, c)
	}
	if a.IsEmpty() {
		t.Error("derived id is empty")
	}
}
```

Acmd/entire/cli/importclaude/id_test.go+19
