PatternFolio · Monitor · Methodology

How scoring, ranking, and breach priority work

The math behind PatternFolio: vertical tier weights feed breach priority, the ICCAN similarity score is bucketed into one of four actions, and the monitor dashboard sorts every fired alert by a single priority_score.

Read Monitor overview → Open the dashboard →
Section 01

Scoring verticals

Each subscription tier contributes a fixed weight to the breach-priority formula. Enterprise is the highest; the free tier is the floor. The same weights power both the alert feed sort order and the priority rank badges on the dashboard.

TierWeightNotes
Enterprise8Daily cadence, unlimited competitors
Funnel7Pre-Monitor sales-pipeline tier
Pro5Bi-weekly cadence, 25 competitors
Starter3Weekly cadence, 5 competitors
Free1One-off Scan, no scheduled cadence
Worked example. A Pro-tier subscription contributes weight 5 to the breach priority for any of its monitored competitors — regardless of whether the competitor is set to daily, weekly, or bi-weekly cadence. The cadence term is scored separately.

The Monitor overview page has the full pricing breakdown — see the Free / Starter / Pro / Enterprise comparison.

Section 02

Ranking audits into actions

The ICCAN scorer returns a similarity percentage between 0 and 100. That score is bucketed into one of four actions using the thresholds in lib/iccan-scorer.js. The same action then feeds the breach priority formula.

ActionWeightScore band
CLEAR00 ≤ similarity < 50
REVIEW850 ≤ similarity < 75
FLAG1575 ≤ similarity < 90
REJECT2090 ≤ similarity ≤ 100
Worked example. A scan with similarity_pct = 87 lands in the FLAG band (75 – 90) and contributes weight 15 to that audit's breach priority. The same audit at similarity_pct = 92 would be REJECT (weight 20).

Cadence, alerts, and how the dashboard uses these bands live in the Monitor FAQ and in the Monitor + canvas + audit feed post.

Section 03

Computing breach priority

Every fired monitoring_alert row carries a single priority_score. The dashboard sorts the Alert Timeline feed by this number, descending, so the most urgent breach always surfaces at the top.

The formula is a weighted blend of seven terms:

priority_score = severity + action + direction + similarity_magnitude
              + tier_weight + cadence_weight + recency_boost
recency_boost  = 30 / (1 + age_days)
Worked example. A breach fires with change_pct = 22.3, action = reject, direction = increased, similarity_new = 87.4, subscription tier pro, competitor cadence weekly, age_days = 0:
sev = 22.30, act = 20, dir = 6, simMag = 17.48, tier = 5, cadence = 1, recency = 30
priority_score = 101.78 — sorted to the top of the dashboard feed.

The canonical formula lives in db/monitoring_alerts.js — the migration 1801000000_monitor_alerts_priority_score.sql backfills existing rows with the same expression, so legacy and new alerts sort consistently.

Section 04

Where this math shows up

The same priority_score drives three surfaces in the app. If a number on one of these pages changes, this is where to look first.