refactor: use hq- prefix for role bead references

Migrate all role bead references from gt-*-role to hq-*-role using
beads.RoleBeadIDTown() function. Role beads are stored in town beads
(~/gt/.beads/) with the hq- prefix.

Changes:
- internal/cmd/prime.go: Use RoleBeadIDTown() for all roles
- internal/doctor/agent_beads_check.go: Use RoleBeadIDTown() for rig agents
- internal/polecat/manager.go: Use RoleBeadIDTown("polecat")
- internal/cmd/crew_add.go: Use RoleBeadIDTown("crew")
- internal/beads/beads.go: Update comments to document hq- convention
- Templates: Update bd show gt-deacon to bd show hq-deacon

Note: Tmux session names remain as gt-* (runtime identifiers).
Bead IDs use hq-* for town-level agents (persistent storage).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
scrotus
2026-01-04 13:17:39 -08:00
committed by Steve Yegge
parent a0e5831f69
commit 4de5a96400
7 changed files with 26 additions and 21 deletions

View File

@@ -35,7 +35,7 @@ gt peek deacon --lines 20
**Step 2: Check agent bead state**
```bash
bd show gt-deacon 2>/dev/null
bd show hq-deacon 2>/dev/null
# Look for:
# - state: running/working/idle
# - last_activity: when was last update?

View File

@@ -1388,15 +1388,20 @@ func IsAgentSessionBead(beadID string) bool {
}
// Role bead ID naming convention:
// gt-<role>-role
// Role beads are stored in town beads (~/.beads/) with hq- prefix.
//
// Canonical format: hq-<role>-role
//
// Examples:
// - gt-mayor-role
// - gt-deacon-role
// - gt-witness-role
// - gt-refinery-role
// - gt-crew-role
// - gt-polecat-role
// - hq-mayor-role
// - hq-deacon-role
// - hq-witness-role
// - hq-refinery-role
// - hq-crew-role
// - hq-polecat-role
//
// Use RoleBeadIDTown() to get canonical role bead IDs.
// The legacy RoleBeadID() function returns gt-<role>-role for backward compatibility.
// RoleBeadID returns the role bead ID for a given role type.
// Role beads define lifecycle configuration for each agent type.

View File

@@ -108,7 +108,7 @@ func runCrewAdd(cmd *cobra.Command, args []string) error {
RoleType: "crew",
Rig: rigName,
AgentState: "idle",
RoleBead: "gt-crew-role",
RoleBead: beads.RoleBeadIDTown("crew"),
}
desc := fmt.Sprintf("Crew worker %s in %s - human-managed persistent workspace.", name, rigName)
if _, err := bd.CreateAgentBead(crewID, desc, fields); err != nil {

View File

@@ -1204,40 +1204,40 @@ func getAgentFields(ctx RoleContext, state string) *beads.AgentFields {
RoleType: "crew",
Rig: ctx.Rig,
AgentState: state,
RoleBead: "gt-crew-role",
RoleBead: beads.RoleBeadIDTown("crew"),
}
case RolePolecat:
return &beads.AgentFields{
RoleType: "polecat",
Rig: ctx.Rig,
AgentState: state,
RoleBead: "gt-polecat-role",
RoleBead: beads.RoleBeadIDTown("polecat"),
}
case RoleMayor:
return &beads.AgentFields{
RoleType: "mayor",
AgentState: state,
RoleBead: "gt-mayor-role",
RoleBead: beads.RoleBeadIDTown("mayor"),
}
case RoleDeacon:
return &beads.AgentFields{
RoleType: "deacon",
AgentState: state,
RoleBead: "gt-deacon-role",
RoleBead: beads.RoleBeadIDTown("deacon"),
}
case RoleWitness:
return &beads.AgentFields{
RoleType: "witness",
Rig: ctx.Rig,
AgentState: state,
RoleBead: "gt-witness-role",
RoleBead: beads.RoleBeadIDTown("witness"),
}
case RoleRefinery:
return &beads.AgentFields{
RoleType: "refinery",
Rig: ctx.Rig,
AgentState: state,
RoleBead: "gt-refinery-role",
RoleBead: beads.RoleBeadIDTown("refinery"),
}
default:
return nil

View File

@@ -230,7 +230,7 @@ func (c *AgentBeadsCheck) Fix(ctx *CheckContext) error {
RoleType: "witness",
Rig: rigName,
AgentState: "idle",
RoleBead: "gt-witness-role",
RoleBead: beads.RoleBeadIDTown("witness"),
}
desc := fmt.Sprintf("Witness for %s - monitors polecat health and progress.", rigName)
if _, err := bd.CreateAgentBead(witnessID, desc, fields); err != nil {
@@ -244,7 +244,7 @@ func (c *AgentBeadsCheck) Fix(ctx *CheckContext) error {
RoleType: "refinery",
Rig: rigName,
AgentState: "idle",
RoleBead: "gt-refinery-role",
RoleBead: beads.RoleBeadIDTown("refinery"),
}
desc := fmt.Sprintf("Refinery for %s - processes merge queue.", rigName)
if _, err := bd.CreateAgentBead(refineryID, desc, fields); err != nil {
@@ -261,7 +261,7 @@ func (c *AgentBeadsCheck) Fix(ctx *CheckContext) error {
RoleType: "crew",
Rig: rigName,
AgentState: "idle",
RoleBead: "gt-crew-role",
RoleBead: beads.RoleBeadIDTown("crew"),
}
desc := fmt.Sprintf("Crew worker %s in %s - human-managed persistent workspace.", workerName, rigName)
if _, err := bd.CreateAgentBead(crewID, desc, fields); err != nil {

View File

@@ -251,7 +251,7 @@ func (m *Manager) AddWithOptions(name string, opts AddOptions) (*Polecat, error)
RoleType: "polecat",
Rig: m.rig.Name,
AgentState: "spawning",
RoleBead: "gt-polecat-role",
RoleBead: beads.RoleBeadIDTown("polecat"),
HookBead: opts.HookBead, // Set atomically at spawn time
})
if err != nil {
@@ -467,7 +467,7 @@ func (m *Manager) RecreateWithOptions(name string, force bool, opts AddOptions)
RoleType: "polecat",
Rig: m.rig.Name,
AgentState: "spawning",
RoleBead: "gt-polecat-role",
RoleBead: beads.RoleBeadIDTown("polecat"),
HookBead: opts.HookBead, // Set atomically at spawn time
})
if err != nil {

View File

@@ -63,7 +63,7 @@ tmux has-session -t {{ .DeaconSession }} 2>/dev/null && echo "alive" || echo "de
gt peek deacon --lines 20
# Agent bead state
bd show gt-deacon 2>/dev/null
bd show hq-deacon 2>/dev/null
# Recent activity
gt feed --since 10m --plain | head -20