- Changed NetworkName from 'chorus_default' to 'chorus_net' - This matches the actual network 'CHORUS_chorus_net' (service prefix added automatically) - Fixes discovered_count:0 issue - now successfully discovering all 25 agents - Updated IMPLEMENTATION-SUMMARY with deployment status Result: All 25 CHORUS agents now discovered successfully via Docker Swarm API 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
3.5 KiB
Go
104 lines
3.5 KiB
Go
package server
|
|
|
|
// RoleProfile provides persona metadata for a council role so CHORUS agents can
|
|
// load the correct prompt stack after claiming a role.
|
|
type RoleProfile struct {
|
|
RoleName string `json:"role_name"`
|
|
DisplayName string `json:"display_name"`
|
|
PromptKey string `json:"prompt_key"`
|
|
PromptPack string `json:"prompt_pack"`
|
|
Capabilities []string `json:"capabilities,omitempty"`
|
|
BriefRoutingHint string `json:"brief_routing_hint,omitempty"`
|
|
DefaultBriefOwner bool `json:"default_brief_owner,omitempty"`
|
|
}
|
|
|
|
func defaultRoleProfiles() map[string]RoleProfile {
|
|
const promptPack = "chorus/prompts/human-roles.yaml"
|
|
|
|
profiles := map[string]RoleProfile{
|
|
"systems-analyst": {
|
|
RoleName: "systems-analyst",
|
|
DisplayName: "Systems Analyst",
|
|
PromptKey: "systems-analyst",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"requirements-analysis", "ucxl-navigation", "context-curation"},
|
|
BriefRoutingHint: "requirements",
|
|
},
|
|
"senior-software-architect": {
|
|
RoleName: "senior-software-architect",
|
|
DisplayName: "Senior Software Architect",
|
|
PromptKey: "senior-software-architect",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"architecture", "trade-study", "diagramming"},
|
|
BriefRoutingHint: "architecture",
|
|
},
|
|
"tpm": {
|
|
RoleName: "tpm",
|
|
DisplayName: "Technical Program Manager",
|
|
PromptKey: "tpm",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"program-coordination", "risk-tracking", "stakeholder-comm"},
|
|
BriefRoutingHint: "coordination",
|
|
DefaultBriefOwner: true,
|
|
},
|
|
"security-architect": {
|
|
RoleName: "security-architect",
|
|
DisplayName: "Security Architect",
|
|
PromptKey: "security-architect",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"threat-modeling", "compliance", "secure-design"},
|
|
BriefRoutingHint: "security",
|
|
},
|
|
"devex-platform-engineer": {
|
|
RoleName: "devex-platform-engineer",
|
|
DisplayName: "DevEx Platform Engineer",
|
|
PromptKey: "devex-platform-engineer",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"tooling", "developer-experience", "automation"},
|
|
BriefRoutingHint: "platform",
|
|
},
|
|
"qa-test-engineer": {
|
|
RoleName: "qa-test-engineer",
|
|
DisplayName: "QA Test Engineer",
|
|
PromptKey: "qa-test-engineer",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"test-strategy", "automation", "validation"},
|
|
BriefRoutingHint: "quality",
|
|
},
|
|
"sre-observability-lead": {
|
|
RoleName: "sre-observability-lead",
|
|
DisplayName: "SRE Observability Lead",
|
|
PromptKey: "sre-observability-lead",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"observability", "resilience", "slo-management"},
|
|
BriefRoutingHint: "reliability",
|
|
},
|
|
"technical-writer": {
|
|
RoleName: "technical-writer",
|
|
DisplayName: "Technical Writer",
|
|
PromptKey: "technical-writer",
|
|
PromptPack: promptPack,
|
|
Capabilities: []string{"documentation", "knowledge-capture", "ucxl-indexing"},
|
|
BriefRoutingHint: "documentation",
|
|
},
|
|
}
|
|
|
|
return profiles
|
|
}
|
|
|
|
func (s *Server) lookupRoleProfile(roleName, displayName string) RoleProfile {
|
|
if profile, ok := s.roleProfiles[roleName]; ok {
|
|
if displayName != "" {
|
|
profile.DisplayName = displayName
|
|
}
|
|
return profile
|
|
}
|
|
|
|
return RoleProfile{
|
|
RoleName: roleName,
|
|
DisplayName: displayName,
|
|
PromptKey: roleName,
|
|
PromptPack: "chorus/prompts/human-roles.yaml",
|
|
}
|
|
}
|