From 70b357a3bd6f596212c2946f4ddbc8d8cef00f13 Mon Sep 17 00:00:00 2001
From: Alexey <247128645+axkurcom@users.noreply.github.com>
Date: Sat, 31 Oct 2026 12:51:59 +0300
Subject: [PATCH] Ping-Pong Comparison Diagrams + Mermaid Validation in
AGENTS.md
---
AGENTS.md | 8 ++++++++
docs/WEB/PROXY_PING.de.md | 38 ++++++++++++++++++++++++++++++++++++++
docs/WEB/PROXY_PING.en.md | 38 ++++++++++++++++++++++++++++++++++++++
docs/WEB/PROXY_PING.ru.md | 38 ++++++++++++++++++++++++++++++++++++++
4 files changed, 122 insertions(+)
diff --git a/AGENTS.md b/AGENTS.md
index d3f6f56..e88fe4e 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -210,6 +210,14 @@ Use English for newly written or substantively updated source comments, document
- Follow local formatting and naming patterns. Avoid style-only churn.
- Remove an obsolete item only when doing so is necessary for the task; do not perform general warning or dead-code cleanup by default.
+### 12.1 Mermaid Diagram Validation
+
+- When adding or changing Mermaid diagrams, validate every Mermaid block in the affected documents, including localized versions, with a real Mermaid parser (`mermaid.parse`) or Mermaid CLI (`mmdc`). Checking Markdown fences alone is insufficient.
+- Fix parse errors before completing the change. For syntax fixes, reproduce the original failure before validating the correction when practical.
+- When changing diagram layout, also render and inspect readability, label clipping, and connections when a renderer is available.
+- Avoid unescaped semicolons in sequence-diagram labels and notes because Mermaid can interpret them as statement separators. Use commas or supported escaping instead.
+- Report the Mermaid version and actual validation results. Distinguish parser validation, rendering, and GitHub verification; mark checks that were not executed as **NOT RUN** or **BLOCKED**, as applicable.
+
## 13. Communication and Deliverables
For a simple answer, answer directly. For a nontrivial implementation, briefly convey the plan, meaningful impact, and verification. Avoid repetitive process narration.
diff --git a/docs/WEB/PROXY_PING.de.md b/docs/WEB/PROXY_PING.de.md
index 2fd75f6..23808f6 100644
--- a/docs/WEB/PROXY_PING.de.md
+++ b/docs/WEB/PROXY_PING.de.md
@@ -75,6 +75,44 @@ Bei einer neuen Verbindung ohne Paketverlust benötigt der übliche TCP-Handshak
Das anfängliche TLS für die Bridge liegt normalerweise vor der Android-Messung. Zusätzliche HTTP-Verbindungen oder ein WebSocket-Upgrade können noch innerhalb des Intervalls stattfinden; Verbindungswiederverwendung muss anhand eines Traces belegt werden. Persistente HTTPS-Verbindungen und bestehende WebSockets führen nicht für jeden Ping einen neuen TLS-Handshake aus. `cache: 'no-store'` steuert Caching, nicht die Wiederverwendung von TCP/TLS. Weder das Abschalten der Zertifikatsprüfung noch TLS 0-RTT ist zur Erklärung oder Diagnose erforderlich. Siehe [persistente HTTP-Verbindungen][http1] und [Bridge-Anfragen][request].
+## Zusätzliche Arbeit bei WEB gegenüber nativem MTProxy
+
+Die Darstellung trennt Arbeit vor dem Android-Timer von Arbeit, die in den angezeigten Wert eingehen kann. Als Basis dient Classic/DD über TCP. Bei EE gehört FakeTLS zum Aufbau des nativen Transports. Die Größe der Kästen und die Länge der Pfeile stellen keine Zeitdauer dar.
+
+```mermaid
+flowchart LR
+ subgraph N["Natives MTProxy: Classic/DD"]
+ direction TB
+ N0["Vor der Messung
DNS + TCP + nativer Transportaufbau"] --> N1["Entfernter Transport bereit
Anfragezeitstempel aktualisiert"]
+ N1 --> N2["MTProxy-Anfrage und Antwort
Ausstehender Relay-Aufbau, Netzwerk, Warteschlangen, Telegram-DC"] --> N3["TL_pong empfangen
Angezeigte Messung beendet"]
+ end
+ subgraph W["WEB: MTProxy in HTTPS oder WebSocket"]
+ direction TB
+ W0["Vor der Messung
DNS + TCP + echtes TLS
HTTP-Bridge + HELLO/WELCOME + 500 ms"] --> W1["Lokaler Socket bereit
Anfragezeitstempel aktualisiert"]
+ W1 --> W2["Zusätzliche Client-Arbeit
Java / WebView / JavaScript-Warteschlangen
Entferntes OPEN eventuell noch ausstehend"] --> W3["Uplink-Verarbeitung
HTTP-Upload oder WebSocket-Frame
Frontend-Verarbeitung und mögliche Pufferung"]
+ W3 --> W4["Innere MTProxy-Anfrage und Antwort
Ausstehender Relay-Aufbau, Netzwerk, Warteschlangen, Telegram-DC"] --> W5["Downlink-Verarbeitung
HTTP-Poll oder WebSocket-Frame
ACK/Commit-Freigabe und native Zustellwarteschlangen"]
+ W5 --> W6["TL_pong empfangen
Angezeigte Messung beendet"]
+ X["Nur wenn eine weitere Verbindung nötig ist
TCP + TLS, eventuell WebSocket-Upgrade
Kein Handshake pro Ping bei Wiederverwendung"] -.-> W3
+ X -.-> W5
+ R["Nur bei Fehlern oder Überlastung
Retries und Backoff
Retry-After: 1 kann etwa eine Sekunde hinzufügen"] -.-> W3
+ R -.-> W5
+ end
+ classDef preparation fill:#eeeeee,stroke:#666666,color:#111111
+ classDef boundary fill:#dbeafe,stroke:#2563eb,color:#111111
+ classDef shared fill:#dcfce7,stroke:#15803d,color:#111111
+ classDef extra fill:#ffedd5,stroke:#c2410c,color:#111111
+ class N0,W0 preparation
+ class N1,N3,W1,W6 boundary
+ class N2,W4 shared
+ class W2,W3,W5,X,R extra
+```
+
+**Grau:** Arbeit vor der angezeigten Messung. **Blau:** Timer-Grenzen. **Grün:** MTProxy-Relay/DC-Arbeit in beiden Pfaden, deren tatsächliche Dauer abweichen kann. **Orange:** WEB-Transport- und Client-Arbeit innerhalb der Messung. **Gestrichelte Pfeile:** bedingter Verbindungsaufbau oder Retries, keine obligatorischen Phasen.
+
+Bei Wiederverwendung des Carriers entfällt der bedingte TCP/TLS/Upgrade-Aufwand. Framing, HTTP- oder WebSocket-Verarbeitung und Client-Warteschlangen bleiben bestehen. HTTP kann Up- und Downlink überlappen, sodass nicht jede Anfrage zwingend einen ganzen RTT hinzufügt. Polling wird bei verfügbaren Daten geweckt, und Frontend-Pufferung hängt von der Installation ab. Paketverlust, Netzwerküberlastung und Upstream-Aufbau können auch natives MTProxy verzögern.
+
+Die sichtbare Differenz kann somit verbleibenden WEB-Streamaufbau, zusätzliche Verbindungen, Transportverarbeitung und Scheduling sowie belegte Retries enthalten. Sie ist weder ein fester TLS-Zuschlag noch die arithmetische Summe aller Kästen. Der erste echte TLS-Handshake steht bewusst vor dem Android-Timer: Er beeinflusst die Gesamtdauer der Prüfung, normalerweise aber nicht den angezeigten Messwert. Da die Prüfung einen separaten Transport verwendet, garantiert eine aktive App-Verbindung auch keine warme Prüfung in der Proxyliste.
+
## HTTP, WebSocket und weitere Verzögerungen
| Faktor | Auswirkung und Beleg |
diff --git a/docs/WEB/PROXY_PING.en.md b/docs/WEB/PROXY_PING.en.md
index e65b61c..2c37b0a 100644
--- a/docs/WEB/PROXY_PING.en.md
+++ b/docs/WEB/PROXY_PING.en.md
@@ -75,6 +75,44 @@ For a new connection without loss, the usual TCP handshake costs about one clien
Initial bridge TLS normally occurs before Android's measurement. Additional HTTP connections or a WebSocket Upgrade can still occur inside it; connection reuse must be established from a trace. Persistent HTTPS and an established WebSocket do not perform a new TLS handshake for every ping. `cache: 'no-store'` controls caching, not TCP/TLS reuse. Neither disabling certificate checks nor enabling TLS 0-RTT is required to explain or diagnose this behavior. See [HTTP persistence][http1] and [bridge requests][request].
+## Where WEB adds work compared with native MTProxy
+
+The comparison below separates work before the Android timer from work that can enter the displayed sample. The baseline is Classic/DD over TCP. For EE, FakeTLS belongs to native transport setup. Box sizes and arrow lengths do not represent elapsed time.
+
+```mermaid
+flowchart LR
+ subgraph N["Native MTProxy: Classic/DD"]
+ direction TB
+ N0["Before measurement
DNS + TCP + native transport setup"] --> N1["Remote transport ready
Request timestamp refreshed"]
+ N1 --> N2["MTProxy request and response
Relay setup still pending, network, queues, Telegram DC"] --> N3["TL_pong received
Displayed sample ends"]
+ end
+ subgraph W["WEB: MTProxy inside HTTPS or WebSocket"]
+ direction TB
+ W0["Before measurement
DNS + TCP + real TLS
HTTP bridge + HELLO/WELCOME + 500 ms"] --> W1["Local socket ready
Request timestamp refreshed"]
+ W1 --> W2["Extra client work
Java / WebView / JavaScript queues
Remote OPEN may still be pending"] --> W3["Uplink carrier work
HTTP upload or WebSocket frame
Frontend handling and possible buffering"]
+ W3 --> W4["Inner MTProxy request and response
Relay setup still pending, network, queues, Telegram DC"] --> W5["Downlink carrier work
HTTP poll or WebSocket frame
ACK/commit gate, native delivery queues"]
+ W5 --> W6["TL_pong received
Displayed sample ends"]
+ X["Only if another connection is needed
TCP + TLS, possible WebSocket Upgrade
No handshake per ping on a reused connection"] -.-> W3
+ X -.-> W5
+ R["Only on errors or overload
Retries and backoff
Retry-After: 1 can add about one second"] -.-> W3
+ R -.-> W5
+ end
+ classDef preparation fill:#eeeeee,stroke:#666666,color:#111111
+ classDef boundary fill:#dbeafe,stroke:#2563eb,color:#111111
+ classDef shared fill:#dcfce7,stroke:#15803d,color:#111111
+ classDef extra fill:#ffedd5,stroke:#c2410c,color:#111111
+ class N0,W0 preparation
+ class N1,N3,W1,W6 boundary
+ class N2,W4 shared
+ class W2,W3,W5,X,R extra
+```
+
+**Gray:** work before the displayed sample. **Blue:** timer boundaries. **Green:** MTProxy relay/DC work present in both paths, whose actual cost can differ. **Orange:** WEB carrier and client work inside the sample. **Dashed arrows:** conditional connection setup or retries, not obligatory stages.
+
+On a reused carrier, the conditional TCP/TLS/Upgrade cost disappears, while framing, HTTP or WebSocket handling and client queues remain. HTTP can overlap uplink and downlink; it does not necessarily add a whole RTT for every request. Polling wakes on data, and frontend buffering is deployment-dependent. Any delay from loss, congestion or upstream setup may also affect native MTProxy.
+
+Thus the visible difference can include remaining WEB stream setup, additional connection setup, carrier handling and scheduling, plus retries when observed. It is not a fixed TLS surcharge or an arithmetic sum of all boxes. The initial real TLS handshake is shown outside the Android timer deliberately: it affects total time to check, but normally not the displayed sample. The separate checker transport also means that an active app connection does not guarantee a warm proxy-list check.
+
## HTTP, WebSocket and other delay sources
| Factor | Effect and evidence |
diff --git a/docs/WEB/PROXY_PING.ru.md b/docs/WEB/PROXY_PING.ru.md
index ec5afba..fa45cf6 100644
--- a/docs/WEB/PROXY_PING.ru.md
+++ b/docs/WEB/PROXY_PING.ru.md
@@ -75,6 +75,44 @@ sequenceDiagram
Начальный TLS для загрузки моста обычно происходит до измерения Android. Дополнительные HTTP-соединения или WebSocket Upgrade могут оказаться внутри него; повторное использование соединений нужно подтверждать трассировкой. Постоянное HTTPS-соединение и установленный WebSocket не выполняют новый TLS-handshake для каждого ping. `cache: 'no-store'` управляет кешированием, а не повторным использованием TCP/TLS. Для объяснения и диагностики не требуется отключать проверку сертификатов или включать TLS 0-RTT. См. [постоянные HTTP-соединения][http1] и [запросы моста][request].
+## Где WEB добавляет работу относительно обычного MTProxy
+
+На схеме разделены этапы до запуска таймера Android и работа, которая может попасть в показанный результат. Базовый вариант — Classic/DD поверх TCP. Для EE FakeTLS относится к подготовке нативного транспорта. Размеры блоков и длины стрелок не обозначают длительность.
+
+```mermaid
+flowchart LR
+ subgraph N["Обычный MTProxy: Classic/DD"]
+ direction TB
+ N0["До измерения
DNS + TCP + подготовка нативного транспорта"] --> N1["Удалённый транспорт готов
Временная метка запроса обновлена"]
+ N1 --> N2["Запрос и ответ MTProxy
Оставшаяся подготовка relay, сеть, очереди, Telegram DC"] --> N3["Получен TL_pong
Отображаемый замер завершён"]
+ end
+ subgraph W["WEB: MTProxy внутри HTTPS или WebSocket"]
+ direction TB
+ W0["До измерения
DNS + TCP + настоящий TLS
HTTP-мост + HELLO/WELCOME + 500 мс"] --> W1["Локальный сокет готов
Временная метка запроса обновлена"]
+ W1 --> W2["Дополнительная работа клиента
Очереди Java / WebView / JavaScript
Удалённый OPEN ещё может быть не завершён"] --> W3["Работа транспорта на отправке
HTTP upload или кадр WebSocket
Обработка фронтендом и возможная буферизация"]
+ W3 --> W4["Внутренний запрос и ответ MTProxy
Оставшаяся подготовка relay, сеть, очереди, Telegram DC"] --> W5["Работа транспорта на приёме
HTTP poll или кадр WebSocket
Ожидание ACK/commit и очереди доставки в native"]
+ W5 --> W6["Получен TL_pong
Отображаемый замер завершён"]
+ X["Только если нужно ещё одно соединение
TCP + TLS, возможный WebSocket Upgrade
При переиспользовании нет handshake на каждый ping"] -.-> W3
+ X -.-> W5
+ R["Только при ошибках или перегрузке
Повторы и backoff
Retry-After: 1 может добавить около секунды"] -.-> W3
+ R -.-> W5
+ end
+ classDef preparation fill:#eeeeee,stroke:#666666,color:#111111
+ classDef boundary fill:#dbeafe,stroke:#2563eb,color:#111111
+ classDef shared fill:#dcfce7,stroke:#15803d,color:#111111
+ classDef extra fill:#ffedd5,stroke:#c2410c,color:#111111
+ class N0,W0 preparation
+ class N1,N3,W1,W6 boundary
+ class N2,W4 shared
+ class W2,W3,W5,X,R extra
+```
+
+**Серый:** работа до отображаемого замера. **Синий:** границы таймера. **Зелёный:** работа MTProxy relay/DC, присутствующая в обоих путях, но не обязательно одинаковая по длительности. **Оранжевый:** работа WEB-транспорта и клиента внутри замера. **Пунктир:** условные затраты на соединения или повторы, а не обязательные этапы.
+
+При повторном использовании транспорта условные затраты на TCP/TLS/Upgrade исчезают, но остаются формирование кадров, обработка HTTP или WebSocket и очереди клиента. HTTP может совмещать отправку и приём: каждый запрос не обязательно добавляет целый RTT. Polling пробуждается при появлении данных, а буферизация фронтенда зависит от развёртывания. Потери, перегрузка сети и подготовка upstream могут задерживать и обычный MTProxy.
+
+Таким образом, в видимую разницу могут войти оставшееся открытие WEB-потока, дополнительные соединения, обработка транспорта, планирование и подтверждённые повторы. Это не фиксированная надбавка TLS и не арифметическая сумма блоков. Начальный настоящий TLS намеренно показан до таймера Android: он влияет на полное время проверки, но обычно не на отображаемый замер. Отдельный транспорт проверки также означает, что активное соединение приложения не гарантирует прогретую проверку в списке прокси.
+
## HTTP, WebSocket и другие источники задержки
| Фактор | Влияние и подтверждение |