# Centralize target capability wiring in session setup

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

Soph·3mo ago·2 files·+12 added/-7 removed

## Sessions

6dcbf336156bView transcript

### Changes

- docs
  - Mrewrite-issue-list.md+1/-1
- internal/syncer
  - Msyncer.go+11/-6

```
452 unmodified lines

453
454
455
456
456
457
458
459

452 unmodified lines

- All mapping validation happens before network activity. Status: done
- Capability negotiation is centralized and enforced consistently. Status: partial
  Source-side fetch capability checks now live behind `gitproto.RefService` methods, and planner relay gating now consumes a narrower syncer-level policy instead of importing `gitproto` types directly. Some target-side relay decisions still rely on orchestration wiring rather than a fully unified capability model, so this remains partial.
  Source-side fetch capability checks now live behind `gitproto.RefService` methods, and sync session setup now owns target advertisement, derived target features, relay policy, and the target pusher together instead of rebuilding those pieces ad hoc in `Run`. Some target-side relay decisions still rely on orchestration wiring rather than a fully unified capability model, so this remains partial.
- Relay strategies are separate packages with explicit inputs and outputs. Status: done
- Tag creation is correct whether or not a pack transfer is needed. Status: done
- Stats are concurrency-safe. Status: done
```

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

```
312 unmodified lines

313
314
315
316
317
318
319
320
321
49 unmodified lines

371
372
373
374
375
376
377
378
379
380
381
382
12 unmodified lines

395
396
397
389
390
391
392
393
394
398
399
400
401
402

312 unmodified lines

targetConn      *gitproto.Conn
	sourceService   *gitproto.RefService
	targetAdv       *packp.AdvRefs
	targetFeatures  gitproto.TargetFeatures
	targetPolicy    planner.RelayTargetPolicy
	targetPusher    gitproto.Pusher
	sourceRefMap    map[plumbing.ReferenceName]plumbing.Hash
	targetRefMap    map[plumbing.ReferenceName]plumbing.Hash
	measurementDone func() Measurement
49 unmodified lines

return nil, fmt.Errorf("decode target refs: %w", err)
	}
	s.targetRefMap = gitproto.RefHashMap(targetRefSlice)
	s.targetFeatures = gitproto.TargetFeaturesFromAdvRefs(s.targetAdv)
	s.targetPolicy = planner.RelayTargetPolicy{
		CapabilitiesKnown: s.targetFeatures.Known,
		NoThin:            s.targetFeatures.NoThin,
	}
	s.targetPusher = gitproto.NewPusher(s.targetConn, s.targetAdv, cfg.Verbose)
	}

return s, nil
12 unmodified lines

sourceConn := s.sourceConn
	sourceService := s.sourceService
	targetAdv := s.targetAdv
	targetFeatures := gitproto.TargetFeaturesFromAdvRefs(targetAdv)
	targetPolicy := planner.RelayTargetPolicy{
		CapabilitiesKnown: targetFeatures.Known,
		NoThin:            targetFeatures.NoThin,
	}
	targetPusher := gitproto.NewPusher(s.targetConn, s.targetAdv, cfg.Verbose)

targetPolicy := s.targetPolicy
targetPusher := s.targetPusher
sourceRefMap := s.sourceRefMap
targetRefMap := s.targetRefMap
```
