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:
@@ -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
@@ -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-сессий.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user