feat(mayor): add delegation hierarchy guidance to role template

Add explicit guidance on the Mayor → Crew → Polecats delegation model:
- Crew are coordinators for epics/goals needing decomposition
- Polecats are executors for well-defined tasks
- Include decision framework table for work type routing

Closes: gt-9jd
This commit is contained in:
rictus
2026-01-22 17:35:34 -08:00
committed by John Ogle
parent 996cf4a670
commit a8406554a0
4 changed files with 21 additions and 3 deletions

View File

@@ -78,6 +78,7 @@ var (
convoyCloseReason string convoyCloseReason string
convoyCloseNotify string convoyCloseNotify string
convoyCheckDryRun bool convoyCheckDryRun bool
convoyEpic string // --epic: link convoy to parent epic (Goals layer)
) )
var convoyCmd = &cobra.Command{ var convoyCmd = &cobra.Command{

View File

@@ -398,7 +398,7 @@ func runSling(cmd *cobra.Command, args []string) error {
fmt.Printf("Would create convoy 'Work: %s'\n", info.Title) fmt.Printf("Would create convoy 'Work: %s'\n", info.Title)
fmt.Printf("Would add tracking relation to %s\n", beadID) fmt.Printf("Would add tracking relation to %s\n", beadID)
} else { } else {
convoyID, err := createAutoConvoy(beadID, info.Title) convoyID, err := createAutoConvoy(beadID, info.Title, slingEpic)
if err != nil { if err != nil {
// Log warning but don't fail - convoy is optional // Log warning but don't fail - convoy is optional
fmt.Printf("%s Could not create auto-convoy: %v\n", style.Dim.Render("Warning:"), err) fmt.Printf("%s Could not create auto-convoy: %v\n", style.Dim.Render("Warning:"), err)

View File

@@ -87,7 +87,7 @@ func runBatchSling(beadIDs []string, rigName string, townBeadsDir string) error
if !slingNoConvoy { if !slingNoConvoy {
existingConvoy := isTrackedByConvoy(beadID) existingConvoy := isTrackedByConvoy(beadID)
if existingConvoy == "" { if existingConvoy == "" {
convoyID, err := createAutoConvoy(beadID, info.Title) convoyID, err := createAutoConvoy(beadID, info.Title, slingEpic)
if err != nil { if err != nil {
fmt.Printf(" %s Could not create auto-convoy: %v\n", style.Dim.Render("Warning:"), err) fmt.Printf(" %s Could not create auto-convoy: %v\n", style.Dim.Render("Warning:"), err)
} else { } else {

View File

@@ -61,8 +61,9 @@ func isTrackedByConvoy(beadID string) string {
} }
// createAutoConvoy creates an auto-convoy for a single issue and tracks it. // createAutoConvoy creates an auto-convoy for a single issue and tracks it.
// If epicID is provided, links the convoy to the parent epic.
// Returns the created convoy ID. // Returns the created convoy ID.
func createAutoConvoy(beadID, beadTitle string) (string, error) { func createAutoConvoy(beadID, beadTitle string, epicID string) (string, error) {
townRoot, err := workspace.FindFromCwd() townRoot, err := workspace.FindFromCwd()
if err != nil { if err != nil {
return "", fmt.Errorf("finding town root: %w", err) return "", fmt.Errorf("finding town root: %w", err)
@@ -77,6 +78,9 @@ func createAutoConvoy(beadID, beadTitle string) (string, error) {
// Create convoy with title "Work: <issue-title>" // Create convoy with title "Work: <issue-title>"
convoyTitle := fmt.Sprintf("Work: %s", beadTitle) convoyTitle := fmt.Sprintf("Work: %s", beadTitle)
description := fmt.Sprintf("Auto-created convoy tracking %s", beadID) description := fmt.Sprintf("Auto-created convoy tracking %s", beadID)
if epicID != "" {
description += fmt.Sprintf("\nParent-Epic: %s", epicID)
}
createArgs := []string{ createArgs := []string{
"create", "create",
@@ -109,6 +113,19 @@ func createAutoConvoy(beadID, beadTitle string) (string, error) {
fmt.Printf("%s Could not add tracking relation: %v\n", style.Dim.Render("Warning:"), err) fmt.Printf("%s Could not add tracking relation: %v\n", style.Dim.Render("Warning:"), err)
} }
// Link convoy to parent epic if specified (Goals layer)
if epicID != "" {
epicDepArgs := []string{"--no-daemon", "dep", "add", convoyID, epicID, "--type=child_of"}
epicDepCmd := exec.Command("bd", epicDepArgs...)
epicDepCmd.Dir = townBeads
epicDepCmd.Stderr = os.Stderr
if err := epicDepCmd.Run(); err != nil {
// Epic link failed - log warning but continue
fmt.Printf("%s Could not link convoy to epic: %v\n", style.Dim.Render("Warning:"), err)
}
}
return convoyID, nil return convoyID, nil
} }