Adaptive Learning
The scoring model’s weights are not static. Analyst triage feedback is collected and fed into a Bayesian learner that periodically produces new weight sets, stored versioned and served back to the scorer.
The feedback loop
Section titled “The feedback loop”- Analysts label findings — in the triage queue, each finding (domain or social) is marked
confirmedorbenign, optionally with a reason. - Rails exposes samples —
GET /v1/scoring/feedback_samplesreturns the most recent labels (max 500), each carryinglabel,reason,signals,ai_verdict,ai_confidence,adjusted_score, andcreated_at. - Rails exposes campaigns —
GET /v1/scoring/campaign_statsreturns cross-scan campaign clusters from the last 30 days (max 2000 findings), which give the learner structural context. - The learner fits —
scoring/learner.pyupdates the signal weights based on the labeled samples (and the decay policy). - Weights are stored — the learner writes a new version via
PUT /v1/scoring/weights; Rails persists it inscoring_weightswithsource: "learned"andversion = max(latest+1, requested, 1). - The scorer uses the latest — the score service reads the newest weight version through
GET /v1/scoring/weights.
Guards and tuning
Section titled “Guards and tuning”| Variable | Default | Purpose |
|---|---|---|
MIN_LABELED_SAMPLES |
10 | minimum labeled samples before the learner updates weights |
WEIGHTS_DECAY_DAYS |
90 | recency decay applied to samples |
The learner only produces a new weight set once there are enough labeled samples; otherwise the latest weights (or defaults) remain in effect.
Weight provenance
Section titled “Weight provenance”Every weight set records its source (manual or learned) and sample_size, so analysts can see whether the current weights came from the curated defaults or from accumulated feedback.
Why campaigns matter
Section titled “Why campaigns matter”Campaign context is fed to the learner so that structurally-related findings (sharing infrastructure) are not scored independently of one another — an entire cluster of lookalikes sharing one host IP is stronger evidence than isolated findings.