# StyloBot-julkaisusarja: oppimisen nopeuttaminen

*Heads up: tämä on nöyryryilleM SK1 Se ' on syvällinen tekninen uima StyloBotin mukautumiseen perustuvaan oppimisjärjestelmään (EWMA-tarkistuksetMSC5 hystereesikynnyksetMST6 tuomiojen pitäminen salaisessa muodossa `Mostlylucid.BotDetection` ja viittaukset vastaavaan koneeseen-oppiminen rakentuu siten, että ML- lukejilla on pääsypaikka. Jos haluatte hissin paikan, read the earlier release postsM SK3 jos haluatte tietää, miten neljän tason muisti muuttaa toistuvan liikenneverkon sub-alueeksi -millisecond decisions while still recovering from false positives*

> ## Ehdotus
> 
> Tämä on työluonnos StyloBotin julkilausumasarjasta.

> **StyloBot -sarja**
> 
> 1. [**Käytänne, Ei identiteettiä**](/blog/stylobot-fingerprint) - miksi StyloBot mallistaa asiakkaita käytännöllisesti
> 2. [**Behaviour-Aware ASP.NET UI**](/blog/behaviour-aware-ux) - palvelijaM SK1 luovutti pintansa kyseisen havaitsemistuloksen yli
> 3. [**Pitkällä aikavälillä tapahtuvan -käynnissä olevan .NET-palvelujen rajaton kasvun löytäminen ja korjaaminen**](/blog/stylobot-release-reliability) -, luotettavuuden kurinalaisuus, joka pitää moottorin tuskallisena tuotannossa
> 4. [**Behaviour-Aware TypeScript UI**](/blog/typescript-sdk) - ExpressM SK1 Fastify, ja hakukonekomponentit
> 5. [**Sidecar-arkkitehtuuri**](/blog/sidecar-architecture) - miten havaitsemismoottori liitetään muihin kuin -.NET-palkkiin
> 6. **Oppiminen nopeuttamaan** - mukautuva oppimisjärjestelmä, , neljä,- tasotasoinen muisti ja , tuomiovarasto
> 7. [**Todistuksen testaaminen, joka ei jää rauhaan**](/blog/stylobot-release-nondeterministic-testing) - tarkastusta koskevat säännökset : yksi BDF-tietokanta hallinnoi regressiaa M SK2 lastausta, , ja kalibrointia
> 8. [**StyloExtract - paikallisen oppimisen HTML:n Markdown-muuttaja**](/blog/stylobot-release-styloextract) - HTMLM SK1Markdown-laaja, joka on päällekkäinen tunnistajan kanssa , walkinger bug lucidVIEW caught, ja dogfood loop, joka teki siitä rehellisen

<!--category-- ASP.NET, StyloBot, Bot Detection, Performance, Machine Learning -->
<datetime class="hidden">2026-05-13T11:00</datetime>

Käytännön malli on [Käytänne, Ei identiteettiä](/blog/stylobot-fingerprint); luotettavuuden kurinalaisuus [Rajattoman kasvun löytäminen ja korjaaminen](/blog/stylobot-release-reliability); lähde osoitteessa [github.com/scottgalM SK2stylobot](https://github.com/scottgal/stylobot).

[TOC]

---


## Miksi StyloBot häiritsee tätä

StyloBotin koko tehtävänä on kertoa ihmisille roboteista, ,, ja se tekee niin perustavanlaatuisella tasolla rakentamalla kuvan siitä, miltä keskimääräinen bot näyttää ja miltä tavallinen ihminen näyttää.. Ei vahvistettuja sääntöjä,,, ei käyttäjää koskevia regexejä.-, Agent strings, MSC5, käytännölliset centroidit dimensional vector spacessa, M SK6, one per cluster of clients that move similarly, ., jokaisessa havainnissa joko vahvistetaan olemassa oleva centroidi tai nopeutetaan sen sijaintia. **Todenmukaisuus paranee ensinnäkin** (Klasteripuolelle on sisällytetty [Käytänne, Ei identiteettiä](/blog/stylobot-fingerprint); tämä artikkeli koskee sitä, mitä tapahtuu centroidoilla, kun niitä on

Tämä mekanismi on myös se, mikä tekee StyloBotista käyttöönottokelpoisen typerästi eri puolilla maailmaa.:, henkilökohtainen blogi 50, pyynnöt,/, minuutti, ,, markkinointisivusto, joka räjähtelee tuotteen markkinoille saattamisen aikana.,, SPA-sivusto, jossa suurin osa liikenteestä on API-puheluja.M SK5, sähköinen -, kaupankäyntiselvitys, jossa yksi virheellinen myönteinen maksuasiakkaan kohdalla on todellista menetettyjä varoja.

Detektor, joka hallinnoi koko pipelinen jokaisen pyynnön osalta, on perusteellinen mutta epätaloudellinen.Detektor, jossa hädin tuskin tallennetaan päätöksiä, on nopea mutta hajanainenM SK1 StyloBot sijaitsee näiden kahden välillä : tallennetus on yleinen tapaus, koko pipe line on elvytystie

Tässä kohdassa tuntemattomien nimien vastainen konteksti:

|
|---|---|---|---|
| Cloudflare Bot -hallinta | | | Edge |( | their CDN | \ ) | Sub | SSK5 | Millisecond at edge | M| | Block | / | challenge |M/ | allow before your origin sees it
| CHEQ | / | DataDome || | Server ‐- | Side API callout
| StyloBot | Prosessissa tai paikallisessa gRPC:n sivuautossa **~10-50 μs** lämmitys Skip, kautta **400-900 μs** täydellisen nopean-path-putken käytölle M SK1 Typoitu tuomio (`BotProbability`, `Confidence`, `RiskBand`, `ThreatScore`) suoraan käsittäjässänne

Kansainväliset tuotteet ovat loistavat " alkuperän edeltävän pysäyttämisen jälkeen"; mitä ne eivät voi tehdä, on antaa hakemuksenne perinpohjaisen pyyntömahdollisuuden ja antaa tilaussivullanne päättää siitä, mitä sen kanssa tehdään . API-tuotteet tekevät niinM SK4 mutta maksatte verkkohyppyyn joka pyynnön yhteydessäMSC5 StyloBot on tapaus, jossa tuomio on vahvistettu menettelyssäMST6MTSK7 verkkohypyynti ei ole olemassaMSSK8 eikä lämpötietä ole nopeampaa kuin kumpikaan suuruusjärjestyksessäMSSTK10

Avaimen turvallisuutta edistävä väline on **politiikka-per-surface**. Tuomiovarastoa ohjaa `SignatureCacheOptions` kirjataan, että 's on asetettu kullekin politiikkalle, niin että hallinnollinen loppupiste voi vaatia 0.95 luottamusta ja \60-second freshness window , kun taas sisältölähettiläs hyväksyy luottamuksen tunnin ajan. [ASP.NET:n välineet](/blog/behaviour-aware-ux), a [gRPC:n sivuauto](/blog/sidecar-architecture), tai Caddyn pluginin takana tapahtuvassa prosessissa

Muutos tästä postista koskee koneistoa, joka varmistaa Cache-turvallisuuden.

## Metastatiivinen sormenjälki

Kaikki below anchors to " the fingerprint ", so it's worth being precise about what that means hereM SK3 StyloBotissa sormenjälki ei ole yksi ainoa alaMSC4 SeMSSK5s a position in the |130+ dimensional behavioural vector space from [Käytänne, Ei identiteettiä](/blog/stylobot-fingerprint), taulukko TLS:stä, , otsikon järjestys,, ajantasaistus,M SK3 etenemisjärjestys,, JS:n käytös sekä kaikki signaalit, jotka tulevat paikan päällä. *käytännöllinen* Muutos: erilainen etenemisjärjestys, erillinen kadenssiM SK2 uusi tapa epäonnistua tarkastuksissa .

Se tekee sormenjäljestä **Metastaali**: riittävän vakaa, että toimija pysyy tunnistettavissa lyhyen ajanjakson aikana -pitkän aikavälin identiteetin purkaminen M SK2 kehittyy riittävän nopeasti, että todellinen käyttäytymismuutos ilmenee kohdan liikkumisena . Ei kiinteää identiteettiä

Tämä on ominaisuus, johon koko oppimisjärjestelmä perustuu. Jos sormenjälmät olisivat meluisia (kaikki pyynnöt saapuisivat jonnekin sattumanvaraisestiM SK2 EWMA:n keskiarvot eivät syventäisi mitään ja Cache olisi aina väärään aikaan . Jos ne olisivat jäykkiä |( |Positio ei koskaan muuttuisi ♫) |Ei driftiä jäljitettäisiin eikä tarkkailijalla olisi mitään tarkkailtavaksi \. \ Metastaabilita on juuri se, mikä tekee molempien päälinjojen toimiviksi \ : \ jatkuvilla tarkkailuilla voidaan täsmentää centroidia, koska taustalla oleva signaali on riittävän vakaa syventääkseen *ja* ajo voidaan havaita, koska todelliset muutokset ilmenevät muuttuessa muulla tavoin vakaalle taustalle..

Rakenteellinen peruste sille, miksi tämä omaisuus on (ihmistön meluinen mutta johdonmukainen rakenteellisestiM SK1botten johdonmukainen mutta väärin rakenteellisesti [**Käytänne, Ei identiteettiä**](/blog/stylobot-fingerprint), ja jos jokin geometriasta täällä ei ole selvää, ettäM SK1 on artikkeli, jonka lukeminen on ensimmäinen. Kaikki, mikä seuraavaa tässä artikkelissa on se, mitä voitte tehdä *kerran* kyseinen vaatimus on käsissä.

## Lausunnon : havaitsemisen pitäisi olla parempaa ja halvempaa, mitä enemmän näette

Jokainen tarkkailu tekee kaksi asiaa: : se syventää keskitettyä sormenjälkiä, tämä sormenjälje kuuluu ( täsmällisyyttä M SK2 ja se lisää järjestelmän luottamusta siihen, että tämä sormienjälmä toimii keskitetyn sormen tavoin.

Bot-detektorilta kysytään saman kalliin kysymyksen miljoonia kertoja päivässä *onko tämä näyttelijä edelleen käyttäytynyt kuten olemme jo oppineet, että se oli?* Suurin osa kyseisistä pyynnöistä:,; järjestelmällä on jo mielipide:.; se näki saman TLS- sormenjälkien; ,; sama otsikonjärjestys; `bot, 0.93`. Ei ole mitään järkeä kääntää täydellistä detektoriputkea samaan toimukseen, ellei se ole muuttunut näkyvästi.

StyloBot-oppimisjärjestelmä rakentuu tämän ajatuksen ympärille. *rakentaa ja viimeistelee centroidia* ensiksikin. Kun putki ei toimi,M SK1 ei käy, , edellistä sijoittamista käytetään uudelleen valvotuissa olosuhteissa,–, pyynnöstä toimitetaan mikrosekkunnissa,-, ja sen toimittaminen syöttää edelleen pitkän–M SK5käynnissä olevan muistin niin, että keskipisteet pysyvät nykyisinä,‐.

> **ML syrjään.** Tämä on **mukautumislaskelma** hermostoverkostoissa (eM SK1g. [early-exit-verkot](https://arxiv.org/abs/1709.01686), Sekakomitea, --asiantuntijat keräävät,): halpa luokittelujärjestelmä ensin,M SK4 kallis luokistusjärjestelmä vain silloin, kun halpa on,'luottamus on alhainen,MSC6 Detektorin putki on kallis johtopäätöslähestyslähetyslähettiläs.

## Neljä kerrosta muistia

StyloBotin oppiminen on kerrottu siten, että kukin taso vastaa eri elämänaikaa:

1. **Nopeus-path-reputaatio M SK1instant).** Sellaisten mallien lyhyt luettelo, jotka luokitellaan `ConfirmedBad` neuvostossa `PatternReputation` tallentaa. Yhdestä näistä vastaava pyyntö abortoi kaasuputken ensisijaisesti M SK1 ennen kuin jokin muu detektori käynnistetään. Siirto edellyttää tulosta ≥ 0.9 ja tukea SSK5 \50 |(lisätietoja jäljempänä mainituista numeroista
2. **Sisäinen -pyynnön taulukko (perM SK2pyynti** Tunnustimet kirjoittavat signaaleja yhteiseen `BlackboardState.Signals` pyynnön aikana sink; jälkimmäiset jäljittäjät lukevat nämä signaalit. Tämä ei ole ' ei pitkää M SK3 pitkittyvä muistiM SK4 seMSC5 on, miten MST6 jäljittäjät koordinoivat yhden pyynnyksen sisällä ilman että kullekin olisi pakko laskea uudelleen muille jo otettuja ominaisuuksia
3. **Inter-pyyntää mainetta M SK1minuuttien ja päivien välisenä aikana** Muodot-tasoinen muisti: `InMemoryPatternReputationCache` pisteet kutakin mallia kohti-mallin bottitulokset verkkoon saatujen EWMA-tarkastuksia ja ajanpuutetta koskevien tulosten perusteella `ReputationState` (`Neutral` → `Suspect` → `ConfirmedBad`, plus `ConfirmedGood`, `ManuallyBlocked`, `ManuallyAllowed`) epäsymmetrisillä edistämis- ja vähentämiskynnyksillä
4. **Per-fingerprint verdict cache (minutesM SK2** Per-aktorin muisti: elollinen liikkuva ikkuna `SignatureCoordinator` kutakin havaittua sormenjälkiä otetaan huomioon. `SignatureVerdictGate.DecideAsync` lukee tämän jokaisessa pyynnössä.

Tauri 1 lyhyellä tasolla, - kulkee putken läpi, . Tauri 2 koordinoi putken sisällä, M SK4 Taari 3 on pitkä muisti, joka säilyy koko päivän ajan.

```mermaid
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: miten järjestelmä unohtaa

Jokaisessa järjestelmässä käytetään samaa päivittämissääntöä, `Helpers/Ewma.cs`:

```csharp
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;
}
```

Se on koko asia. `alpha` on uusien havaintojen paino `1 - alpha` on menneisyyden inertia. korkeampi alfa M SK1 nopeampi reaktio viimeisimpiin havaintoihin; alpha =

Muodon maine käyttää sitä suoraan. `PatternReputationUpdater.ApplyEvidence`:

```csharp
// 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` ennakolta 0.1,, joten yksi ainoa havainnollinen siirtää tulosta 10% puutteen vuoksi kyseiseen havainnon kohteeksi.

> **ML syrjään.** EWMA = klassinen [eksponentiaalinen liikkuva keskiarvo](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average) joka ilmenee [Adam](https://arxiv.org/abs/1412.6980) (the `β₁`, `β₂` nopeuden ja vaihtelun kerääjät), [Polyakin keskiarvo](https://en.wikipedia.org/wiki/Stochastic_approximation), batchNorm-käynnissä keskimääräinen [TD(0)-arvon päivitykset](https://en.wikipedia.org/wiki/Temporal_difference_learning) (`V ← V + α(r + γV' - V)`). `α = 0.1` tässä on sama ulottuvuus kuin mitä te näette momentumipuffereista.1 hitaasti niin, että yksi huono tarkkailu ei voi muuttaa käynnissä olevaa arvoa.2 nopeasti niin, ettei käynnissa oleva arvo seuraa jatkuvaa muutosta.4

Valitsimme tämän ajantasaistamisen ilmeisempään -, mutta- väärä vaihtoehto tallentaa koskaan havaittua suurinta todennäköisyyttäM SK2 Historian talletuslaitos antaisi yhden 0.95 huipenen pin-muodon \0.95 ikuiseksi ajaksiMSC7 riippumatta siitä, miten se käyttäytyy sen jälkeenMST8 EWMA- talletuslaitoksessa on päinvastoin omaisuusMSL9 huipeudet |0.95, joiden jälkeen satoja hyväntahtoisia havaintoja kumotaan sujuvasti takaisin hyväntahtoon suuntaan | . väärät positiiviset ovat palautettavia |.

Kasvu ulottuu myös malleihin. `ReputationOptions` (standardit kodesta ):

```csharp
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;
```

Muuntaviiva, jota ei ole nähty yhden päivän aikana, on heikentänyt suurimman osan tukiaan. `Neutral` on jätettä- kerättyM SK1 `ConfirmedBad` Muistit saavat pidemmän taun (he ovat saaneet asemansa vahvojen todisteiden avulla ja heidän ei pitäisi ' menettää sitä yhdellä hiljaisella tunnillaM SK2 muisti, joka ei häviä M SK3 ei kadota todellisuudestaan

> **ML syrjään.** Tulos-heikkeneminen -suuntaukseenM SK2ensimmäinen askel on ensimmäinen-määrän keskiarvo [Ornstein–Uhlenbeck](https://en.wikipedia.org/wiki/Ornstein%E2%80%93Uhlenbeck_process) muoto): ilman uusia todisteitaM SK1 tulos vetää takaisin entiseen vauhtiin `1/τ`.

Hysteresi sisällytetään valtion koneeseen. Todelliset kynnysarvot `ReputationOptions`:

| Siirtymävaihe
|---|---|---|
| `Neutral → Suspect` | ≥ 0.6 | ≥ 10 |
| `Suspect → ConfirmedBad` | ≥ 0.9 | ≥ 50 |
| `Suspect → Neutral` | ≤ ♫ ♫ 0.4 ♫
| `ConfirmedBad → Suspect` | ≤ ♫ ♫ 0.5 ♫
| `Neutral → ConfirmedGood` | ≤ 0.1 | ≥ 100 |

```mermaid
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-kohtainen kuilu edistävän kynnysarvon (0.9) ja demote-kynnyksen (0.5) välillä `ConfirmedBad` on tarkoituksellinen: se ' on oscillaatioM SK2 suppression band. mikä tahansa, joka vaihtelee MSC4 ja 0.8 välillä pysyy `Suspect`; vain yksisuuntaiset todisteet ylittävät rajan

> **ML syrjään.** Tämä on [Schmittin aktivointi](https://en.wikipedia.org/wiki/Schmitt_trigger): laajempiM SK1myönteisempi kuin -symmetriset raja-arvot valtiomuutoksille.ML:n analogi on jäykkä, selkeitä, -päätöksiä sisältävä wrapper jokaisessa jatkuvassa luokittelujärjestelmässä, jossa ei halua, että merkinnät käännetään jokaista pakettia vastenMSC6ajattelkaa sitä, miten ensemblein äänestykset yleensä verrataan marginaalivaatimukseen , tai miten hälytysjärjestelmät paljastavat tilanteen.

## Verdict cache: nopeuden, joka on saatava

Per-fingerprint sliding window on taso, jota pyynnön kuuma tie nyt suoraan kuulee `SignatureVerdictGate.DecideAsync` koko päätös, ja se on pieni

```csharp
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);
}
```

Per-politiikan kynnysarvot `SignatureCacheOptions` (defaults shownM SK1

```csharp
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 %
```

Itse luottamus perustuu `SignatureCoordinator.TryGetVerdictAsync` näytteen kokosta , täysin luottamuksellisesti 10 havaintoihin ja lineaariseen rampiin alle

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

Siten `SkipMinConfidence = 0.85` merkitsee, että sormenjälki tarvitsee ~9 havaintoja nykyisessä ikkunassa ennen kuin se voi olla SkipM SK1kelpoinen . Sen alapuolella, ovi suosii ennakkoluuloja

Neljä toimia:

- **Miss.** Tämä sormenjälki ei ole käyttökelpoinen, tai vanhempi kuin `BiasMaxAgeSeconds`. Full detector pipeline runningM SK1 Result feeds the sliding window for next time
- **Epäluottamus** Luettelo on olemassa maltillisen luottamuksen kanssa, tai se ' on hieman vanhentunutM SK2 putki kulkee,, mutta tallennettu tuomio syötetään aaltonaMSC4 aikaisemman panoksenaMST5 jälkipolvi vedetään aikaisempaa luottamukseen ja lineaariseen iän heikkenemiseen nähden kohti aikaisempia kohtia.
- **Skip.** Luettelo on tuore ja riittävän varma siitä, että kaasuputken osuus olisi marginaali.
- **Watchdog-tripM SK1** Skip-kelpoinen Cache-hyökkäys,, mutta varianssitarkkailija havaitsi jotain epätyypillistäM SK2 Cacheetut päätökset ovat mitätöidtyneet tämän pyynnön osalta

```mermaid
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
```

Välineiden päästöt `X-StyloBot-VerdictSource` (`cache` tai `pipeline`) ja `X-StyloBot-WatchdogTrip` (reason string when applicable) vastauksessa, jotta operaattorit voivat nähdä suoraan, mihin suuntaan kukin pyyntö meni

Skip on se, mitä tapahtuu, kun ei ole mitään uutta oppia. Kun sormenjälkiä on nähty riittävän luottamuksellisesti kummassakin suunnassa M SK1poraus on suunnanmukainen -agnostic, niin varmaa M SK4ihmis ja varma МSK5bot ovat yhtä päteviä MSC6 jokainen seuraava pyyntö maksaa vain porttitarkastusta , tarkkailurekisterin MST8 ja politiikan täytäntöönpanoa

## Tuomiovarasto osuudena, ei päätöksenä

Ennen kuin pääsemme takaisinottomekanismiin, niiden yhdenmukaistamista koskevat puitteet: tallennettu tuomio ei ole tallennettu vastaus, jota järjestelmä käyttää uudelleen pimeästiM SK2 Epäjohdonmukaisella tiellä se *maksuosuus*, painotettu luottamuksen ja iän perusteella `FingerprintPriorContributor.ContributeAsync` on koko koneisto

```csharp
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-kolmionneksi,- vanhan luottamuksellisen tuomion, 0.9 ankkuroi jälkiosan voimakkaasti.

> **ML syrjään.** Tämä on todellakin **Bayesian kieli**: edeltävä ( salaistettu tuomio ) SSK3 todennäköisyys S( tämä pyyntö M' todisteet `decay = 1 - age/horizon` termillä on sama merkitys kuin unohtavassa tekijässä [Bayesin arvio](https://en.wikipedia.org/wiki/Recursive_Bayesian_estimation); vanhat edeltäjät menettävät voimansa, joten todennäköisyys hallitsee aikaisempia vuosia. `RequestContributionDelta` (muutos, joka tämän pyynnön perusteella tehdään käynnissä olevaan jälkipäätökseen) sen sijaan että se olisi raakaperäinen perM SK2pyynnön todennäköisyys : tallennetuissa päätöksissä `delta` on se osa, joka ”'” on itse asiassa uusi tieto

## Miten väärät positiiviset aineet eivät sekoitu

Tähän asti järjestelmä kuulostaa vaaralliselta Cache-järjestelmältä- raskaalta , joten tämä kohta on tärkeä: miten suunnittelussa edellytetään, että Cacheetut tuomiot ovat lopulta vääriäM SK3 ja kuinka halvalla se havaitsee ja palauttaa ne takaisin, kun ne ovat–. Kuusi riippumatonta mekanismia on päällekkäisyydessä toistensa kanssa, niin että jos yksikään niistä häviää, jätetään vielä viisi Cacheen ja pysyvän virheellisen tuomion välillä

```mermaid
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
```

**Suuntaviivat-vakausluottamusM SK1** `SkipMinConfidence` on tarkistettu `verdict.Confidence`, ei vastusta `verdict.BotProbability`. Varma robotin tuomio ja varma inhimillinen tuomio ovat yhtä päteviä Skip-päätökseen. *luottavainen* tuomiot" M SK1järjestelmä, joka on puolueellinen riippumatta siitä, mihin tapaan todisteet viittaavat

**EWMA, ei MAXM SK1** Yhden korkean, -:n, todennäköisyyden havainnot siirtävät suorittaman pisteen `α = 0.1` todellinen hyökkääjä kerää todisteita nopeasti, koska *joka kerta* tarkkailu on vihamielistä. Oikeutettu vierailija, joka sattumalta näyttää scraperilta yhden pyynnön takia, kumoautuu takaisin myönteiseen suuntaan seuraavissa havainnoissaM SK1

**Esimerkki-kokonaisuuserotusM SK1** `confidence = min(1, request_count / 10)`. AllemmäisarvioinnitM SK1 , jopa vahva posterior on pidetty puolueellisena sen sijaan, että sivuutetaan. Päätös täysin luottaa Cache-järjestelmään perustuu siihen, että EWMA on merkityksellinen

> **ML syrjään.** Tämä on **hidastuminen ennen**: kunnes on kerätty riittävästi todisteita , jälkimmäinen ei toimi luottamuksellisesti [UCB:n ryöstäjät](https://en.wikipedia.org/wiki/Multi-armed_bandit#Upper_Confidence_Bound) otetaan mukaan näytelmä-laskenta termiM SK1 pieni `n`, laaja luottamusväli

**Varianssitarkkailija** Jopa luottamuksellisena, tuoreen tallennetun tuomion kanssa , Skip voi olla veto-oikeudellinen pyynnöstä kohti. `VarianceWatchdog.Check` toteuttaa kolmea riippumatonta testiä vastaan `VarianceWatchdogOptions` (defaultsM SK1

```csharp
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
```

Tietä-eroja koskeva tarkistus edellyttää ainakin M SK1 erilaisten tieten perheiden rekisteröintiä, ennen kuin se voi toimia , niin lämmää M SK3heikkenevät pyynnöt eivät 'huomau

```csharp
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}");
}
```

Jokainen matka ja putki kulkee tuoreena; vastauksen kantaa `X-StyloBot-WatchdogTrip: ip-rotation:1.2.3.0->5.6.7.0` ( tai mitä tahansa tulipaloon ) niin että operaattorit näkevät syyn

> **ML syrjään.** Valvontakoira on **käsite-drift-detection** yhden sormenjäljen osalta. Klassiset analogit ovat [ADWIN-ohjelma](https://www.cs.upc.edu/~gavalda/papers/adwin06.pdf), [Page–Hinkley](https://en.wikipedia.org/wiki/CUSUM), ja [DDM](https://link.springer.com/chapter/10.1007/978-3-540-28645-5_29); kaikki nämä havaitsevat, että verkkovirtaa koskevat siirtot ovat muuttuneet riittävän paljon, ettei nykyinen malli ole enää luotettava.

**Skip-tietarkkailu** Jopa silloin, kun ovi välittää putken, middleware rekisteröi edelleen pyynnön.

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

Tosiasia, että havaitseminen sivuutettiin, ei aiheuta porsaanreikiä kutakin pyyntöä kohden.1; Clustering 3 drift detection 4 dashboard 5 per - fingerprint stats see every request whether the pipeline ran

**Elvytetään näytteenottoa.** `ShouldRefresh` vähentää määriteltävästi Skip-- ja Bias-[Bias] -hakemuksia, joten pipeline toimii ja päivittää suoran pöytäkirjan.`DeterministicBucket.ShouldFire`), niin että samasta tilanteesta lähtevät palaukset laskeutuvat identtisesti ; ajan kuluessa jokainen sormenjälki saa säännöllisen täyden uudelleenarvioinnin

> **ML syrjään.** Tämä on deterministinen versio **ε-herkkyystutkimus** vahvistusta koskevan oppimisen perusteella: suurin osa ajasta hyödyntää nykyistä politiikkaa (SkipM SK2 osan ajasta maksaa tutkimisen kustannukset

**Yhteinen osapuoli- perhevähennysM SK1** Kun sormenjälki kiertää ja sen uudella identiteetillä ei ole tallennettua omaa tuomiota, portaali putoaa perheelle, jonka kanonillinen allekirjoitus on '. [Leidenin ryhmittymä ankkuri](/blog/stylobot-fingerprint) käyttäytymismallista). `TryGetVerdictAsync`:

csharp
if (!_signatureCac
