Remove embedded molecule management from witness - this logic belongs in molecule definitions (YAML + hooks), not Go code. Removed: - WitnessHandoffState, WorkerState types - Handoff bead management (load/save/ensure) - Patrol instance creation (ensurePatrolInstance) - Polecat arm tracking (ensurePolecatArm, closePolecatArm) - updateWorkerActivity function Simplified: - Nudge tracking now uses only SpawnedIssues (in-memory) - run() no longer loads handoff state or creates patrol instances - healthCheck() no longer manages tracking arms Fixed: - escalateToMayor: bd mail send → gt mail send - ackMessage: bd mail ack → gt mail archive The witness now does its core job (health checks, nudges, escalation, cleanup) without trying to manage molecule state. Molecule tracking should be handled by the molecule system itself via bd mol commands. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
// Package witness provides the polecat monitoring agent.
|
|
package witness
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// State represents the witness's running state.
|
|
type State string
|
|
|
|
const (
|
|
// StateStopped means the witness is not running.
|
|
StateStopped State = "stopped"
|
|
|
|
// StateRunning means the witness is actively monitoring.
|
|
StateRunning State = "running"
|
|
|
|
// StatePaused means the witness is paused (not monitoring).
|
|
StatePaused State = "paused"
|
|
)
|
|
|
|
// Witness represents a rig's polecat monitoring agent.
|
|
type Witness struct {
|
|
// RigName is the rig this witness monitors.
|
|
RigName string `json:"rig_name"`
|
|
|
|
// State is the current running state.
|
|
State State `json:"state"`
|
|
|
|
// PID is the process ID if running in background.
|
|
PID int `json:"pid,omitempty"`
|
|
|
|
// StartedAt is when the witness was started.
|
|
StartedAt *time.Time `json:"started_at,omitempty"`
|
|
|
|
// MonitoredPolecats tracks polecats being monitored.
|
|
MonitoredPolecats []string `json:"monitored_polecats,omitempty"`
|
|
|
|
// LastCheckAt is when the last health check was performed.
|
|
LastCheckAt *time.Time `json:"last_check_at,omitempty"`
|
|
|
|
// Stats contains cumulative statistics.
|
|
Stats WitnessStats `json:"stats"`
|
|
|
|
// Config contains auto-spawn configuration.
|
|
Config WitnessConfig `json:"config"`
|
|
|
|
// SpawnedIssues tracks which issues have been spawned (to avoid duplicates).
|
|
SpawnedIssues []string `json:"spawned_issues,omitempty"`
|
|
}
|
|
|
|
// WitnessConfig contains configuration for the witness.
|
|
type WitnessConfig struct {
|
|
// MaxWorkers is the maximum number of concurrent polecats (default: 4).
|
|
MaxWorkers int `json:"max_workers"`
|
|
|
|
// SpawnDelayMs is the delay between spawns in milliseconds (default: 5000).
|
|
SpawnDelayMs int `json:"spawn_delay_ms"`
|
|
|
|
// AutoSpawn enables automatic spawning for ready issues (default: true).
|
|
AutoSpawn bool `json:"auto_spawn"`
|
|
|
|
// EpicID limits spawning to children of this epic (optional).
|
|
EpicID string `json:"epic_id,omitempty"`
|
|
|
|
// IssuePrefix limits spawning to issues with this prefix (optional).
|
|
IssuePrefix string `json:"issue_prefix,omitempty"`
|
|
}
|
|
|
|
// WitnessStats contains cumulative witness statistics.
|
|
type WitnessStats struct {
|
|
// TotalChecks is the total number of health checks performed.
|
|
TotalChecks int `json:"total_checks"`
|
|
|
|
// TotalNudges is the total number of nudges sent to polecats.
|
|
TotalNudges int `json:"total_nudges"`
|
|
|
|
// TotalEscalations is the total number of escalations to mayor.
|
|
TotalEscalations int `json:"total_escalations"`
|
|
|
|
// TodayChecks is the number of checks today.
|
|
TodayChecks int `json:"today_checks"`
|
|
|
|
// TodayNudges is the number of nudges today.
|
|
TodayNudges int `json:"today_nudges"`
|
|
}
|
|
|