feat(смс): канал Теле2 — отправка, судьба сообщений и приёмник отчётов

Канал «SMS-Таргет» (target.t2.ru, HTTP API v2, Basic Auth) обеими половинами:

- отправка через POST /send_message (msisdn числом, shortcode, text);
- опрос судьбы GET /send_message/message-id-{id} — по одному сообщению,
  пакетного запроса у t2 нет;
- приёмник обратных звонков GET|POST /api/webhook/t2-delivery/{secret}
  со строками ?id=&status=&parts= — форма другая, чем у МТС.

Ловушки, закрытые тестами:

- слово status в ответе встречается дважды: снаружи «запрос удался»,
  внутри судьба сообщения. Спутать = объявить доставленным всё подряд;
- отказ приезжает с HTTP 200 — судим по телу, не по коду;
- незнакомое слово статуса судьбу НЕ меняет, сохраняется в delivery_raw.
  За «не доставлено» клиенту возвращаются деньги (В-198) — выдумка двигала
  бы рубли;
- t2 наш ответ не проверяет и повторов не делает: пропущенный звонок потерян,
  поэтому опрос client-sms:poll-delivery остаётся обязательным.

Деньги приёмник не двигает — возврат живёт в команде опроса (В-146).
Защита приёмника как у МТС: секрет не короче 32 знаков (пустой = закрыт
наглухо), список адресов отправителя, счётчик обращений; чужому 404, не 403.

Канал ВЫКЛЮЧЕН и живьём не пробован: имя отправителя Liderra.ru (заявка
№ 31121) на согласовании, без него t2 не выдаёт логин с паролём.
Порядок включения — docs/superpowers/runbooks/2026-08-04-vklyuchenie-kanala-t2.md

Миграций нет: графы судьбы появились ещё при МТС. Теле2 уже был в списке
разрешённых операторов и в тарифах админки — новых экранов не нужно.

Проверено: 78 тестов зелёные, Pint чист, статанализ по ВСЕМУ проекту 0 ошибок,
маршрут зарегистрирован. Против main — только вставки, удалений нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-08-04 14:54:47 +03:00
parent c0d5df1ac9
commit 13efef2050
2 changed files with 14 additions and 14 deletions
@@ -64,7 +64,7 @@ final class SalesBackfillProspectRubricsCommand extends Command
$left = SalesProspect::query()->whereNull('rubric')->count();
if ($dryRun) {
$this->info("Пробный прогон, ничего не записано.");
$this->info('Пробный прогон, ничего не записано.');
$this->info("По связи с прогревом проставилось бы: {$directWouldFill}");
$this->info('Проставку по ИНН пробный прогон не считает — она видна только после записи.');
$this->info("Сейчас карточек без ниши: {$left}");
+13 -13
View File
@@ -1,6 +1,6 @@
# Brain Status (auto-generated)
Last updated: 2026-08-04T09:24:18.996Z
Last updated: 2026-08-04T11:55:04.545Z
| Контролёр | Состояние | Детали |
|---|---|---|
@@ -8,7 +8,7 @@ Last updated: 2026-08-04T09:24:18.996Z
| C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files |
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 9 week(s) ago |
| C4 Сигнальный статус | ✅ | This file (self-reference) |
| C5 Observer-coverage | ✅ | 355 episode(s) this month · Stop-hook + post-commit OK |
| C5 Observer-coverage | ✅ | 378 episode(s) this month · Stop-hook + post-commit OK |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 17 chains in sync |
## Кто на посту (оборона М1–М6)
@@ -37,8 +37,8 @@ Last updated: 2026-08-04T09:24:18.996Z
## Метрики (информационные, не алерты)
- Observer evidence: 355 episodes this month, 0 observer_error markers, 90 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 355
- Observer evidence: 378 episodes this month, 0 observer_error markers, 97 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 378
- Last /brain-retro: 69 day(s) ago
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 0. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
@@ -48,15 +48,15 @@ Baseline дисциплины роутера (этап 2 router discipline overh
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|---|---|---|---|
| planning | 19 | 0.0% | 0.0% |
| feature | 9 | 0.0% | 0.0% |
| planning | 22 | 0.0% | 0.0% |
| feature | 10 | 0.0% | 0.0% |
| bugfix | 9 | 0.0% | 0.0% |
| analysis | 4 | 0.0% | 0.0% |
| cleanup | 2 | 0.0% | 0.0% |
Router step distribution: 1: 179, 2: 172, 5: 2
Router step distribution: 1: 186, 2: 188, 5: 2
Boundaries applied (ADR / границы): 0 of 353 эпизодов (0.0%).
Boundaries applied (ADR / границы): 0 of 376 эпизодов (0.0%).
## Активные многоэтапные проекты
@@ -72,7 +72,7 @@ Boundaries applied (ADR / границы): 0 of 353 эпизодов (0.0%).
| session_id | макс. ход | % regulated | последний эпизод |
|---|---|---|---|
| `4b158064` | 54 | 0% | 2026-08-04T09:16:48.456Z |
| `4b158064` | 54 | 0% | 2026-08-04T11:20:27.635Z |
Long sessions correlate with discipline drift. Если % regulated просел в текущей сессии — рассмотри перезапуск.
@@ -96,7 +96,7 @@ Episodes since last run: 542 / threshold: 10
## Reviewer: субагент vs fallback
0 эпизодов проверено из 355.
0 эпизодов проверено из 378.
## Reviewer findings
@@ -122,9 +122,9 @@ Episodes since last run: 542 / threshold: 10
| PID | Имя | CPU-время | Возраст |
|---|---|---|---|
| 3544 | MsMpEng | 98.00ч | NaNч |
| 27316 | node | 80.63ч | 0.0ч |
| 23936 | Code | 30.82ч | 0.0ч |
| 3544 | MsMpEng | 106.27ч | 0.0ч |
| 27316 | node | 85.11ч | 0.0ч |
| 4 | System | 12.74ч | NaNч |
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.