Upstream design discussion: #68 (comment: #68 (comment))
Summary
Provider rotation is merged but unusable. RandomStrategy.Select() in resolveTemplate runs every reconcile tick → different pick → config-drift restart loop.
Fix
- Store selected provider in
bead.Metadata["provider"] at creation
- On reconcile: read stored provider from existing bead, skip re-roll
- Quota-kill via
gc session close forces fresh bead → new random pick
- Add
existingProvider param to resolveTemplate to bypass random selection for running sessions
Key Files
cmd/gc/template_resolve.go:92 — resolveTemplate calls ResolveProvider every tick
cmd/gc/build_desired_state.go:403 — discoverSessionBeads passes to resolveTemplate
cmd/gc/session_template_start.go — materialize stores provider in bead
internal/config/provider_strategy.go — RandomStrategy
Upstream design discussion: #68 (comment: #68 (comment))
Summary
Provider rotation is merged but unusable.
RandomStrategy.Select()inresolveTemplateruns every reconcile tick → different pick → config-drift restart loop.Fix
bead.Metadata["provider"]at creationgc session closeforces fresh bead → new random pickexistingProviderparam toresolveTemplateto bypass random selection for running sessionsKey Files
cmd/gc/template_resolve.go:92— resolveTemplate calls ResolveProvider every tickcmd/gc/build_desired_state.go:403— discoverSessionBeads passes to resolveTemplatecmd/gc/session_template_start.go— materialize stores provider in beadinternal/config/provider_strategy.go— RandomStrategy