Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions agents/internal/swarm/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module phoenix/swarm
31 changes: 31 additions & 0 deletions agents/internal/swarm/reputation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package swarm

import (
"sync"
)

type ReputationStore struct {
mu sync.RWMutex
reputation map[string]float64
}

func NewReputationStore() *ReputationStore {
return &ReputationStore{
reputation: make(map[string]float64),
}
}

func (s *ReputationStore) UpdateReputation(nodeID string, delta float64) {
s.mu.Lock()
defer s.mu.Unlock()
s.reputation[nodeID] += delta
if s.reputation[nodeID] < 0 {
s.reputation[nodeID] = 0
}
}

func (s *ReputationStore) GetReputation(nodeID string) float64 {
s.mu.RLock()
defer s.mu.RUnlock()
return s.reputation[nodeID]
}
12 changes: 12 additions & 0 deletions agents/internal/swarm/reputation_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package swarm

import "testing"

func TestReputationStore(t *testing.T) {
store := NewReputationStore()
store.UpdateReputation("node1", 10.0)

if store.GetReputation("node1") != 10.0 {
t.Errorf("Expected 10.0, got %f", store.GetReputation("node1"))
}
}
59 changes: 59 additions & 0 deletions phoenix_os/arbiter/consensus.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package arbiter

import (
"sync"
"time"

"phoenix/agents/internal/swarm"
)
Comment on lines +3 to +8

type Vote struct {
NodeID string
Decision bool
Confidence float64
}

type ConsensusEngine struct {
mu sync.Mutex
reputation *swarm.ReputationStore
votes []Vote
threshold float64
}

func NewConsensusEngine(rep *swarm.ReputationStore, threshold float64) *ConsensusEngine {
return &ConsensusEngine{
reputation: rep,
votes: make([]Vote, 0),
threshold: threshold,
}
}

func (e *ConsensusEngine) SubmitVote(v Vote) {
e.mu.Lock()
defer e.mu.Unlock()
e.votes = append(e.votes, v)
}
Comment on lines +31 to +35

func (e *ConsensusEngine) EvaluateQuorum() bool {
e.mu.Lock()
defer e.mu.Unlock()

var weightedTotal float64
var totalReputation float64

for _, v := range e.votes {
rep := e.reputation.GetReputation(v.NodeID)
if rep == 0 { rep = 1.0 } // Default minimal rep

if v.Decision {
weightedTotal += rep * v.Confidence
}
totalReputation += rep
Comment on lines +48 to +51
}

if totalReputation == 0 {
return false
}

return (weightedTotal / totalReputation) > e.threshold
}
23 changes: 23 additions & 0 deletions phoenix_os/arbiter/consensus_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package arbiter

import (
"phoenix/agents/internal/swarm"
"testing"
)

func TestConsensusEngine(t *testing.T) {
rep := swarm.NewReputationStore()
Comment on lines +4 to +9
rep.UpdateReputation("node1", 10.0) // High trust
rep.UpdateReputation("node2", 1.0) // Low trust

engine := NewConsensusEngine(rep, 0.5)

// High trust node votes true
engine.SubmitVote(Vote{"node1", true, 0.9})
// Low trust node votes false
engine.SubmitVote(Vote{"node2", false, 0.9})

if !engine.EvaluateQuorum() {
t.Error("Expected quorum to be true based on high trust node")
}
}
Comment on lines +8 to +23
2 changes: 0 additions & 2 deletions phoenix_os/arbiter/go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
module phoenix/arbiter

go 1.25.0
Loading