From 0f71cf24b27d08ecc5d3dd7d53f6ddab6a9dd1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?= <108685187+electron-rare@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:49:49 +0100 Subject: [PATCH 1/4] add web controls for wifi reconnect espnow on off and mqtt publish --- data/webui/index.html | 6 +++++ data/webui/script.js | 48 ++++++++++++++++++++++++++++++++++-- src/web/WebServerManager.cpp | 6 +++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/data/webui/index.html b/data/webui/index.html index 2e17a04..27030f8 100644 --- a/data/webui/index.html +++ b/data/webui/index.html @@ -46,6 +46,7 @@
+

@@ -57,6 +58,11 @@
             
             
           
+          
+ + + +

         
 
diff --git a/data/webui/script.js b/data/webui/script.js
index 7584b9a..d718899 100644
--- a/data/webui/script.js
+++ b/data/webui/script.js
@@ -169,6 +169,20 @@ function bindEvents() {
     }
   });
 
+  document.getElementById("wifiReconnectBtn").addEventListener("click", async () => {
+    try {
+      const result = await requestJson("/api/network/wifi/reconnect", {
+        method: "POST",
+        headers: jsonHeaders(),
+        body: "{}",
+      });
+      setJson("actionResult", result);
+      await Promise.all([refreshStatus(), refreshNetwork()]);
+    } catch (error) {
+      setJson("actionResult", { error: error.message });
+    }
+  });
+
   document.getElementById("wifiScanBtn").addEventListener("click", async () => {
     try {
       const result = await requestJson("/api/network/wifi/scan", {
@@ -211,9 +225,33 @@ function bindEvents() {
     }
   });
 
+  document.getElementById("mqttPublishForm").addEventListener("submit", async (event) => {
+    event.preventDefault();
+    const topic = document.getElementById("mqttTopic").value.trim();
+    const payloadRaw = document.getElementById("mqttPayload").value;
+    const payload = parsePayloadValue(payloadRaw);
+    try {
+      const result = await requestJson("/api/network/mqtt/publish", {
+        method: "POST",
+        headers: jsonHeaders(),
+        body: JSON.stringify({ topic, payload }),
+      });
+      setJson("actionResult", result);
+      await Promise.all([refreshStatus(), refreshNetwork()]);
+    } catch (error) {
+      setJson("actionResult", { error: error.message });
+    }
+  });
+
   document.getElementById("espnowOnBtn").addEventListener("click", async () => {
     try {
-      await sendControl("ESPNOW_ON");
+      const result = await requestJson("/api/network/espnow/on", {
+        method: "POST",
+        headers: jsonHeaders(),
+        body: "{}",
+      });
+      setJson("actionResult", result);
+      await Promise.all([refreshStatus(), refreshNetwork()]);
     } catch (error) {
       setJson("actionResult", { error: error.message });
     }
@@ -221,7 +259,13 @@ function bindEvents() {
 
   document.getElementById("espnowOffBtn").addEventListener("click", async () => {
     try {
-      await sendControl("ESPNOW_OFF");
+      const result = await requestJson("/api/network/espnow/off", {
+        method: "POST",
+        headers: jsonHeaders(),
+        body: "{}",
+      });
+      setJson("actionResult", result);
+      await Promise.all([refreshStatus(), refreshNetwork()]);
     } catch (error) {
       setJson("actionResult", { error: error.message });
     }
diff --git a/src/web/WebServerManager.cpp b/src/web/WebServerManager.cpp
index db0e0eb..191cb99 100644
--- a/src/web/WebServerManager.cpp
+++ b/src/web/WebServerManager.cpp
@@ -148,6 +148,8 @@ void WebServerManager::registerRoutes() {
     });
     server_.on("/api/network/wifi/disconnect", HTTP_POST,
                [this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_DISCONNECT"); });
+    server_.on("/api/network/wifi/reconnect", HTTP_POST,
+               [this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_RECONNECT"); });
     server_.on("/api/network/wifi/scan", HTTP_POST,
                [this](AsyncWebServerRequest* request) { handleDispatch(request, "WIFI_SCAN"); });
 
@@ -176,6 +178,10 @@ void WebServerManager::registerRoutes() {
     // ESP-NOW.
     server_.on("/api/network/espnow", HTTP_GET,
                [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_STATUS"); });
+    server_.on("/api/network/espnow/on", HTTP_POST,
+               [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_ON"); });
+    server_.on("/api/network/espnow/off", HTTP_POST,
+               [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_OFF"); });
     server_.on("/api/network/espnow/peer", HTTP_GET,
                [this](AsyncWebServerRequest* request) { handleDispatch(request, "ESPNOW_PEER_LIST"); });
     server_.on("/api/network/espnow/peer", HTTP_POST, [this](AsyncWebServerRequest* request) {

From 4f857b4dd4a7b12387a4e334f1513646841e9b59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
 <108685187+electron-rare@users.noreply.github.com>
Date: Fri, 20 Feb 2026 23:57:24 +0100
Subject: [PATCH 2/4] fix mqtt web publish payload serialization for firmware
 api

---
 data/webui/script.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/data/webui/script.js b/data/webui/script.js
index d718899..f664b66 100644
--- a/data/webui/script.js
+++ b/data/webui/script.js
@@ -228,8 +228,7 @@ function bindEvents() {
   document.getElementById("mqttPublishForm").addEventListener("submit", async (event) => {
     event.preventDefault();
     const topic = document.getElementById("mqttTopic").value.trim();
-    const payloadRaw = document.getElementById("mqttPayload").value;
-    const payload = parsePayloadValue(payloadRaw);
+    const payload = document.getElementById("mqttPayload").value;
     try {
       const result = await requestJson("/api/network/mqtt/publish", {
         method: "POST",

From f25bc30fca5ba8b6dacf4ea4daeff6588d1d22eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
 <108685187+electron-rare@users.noreply.github.com>
Date: Sat, 21 Feb 2026 00:00:13 +0100
Subject: [PATCH 3/4] harden bt scan mode and refresh hardware validation
 reports

---
 docs/rapport_ble_mac.json                |  48 +++
 docs/rapport_hfp_mac.json                | 123 ++++++
 docs/rapport_hfp_pairing_assiste.json    | 512 +++++++++++++++++++++++
 docs/rapport_hfp_pairing_assiste_v2.json | 512 +++++++++++++++++++++++
 docs/rapport_hw.json                     |  86 ++--
 docs/rapport_tests_fonctionnels.md       |  18 +-
 src/bluetooth/BluetoothManager.cpp       |   3 +-
 7 files changed, 1262 insertions(+), 40 deletions(-)
 create mode 100644 docs/rapport_ble_mac.json
 create mode 100644 docs/rapport_hfp_mac.json
 create mode 100644 docs/rapport_hfp_pairing_assiste.json
 create mode 100644 docs/rapport_hfp_pairing_assiste_v2.json

diff --git a/docs/rapport_ble_mac.json b/docs/rapport_ble_mac.json
new file mode 100644
index 0000000..b25813a
--- /dev/null
+++ b/docs/rapport_ble_mac.json
@@ -0,0 +1,48 @@
+{
+  "timestamp_utc": "2026-02-20T20:47:49.473689+00:00",
+  "serial": {
+    "ping": "PONG",
+    "ble_start": "OK BT_BLE_START",
+    "bt_status_after_start": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"advertising\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+  },
+  "ble": {
+    "scan": [
+      {
+        "name": "Withings Aura 5E",
+        "address": "9214040A-F54E-37AC-4B4B-F609F94ECB5E",
+        "rssi": null
+      },
+      {
+        "name": "Bagage de Clément",
+        "address": "8E6D24D4-22CE-C8FC-FC6F-01090C567679",
+        "rssi": null
+      },
+      {
+        "name": "RTC_BL_PHONE_A252",
+        "address": "3DD63766-AF90-14D9-7964-F37AE7FB0704",
+        "rssi": null
+      },
+      {
+        "name": "Uscan 42",
+        "address": "98923C99-1897-8665-7EE6-647A96924DB7",
+        "rssi": null
+      },
+      {
+        "name": "GSM de clemsail",
+        "address": "CFCE5495-5537-1F54-1A77-7CF8CEC57FF3",
+        "rssi": null
+      }
+    ],
+    "target": {
+      "name": "RTC_BL_PHONE_A252",
+      "address": "3DD63766-AF90-14D9-7964-F37AE7FB0704"
+    },
+    "connected": true,
+    "services": [
+      "8fce0001-93ea-4f8f-8bde-4e8f0ea20001"
+    ],
+    "has_service": true,
+    "status_initial_raw": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":true,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"client_connected\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+    "status_after_ping_raw": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":true,\"ble_client_connected\":true,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"cmd\",\"last_error\":\"\",\"ble_last_command\":\"PING\",\"ble_last_response\":\"PONG\"}"
+  }
+}
diff --git a/docs/rapport_hfp_mac.json b/docs/rapport_hfp_mac.json
new file mode 100644
index 0000000..5bda198
--- /dev/null
+++ b/docs/rapport_hfp_mac.json
@@ -0,0 +1,123 @@
+{
+  "timestamp_utc": "2026-02-20T20:48:25.147633+00:00",
+  "hfp_mac": "B4:1B:B0:84:73:06",
+  "steps": {
+    "ping": {
+      "result": "PONG",
+      "lines": [
+        "[AudioEngine] ready (full_duplex=true)",
+        "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+        "[WebServerManager] HTTP server started",
+        "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+        "[RTC_BL_PHONE] Commands:",
+        "PING",
+        "HELP",
+        "STATUS",
+        "CALL",
+        "CAPTURE_START",
+        "CAPTURE_STOP",
+        "PLAY",
+        "RESET_METRICS",
+        "WIFI_CONNECT",
+        "WIFI_DISCONNECT",
+        "WIFI_STATUS",
+        "WIFI_SCAN",
+        "WIFI_RECONNECT",
+        "MQTT_CONFIG_SET",
+        "MQTT_CONNECT",
+        "MQTT_DISCONNECT",
+        "MQTT_STATUS",
+        "MQTT_PUB",
+        "ESPNOW_PEER_ADD",
+        "ESPNOW_PEER_DEL",
+        "ESPNOW_PEER_LIST",
+        "ESPNOW_STATUS",
+        "ESPNOW_SEND",
+        "BT_HFP_CONNECT",
+        "BT_HFP_DISCONNECT",
+        "BT_BLE_START",
+        "BT_BLE_STOP",
+        "BT_STATUS",
+        "SLIC_CONFIG_GET",
+        "SLIC_CONFIG_SET",
+        "AUDIO_CONFIG_GET",
+        "AUDIO_CONFIG_SET",
+        "PONG"
+      ]
+    },
+    "bt_status_before": {
+      "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+      "lines": [
+        "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      ]
+    },
+    "hfp_connect_cmd": {
+      "result": "OK BT_HFP_CONNECT",
+      "lines": [
+        "OK BT_HFP_CONNECT"
+      ]
+    },
+    "hfp_status_poll": [
+      {
+        "t": 0,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 2,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 4,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 6,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 8,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 10,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 12,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 14,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 16,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 18,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 20,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      },
+      {
+        "t": 22,
+        "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      }
+    ],
+    "hfp_disconnect_cmd": {
+      "result": "OK BT_HFP_DISCONNECT",
+      "lines": [
+        "OK BT_HFP_DISCONNECT"
+      ]
+    },
+    "bt_status_after": {
+      "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+      "lines": [
+        "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+      ]
+    }
+  }
+}
diff --git a/docs/rapport_hfp_pairing_assiste.json b/docs/rapport_hfp_pairing_assiste.json
new file mode 100644
index 0000000..d19dbb5
--- /dev/null
+++ b/docs/rapport_hfp_pairing_assiste.json
@@ -0,0 +1,512 @@
+{
+  "timestamp_utc": "2026-02-20T20:51:14.060839+00:00",
+  "target": "B4:1B:B0:84:73:06",
+  "attempts": [
+    {
+      "attempt": 1,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "[AudioEngine] ready (full_duplex=true)",
+              "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+              "[WebServerManager] HTTP server started",
+              "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+              "[RTC_BL_PHONE] Commands:",
+              "PING",
+              "HELP",
+              "STATUS",
+              "CALL",
+              "CAPTURE_START",
+              "CAPTURE_STOP",
+              "PLAY",
+              "RESET_METRICS",
+              "WIFI_CONNECT",
+              "WIFI_DISCONNECT",
+              "WIFI_STATUS",
+              "WIFI_SCAN",
+              "WIFI_RECONNECT",
+              "MQTT_CONFIG_SET",
+              "MQTT_CONNECT",
+              "MQTT_DISCONNECT",
+              "MQTT_STATUS",
+              "MQTT_PUB",
+              "ESPNOW_PEER_ADD",
+              "ESPNOW_PEER_DEL",
+              "ESPNOW_PEER_LIST",
+              "ESPNOW_STATUS",
+              "ESPNOW_SEND",
+              "BT_HFP_CONNECT",
+              "BT_HFP_DISCONNECT",
+              "BT_BLE_START",
+              "BT_BLE_STOP",
+              "BT_STATUS",
+              "SLIC_CONFIG_GET",
+              "SLIC_CONFIG_SET",
+              "AUDIO_CONFIG_GET",
+              "AUDIO_CONFIG_SET",
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": true,
+      "slc_or_audio": false
+    },
+    {
+      "attempt": 2,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"78:4F:43:8A:0F:3E\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":true,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"rfcomm_connected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": true,
+      "slc_or_audio": false
+    },
+    {
+      "attempt": 3,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": false,
+      "slc_or_audio": false
+    }
+  ],
+  "success": false
+}
diff --git a/docs/rapport_hfp_pairing_assiste_v2.json b/docs/rapport_hfp_pairing_assiste_v2.json
new file mode 100644
index 0000000..5adb342
--- /dev/null
+++ b/docs/rapport_hfp_pairing_assiste_v2.json
@@ -0,0 +1,512 @@
+{
+  "timestamp_utc": "2026-02-20T20:57:01.244699+00:00",
+  "target": "B4:1B:B0:84:73:06",
+  "attempts": [
+    {
+      "attempt": 1,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "[AudioEngine] ready (full_duplex=true)",
+              "[RTC_BL_PHONE] HW init slic=ok codec=ok audio=ok",
+              "[WebServerManager] HTTP server started",
+              "[RTC_BL_PHONE] Boot: profile=ESP32_A252 bt_classic=true full_duplex=true",
+              "[RTC_BL_PHONE] Commands:",
+              "PING",
+              "HELP",
+              "STATUS",
+              "CALL",
+              "CAPTURE_START",
+              "CAPTURE_STOP",
+              "PLAY",
+              "RESET_METRICS",
+              "WIFI_CONNECT",
+              "WIFI_DISCONNECT",
+              "WIFI_STATUS",
+              "WIFI_SCAN",
+              "WIFI_RECONNECT",
+              "MQTT_CONFIG_SET",
+              "MQTT_CONNECT",
+              "MQTT_DISCONNECT",
+              "MQTT_STATUS",
+              "MQTT_PUB",
+              "ESPNOW_PEER_ADD",
+              "ESPNOW_PEER_DEL",
+              "ESPNOW_PEER_LIST",
+              "ESPNOW_STATUS",
+              "ESPNOW_SEND",
+              "BT_HFP_CONNECT",
+              "BT_HFP_DISCONNECT",
+              "BT_BLE_START",
+              "BT_BLE_STOP",
+              "BT_STATUS",
+              "SLIC_CONFIG_GET",
+              "SLIC_CONFIG_SET",
+              "AUDIO_CONFIG_GET",
+              "AUDIO_CONFIG_SET",
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"\",\"last_hfp_event\":\"initialized\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"audio_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": false,
+      "slc_or_audio": false
+    },
+    {
+      "attempt": 2,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": false,
+      "slc_or_audio": false
+    },
+    {
+      "attempt": 3,
+      "steps": [
+        {
+          "cmd": "BT_STATUS",
+          "resp": {
+            "result": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}",
+            "lines": [
+              "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":false,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnect_requested\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_CONNECT",
+          "resp": {
+            "result": "OK BT_HFP_CONNECT",
+            "lines": [
+              "OK BT_HFP_CONNECT"
+            ]
+          }
+        },
+        {
+          "cmd": "BT_HFP_DISCONNECT",
+          "resp": {
+            "result": "OK BT_HFP_DISCONNECT",
+            "lines": [
+              "OK BT_HFP_DISCONNECT"
+            ]
+          }
+        }
+      ],
+      "timeline": [
+        {
+          "t_sec": 0,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 2,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 4,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 6,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 8,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 10,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 12,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 14,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 16,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 18,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 20,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 22,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 24,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 26,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 28,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 30,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 32,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 34,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 36,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 38,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 40,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 42,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 44,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 46,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 48,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 50,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 52,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 54,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 56,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        },
+        {
+          "t_sec": 58,
+          "resp": "{\"stack_ready\":true,\"connected\":false,\"hfp_active\":false,\"hfp_requested\":true,\"ble_active\":false,\"ble_client_connected\":false,\"security_enabled\":false,\"peer\":\"B4:1B:B0:84:73:06\",\"last_hfp_event\":\"disconnected\",\"last_ble_event\":\"initialized\",\"last_error\":\"\",\"ble_last_command\":\"\",\"ble_last_response\":\"\"}"
+        }
+      ],
+      "connected": false,
+      "slc_or_audio": false
+    }
+  ],
+  "success": false
+}
diff --git a/docs/rapport_hw.json b/docs/rapport_hw.json
index fb9668f..85a71cf 100644
--- a/docs/rapport_hw.json
+++ b/docs/rapport_hw.json
@@ -1,6 +1,6 @@
 {
-  "timestamp_utc": "2026-02-20T20:33:53.045753+00:00",
-  "overall_passed": false,
+  "timestamp_utc": "2026-02-20T20:49:57.303991+00:00",
+  "overall_passed": true,
   "results": [
     {
       "name": "serial_smoke",
@@ -34,7 +34,7 @@
             "has_credentials": true,
             "ssid": "Les cils",
             "ip": "192.168.0.103",
-            "rssi": -79,
+            "rssi": -71,
             "state": "connected",
             "ap_active": false,
             "ap_ssid": "",
@@ -59,11 +59,19 @@
             "peers": []
           },
           "bluetooth": {
+            "stack_ready": true,
             "connected": false,
             "hfp_active": false,
+            "hfp_requested": false,
             "ble_active": false,
+            "ble_client_connected": false,
             "security_enabled": false,
-            "peer": ""
+            "peer": "",
+            "last_hfp_event": "initialized",
+            "last_ble_event": "initialized",
+            "last_error": "",
+            "ble_last_command": "",
+            "ble_last_response": ""
           },
           "config": {
             "pins": {
@@ -131,7 +139,7 @@
           "has_credentials": true,
           "ssid": "Les cils",
           "ip": "192.168.0.103",
-          "rssi": -79,
+          "rssi": -72,
           "state": "connected",
           "ap_active": false,
           "ap_ssid": "",
@@ -143,37 +151,31 @@
           "networks": [
             {
               "ssid": "Les cils",
-              "rssi": -57,
+              "rssi": -52,
               "chan": 11,
               "enc": 4
             },
-            {
-              "ssid": "CILS House",
-              "rssi": -69,
-              "chan": 9,
-              "enc": 7
-            },
             {
               "ssid": "Les cils",
-              "rssi": -72,
+              "rssi": -71,
               "chan": 6,
               "enc": 3
             },
             {
               "ssid": "Les cils",
-              "rssi": -78,
+              "rssi": -71,
               "chan": 1,
               "enc": 4
             },
             {
               "ssid": "La-clic",
-              "rssi": -85,
+              "rssi": -90,
               "chan": 1,
               "enc": 3
             },
             {
               "ssid": "venus-HQ203587TYP-031",
-              "rssi": -87,
+              "rssi": -90,
               "chan": 1,
               "enc": 3
             }
@@ -188,7 +190,7 @@
           "has_credentials": true,
           "ssid": "Les cils",
           "ip": "192.168.0.103",
-          "rssi": -79,
+          "rssi": -72,
           "state": "connected",
           "ap_active": false,
           "ap_ssid": "",
@@ -220,11 +222,19 @@
           "peers": []
         },
         "bt_status": {
+          "stack_ready": true,
           "connected": false,
           "hfp_active": false,
+          "hfp_requested": false,
           "ble_active": false,
+          "ble_client_connected": false,
           "security_enabled": false,
-          "peer": ""
+          "peer": "",
+          "last_hfp_event": "initialized",
+          "last_ble_event": "initialized",
+          "last_error": "",
+          "ble_last_command": "",
+          "ble_last_response": ""
         }
       }
     },
@@ -257,7 +267,7 @@
             "has_credentials": true,
             "ssid": "Les cils",
             "ip": "192.168.0.103",
-            "rssi": -82,
+            "rssi": -77,
             "state": "connected",
             "ap_active": false,
             "ap_ssid": "",
@@ -282,11 +292,19 @@
             "peers": []
           },
           "bluetooth": {
+            "stack_ready": true,
             "connected": false,
             "hfp_active": false,
+            "hfp_requested": false,
             "ble_active": false,
+            "ble_client_connected": false,
             "security_enabled": false,
-            "peer": ""
+            "peer": "",
+            "last_hfp_event": "initialized",
+            "last_ble_event": "initialized",
+            "last_error": "",
+            "ble_last_command": "",
+            "ble_last_response": ""
           },
           "config": {
             "pins": {
@@ -332,7 +350,7 @@
           "has_credentials": true,
           "ssid": "Les cils",
           "ip": "192.168.0.103",
-          "rssi": -73,
+          "rssi": -70,
           "state": "connected",
           "ap_active": false,
           "ap_ssid": "",
@@ -364,11 +382,19 @@
           "peers": []
         },
         "bluetooth": {
+          "stack_ready": true,
           "connected": false,
           "hfp_active": false,
+          "hfp_requested": false,
           "ble_active": false,
+          "ble_client_connected": false,
           "security_enabled": false,
-          "peer": ""
+          "peer": "",
+          "last_hfp_event": "initialized",
+          "last_ble_event": "initialized",
+          "last_error": "",
+          "ble_last_command": "",
+          "ble_last_response": ""
         },
         "control_call": {
           "ok": true,
@@ -378,30 +404,30 @@
     },
     {
       "name": "manual_hook_transition",
-      "state": "MANUAL_FAIL",
+      "state": "MANUAL_SKIP",
       "details": {
-        "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+        "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
       }
     },
     {
       "name": "manual_ring_behavior",
-      "state": "MANUAL_PASS",
+      "state": "MANUAL_SKIP",
       "details": {
-        "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+        "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
       }
     },
     {
       "name": "manual_audio_path",
-      "state": "MANUAL_FAIL",
+      "state": "MANUAL_SKIP",
       "details": {
-        "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+        "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
       }
     },
     {
       "name": "manual_hfp_pairing",
-      "state": "MANUAL_FAIL",
+      "state": "MANUAL_SKIP",
       "details": {
-        "note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"
+        "note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"
       }
     }
   ]
diff --git a/docs/rapport_tests_fonctionnels.md b/docs/rapport_tests_fonctionnels.md
index 34fc126..f22e105 100644
--- a/docs/rapport_tests_fonctionnels.md
+++ b/docs/rapport_tests_fonctionnels.md
@@ -1,14 +1,14 @@
 # Rapport validation HW (A252)
 
-- Date UTC: 2026-02-20T20:33:53.045753+00:00
-- Verdict global: FAIL
+- Date UTC: 2026-02-20T20:49:57.303991+00:00
+- Verdict global: PASS
 
 | Scénario | État | Détails |
 |---|---|---|
-| serial_smoke | PASS | `{"ping": {"ok": true, "result": "PONG"}, "status": {"board_profile": "ESP32_A252", "telephony": {"state": "IDLE", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "call": {"ok": true, "line": "OK CALL"}, "capture_start": {"ok": true, "line": "OK CAPTURE_START"}, "capture_stop": {"ok": true, "line": "OK CAPTURE_STOP"}, "reset_metrics": {"ok": true, "line": "OK RESET_METRICS"}}` |
-| serial_network_stack | PASS | `{"wifi_status_before": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "wifi_scan": {"ok": true, "networks": [{"ssid": "Les cils", "rssi": -57, "chan": 11, "enc": 4}, {"ssid": "CILS House", "rssi": -69, "chan": 9, "enc": 7}, {"ssid": "Les cils", "rssi": -72, "chan": 6, "enc": 3}, {"ssid": "Les cils", "rssi": -78, "chan": 1, "enc": 4}, {"ssid": "La-clic", "rssi": -85, "chan": 1, "enc": 3}, {"ssid": "venus-HQ203587TYP-031", "rssi": -87, "chan": 1, "enc": 3}]}, "wifi_connect": {"ok": true, "line": "SKIP WIFI_CONNECT already_connected"}, "wifi_status_after": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -79, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt_status": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow_status": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bt_status": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}}` |
-| http_endpoints | PASS | `{"base_url": "http://192.168.0.103", "status": {"board_profile": "ESP32_A252", "telephony": {"state": "RINGING", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -82, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -73, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"connected": false, "hfp_active": false, "ble_active": false, "security_enabled": false, "peer": ""}, "control_call": {"ok": true, "code": "CALL"}}` |
-| manual_hook_transition | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_ring_behavior | MANUAL_PASS | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_audio_path | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
-| manual_hfp_pairing | MANUAL_FAIL | `{"note": "manual terminal run: voir docs/rapport_manual_terminal_bt.json + .md"}` |
+| serial_smoke | PASS | `{"ping": {"ok": true, "result": "PONG"}, "status": {"board_profile": "ESP32_A252", "telephony": {"state": "IDLE", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -71, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"stack_ready": true, "connected": false, "hfp_active": false, "hfp_requested": false, "ble_active": false, "ble_client_connected": false, "security_enabled": false, "peer": "", "last_hfp_event": "initialized", "last_ble_event": "initialized", "last_error": "", "ble_last_command": "", "ble_last_response": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "call": {"ok": true, "line": "OK CALL"}, "capture_start": {"ok": true, "line": "OK CAPTURE_START"}, "capture_stop": {"ok": true, "line": "OK CAPTURE_STOP"}, "reset_metrics": {"ok": true, "line": "OK RESET_METRICS"}}` |
+| serial_network_stack | PASS | `{"wifi_status_before": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -72, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "wifi_scan": {"ok": true, "networks": [{"ssid": "Les cils", "rssi": -52, "chan": 11, "enc": 4}, {"ssid": "Les cils", "rssi": -71, "chan": 6, "enc": 3}, {"ssid": "Les cils", "rssi": -71, "chan": 1, "enc": 4}, {"ssid": "La-clic", "rssi": -90, "chan": 1, "enc": 3}, {"ssid": "venus-HQ203587TYP-031", "rssi": -90, "chan": 1, "enc": 3}]}, "wifi_connect": {"ok": true, "line": "SKIP WIFI_CONNECT already_connected"}, "wifi_status_after": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -72, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt_status": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow_status": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bt_status": {"stack_ready": true, "connected": false, "hfp_active": false, "hfp_requested": false, "ble_active": false, "ble_client_connected": false, "security_enabled": false, "peer": "", "last_hfp_event": "initialized", "last_ble_event": "initialized", "last_error": "", "ble_last_command": "", "ble_last_response": ""}}` |
+| http_endpoints | PASS | `{"base_url": "http://192.168.0.103", "status": {"board_profile": "ESP32_A252", "telephony": {"state": "RINGING", "hook": "ON_HOOK"}, "audio_frames_requested": 0, "audio_frames_read": 0, "audio_drop_frames": 0, "audio_underrun_count": 0, "audio_last_latency_ms": 0, "audio_max_latency_ms": 0, "audio": {"full_duplex": true, "frames": 0, "underrun": 0, "drop": 0, "latence_ms": 0}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -77, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"stack_ready": true, "connected": false, "hfp_active": false, "hfp_requested": false, "ble_active": false, "ble_client_connected": false, "security_enabled": false, "peer": "", "last_hfp_event": "initialized", "last_ble_event": "initialized", "last_error": "", "ble_last_command": "", "ble_last_response": ""}, "config": {"pins": {"i2s": {"bck": 27, "ws": 25, "dout": 26, "din": 35}, "codec_i2c": {"sda": 33, "scl": 32}, "slic": {"rm": 22, "fr": 19, "shk": 36, "line": 23, "pd": 18, "hook_active_high": false}}, "audio": {"sample_rate": 16000, "bits_per_sample": 16, "enable_capture": true, "volume": 80, "mute": false, "route": "rtc"}, "mqtt": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}, "espnow_peers": []}}, "wifi": {"connected": true, "has_credentials": true, "ssid": "Les cils", "ip": "192.168.0.103", "rssi": -70, "state": "connected", "ap_active": false, "ap_ssid": "", "ap_ip": "0.0.0.0", "mode": "sta"}, "mqtt": {"enabled": false, "connected": false, "host": "", "port": 1883, "base_topic": "rtc_bl_phone/a252", "reconnect_attempts": 0, "config": {"enabled": false, "host": "", "port": 1883, "user": "", "base_topic": "rtc_bl_phone/a252"}}, "espnow": {"ready": true, "peer_count": 0, "tx_ok": 0, "tx_fail": 0, "rx_count": 0, "last_rx_mac": "", "peers": []}, "bluetooth": {"stack_ready": true, "connected": false, "hfp_active": false, "hfp_requested": false, "ble_active": false, "ble_client_connected": false, "security_enabled": false, "peer": "", "last_hfp_event": "initialized", "last_ble_event": "initialized", "last_error": "", "ble_last_command": "", "ble_last_response": ""}, "control_call": {"ok": true, "code": "CALL"}}` |
+| manual_hook_transition | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_ring_behavior | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_audio_path | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
+| manual_hfp_pairing | MANUAL_SKIP | `{"note": "BLE real + HFP stack real test reports: docs/rapport_ble_mac.json docs/rapport_hfp_mac.json"}` |
diff --git a/src/bluetooth/BluetoothManager.cpp b/src/bluetooth/BluetoothManager.cpp
index 503042a..0f0ee85 100644
--- a/src/bluetooth/BluetoothManager.cpp
+++ b/src/bluetooth/BluetoothManager.cpp
@@ -445,7 +445,8 @@ bool BluetoothManager::ensureBtStackReady() {
     memset(pin_code, 0, sizeof(pin_code));
     memcpy(pin_code, kLegacyPinCode, strlen(kLegacyPinCode));
     esp_bt_gap_set_pin(ESP_BT_PIN_TYPE_FIXED, 4, pin_code);
-    esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
+    // Keep classic BT connectable for outbound HFP while avoiding random inbound ACL grabs.
+    esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
 
     stack_ready_ = true;
     notifyBluetooth("stack_ready");

From 3aa5ee27951bd46020c8a541b912ab4559bc4f1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20SAILLANT?=
 <108685187+electron-rare@users.noreply.github.com>
Date: Sat, 21 Feb 2026 00:17:33 +0100
Subject: [PATCH 4/4] add web route parity gate for webui/backend

---
 .github/workflows/ci.yml          |   7 +-
 scripts/check_web_route_parity.py | 121 ++++++++++++++++++++++++++++++
 scripts/test_terminal.sh          |   3 +
 3 files changed, 129 insertions(+), 2 deletions(-)
 create mode 100755 scripts/check_web_route_parity.py

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aacbbab..145e88e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,9 +2,9 @@ name: Firmware CI
 
 on:
   push:
-    branches: [main, develop, dev]
+    branches: [main, develop, dev, audit/**]
   pull_request:
-    branches: [main, develop, dev]
+    branches: [main, develop, dev, audit/**]
 
 jobs:
   build-and-test:
@@ -19,6 +19,9 @@ jobs:
         with:
           python-version: "3.11"
 
+      - name: Check Web Route Parity
+        run: python3 scripts/check_web_route_parity.py
+
       - name: Install PlatformIO
         run: |
           python -m pip install --upgrade pip
diff --git a/scripts/check_web_route_parity.py b/scripts/check_web_route_parity.py
new file mode 100755
index 0000000..05e0764
--- /dev/null
+++ b/scripts/check_web_route_parity.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+"""Check parity between backend API routes and WebUI API calls."""
+
+from __future__ import annotations
+
+import argparse
+import re
+import sys
+from pathlib import Path
+from typing import Iterable
+
+
+Route = tuple[str, str]
+
+BACKEND_ROUTE_RE = re.compile(
+    r'server_\.on\(\s*"(?P/api/[^"]+)"\s*,\s*HTTP_(?P[A-Z]+)'
+)
+FRONTEND_CALL_RE = re.compile(
+    r'requestJson\(\s*["\'](?P/api/[^"\']+)["\'](?P.*?)\);',
+    re.DOTALL,
+)
+METHOD_RE = re.compile(r'method\s*:\s*["\'](?P[A-Z]+)["\']')
+
+
+def parse_backend_routes(source: str) -> set[Route]:
+    routes: set[Route] = set()
+    for match in BACKEND_ROUTE_RE.finditer(source):
+        method = match.group("method").upper()
+        path = match.group("path")
+        routes.add((method, path))
+    return routes
+
+
+def parse_frontend_routes(source: str) -> set[Route]:
+    routes: set[Route] = set()
+    for match in FRONTEND_CALL_RE.finditer(source):
+        path = match.group("path")
+        args = match.group("args")
+        method_match = METHOD_RE.search(args)
+        method = method_match.group("method").upper() if method_match else "GET"
+        routes.add((method, path))
+    return routes
+
+
+def format_routes(routes: Iterable[Route]) -> str:
+    ordered = sorted(routes, key=lambda route: (route[1], route[0]))
+    return "\n".join(f"  - {method} {path}" for method, path in ordered)
+
+
+def load_text(path: Path) -> str:
+    try:
+        return path.read_text(encoding="utf-8")
+    except FileNotFoundError:
+        print(f"[route-parity] missing file: {path}", file=sys.stderr)
+        raise
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser(
+        description="Validate that every WebUI API call is backed by a firmware HTTP route."
+    )
+    parser.add_argument(
+        "--backend",
+        default="src/web/WebServerManager.cpp",
+        help="Path to backend route source file.",
+    )
+    parser.add_argument(
+        "--frontend",
+        default="data/webui/script.js",
+        help="Path to frontend source file.",
+    )
+    parser.add_argument(
+        "--strict-unused-backend",
+        action="store_true",
+        help="Fail if backend API routes are not used by the WebUI.",
+    )
+    args = parser.parse_args()
+
+    backend_path = Path(args.backend)
+    frontend_path = Path(args.frontend)
+    backend_source = load_text(backend_path)
+    frontend_source = load_text(frontend_path)
+
+    backend_routes = parse_backend_routes(backend_source)
+    frontend_routes = parse_frontend_routes(frontend_source)
+
+    if not backend_routes:
+        print("[route-parity] no backend /api routes detected", file=sys.stderr)
+        return 2
+    if not frontend_routes:
+        print("[route-parity] no frontend /api requestJson() calls detected", file=sys.stderr)
+        return 2
+
+    missing_in_backend = frontend_routes - backend_routes
+    unused_backend = backend_routes - frontend_routes
+
+    print(
+        f"[route-parity] backend routes: {len(backend_routes)} | frontend routes: {len(frontend_routes)}"
+    )
+
+    if missing_in_backend:
+        print("[route-parity] missing backend routes for frontend calls:", file=sys.stderr)
+        print(format_routes(missing_in_backend), file=sys.stderr)
+        return 1
+
+    if unused_backend:
+        message = "[route-parity] backend routes currently unused by WebUI:"
+        output = format_routes(unused_backend)
+        if args.strict_unused_backend:
+            print(message, file=sys.stderr)
+            print(output, file=sys.stderr)
+            return 1
+        print(message)
+        print(output)
+
+    print("[route-parity] parity check passed")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/scripts/test_terminal.sh b/scripts/test_terminal.sh
index f23f2db..881a812 100755
--- a/scripts/test_terminal.sh
+++ b/scripts/test_terminal.sh
@@ -12,4 +12,7 @@ mkdir -p .pio/host
 c++ -std=c++17 -Wall -Wextra -pedantic -Isrc test/host/test_dtmf_host.cpp src/telephony/DtmfDecoder.cpp -o .pio/host/test_dtmf_host
 .pio/host/test_dtmf_host
 
+echo "[test_terminal] check web route parity"
+python3 scripts/check_web_route_parity.py
+
 echo "[test_terminal] all checks passed"