# Add direct relay decision coverage

`f9170fc`→[main](/content/gh/entireio/git-sync/commits/main/index.html)·

Soph·3mo ago·2 files·+103 added/-4

## Sessions

1a1fb1d80eafView transcript

[?\
Can you take a look at the go code (wasm) in /Users/soph/Work/entire/devenv/entire-io-worktree1 based a bit on that I wonder if something like this can be build:Codex·GPT-5.4·1 step](/content/gh/entireio/git-sync/session/019d6d29-8cf7-7fe3-adc9-8c3e4d9d5603#timeline-1a1fb1d80eaf/index.html)

## Changes

2

- docs

- Mrewrite-issue-list.md+4/-4

- internal/planner

- Mplanner_test.go+99

```
372 unmodified lines

### 19. Relay eligibility logic is only tested indirectly

Status: partial
Status: done

Missing direct tests include:
- `canIncrementalRelay`

- Strategy selection must be testable independently from network execution.

Current rewrite note:
- Relay logic moved into planner/strategy packages and is more directly testable, but the original acceptance wording implies more isolated decision tests than currently exist.
- Relay decision functions now have direct planner-level coverage in addition to higher-level execution-path tests.

### 20. Protocol v2 error handling is under-tested

### 22. No benchmark coverage for the expensive paths

Status: done
Status: partial

Rewrite requirement:
- Add benchmarks for relay path overhead, planning overhead, and fallback graph/object work.
- Logging is structured and concurrency-safe. Status: open
- Protocol parsing has explicit malformed-input tests. Status: done
- Rewrite passes `go test ./...` and `go test -race ./...`. Status: done
- Rewrite includes benchmarks for the critical planning and execution paths. Status: done
- Rewrite includes benchmarks for the critical planning and execution paths. Status: partial
- Rewrite branch can be compared against current behavior using the same integration scenarios. Status: done

Notes:
```

Mdocs/rewrite-issue-list.md+4/-4

```

733 unmodified lines

```go
func TestCanIncrementalRelayRejectsNoThin(t *testing.T) {
	plans := []BranchPlan{{
		Branch:     "main",
		SourceRef:  "refs/heads/main",
		TargetRef:  "refs/heads/main",
		SourceHash: plumbing.NewHash("1111111111111111111111111111111111111111"),
		TargetHash: plumbing.NewHash("2222222222222222222222222222222222222222"),
		Kind:       RefKindBranch,
		Action:     ActionUpdate,
	}}

advRefs := &packp.AdvRefs{}
	advRefs.Capabilities = capability.NewList()
	_ = advRefs.Capabilities.Set(capability.Capability("no-thin"))

ok, reason := CanIncrementalRelay(false, false, false, plans, advRefs)
	if ok {
		t.Fatal("expected CanIncrementalRelay=false when target advertises no-thin")
	}
	if reason != "incremental-target-no-thin" {
		t.Fatalf("unexpected reason: %s", reason)
	}
}

func TestCanIncrementalRelayRejectsBranchCreate(t *testing.T) {
	plans := []BranchPlan{{
		Branch:     "main",
		SourceRef:  "refs/heads/main",
		TargetRef:  "refs/heads/main",
		SourceHash: plumbing.NewHash("1111111111111111111111111111111111111111"),
		TargetHash: plumbing.ZeroHash,
		Kind:       RefKindBranch,
		Action:     ActionCreate,
	}}

advRefs := &packp.AdvRefs{}
	advRefs.Capabilities = capability.NewList()

ok, reason := CanIncrementalRelay(false, false, false, plans, advRefs)
	if ok {
		t.Fatal("expected CanIncrementalRelay=false for branch create")
	}
	if reason != "incremental-branch-action-not-update" {
		t.Fatalf("unexpected reason: %s", reason)
	}
}

func TestCanFullTagCreateRelay(t *testing.T) {
	plans := []BranchPlan{{
		Branch:     "v1.0",
		SourceRef:  "refs/tags/v1.0",
		TargetRef:  "refs/tags/v1.0",
		SourceHash: plumbing.NewHash("3333333333333333333333333333333333333333"),
		TargetHash: plumbing.ZeroHash,
		Kind:       RefKindTag,
		Action:     ActionCreate,
	}}

ok, reason := CanFullTagCreateRelay(plans)
	if !ok {
		t.Fatalf("expected CanFullTagCreateRelay=true, got reason=%s", reason)
	}
	if reason != "tag-create-full-pack" {
		t.Fatalf("unexpected reason: %s", reason)
	}
}

func TestRelayFallbackReason(t *testing.T) {
	tagCreate := []BranchPlan{{
		Branch:     "v1.0",
		SourceRef:  "refs/tags/v1.0",
		TargetRef:  "refs/tags/v1.0",
		SourceHash: plumbing.NewHash("3333333333333333333333333333333333333333"),
		TargetHash: plumbing.ZeroHash,
		Kind:       RefKindTag,
		Action:     ActionCreate,
	}}

advRefs := &packp.AdvRefs{}
	advRefs.Capabilities = capability.NewList()

if got := RelayFallbackReason(false, false, false, tagCreate, advRefs); got != "fast-forward-branch-or-tag-create" {
		t.Fatalf("expected fast-forward-branch-or-tag-create, got %s", got)
	}

unsupported := []BranchPlan{{
		Branch:     "main",
		SourceRef:  "refs/heads/main",
		TargetRef:  "refs/tags/main",
		SourceHash: plumbing.NewHash("1111111111111111111111111111111111111111"),
		TargetHash: plumbing.NewHash("2222222222222222222222222222222222222222"),
		Kind:       RefKindBranch,
		Action:     ActionUpdate,
	}}
	if got := RelayFallbackReason(false, false, false, unsupported, advRefs); got != "incremental-tag-relay-non-tag-plan" {
		t.Fatalf("unexpected fallback reason: %s", got)
	}
}

func TestObjectsToPush(t *testing.T) {
	repo, err := git.Init(memory.NewStorage(), nil)
	if err != nil {
