Files
synapbus/internal/trust/model.go
T
Algis DumbrisandClaude Opus 4.6 8df22457ab feat: trust scores, claim semantics, state-change webhooks (011-trust-claims-triggers)
Trust scores: per (agent, action_type) pair, stored in agent_trust
table. Auto-adjusts when human reacts to AI agent messages (approve
+0.05, reject -0.1). Scores clamped [0.0, 1.0]. MCP get_trust action
+ REST API /api/trust/{agent}. Web UI shows trust progress bars on
agent detail pages.

Claim semantics: only one in_progress reaction per message enforced.
First agent to claim wins, duplicates rejected with clear error.

State-change webhooks: StateChangeNotifier interface fires
workflow.state_changed events through existing webhook infrastructure
when reactions change a message's derived workflow state.

Channel thresholds: publish_threshold and approve_threshold fields
on channels for configuring autonomy gates.

Migration 014_trust_claims.sql. 17 new test cases across trust
model + store.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 21:41:54 +02:00

66 lines
1.8 KiB
Go

// Package trust provides agent trust score tracking for graduated autonomy.
package trust
import (
"errors"
"time"
)
// Trust adjustment constants.
const (
ApprovalIncrement = 0.05
RejectionDecrement = 0.10
MinScore = 0.0
MaxScore = 1.0
)
// Common action types (extensible — any string is valid).
const (
ActionResearch = "research"
ActionPublish = "publish"
ActionComment = "comment"
ActionApprove = "approve"
ActionOperate = "operate"
)
// Sentinel errors.
var (
ErrAlreadyClaimed = errors.New("work item already claimed by another agent")
ErrSelfReaction = errors.New("cannot adjust trust for self-reactions")
)
// TrustScore represents an agent's trust level for a specific action type.
type TrustScore struct {
ID int64 `json:"id"`
AgentName string `json:"agent_name"`
ActionType string `json:"action_type"`
Score float64 `json:"score"`
AdjustmentsCount int `json:"adjustments_count"`
LastAdjustedAt *time.Time `json:"last_adjusted_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
// AgentTrustSummary is a map of action_type -> score for an agent.
type AgentTrustSummary map[string]float64
// ClampScore ensures a score stays within [0.0, 1.0].
func ClampScore(score float64) float64 {
if score < MinScore {
return MinScore
}
if score > MaxScore {
return MaxScore
}
return score
}
// WorkflowStateChangeEvent is the webhook payload for state transitions.
type WorkflowStateChangeEvent struct {
MessageID int64 `json:"message_id"`
ChannelID int64 `json:"channel_id,omitempty"`
OldState string `json:"old_state"`
NewState string `json:"new_state"`
TriggeredBy string `json:"triggered_by"`
Reaction string `json:"reaction"`
}