ZFC #10: Polecat self-reports cleanup status
Instead of Go code checking git state to decide if polecat removal is safe, the polecat now self-reports its cleanup_status via its agent bead. Changes: - Add CleanupStatus field to AgentFields struct - Update FormatAgentDescription and ParseAgentFields for cleanup_status - Add UpdateAgentCleanupStatus function to beads package - Update gt done to compute and report git cleanup status - Update RemoveWithOptions to read cleanup_status from agent bead first, falling back to git check for backward compatibility Valid cleanup_status values: - clean: no uncommitted work - has_uncommitted: has uncommitted changes - has_stash: has stashed changes - has_unpushed: has unpushed commits - unknown: git check failed This follows ZFC (Zero Figuring in Code) principles - the polecat is the authority on its own state, not Go code inferring it from external signals. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -227,6 +227,8 @@ func runDone(cmd *cobra.Command, args []string) error {
|
||||
// - COMPLETED → "done"
|
||||
// - ESCALATED → "stuck"
|
||||
// - DEFERRED → "idle"
|
||||
//
|
||||
// Also self-reports cleanup_status for ZFC compliance (#10).
|
||||
func updateAgentStateOnDone(cwd, townRoot, exitType, issueID string) {
|
||||
// Get role context
|
||||
roleInfo, err := GetRoleWithContext(cwd, townRoot)
|
||||
@@ -267,4 +269,37 @@ func updateAgentStateOnDone(cwd, townRoot, exitType, issueID string) {
|
||||
// Silently ignore - beads might not be configured
|
||||
return
|
||||
}
|
||||
|
||||
// ZFC #10: Self-report cleanup status
|
||||
// Compute git state and report so Witness can decide removal safety
|
||||
cleanupStatus := computeCleanupStatus(cwd)
|
||||
if cleanupStatus != "" {
|
||||
if err := bd.UpdateAgentCleanupStatus(agentBeadID, cleanupStatus); err != nil {
|
||||
// Silently ignore
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// computeCleanupStatus checks git state and returns the cleanup status.
|
||||
// Returns the most critical issue: has_unpushed > has_stash > has_uncommitted > clean
|
||||
func computeCleanupStatus(cwd string) string {
|
||||
g := git.NewGit(cwd)
|
||||
status, err := g.CheckUncommittedWork()
|
||||
if err != nil {
|
||||
// If we can't check, report unknown - Witness should be cautious
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
// Check in priority order (most critical first)
|
||||
if status.UnpushedCommits > 0 {
|
||||
return "has_unpushed"
|
||||
}
|
||||
if status.StashCount > 0 {
|
||||
return "has_stash"
|
||||
}
|
||||
if status.HasUncommittedChanges {
|
||||
return "has_uncommitted"
|
||||
}
|
||||
return "clean"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user