docs(domain G): v2 — связь/телефон (Connectivity+Phone), после adversarial-ревью (15 находок) + кросс-док

Новый домен G: Connectivity-core (WiFi/LTE/tethering + BT-адаптер/паринг) +
Phone-ап (HFP-звонки/контакты). Многоагентный adversarial-ревью: 24 находки,
15 подтверждено (default-refute; tech-измерение — 0, техника устояла), все применены.

Ключевое из ревью:
- BT-шов резолвнут двунаправленно: владелец BlueZ — Connectivity-core (G §3 ↔ H §6/§15 ).
- Граница голоса: только HFP спаренного телефона; встроенный модем — data-only (VoLTE/eCall вне скоупа).
- SIM PIN/PUK-флоу (sim_locked/no_sim) + captive-portal детект (portal/limited, не ложный online) — модем v1.
- Connectivity поднимается на Stage 2 (синхр. с architecture §6).
- Мультипаринг: ровно один active-телефон для HFP/PBAP (Dial/CallStateChanged однозначны).
- SCO-loss mid-call → CallState=audio_lost + снятие роли phone_call → H раскорчивает медиа (не залипает).
- Входящий-оверлей не перекрывает реверс-вид (z-order overlay-слота → C); tethering-петля AP+tether запрещена.
- PBAP-синк фоновый; отказ-пути паринга/no_service симметрично J/H.

Кросс-док: H §6/§15 (BlueZ ) + якоря D §147/§148→§10; architecture §3 (Connectivity+BT)
/§6 (Stage 2); ipc §3 (Type+tether, State enum, CallState=audio_lost); security-privacy §7
(контакты/журнал/SMS local-first); hardware §4 (Bluetooth); tech-stack (NM/MM/BlueZ);
C §11 (z-order overlay).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 19:08:52 +03:00
parent 77d9a5a0ee
commit fb4e585152
8 changed files with 245 additions and 12 deletions
+8 -7
View File
@@ -78,7 +78,7 @@ capture-нода не «дакает» вывод; дакает медиа им
intra-role, состояние для UI) — компонент Media-апа, подписан на `Assistant.StateChanged`/`Phone`/`Nav`/
`Power` (ipc §34). До Media-апа (v1) хватает статической политики + ролей ассистента.
## 4. AEC и loopback-референс *(резолв D §147)*
## 4. AEC и loopback-референс *(резолв D §10)*
- H **публикует monitor/loopback-tap смешанного выхода** как референс для эхоподавления (без него
wake-word во время воспроизведения и barge-in невозможны).
@@ -86,8 +86,8 @@ capture-нода не «дакает» вывод; дакает медиа им
пути capture микрофона; референс — monitor-порты выхода. **Не внутри ассистента** (D потребляет уже
очищенную capture-ноду). *(`module-echo-cancel` — отдельный модуль PipeWire, не `module-filter-chain`:
последний — иной механизм (граф LADSPA/LV2/builtin), пригоден лишь для опц. кастомного денойза.)*
→ закрывает «место AEC (в audio-plane vs внутри ассистента)» из D §147 в пользу audio-plane.
- Beamforming/денойз салона (D §148) — отдельно (mic-массив, hardware); AEC ≠ денойз.
→ закрывает «место AEC (в audio-plane vs внутри ассистента)» из D §10 в пользу audio-plane.
- Beamforming/денойз салона (D §10) — отдельно (mic-массив, hardware); AEC ≠ денойз.
## 5. Локальное аудио
@@ -113,7 +113,8 @@ capture-нода не «дакает» вывод; дакает медиа им
**cork/пауза транспорта + auto-resume по реконнекту**, не крэш, видимая индикация.
- **Шов с G/Connectivity:** BT-адаптер, паринг и профиль **HFP** (звонок) — **не H** (домен G/Connectivity).
H цепляет A2DP/AVRCP к уже спаренному устройству. Сосуществование A2DP↔HFP на одном устройстве — через
политику (§3): входящий `phone_call` корчит A2DP-`media`. Владелец BlueZ — ◻️ (§15, с G).
политику (§3): входящий `phone_call` корчит A2DP-`media`. Владелец BlueZ-адаптера/паринга —
Connectivity-core (домен G, резолв G §3); сосуществование A2DP↔HFP — политика §3.
- **Проекция (CarPlay/Android Auto)** несёт свои медиа+звонок — её аудио идёт ролями `projection`/`phone_call`;
контроль/протокол проекции — **G**. H лишь маршрутизирует звук по политике.
@@ -223,10 +224,10 @@ capture-нода не «дакает» вывод; дакает медиа им
- 🟡 **Декодер/кодеки:** `symphonia` (рек.) + **AAC-патент** (роялти) — юр-проверка; Opus → `audiopus`; SBC/AAC
по BT, **aptX/LDAC исключены** (#12). → tech-stack.
- 🟡 **FM-тюнер:** добавить в hardware §4 периферию **или** отказаться от радио. → hardware.
- 🟡 **Владелец BlueZ/паринга** (Connectivity vs G vs shared) + сосуществование A2DP↔HFP. → G/Connectivity.
- **Владелец BlueZ/паринга** Connectivity-core (резолв в G §3); сосуществование A2DP↔HFP — политика §3. → G.
- 🟡 **enable/mute-секвенс усилителя (anti-pop):** owner GPIO — hardware §4 (mute-GPIO), owner порядка — B §4. → hardware + B.
-**AEC** — узел audio-plane (`module-echo-cancel`/WebRTC APM), референс = output-monitor, не в ассистенте;
loopback-tap — §4. → резолв §4 (D §147; синхронизировано в d-assistant §10).
loopback-tap — §4. → резолв §4 (синхронизировано в d-assistant §10).
- ◻️ **Ранний звук на Stage-0-реверсе** (park-beep до поднятия аудио-плоскости) — нужен ли отдельный путь. → J/E/B.
- ◻️ **Split политики:** сколько в статическом WirePlumber vs Rust-координаторе (+ crash-safety проактивного
cork, тайминги гистерезиса/фейда дакинга). → реализация.
@@ -247,7 +248,7 @@ capture-нода не «дакает» вывод; дакает медиа им
| Ducking | cork (звонок) vs duck (ассистент/нав); duck — относительный аттенюатор; гистерезис/фейд (анти-pumping) | 2026-06-22 |
| Crash-safe | две оси: source (жизнь ноды + проактивный cork по `NameOwnerChanged`/watchdog) + sink (пересчёт при возврате output) | 2026-06-22 |
| Где политика | статика — конфиг WirePlumber (Stage 1, переживает крэш); динамика — координатор Media-апа | 2026-06-22 |
| AEC | `module-echo-cancel` (WebRTC APM) в audio-plane (не в ассистенте); H даёт loopback-референс — **резолв D §147** | 2026-06-22 |
| AEC | `module-echo-cancel` (WebRTC APM) в audio-plane (не в ассистенте); H даёт loopback-референс — **резолв D §10** | 2026-06-22 |
| Декодер | `symphonia` (Rust, MPL-2.0; AAC-патент на юр-проверку; Opus НЕ поддержан → `audiopus`); aptX/LDAC исключены (#12) | 2026-06-22 |
| BT-аудио | A2DP sink (SBC/AAC) + AVRCP; обрыв → cork+auto-resume; паринг/HFP — G/Connectivity (шов) | 2026-06-22 |
| Радио/стриминг | later (v3); FM требует тюнера (нет в hardware); стриминг — креды юзера, провайдер-агностик | 2026-06-22 |