@@ -158,6 +158,15 @@ func (m *Manager) Start(foreground bool, agentOverride string, envOverrides []st
158158 // package config) to prevent concurrent rig starts from corrupting the
159159 // global agent registry.
160160 townRoot := m .townRoot ()
161+
162+ // Resolve CLAUDE_CONFIG_DIR from accounts.json so witness sessions
163+ // use the correct account. Mirrors the daemon restart path (lifecycle.go).
164+ accountsPath := constants .MayorAccountsPath (townRoot )
165+ runtimeConfigDir , _ , _ := config .ResolveAccountConfigDir (accountsPath , "" )
166+ if runtimeConfigDir == "" {
167+ runtimeConfigDir = os .Getenv ("CLAUDE_CONFIG_DIR" )
168+ }
169+
161170 runtimeConfig := config .ResolveRoleAgentConfig ("witness" , townRoot , m .rig .Path )
162171 witnessSettingsDir := config .RoleSettingsDir ("witness" , m .rig .Path )
163172 if err := runtime .EnsureSettingsForRole (witnessSettingsDir , witnessDir , "witness" , runtimeConfig ); err != nil {
@@ -180,7 +189,7 @@ func (m *Manager) Start(foreground bool, agentOverride string, envOverrides []st
180189 // NOTE: No gt prime injection needed - SessionStart hook handles it automatically
181190 // Export GT_ROLE and BD_ACTOR in the command since tmux SetEnvironment only affects new panes
182191 // Pass m.rig.Path so rig agent settings are honored (not town-level defaults)
183- command , err := buildWitnessStartCommand (m .rig .Path , m .rig .Name , townRoot , sessionID , agentOverride , roleConfig )
192+ command , err := buildWitnessStartCommand (m .rig .Path , m .rig .Name , townRoot , sessionID , agentOverride , roleConfig , runtimeConfigDir )
184193 if err != nil {
185194 return err
186195 }
@@ -197,11 +206,12 @@ func (m *Manager) Start(foreground bool, agentOverride string, envOverrides []st
197206 // Set environment variables (non-fatal: session works without these)
198207 // Use centralized AgentEnv for consistency across all role startup paths
199208 envVars := config .AgentEnv (config.AgentEnvConfig {
200- Role : "witness" ,
201- Rig : m .rig .Name ,
202- TownRoot : townRoot ,
203- Agent : agentOverride ,
204- SessionName : sessionID ,
209+ Role : "witness" ,
210+ Rig : m .rig .Name ,
211+ TownRoot : townRoot ,
212+ RuntimeConfigDir : runtimeConfigDir ,
213+ Agent : agentOverride ,
214+ SessionName : sessionID ,
205215 })
206216 envVars = session .MergeRuntimeLivenessEnv (envVars , runtimeConfig )
207217 for k , v := range envVars {
@@ -311,7 +321,7 @@ func roleConfigEnvVars(roleConfig *beads.RoleConfig, townRoot, rigName string) m
311321 return expanded
312322}
313323
314- func buildWitnessStartCommand (rigPath , rigName , townRoot , sessionName , agentOverride string , roleConfig * beads.RoleConfig ) (string , error ) {
324+ func buildWitnessStartCommand (rigPath , rigName , townRoot , sessionName , agentOverride string , roleConfig * beads.RoleConfig , runtimeConfigDir string ) (string , error ) {
315325 if agentOverride != "" {
316326 roleConfig = nil
317327 }
@@ -343,12 +353,13 @@ func buildWitnessStartCommand(rigPath, rigName, townRoot, sessionName, agentOver
343353 Topic : "patrol" ,
344354 }, "Run `gt prime --hook` and begin patrol." )
345355 command , err := config .BuildStartupCommandFromConfig (config.AgentEnvConfig {
346- Role : "witness" ,
347- Rig : rigName ,
348- TownRoot : townRoot ,
349- Prompt : initialPrompt ,
350- Topic : "patrol" ,
351- SessionName : sessionName ,
356+ Role : "witness" ,
357+ Rig : rigName ,
358+ TownRoot : townRoot ,
359+ RuntimeConfigDir : runtimeConfigDir ,
360+ Prompt : initialPrompt ,
361+ Topic : "patrol" ,
362+ SessionName : sessionName ,
352363 }, rigPath , initialPrompt , agentOverride )
353364 if err != nil {
354365 return "" , fmt .Errorf ("building startup command: %w" , err )
0 commit comments