Back to "Серія випуску StyloBot: Начитися швидше"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

ASP.NET Bot Detection Machine Learning Performance StyloBot

Серія випуску StyloBot: Начитися швидше

Wednesday, 13 May 2026

Підніміть голову: МСК0 , це для ботанів. МСК1 . МСК2 - глибоке технічне занурення в систему адаптивного навчання StyloBot, МSK3. МSK4 - оновлення EWMA, , - пороги гістерези, МСК6 - конфігурація вердикту, МСК7 - спостерігачі за змінами, М СК8 - справжній код з Mostlylucid.BotDetection і вказівники на еквівалентну машину-learning створює так, що читачі МЛ мають вхідну точкуМSK1 Якщо ви хочете піднятися на ліфтуM SK2 прочитати попередні статті про реліз. Якщо Ви хочете знати, як пам 'ять чотирьох рівнівMSC4 перетворює повторюваний рух у суб' язокMSК5мілісекундні рішення, в той час як вони все ще приwracaються від хибних позитивних речейMСК6 читати наМСК7

Проект

Це проект релізу StyloBot.

Серія випуску StyloBot

  1. Подібність, Не ідентичність - чому StyloBot моделює клієнтів поведінково
  2. Подібність-Усвідомлення ASP.NET UI - сервер - віддав поверхню над результатом виявлення
  3. Винайти та виправити безмежний ріст у довгостроковій-Running M SK1NET Services - - дисципліна надійності, яка робить двигун нудним в процесі виробництва
  4. Подібність-Усвідомлення інтерфейсу TypScript - Express , Fastify, і компоненти браузера
  5. Архітектура Sidecar - як реагуючий двигун підключається до не МSK1NET стеків
  6. Навчитися швидше - адаптивна система навчання , чотири МSK2 пам 'ять на рівні M SK3 і кэш вердикта
  7. Випробовуємо те, що не зупиняє нас - контрольна дисципліна : один БДФ файл керує регресією МSK2 завантаженням МСК3 та калібрацією
  8. StyloExtract - локальний інтерфейс навчання HTML для конвертера Markdown - HTML → Марка-даун, який поєднується з детектором МSK2 walker bug lucidVIEW caught МSK3 and the dogfood loop that made it honest

Модель поведінки Подібність, Не ідентичність; дисципліна надійності в Винайти та виправити безмежний ріст; джерело на github.comM SK1scottgal/stylobot.


Чому StyloBot цим займається?

Все, що робить StyloBot - це розказувати людям від роботів: МСК1 , і як він це робить на найпростішому рівні - це створювати картину того, як виглядає середній робот і як виглядає пересічна людина. МСК2 . Не визначені правила. МSK3 . Немає регекса над користувачам. ММК4 . Стрини агентів. ММСК5 . Подібні до поведінки центроиди у просторі вектора розміром МСК6 . ММСк7 . Один на кластер з клієнтами, які рухаються однаково. MМСК8 . Кожна спостерега або підтверджує існуючий центроід, або приштовхує його місцезнаходження. Точность покращується першими; затримка покращується в результатіM SK1 (Цель кластерування Подібність, Не ідентичність; це пост про те, що відбувається з центроїдами, коли ви їх маєте .)

Цей механізм також робить StyloBot доступним для використання в нерозбірливо різних місцях.:, особистий блог на 50, запити, /, хвилина, МSK3, веб-сайт маркетингу, який вибухає під час запуску продукту.M SK4, SPA, де більшість трафику - це API дзвінки.,, e-commerce, де один помилковий позитивний результат на платіжному покупці - це справжній втратив гроші.МSK7, портал контенту, де traffic автоматизований, але люди все ще потребують чистої дороги через .. Цей самий двигун закінчується різними центроидими на різних сайтах, тому що він бачить різні потоки. МSK11, спосіб їх будування є таким же всюди.

Детектор, який запускає повну лінію потоку на кожному запиті, є досконалім, але не економічним. Дететор, що сліпо зберігає вердикти, швидкий, але ламкийM SK1 Стілобота сидить між цими двома : Cache - це поширена ситуація МSK3 повна лінія потоку - це шлях відновлення .

Для контексту проти більш знайомих імен у цьому просторі:

МSK0 Местонаходження Типове на МSK3заказові витрати MSК4 Що ви отримуєте назад МСК5
Cloudflare Bot Management Edge МSK2their CDN МSK3 Sub МСК5 Millisecond at edge СМСК6 Block СМСК7 challenge SМСК8 allow before your origin sees it MSК9
CHEQ МSK1 DataDome Server МSK3 side API callout МSK4 ~50-150 ms ♫ network round ♫ МSK7 trip ♫
StyloBot ВM SK2 процесі або локальному sidecar gRPC МSK3 ~10-50 μs нагріто через Skip, 400-900 μs для запуску повного швидкого-шляхового трубопроводу M SK1 Задрукований вердикт МSK2BotProbability, Confidence, RiskBand, ThreatScore) безпосередньо у вашому операторі

"блокування перед початком МSK1 те, що вони не можуть зробити - це дати вашій програмі шанс на просування, і дозволити вашій скриньці вирішити, що робити з нею МSK3 API-продукти роблять це , але ви платите за модем підключення до мережі на кожен запит \ . StyloBot - це той випадок, коли вирок є в \ МSK6 \ процес , \ модом підключения до мережі не існує ♪ ' \ не існує, ♪ МSK9 \ і теплий шлях швидший, ніж один чи інший порядок величини \МSK10 \

Лівер, який робить кэш безпечним policy-perM SK1surface. Cache вироку керується SignatureCacheOptions записувати, що ' встановлений за МSK1 політику МSK2 таким чином, щоб кінцевий пункт адміністратора міг вимагати 0.95 довіри і ♫ 60- секундного вікна свіжості, в той час як канал контенту приймає \ 0.7 довері протягом години . той самий код | , | різні кнопки | МSK8 | без вигинів |. | те, що makes the same engine deployable as ASP.NET, як Автомобіль gRPC, або вM SK1за допомогою плагина Caddy

Решта цієї статті - це механізми, які роблять Cache безпечним: EWMA aktualiзації, пороги гістерезиM SK2 Caching вердикту , відрізання зразківMSC4 і спостерігачі за варіаційамиМSK5 Номер заголовку - затримка МSK6 Справжня проблема дизайну - це навчання, не роблячи старих помилок постійними

Метастабельний відбиток пальців

Все, що під ним прикріпляється до "пальцевого відбитка ", тож це МSK2 варто бути точним щодо того, що це значить тут МСК3 У StyloBot пальці - це не одне поле MСК4 Це М СК5 є місцем в вимірній поведінковій векторній просторі з Подібність, Не ідентичність, малюнок на TLS МSK1 порядок заголовків МSK2 тайминг , послідовність маршруту поведінка змінити: іншу послідовність маршрутуM SK1 іншу каденцію, новий спосіб недосконалої перевірки .

Це робить відбитки пальців метастабільний: достатньо стабільний, щоб актор міг залишатися впізнаваним протягом короткого часу - тривалий рух ідентичності МSK2 достатньо еволюціонуючий, щоб справжня зміна поведінки з 'явилась як рух точки MSC3 Не фіксована ідентичність M SK4 не випадковий шум . Повільний MSV6 рухающийся підпис з структурою M SV7

Це така властивість, на якій базується вся система навчання. . Якби відбитки пальців були шумними, ♫ ( ♫ кожна просьба приземлялася десь випадково ♫ МSK2 ♫ Оцінка EWMA нічого не острибувала б і Cache завжди був би неправильним ♫МSK3 ♫ Якби вони були жорсткими ♫( ♫ положення ніколи не рухалось ♫ і дрейф можна виявити, тому що реальні зміни з 'являються як рух на інших стабільних фонах.

Структурний аргумент для того, чому ця властивість має (люди шумні, але послідовні у структурі , боти послідовні, але неправильні в структурі Подібність, Не ідентичність, і якщо будь-яке з геометрії тут не ясно, що МSK1 це стаття, яку треба читати першими МSK2 Все, що йде далі в цьому пості, це те, що ви можете зробити раз що твердження в руках

Теза Detection should get better and cheaper the more you see

Кожна спостерега робить дві речі: : вона остриблює центроід, цей отвір належить до ( точності МSK2 і підвищує впевненість системи МSK3 у тому, що цей отріз поводиться так само, як центроид. " \ "( розташування \ ', ' , що дає можливість швидкості `). \ ́ Те, що складно для адаптивного детектора - це те, що робиться одночасно, не дозволяючи старим помилкам стати постійними

Робот-детектор питається однаково дорогого питання мільйони разів на день чи цей актор все ще поводиться так, як ми вже дізналися - це було "?". Для більшої частини таких запитів – МСК0 – система вже має свою думку – МSK1 – вона бачила один і той самий відбиток пальця TLS, МSK2 – один і такий порядок заголовків, МСК3 – один й той самій користувача, MСК4 – модель ротації агента, М СК5 – той самі IP сусідства десять хвилин тому – М С К 6 – і дійшла висновку bot, 0.93. Не має сенсу знову запускати повну трубку детектора на тому ж акторі, якщо щось не змінилося

Система навчання StyloBot побудована на цій ідеї: ".". Трубопровод працює повно, коли йому потрібно. будує та покращує центроиди в першу чергу. Коли труба не працюєMSC1не працюєМSK2 попередній розміщування повторюється під контролованими умовамиM SK3 прохання задовольняється в мікросекунди, і його обслуговування все ще нагоджує довгуMST5 оперативну пам ’ ять, так що центроиди залишаються теперішнімиMSP6

МЛ натомість. Це адаптивні обчислення в нейронних мережах (eM SK1g. ранні- вихідні мережі, Смішка МSK1 з- Працівники збираються ): дешевий класифікатор спочатку M SK4 дорогий класификатор тільки тоді, коли дешевий один МСК5 рівень довіри є низьким MСК6 Трубопровод детектора - це дорогий шлях висновків М СК7 кожен cache для пальцевого відбитку - це дешевий M СК9 ми вже вивчали цей шлях М S К 10 шлях М С К 11

Чотири рівні пам 'яті

Навчання в StyloBot порівнюється таким чином, що кожен рівень відповідає різному тривалості життя:

  1. Швидкий-путна репутація МSK1instantM SK2 Короткий список моделей, класифікованих як ConfirmedBad в PatternReputation зберігати. Прохання, яке відповідає одному з них, перекидає канал у пріоритеті M SK1 перед запуском будь-якого іншого детектора . Вхід вимагає балу МSK3 МSK4 і підтримки
  2. Внутрішній -чорна доска для запиту МSK1в часі МSK2за запитом M,мілісекунд МСК4 Детектори пишуть сигнали до спільного BlackboardState.Signals вмикатись під час запиту; пізніше детектори читають ці сигналиM SK1 Це не ' не довгий МSK3 довготривалий пам 'ятьМSK4 це ' те, як детекторі MSC6 координуються в рамках одного запиту без того, щоб кожен з них повинен відраховувати характеристики, які вже були видобувані
  3. Inter-запрос репутації M SK1мин. до днів). Pattern-уровень пам 'ятіM SK1 InMemoryPatternReputationCache відслідковує кожен з них. ReputationState (NeutralSuspectConfirmedBad, плюс ConfirmedGood, ManuallyBlocked, ManuallyAllowed) з асимметричними порогами підвищення та відходу
  4. За секунду -цифровий таємник вироків від пальців МSK1 MinuтиM SK2 Per-акторна пам ’ ятьM SK1 віконце скольження наживо в SignatureCoordinator carry each observed fingerprint's running posterior SignatureVerdictGate.DecideAsync читає це на кожному запиті.

Уровни 1 короткі - об 'єднують трубу МSK2 Уровни "2" співвідносяться до неї \ . \ Уровни 3 - довга пам' ять, яка виживає протягом декількох днів \ МSK6 \ уровни « МSK7 » - коротка пам 'ять, що дозволяє повторювати рух і повністю пропустити трубу

flowchart LR
    classDef input fill:none,stroke:#3b82f6,stroke-width:2px
    classDef fast fill:none,stroke:#22c55e,stroke-width:2px
    classDef async fill:none,stroke:#a855f7,stroke-width:2px
    classDef store fill:none,stroke:#f59e0b,stroke-width:2px

    REQ["Incoming request<br\>(TLS fingerprint, headers, IP)"]:::input
    T1["Tier 1 · Fast-path reputation<br\>ConfirmedBad list<br\>priority 3, pre-pipeline"]:::fast
    T2["Tier 2 · Intra-request blackboard<br\>BlackboardState.Signals<br\>lifetime: one request"]:::async
    T3[("Tier 3 · PatternReputation<br\>EWMA + state machine<br\>lifetime: minutes to days")]:::store
    T4[("Tier 4 · SignatureCoordinator<br\>sliding window<br\>lifetime: minutes")]:::store
    PIPE["Detector pipeline<br\>(BlackboardOrchestrator)"]:::async
    OUT["Verdict"]:::fast

    REQ --> T1
    T1 -->|match| OUT
    T1 -->|no match| T4
    T4 -->|Skip| OUT
    T4 -->|Miss / Bias / Watchdog| PIPE
    PIPE <--> T2
    PIPE <--> T3
    PIPE --> T4
    PIPE --> OUT

EWMA: як система забуває

Кожна цифрова пам ’ ять у системі використовує те ж правило налаштування, в Helpers/Ewma.cs:

public static class Ewma
{
    /// <summary>new = (1 - alpha) * previous + alpha * observation</summary>

    public static double Update(double previous, double observation, double alpha)
        => (1.0 - alpha) * previous + alpha * observation;
}

Це все. alpha вагу на новому спостереження; 1 - alpha інерція минулого. Гостріша альфа МSK1 швидша реакція на останні спостереженняM SK2 альфа

Репутація шаблону використовує його безпосередньо. Від PatternReputationUpdater.ApplyEvidence:

// EMA update: alpha clamped to [0,1] preserves EMA semantics (alpha > 1 inverts
// the old score contribution).
var alpha = Math.Min(_options.LearningRate * evidenceWeight, 1.0);
var newScore = Ewma.Update(decayed.BotScore, label, alpha);

LearningRate дефтекс до 0.1,, тож одна спостерега рухає бал за 10% від відхилення до цієї спостерегації МSK2 Інша МSK3 є тим, що ця модель робила впродовж історії

МЛ натомість. EWMA = класична експоненціальний середній рух що з 'являється в Адам (the β₁, β₂ акумулятори швидкості та варіації), в Середня показника поліак, в пакетіNorm running mean /varianceM SK2 in Обновлення значення TD(0) (V ← V + α(r + γV' - V)). α = 0.1 тут у тому ж діапазоні, що ви бачите для буферів імпульсу

Ми вибрали цю версію над очевидним, але неправильним варіантом зберігання максимальної ймовірності, яку коли-небудь спостерігали. МСК2 Максимальний розмір - з історії дасть змогу одному 0.95 шпику встановлювати шаблон у МSK6 назавжди. МSK7, незалежно від того, як він поводиться після цього. . EWMA магазин має протилежну властивість: МSK9, МSK10 , а потім сотні доброякісних спостережень плавно повертаються назад до доброякіснего.

Розпад розширюється до самих моделей. ReputationOptions (погані дані з кодуM SK1

public double ScoreDecayTauHours { get; set; } = 3;             // generic
public double SupportDecayTauHours { get; set; } = 6;
public double ConfirmedBadScoreDecayTauHours { get; set; } = 12; // ConfirmedBad
public double ConfirmedBadSupportDecayTauHours { get; set; } = 24;
public int GcEligibleDays { get; set; } = 90;

Модель, яку не бачили за день, втратила більшу частину свого підтримки, модель, яка не бачила за ' за 3 дні і повернулася до Neutral це сміття-собраноM SK1 ConfirmedBad patterns get a longer tau (they earned their status through strong evidence and shouldn 't lose it on a single quiet hourM SK2 Memory that does notMSC3t decay drifts away from reality.

МЛ натомість. Результат: -розпад МSK1наперед МSK2перший крок - перший -середній порядок ОрнштайнМSK0Уленбек форма МСК0 без нових доказів МSK1 бал повертається назад до попереднього на швидкості 1/τ.

Гістереза вбудована у стан. ReputationOptions:

МSK0 Перехід Проміжок балів МSK2 Промижок підтримки
Neutral → Suspect ≥ 0.6 ≥ 10
Suspect → ConfirmedBad ≥ 0.9 ≥ 50
Suspect → Neutral МSK0 ≤ ♫ ♫ МSK2 ♫
ConfirmedBad → Suspect МSK0 ≤ ♫ ♫ 0.5 ♫
Neutral → ConfirmedGood ≤ 0.1 ≥ 100
stateDiagram-v2
    direction LR
    [*] --> Neutral
    Neutral --> Suspect : score &ge; 0.6<br/>support &ge; 10
    Suspect --> ConfirmedBad : score &ge; 0.9<br/>support &ge; 50
    Suspect --> Neutral : score &le; 0.4
    ConfirmedBad --> Suspect : score &le; 0.5<br/>(support &ge; 100 OR<br/>support &lt; 50)
    Neutral --> ConfirmedGood : score &le; 0.1<br/>support &ge; 100
    ConfirmedBad --> [*] : 90 days unseen<br/>+ neutral + low support
    Neutral --> [*] : 90 days unseen<br/>+ low support

    note left of ConfirmedBad
        Fast-path eligible
        (Tier 1 short-circuit)
    end note
    note right of Neutral
        Promote at score 0.9 / sup 50
        Demote at score 0.5 / sup 100
        Wider gap = oscillation-resistant
    end note

Різниця 0.4- між проміжку для стимулювання (0.9) і проміжок для демоті МSK2 для ConfirmedBad є навмисно: це ' є осцилляцією МSK2 стисковую стрічку M SK3 будь-що, що перевертається між МСК4 і MСК5 залишається Suspect; лише підтвердzone докази в одному напрямку перетинають кордон

МЛ натомість. Це Триггер ШміттаМSK0 ширше- більше, ніж МSK2 симетрічні пороги для стаціонарних транзиційMSC3 аналог ML є дискретнимM SK4окремленням прийняття рішень навколо будь-якого постійного класифікатора, де ви не хочете, щоб ярлики перевертали кожну партію: думайте про те, як голоси в ансамблі зазвичай порівнюються з маржиновим обов 'язком , або як системи тревоги відкидають MST8 тільки сторінки, якщо умова триває N хвилинM ST9 Це також причина того, чому операційні точки в точностіM st11 кривая зворотнього зв' язку підлаштована на один адресMst12 напрямокM St13

швидкість, яку ви маєте заробити в кэші вердикта

Перетягування пер- відбитком пальців є шаром, з яким hot path звертається до запиту зараз безпосередньо SignatureVerdictGate.DecideAsync і це маленька цифра

public async Task<GateDecision> DecideAsync(
    string? signature, SignatureCacheOptions options, CancellationToken ct = default)
{
    if (!options.Enabled || string.IsNullOrEmpty(signature))
        return new GateDecision(GateAction.Miss, null);

    var verdict = await _coordinator.TryGetVerdictAsync(signature, ct);
    if (verdict is null)
        return new GateDecision(GateAction.Miss, null);

    if (verdict.Confidence < options.BiasMinConfidence)
        return new GateDecision(GateAction.Miss, verdict);          // too noisy

    var ageSeconds = (DateTime.UtcNow - verdict.LastSeenUtc).TotalSeconds;

    var skipEligible =
        verdict.Confidence >= options.SkipMinConfidence
        && ageSeconds <= options.SkipMaxAgeSeconds;

    if (skipEligible && !ShouldRefresh(signature, options.SkipSamplingRate))
        return new GateDecision(GateAction.Skip, verdict);          // cache hit

    var biasEligible = ageSeconds <= options.BiasMaxAgeSeconds;
    return new GateDecision(biasEligible ? GateAction.Bias : GateAction.Miss, verdict);
}

Перероги політики на "-" від SignatureCacheOptions (погані дані показаніM SK1

public double SkipMinConfidence { get; init; } = 0.85;
public int    SkipMaxAgeSeconds { get; init; } = 300;        // 5 min
public double BiasMinConfidence { get; init; } = 0.30;
public int    BiasMaxAgeSeconds { get; init; } = 86_400;     // 24 h
public double SkipSamplingRate  { get; init; } = 0.05;       // 5 %

Довіра сама по собі SignatureCoordinator.TryGetVerdictAsync з розміру зразка, з повною впевненістю в спостереженнях за M SK1 і лінійним спуском нижче МSK2

var confidence = Math.Min(1.0, behavior.RequestCount / 10.0);

Отже, SkipMinConfidence = 0.85 означає, що відбиток пальця потребує ~9 спостережень у теперішньому вікні перед тим, як він може бути перетнутим - पात्रим МSK2 Poniżej цього МSK3 порт надає перевагу упередженості

Чотири заходи:

  • Miss. Ніяких корисних записів для цього відбитка пальців, або одного старшого за BiasMaxAgeSeconds. Рухає повна трубка детектора . Результат запускає вікно слизування на наступний раз
  • Упередженість. Існує запис з середньою впевненістю МСК0 або він МSK1 трішки застарілий . Трубопровод працює МСК3 але прихований вирок ін 'єкціонується як хвиля ММСК4 попередній внесок МПСК5 Позалежний тягається до попереднього у пропорції до попередньої впевниності та лінійної старості МНСК6
  • По Skip. Цей запис є останнім, і достатньо впевнений, що дохід від трубопроводу буде маргіальним.
  • Собачий-tripM SK1 Пройти- піддатний кэш hit, але регулювальник розбіжностей виявив щось нетипічнеM SK2 зашифрований вирок неważний для цього запиту ; труба запускається свіжими МSK4
flowchart TD
    classDef input fill:none,stroke:#3b82f6,stroke-width:2px
    classDef decision fill:none,stroke:#f59e0b,stroke-width:2px
    classDef fast fill:none,stroke:#22c55e,stroke-width:2px
    classDef slow fill:none,stroke:#a855f7,stroke-width:2px
    classDef trip fill:none,stroke:#ef4444,stroke-width:2px

    REQ["Request arrives"]:::input --> LOOKUP{"TryGetVerdictAsync<br\>(sliding window<br\>+ family fallback)"}:::decision
    LOOKUP -->|"null OR low-conf OR stale"| MISS["MISS<br\>full pipeline"]:::slow
    LOOKUP -->|"record found"| CONF{"conf ≥ 0.85<br\>+ age ≤ 300s?"}:::decision
    CONF -->|"no"| BIAS["BIAS<br\>pipeline + prior contribution"]:::slow
    CONF -->|"yes"| REFRESH{"In 5% refresh<br\>(hash bucket)?"}:::decision
    REFRESH -->|"yes"| BIAS
    REFRESH -->|"no"| WD{"VarianceWatchdog<br\>OK?"}:::decision
    WD -->|"tripped"| TRIP["WATCHDOG-TRIP<br\>X-StyloBot-VerdictSource = pipeline<br\>X-StyloBot-WatchdogTrip = reason"]:::trip
    WD -->|"ok"| SKIP["SKIP<br\>X-StyloBot-VerdictSource = cache<br\>orchestrator bypassed"]:::fast

    MISS --> UPDATE[("Update sliding window<br\>+ RecordObservation")]:::slow
    BIAS --> UPDATE
    TRIP --> UPDATE
    SKIP --> UPDATE

Посередник випускає X-StyloBot-VerdictSource (cache або pipeline) і X-StyloBot-WatchdogTrip (резонний рядок, коли це применимоM SK1 на відгукі, щоб оператори могли бачити в реальному часі, який шлях взяла кожна просьба

Скип - це те, що трапляється, коли немає нічого нового для вивчення. МСК0 Як тільки відбиток пальця побачили з достатньою впевненістю у будь-якому напрямку. МСК1 ворота є напрямком. \ - \ агностичний \ МСК3 \ так точно. ♪ МСК4 \ людина і точно \ мСК5 \ роботи однаково піддатні для цього. | МСК6 \ кожен наступний запит коштує лише пошуком ворот \ , \ запису спостереження , \ та політичному налагодженню.

Мережа вироку як внесок, не рішення

Перед тим, як перейти до механіки відновлення – МСК0 – кадри, які роблять їх послідовними – МSK1 – прихований verdikт не є накопиченим відповіддю, яку система слепо переробляє – . – На шляху упередженості він – ММК3 – вживається як хвиля – ММСК4 вклад, підрахунку за довірою та віком FingerprintPriorContributor.ContributeAsync це весь механізм

var horizon = AgeDecayHorizon;                                 // default 86,400s
var decay = horizon > 0.0 ? Math.Max(0.0, 1.0 - age / horizon) : 1.0;
var effectiveWeight = conf * WeightMultiplier * decay;

if (effectiveWeight <= 0.0) return _emptyResult;

var delta = 2.0 * (prob - 0.5);   // map [0,1] probability to [-1,+1] confidence delta

var contribution = new DetectionContribution
{
    DetectorName = DetectorName,
    Category = DetectorName,
    ConfidenceDelta = delta,
    Weight = effectiveWeight,
    Reason = $"Cached fingerprint verdict (prob={prob:F2}, conf={conf:F2}, age={age:F0}s)"
};

30-секундиM SK1старіший вердикт з впевненістю МSK2 міцно закріплює задню частину МSK3ефективну вагу ≈ ♫ ♫ МSK5 ♫ × ♫

МЛ натомість. Це дійсно Байесіан: попередній МSK1 зашифрований вердикт МSK2 × ймовірність decay = 1 - age/horizon термін відіграє ту ж роль, що і забувальний фактор в Рекурсивна Беєсова оцінка; старі попередники втрачають силу, тож ймовірність домінує, так як попередні віки . Це МSK2 це також причина, чому на панелі показано RequestContributionDelta ( зміна цього запиту, зроблена на забігаючий posterior) замість сирого perM SK2мощності запросу : наキャッシュованих вердикціяхMSC4мочність запросу perМSK5в основному є попереднім мовленнямMSL6 і delta це частина, яка насправді містить нову інформацію

Як неправильні позитиви не з 'єднуються

До цього моменту система звучить небезпечно Cache -heavy , так що ця частина є важливою МSK2 як дизайн припускає, що заキャッシュовані вердикти в кінцевому підсумку хибні МSK3 і як дешево він помічає та відбирає, коли вони хибни мSK4 шість окремих механізмів накладаються одна на одну, тож будь-яка погане подолання все ще залишає п 'ять між Cache і постійним хибним вердиктом

flowchart TD
    classDef store fill:none,stroke:#f59e0b,stroke-width:2px
    classDef defense fill:none,stroke:#22c55e,stroke-width:2px
    classDef recover fill:none,stroke:#a855f7,stroke-width:2px

    CACHE[("Cached verdict<br\>(EWMA posterior + sample count)")]:::store

    D1["Direction-agnostic confidence<br\>caches confident verdicts,<br\>not just bot verdicts"]:::defense
    D2["EWMA, not MAX<br\>one spike contributes 10%,<br\>not 100%"]:::defense
    D3["Sample-size gating<br\>full trust at 10 samples,<br\>Bias below that"]:::defense
    D4["Variance watchdog<br\>IP rotation, rate spike,<br\>path divergence"]:::defense
    D5["Skip-path observation<br\>cache hits still record,<br\>history stays whole"]:::recover
    D6["Refresh sampling<br\>5% of Skips downgraded<br\>to Bias by signature hash"]:::recover

    D1 --> CACHE
    D2 --> CACHE
    D3 --> CACHE
    D4 --> CACHE
    D5 --> CACHE
    D6 --> CACHE

напрямокМSK0агонистичне впевненість. SkipMinConfidence перевіряється проти verdict.Confidence, не проти verdict.BotProbability. Безперечное МSK1 вирок робота і безперечноі - викидання людського виroku є однаково піддатними для перехилення МSK3 Це те, що МСК4 є різницею між ММСК5 вирахунками робота в кэші MМСК6 МСК7 системою, упередженою до хибних позитивних речей ПМСК8 та СМСК9 наш кэш впевнена вироки" M SK1 система упереджена в залежності від того, на який спосіб показані докази

EWMA, не MAXM SK1 Одне високое спостереження за ймовірністю - - - рухає бігаючий рахунок α = 0.1 відхилення до того спостереження. Справжній атакатор швидко накопичує докази, тому що кожного дня спостереження - вороже. законний відвідувач, який начебто виглядав як скравер за один запит, повертається до доброзичливого на наступних спостереженняхM SK1

До прикладу-вирізання розміруМSK1 confidence = min(1, request_count / 10). Poniżej МSK1 спостереженьM SK2 навіть сильний задній край прив 'язаний до упередженості, а не до перехилення. рішення повністю довіряти кэшу залежить від значущості EWMA

МЛ натомість. Це скорочення попереду: доки не накопичується достатньо доказів , задній мозок не зміг МSK2 діяти з впевненістю Бандіти UCB including a sample -count term: small n, великий intervall довіри , не МSK2 ще не скористатися

Диференційна собака. Навіть з впевненім вироком, свіжою закодованою версієюM SK1 Перейти можна вето на кожен запит. VarianceWatchdog.Check проходить три незалежні тести проти VarianceWatchdogOptions (defaultsM SK1

public int    IpRotationWindowSeconds { get; init; } = 300;   // same fingerprint, new /24
public double RateSpikeMultiplier     { get; init; } = 10.0;  // last minute vs rolling 5
public bool   CheckPathCentroid       { get; init; } = true;  // never-seen path family

Щоб перевірити розбіжність, слід пам 'ятати хоча б про сім' ї маршрутів, які відрізняються від інших, перш ніж вони можуть реагувати.

if (options.CheckPathCentroid && hist.PathFamilyCount >= PathFamilyBaseline)
{
    var family = PathFamily(ctx.Request.Path.Value);
    if (family is not null && !ContainsFamily(hist, family))
        return new WatchdogResult(true, $"path-divergence:{family}");
}

Будь-яка поїздка і трубопровод працює свіжими; реагування несе X-StyloBot-WatchdogTrip: ip-rotation:1.2.3.0->5.6.7.0 ( або будь-що, що було випущено ) так що оператори бачать причину МSK2

МЛ натомість. Собачий собака концепція-викриття дрейфу для одного відбитка пальців. класичні аналоги ADWIN, Страница–Hinkley, і DDM; всі вони виявляють, що поширення онлайн потоку ' змінилося настільки, що існуюча модель більше не є надійною M SK2 Три перевірки тут - це домені МSK3 специфічні сигнали дрейфу М SK4 дрейф сетевої ідентичності МSK5 І پی МСК6 дріф об 'єму MSC7 швидкість М СК8 похибка поведінки ♫ ( траєкторічний центроід ♫ М С К 10

Перейти-обстеження маршрутуM SK1 Навіть, коли ворота перемикають трубну лінію, посередник все ще записує проханняM SK1

_watchdog.RecordObservation(precomputedSig, clientIp, pathStr);
_ = _signatureCoordinator.NotifyObservationAsync(
    precomputedSig, pathStr, v.BotProbability, context.RequestAborted);

Той факт, що відстеження було пропущено, не спричиняє розриву в історії пер. пер.

Обновлюйте зразки. ShouldRefresh детерміністично знижує конфігурований відсоток Skip- доступних запитів до Bias, так що канал запускає і обновлює живу записуM SK1 hash підпису вирішує, які запити будуть обновлені (DeterministicBucket.ShouldFire), так що репутації з одного і того ж клієнта приземляються однаково МSK1 з часом кожен відбиток пальців отримує періодичну повну ре-

МЛ натомість. Це детерміністична версія ε- жахливе дослідження з навчання у renforcement: більшу частину часу використовують поточну політику M SK1Skip), більша частина часу платять за дослідження (BiasMSC4 так, що модель залишається каліброваною МSK5 детермінізм за допомогою hash робить її idempotent МSK6 що має значення, коли один і той же клієнт повертається назад .

Об 'єкт-відхилення сім' їM SK1 Коли відбитка пальців обертається, і її нова особистість не має ніякого закодованого рішення, що його стосується, Кларкстер-анкер Лейдена з моделі поведінки). З TryGetVerdictAsync:

csharp if (!_signatureCac

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.