Як ви перевіряєте детектор, чиї відповідь має змінюватися, коли він вчиться?? Цей пост про BDF , Формат визначення поведінки, який робить StyloBot піддатним тестуванням. МSK2 один файл визначає класи потоку.
Серія випуску StyloBot
- Подібність, Не ідентичність: чому StyloBot моделює клієнтів поведінково
- Подібність-Усвідомлення ASP.NET UI: сервер - віддав поверхню над результатом виявлення
- Винайти та виправити безмежний ріст у довгостроковій-Running M SK1NET Services: - дисципліна надійності, яка робить двигун нудним в процесі виробництва
- Подібність-Усвідомлення інтерфейсу TypScript: Express , Fastify, і компоненти браузера
- Архітектура Sidecar: як реагуючий двигун підключається до не МSK1NET стеків
- Навчитися швидше: адаптивна система навчання , чотири МSK2 пам 'ять на рівні M SK3 і кэш вердикта
- Випробовуємо те, що не зупиняє нас: контрольна дисципліна : один БДФ файл керує регресією МSK2 завантаженням МСК3 та калібрацією
- StyloExtract - локальний інтерфейс навчання HTML для конвертера Markdown: HTML → Марка-даун, який поєднується з детектором МSK2 walker bug lucidVIEW caught МSK3 and the dogfood loop that made it honest
Дисципліна надійності Винайти та виправити безмежний ріст; адаптивна система навчання в Навчитися швидше; джерело на github.comM SK1scottgal/stylobot.
Це незручне питання, що стоїть за StyloBotом, і нереторичне.
Зазвичайний тест закріплює функцію на місці: вхід X повертає вихід YM SK1 Це працює, коли під час тесту річ є стабільною . StyloBot навмисно нестабільна на цьому рівні МSK3 Він накопичує поведінкові дані M SK4 один запит ' вирок залежить від самого запиту MSC6 пальцевий відпечаток MSSK7 дрейф від свого вивченого архетипового анкера МСК8 сеансова поведінкаМСК9 і чи система вже бачила достатньо, щоб перейти прямо до швидкого шляху MСК10 Кожний пальець починає закріплюватися на найближчому архетипові анкері М СК11 його попередню пальці M СК12 як тільки нові спостереження приземляються, він рухаєтьсяMСК13 і рух сам є сигналом МSК14 Метастабельний співставник пальців вирішує шумний вектор до стабільної особистості за допомогою двох комбінацій пальця пальца пальцем пальцями пальце пальцю пальцу палькою пальчі пальки пальчи пальчики пальць пальц пальіння Навчитися швидше.)
Вирок для запиту 20, тодіM SK1 не є функцією прохання 20. Це є функція проханням МSK3 через МSK4 Таким чином, тестова ціль взагалі не є проханняm СМСК5 Це поведінка системи над послідовністю з них СМСК6
Це виключає Assert.Equal. Питання, яке може задати тест, більше не є МSK1забаровує зворотнього вердикту X YM SK2 Стає МSK3 враховуючи цю клас поведінку , система сходиться до правильного відповіді М SK5 з правильних причин , в межах обмеженої кількості кроків M SK7 Це питання, на яке існує BDF для відповіді MSC8
Найближчі аналоги .NET Перевірити і Проверка Fs, але BDF не є жодним з них . Перевірка підтверджує артефакту МSK2 потім провалює будування на будь-якому точному дифференциумі M SK3 FsCheckserts properties over randomly generated inputs MSC4 BDF sits between them : the approved artefact is a behavioural definitionМSK6 but the pass condition is probabilisticM SK7 Not МСК8 did the output match this snapshot МСК9 but М СК10 did this distribution converge to the expected side of the boundary MСК11 with the right signals presentMСК12
Трик, який робить цей обладнаний файл BDF : не є тестом. Це здатний до виконання, визначення того, як поводиться клас клієнта
flowchart TD
classDef def fill:none,stroke:#3b82f6,stroke-width:2px
classDef rig fill:none,stroke:#a855f7,stroke-width:2px
classDef out fill:none,stroke:#22c55e,stroke-width:2px
BDF["BDF behavioural definition<br/>clientProfile · timingProfile<br/>requests · evidence · labels"]:::def
Replay["Integration replay<br/>slim form · real orchestrator<br/>cache disabled · identity reset"]:::rig
K6["k6 load harness<br/>full form · re-sampled per VU<br/>burst + jitter"]:::rig
Calibration["Calibration audit<br/>claimed evidence<br/>vs measured signals"]:::rig
Signals["Signal-flow regressions caught<br/>merged ev.Signals reaches<br/>dashboard · persistence · threat report"]:::out
Metrics["Load envelope verified<br/>latency · detection_rate<br/>burst_detected"]:::out
Drift["Calibration drift surfaced<br/>stale claims · aged signatures<br/>moved detection surface"]:::out
BDF --> Replay --> Signals
BDF --> K6 --> Metrics
BDF --> Calibration --> Drift
Регресія, завантаженняМSK1 і калібрація - це зазвичай три системи тестування з трьома джерелами правди, які відхиляються від іншихM SK2 Тут є три odczytи одного файлу. Решта цієї статті - кожен odczyt по черзіMSC4
Першою версією цієї роботи були сотні тестів на одиниці детектора за одиниці з mock-контекстами та контейнерними заголовками. Вони були швидкими, детерміністичними, і незрозумілими для класу невдачі, про яку я дбав.
Оркестр об 'єднає свої внеску в один ev.Signals словник, який споживачі внизу. ( панель діаграми МSK1 тривалість , творець розповідей M SK3 звіт про загрозу primary_signature з об 'єднаної поверхні не працює жодного разу. МСК0 – тест на детекторі. МSK1 – детектор все ще працює. , – довідка все ще переносить сигнал. МСК3 – він просто припиняє дістатися до будь-кого, хто його потребував. MСК4 – панель приладів, МСк5 – стіл відбитків пальців залишається пустим. М СК6 – стійкість перекидає рядок. M СК7 – набор блоків залишається зеленим, бо нічого з нього не підходить до об' єднання.
Це не гіпотетична документ контрактів записує саме цю регресію: зміну, яка зупинила поєднання сигналів M SK1 пережила шість днів в процесі виробництва, незважаючи на МSK2 проходження тестів на одиниці" тому що МSK4 тести на одиницях підтверджували ймовірність і відсоток вкладу evidence.Signals."
Тест інтеграції на BdfReplayTests.Integration.cs безпосередньо про те, чому вона існує:
Ця установка існує тому, що вона поймає category failure class ( downstream споживачів
ev.Signalsбеззвучно знижуються, коли оркестратор припиняє з 'єднувати сигнали) не підводить жодного тесту на одиниціM SK1
Оркестратор не є функцією; це ланцюг, його значення - це все, що виходить з об 'єднання після того, як кожен співавтор запустивM SK1 Єдиний спосіб довести це - запустити реальний запит через реальный оркестраtor і дослідити об' єднану поверхню. Переміщання об 'єднання перевершує тест .
Файл BDF (Behavioural Definition FormatM SK1 описує, як клас поведінки клієнта, не фіксоване повторення одного з нихM SK1 Цікавими частинами схеми є статистичні : профиль клієнта, який захоплює розподіляючу ідентичність МSK3 профіль часу, який визначає пульт MSC4 з- правило виведення зразків джіттеру замість фіксованої затримки M SK6 сукупність доказів, що базуються на взвешенних предикатах над сигналами поведінкиbot-signatures/python-requests-bdf.json):
{
"scenarioName": "python-requests-bdf",
"scenario": "A bot/scraper using python-requests/2.31.0 with specific behavior patterns.",
"confidence": 0.85,
"clientProfile": {
"userAgent": "python-requests/2.31.0",
"cookieMode": "none",
"headerCompleteness": "minimal",
"clientHintsPresent": false,
"robotsConsulted": false
},
"timingProfile": {
"burstRequests": 10,
"delayAfterMs": { "min": 20, "max": 150 },
"pauseAfterBurstMs": { "min": 500, "max": 2000 }
},
"requests": [
{ "method": "GET", "path": "/", "expectedStatusAny": [200,301,302], "expectedOutcome": "indexing", "successCondition": "any 2xx" },
{ "method": "HEAD", "path": "/admin", "expectedStatusAny": [200,403], "expectedOutcome": "indexing", "successCondition": "any 2xx" },
{ "method": "GET", "path": "/api/data?page=1", "expectedStatusAny": [200,403], "expectedOutcome": "indexing", "successCondition": "any 2xx" },
{ "method": "GET", "path": "/api/data?page=2", "expectedStatusAny": [200,403], "expectedOutcome": "indexing", "successCondition": "any 2xx" },
{ "method": "GET", "path": "/api/data?page=3", "expectedStatusAny": [403,404], "expectedOutcome": "indexing", "successCondition": "any 4xx" }
],
"labels": ["Scraper", "RobotsIgnore"],
"evidence": [
{ "signal": "interval_ms_p95", "op": "<", "value": 200, "weight": 0.35 },
{ "signal": "requestInterval", "op": "<", "value": "burst <150ms", "weight": 0.70 }
],
"patterns": { "requestInterval": "burst <150ms" },
"reasoning": "The bot/scraper uses python-requests/2.31.0 to access various endpoints, including the root path and admin pages, while also enumerating API paths and testing different HTTP methods."
}
Більшість поверхні є статистичною, а найбільша частина - це те, що робить визначення замість тестового сценарію. docs/bdf-v2-schema.json.)
confidence є попереднім, не твердженнямМSK1 0.85 каже МSK1 це має приземлитися високо МSK2 робот з впевненістю, коли система здорова ". установка не перевіряє, чи дорослій бал рівний мSK4 вона перевіряють, чи вирок приземляється на боці робота з кордону M. попередній - це стрічка, яка є підписом МСК6 автор МК7 ЛЛМ або людина МБС8 вважає, що система повинна досягти МПС9 Тут дрейф - це історія калібрації МУС10 не одиниця РМС11 тестовий провал МНС12
clientProfile є категорією клієнта. cookieMode: none є категорії поведінки ( немає печеньки , кожен запит починається з свіжого МSK2 не конкретний заголовок МSK3 headerCompleteness: minimal каже: "запити від цього клієнта несуть лише те, що встановили класичні бібліотеки МSK1 МSK2 факти про популяцію запити, які викидає цей клієнт , не фіксований список заголовків різноманіття клієнта.
timingProfile правила зразку. burstRequests: 10 плюс delayAfterMs: {min: 20, max: 150} плюс pauseAfterBurstMs: {min: 500, max: 2000} визначає генератор : десять запитів з однорідним МSK1 випадкові прогалини в МSK2 до 150 ms МСК4 потім однорідний мСК5 випадковий пауза від мСК6 до 2000ms М СК8 повторюй एमСК9 той самий BDF, що повторюється двічі, створює два різні потоки запитів із однаковою статистичною дистриб ’ цією МСК10 Це реальна поведінка StyloBot СМСК11 детектор періодичності та сеанс SМСК12 векторний компактор намагається розпізнати \ МС К13 \ вектор фіксованої затримки перевірить цілком іншу дистриб ' юцію \ СМС К14 \
evidence це ваганий предикат над сигналами. Кожен елемент - це вимоги до бланку signal OP value, weight w. {signal: "interval_ms_p95", op: "<", value: 200, weight: 0.35} стверджує, що "pM SK1 інтерп interval request for this scenario should be under 200ms, and that is worth МSK5 of the verdict МSK6 BDFserts at the statistical levelMSC7 not မ်СК8request мСК9 returned botМСК10trueMСК11 but MMСК12the population this client generated should produce an interval distribution whose p МСК13 falls below МССК14М СК15 A scenario whose evidence claims diverge from what the running system measures is a signature that has drifted out of calibrationМSК16
labels taxonomy. [Scraper, RobotsIgnore] це клас, в якому генерувався сценарій для . вибору сценаріїв приводу з ярликами в навантаженнях МSK1 тільки для запуску Scraper сценарії, не враховують RobotsIgnore) без того, щоб хтось писав регекс над именами сценаріївM SK1
requests описати, що робить klient, а не те, що має відбуватися далі expectedStatusAny: [200, 403] толерантна до успішного залучення або прямого блоку, тому що обидві є ефективними продуктами враждебної пробірки шляхівM SK1 expectedOutcome: indexing - це мета клієнта (визначати API-сторінки), не серверM SK2 реагування . successCondition: "any 4xx" на /api/data?page=3 є клієнтом' герістика для M SK1 робила цю роботу": скруфер, який отримує 4xx на третьій сторінці досягає успіху в своїй обчислювальній роботі МSK4 він знайшов прірву МSK5 BDF фіксує асимметрию між тим, що klient намагається зробити, і тим, чим система повинна зайнятися з цимMSC6
Слово визначення і об 'єднує БДФ з концепцією в центрі детектора StyloBot центроиди: відмітки у вимірному просторі МSK1 від Подібність, Не ідентичність, кожен з них - вчений анкер для групи клієнтів, які рухаються однаково
А BDF описує те ж саме: ( клас клієнта ) з відвертою ролью M SK2 Центроїд - це впізнавача: запитує " це запитання виглядає так, ніби клас генератор: він відповідає " виробляти поток запитів з цієї категорії M SK2 Те ж саме поведінка МSK3 протилежна напряму , що саме робить БДФ відтворюваним і центроїдом, а не
Мотор SignatureToBdfMapper перетворює опис атакувача на новий.
Отже, bot-signatures/ Корпус - це не лише тестна установка; це бібліотека поведінкових тлумачень , один файл на клас клієнта StyloBot причини про. підписи там були створені моделью M SK3ministral-3:3b, за каталогомM SK1s README) дані пропони, які описують сім 'ю клієнта, яка вдаряється на низку кінцевих точок , і одна і та сама поверхня доступна для людини-автораMSC4 Написати БДФ для нової сім' ї скрукерів, і ви отримаєте поведінкову дефіцитаціюМSK5 сценарій регресії МSK6 та завантаженняMST7 запис тесту в одному файлі MST8
Злегка грана форма "-" живе під test-suites/{bots,humans,adversarial}/*.bdf.json зберігати тільки requests[].method/path/headers/delayAfter плюс мягкий expectedDetection. Це підмноження - це те, що інтеграційна установка поміщає на кінцевий пункт реплею ,, який не може синтезувати розподілу поведінки з одного реплея МSK2 немає одночасних VUs МSK3 лише зворотній цикл M SK4 тому виміри TLS/ відбитків пальців TCP деградують за допомогою конструювання MSC6 багатша форма керує приборомlast harness , там, де одночасні VUs можуть дійсно реалізувати розподіл часу
Інтеграційна установка встановлює кожен сценарій для POST /bot-detection/bdf-replay/replay, кінцевий пункт, що живе в продукті МSK1BdfReplayEndpoints.cs), не в тестовому проектіM SK1 Установлення є навантаженням -небезпечним МSK3 кінцевий пункт вирішує IDetectionOrchestrator і проходить через будь-який організатор, який зараз зареєстрований DetectionPolicy.Default. В попередньому варіанті зашифровували конкретний оркестратор і маскували регресії в альтернативному.
Через те, що кінцевий пункт живе в продукті , він згортається як поверхня продукту . BdfReplay по замовчуванню відключено;, коли включено, дзвінки потребують X-BdfReplay-Api-Key Header and pass a per - IP rate limit , so the replay route is not a detection bypass left lying around
flowchart LR
classDef test fill:none,stroke:#3b82f6,stroke-width:2px
classDef proc fill:none,stroke:#a855f7,stroke-width:2px
classDef out fill:none,stroke:#22c55e,stroke-width:2px
Test["BDF replay rig<br/>authenticated with API key"]:::test --> Endpoint["Product replay endpoint<br/>identity reset · cache disabled"]:::proc
Endpoint --> Orch["Current DI-registered<br/>orchestrator"]:::proc
Orch --> Signals["Merged ev.Signals"]:::proc
Signals --> Assert["Contract assertions<br/>verdict · signal probes<br/>convergence bound"]:::out
Одна обміркована політика перекидає: Cache для вердикту підпису perM SK1 не підключений для повторюваності.
var replayPolicy = Policies.DetectionPolicy.Default with
{
SignatureCache = Policies.DetectionPolicy.Default.SignatureCache with { Enabled = false }
};
Cache's Skip path повністю перехиляє співставника, коли примарна підписка має надійний закодований вердикт Навчитися швидше); для установки, яка вимірює точность визначення та потік сигналу, він приховує поведінку кожного запиту, який установка намагається затвердити на . Реплеєр вимикає його і кожен запит запускає повну форму хвиль
сценарії також ізольовані один від одного. Кожний сценарій отримує унікальну синтетичну IP, отриману з детерміністичного xxHash на ім 'я M SK1a 192.0.x.y адреса з РФК 5737 TEST - NET діапазон МSK2 таким чином, суб-нет \ - \ рівень репутації ніколи не кровоточить між сценаріїми \ МSK4 \ І реагування POST /bot-detection/bdf-replay/reset-identity перед тим, як кожен сценарій скоротити запас відбитків пальців МСК0 без цього МSK1 сценарій N успадкує сценарії відбитков пальцеві пальця МСК2 Н MСК3 створені, а взаємні М СК4 твердження про стабільність сценарію стають за замовчанням
Риг робить три висновки щодо кожного сценаріїва . Кожен з них є шаблоном для тестування таких систем M SK1
Вирок зрілий, не за МСК1вирок на запитіM SK2 Затверджують сценарії Bot last.Actual.IsBot є правдою; людські сценаріїsert більшість з запитами, які класифіковані як людські. Приведення кожного окремого запиту couple the test to the drift trajectory away from the archetype anchor
// Some heuristics legitimately escalate on outlier rates; assert majority human, not all.
var humanCount = response.Results.Count(r => r.Actual is { IsBot: false });
var botCount = response.Results.Count - humanCount;
Assert.True(humanCount >= botCount,
$"{response.ScenarioName}: {botCount}/{response.Results.Count} requests classified as bot, " +
$"expected majority human. Last verdict: {last.Actual!.RiskBand} prob={last.Actual.BotProbability:F2}");
Наименовані датчики сигналу, не рахують сигналівM SK1 Сигналовий потік перевіряється на одному ключі. МСК0, а не в цілому. МSK1 стверджує, що число нестабільне. :, новий детектор, що випромінює новий сигнал, закриває втрату критичного існуючого. ММК3, число залишається таким же. ММСК4, бракує. MМСК5, особистість ключів невидима.
Assert.True(probes.TryGetValue(SignalKeys.PrimarySignature, out var hasSig) && hasSig,
$"{scenarioName}: {SignalKeys.PrimarySignature} missing from ev.Signals — " +
"RequestPersistenceService skips persistence, dashboard fingerprint table goes blank");
Мова про невдачі - це тест. МСК0 - це спецификація. МSK1 - через три місяці ви не мусите пам 'ятати, чому сигнал мав значення.
Обмежена конвергенція, не точне рівністьM SK1 Метастабельний співставник відбитків пальців вирішує шумний вектор до стабільної ідентичності. Состав вектора включає виміри сеансу M SK1ентропію траєкторіїМSK2 вік сеансів) що дрейфує за запитомMSC4 так, що двоє МSK5pass-погони можуть іноді випадати за межі його вільної стрічки та розподілятись . Tvування про один ідентифікатор відбитков пальця на всіх запитах було б помилковимMSL7 Tvорення про МSL8без дірМСЛ9 і конвергенцію до не більше, ніж ceil(N/2) розрізнені відбитки пальців
var distinctFps = withFingerprints
.Select(r => r.Actual!.IdentityFingerprintId!)
.Distinct(StringComparer.OrdinalIgnoreCase)
.Count();
var allowed = Math.Max(1, (int)Math.Ceiling(response.Results.Count / 2.0));
Assert.True(distinctFps <= allowed,
$"{scenarioName}: {distinctFps} distinct fingerprints across {response.Results.Count} requests " +
$"(allowed {allowed}). The matcher isn't converging — every request is allocating new, suggesting " +
"vector composition is unstable or LooseThreshold is unreachable.");
ceil(N/2) це не магія. це кодує політику : перша просьба завжди розподіляє МSK2 наступні просьби мають переважно співпадати за допомогою LМSK3 підтверджує або Перейде МСК4ccasional allocation under high path variance is acceptableМСК5 allocation on кожного дня прохання - регресія. Межа достатньо розслаблена, щоб поглинати шум, що співставник розроблений для поглинанняM SK1 досить щільна, щоб вловити режим непрацездатності, де він припиняє конвергуватися взагалі.
Усі три моделі мають спільні риси: МСК0, вони вказують на контракт, що поведінка повинна бути задовільняна; МСК1, а не на певні числа, які виробляє теперішній проект. МСК2, коли проект змінюється. МSK3, тест все ще holds, якщо проект ще holds. .. Ось що робить не--, детермінативний тест стабільним.
Файл BDF - це просто JSON. Інтеграційна установка споживає звичайну форму scripts/convert-bdf-to-k6-v2.csx читає каталог підписів і випускає скрипт k6, який зразки re- кожен підпис'с розподілом на VU на ітераціюM SK1
Знову - зразки роблять реальну роботу в цьому реченні . сценарій kM SK2 не відтворює зафіксованого сліду clientProfile і timingProfile як живий генератор. Кожна ітерація VU вибирає підписM SK1 створює заголовки з його headerCompleteness і clientHintsPresent флаги, прикріплює посудина для печень, яка відповідає cookieMode, отримує robots.txt якщо robotsConsulted є правдою,, тоді отримує новий штрих наM SK1запізнення від delayAfterMs.min..max і новий перерваний період від pauseAfterBurstMs.min..max. Дві VU, які мають один і той самий підпис, випускають два різні потоки запитів з однаковим статистичним розподілом , саме те, що розпізнає детектор різноманіття клієнта.
// Main test function - each VU picks random scenario and replays with burst/jitter.
// Multiple VUs running concurrently provide natural request interleaving.
export default function() {
const sig = signatures[Math.floor(Math.random() * signatures.length)];
// ... robots.txt, cookie jar, header bundle built from sig.clientProfile ...
for (let i = 0; i < sig.requests.length; i++) {
const req = sig.requests[i];
const url = `${TARGET_URL}${req.path}`;
const headers = buildHeaders(req.headers || {}, sig.clientProfile);
const res = http.request(req.method, url, null, params);
if (sig.timingProfile) {
if (requestCount < sig.timingProfile.burstRequests) {
sleep(randomBetween(
sig.timingProfile.delayAfterMs.min / 1000,
sig.timingProfile.delayAfterMs.max / 1000));
} else {
sleep(randomBetween(
sig.timingProfile.pauseAfterBurstMs.min / 1000,
sig.timingProfile.pauseAfterBurstMs.max / 1000));
requestCount = 0;
burstRate.add(1);
}
}
}
}
Поміція заголовка: тіло, яке ви перевіряєте на правильність, є тілом, який ви підтримуєте для виконання. Ніхто не проходить тести на інтеграцію, але транспорт з виробництва не схожий на тести є генератор потоку. Коли клієнт повідомляє про пропущену сім 'ю роботівM SK1 ви додаєте один БДФ і він об' єднується як з регрессивним набором, так і з тестом на навантаженняМSK2 Без перекладу МSK3 без другого джерела істини
метрики k6 говорять так само, як поверхня BDF
| МSK0 k6 метрyczny M SK2 Що він вимірює | |
|---|---|
bot_scenarios / human_scenarios |
Перерахунки за клас сценаріїв |
detection_rate |
Фракція сценаріїв класу Бот , позначена на краю МSK2 |
interval_ms |
InterM SK1 тенденція відхилення від запиту; перевіряє, чи впорядкований час зберігається під навантаженням |
sensitive_path_rate |
Частину запитів /admin, /api, файли з точками МSK1 |
burst_detected |
Похибки на межі вибуху, отримані з профиля таймingu |
http_req_duration |
Standard latency histogram for p |
Пороги на них стають вказівним параметром для об 'єму завантаження:
thresholds: {
http_req_duration: ['p(95)<1000'],
http_req_failed: ['rate<0.1'],
'detection_rate': ['rate>0.3'],
},
Рефактор, який регресує точність розпізнавання під навантаженням. (наказовий бумажник відстеження прокидає прохання, що він не повинен detection_rate. Рефактор, що вводить повільний шлях під рухами суперечок http_req_duration p95. Ті ж самі дані з джерела МSK1 дві регресії спіймані .
На даний момент БДФ вже зробив дві роботи: МСК0, перевірив контракт з оркестратором, МСК1, під час репроду, МSK2 і генерував реалістичне obciążenie під час к. Третє застосування найцікавіше для мене - МСК4, тому що тут БДБ перевіряється на сам.
Кожне введення доказів - це вимоги до бланку signal OP value, weight w. Після того, як підпис відтворився, ( під зворотним циклом або kM SK2 система виробила виміряний розподіл для тих самих сигналів interval_ms_p95 < 200 вимоги можна перевірити за допомогою вимірювання p95. cookie_count >= 2 можна перевірити за рахунок кількості cookies, які насправді були перевезені header_count >= 8 можна перевірити проти заголовків, які приземлилися evidence в списку skeма BDF v2: interval_ms_p95, interval_ms_p50, sensitive_path_rate, error_rate, burst_detected, header_count, cookie_count.)
Коли вимірюваний відхиляється від стверджуваного, підпис вийшов з калібраціїM SK1 або він був надмірно охарактеризован для системи, проти якої він був створений, либо система рухалась під ним . Обидві є корисними: перша каже: Знову , МSK5 генерувати підпис з спостереження , ";", друга - Перемножник рухав поверхню розпізнавання таким чином, щоб жодна функціональна перевірка не спіймала .
І python-requests-bdf.json показано раніше - це невеликий живий приклад того, чому аудит взагалі потрібен value ("burst <150ms") там, де схема потребує числа , і requestInterval знак, який він на ім 'я не має в доказовій енумі взагалі. Модель написала, що рядок , і жодний одиниця тесту його не відкидаєM SK2 Лише вимірюваний бік, який порівнює затвердzone докази з спостереганими сигналами, викриває твердження, яке ніколи не можна було перевірити в першу чергу МSK3
Це перетворює БДФ з регрессивного артефакту на артеfact калібрації. bot-signatures/ згенерували LLM- проти попередньої версії ланцюга детектора; їхні докази закодують те, що що версію, яка виділяла кожну родину покупців. РеМSK1 поточні калібрації показують вам, які твердження досі підтримують і які застарілиM SK2 так само, як архетипний притяг, що нічого не дрейфувало близько протягом тижнів, перестає бути корисним попередником. Корпусові саміMSC4 аудитиMスク5
Недетерміністичні системи не потребують недетерминативних тестів збудована Ones. Моделі, які працюють для StyloBot об 'єднують
timingProfile з міном/макс. прогалини є генератором ; зафіксована траєкторія запиту є одним винятком з неїM SK2 перевіряємо на слід і ви перевіряєте виняток, не дистрибуціюMSC4 Така ж логіка для клієнта profile МSK5 режим cookie та повність заголовків описують популяцію МSK6 не фіксований список заголовков).evidence tablicа - це найближче, що має система до одиниці-test assertionM SK1 і предикати - над розподіляючими сигналами (interval_ms_p95 < 200), не точні значенняM SK1 Вказівники з вагами складають ; заперечення рівності don МSK3t.Винайти та виправити безмежний ріст обмежена пам 'ять; Навчитися швидше зробити повторне виявлення дешевим. Це третя ногаM SK1 перевірити систему, чиї виходи будуть виграти
Metodа є одним корпусом. Ті ж самі BDF підписи спричиняють регресію , завантаження МSK2 та калібрацію M SK3 так що технічна техніка перетворюється на технічну техніку korpusу . Нова підписа - це те, що LLM може допомогти скласти з опису атакующего MSC5
Отже, ось відповідь на це питання: " як ви можете перевірити щось на зразок StyloBotу? ?" Ви не замерзаєте його. МSK2 Ви визначаєте клас дорожнього руху. \ , \ запускаєте реальну систему проти нього. ♪ , \ і перевіряєте три речі.
Репертуар BDF живе на BdfReplayTests.Integration.cs. Слізькі сценарії повтору test-suites/{bots,humans,adversarial}/*.bdf.json; повні статистичні підписи ( з clientProfile, timingProfile, evidence) bot-signatures/*.json. Перетворювач kM SK1 scripts/convert-bdf-to-k6-v2.csx. Переграваний кінцевий пункт, який обидві установки використовують BdfReplayEndpoints.cs. Контракт сигналу, який захищає ці тести, задокументований в docs/architecture/signal-contracts.md. Всі джерела на github.comM SK1scottgal/stylobot. Живий двигун , панель управления МSK2 та коммерціальні прилади stylobot.net.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.