Карта MR и деплоев
| MR | Ветка / суть | Ключевые места | Пайплайн | Статус |
|---|---|---|---|---|
| !786 | fix/tatneft-proxy-oktaneхардкод адреса посредника → appsettings | UrlManager.TryInit(): 91.190.156.76 → 141.101.196.65 | #8775 | прод · 22.06 |
| !790 / !791 | per‑vink фильтр тех‑лимита (корень дублей) | CardOwnerLimitsService.GetFields() + LimitService | #8794 | прод · 22.06 |
| !792 | fix/rosneft-category-header-zero-phantomguard от phantom‑zero | hasPositiveTypeLimit в GetFileds + sync‑guard в RosneftApiService + 2 регресс‑теста | #8810 / #8811 | прод · 23.06 11:50 merge 700ed6ae |
| !795 | fix/rosneft-transaction-timeoutанти‑зависание всех ВИНК | ReadWriteTimeout для RestSharp‑клиентов (×10) + StartNow() на ApiVinkJob, 9 файлов | #8843 | прод · ~00:07 (24.06) |
| !789 | limitsForOptimize (a.okosten)дедуп + sync‑state | бизнес‑ключ {CardId,LimitType,FuelCategoryId,FuelTypeId}; ApiLimitInfo.CreatedAtUtc/SentAtUtc; миграция AddApiLimitInfoSyncDates | #8847 / #8848 | прод · ~02:30 (24.06) backfill 762 849 |
| !799 | feat/web-activity-loggingсквозной HTTP‑трейс | FuelProcessing.WebLogging · decorator LoggingRestClient → Loki; ротация docker‑логов json-file 100m×5 | master | прод · ~04:50 (24.06) |
| !794 | RosneftLimitSend Information → Warning (видимость egress в Kibana) | 1 файл, уровень логирования | — | в ревью |
| !787 | fix/es-sink-durable-bufferdurable ES‑sink + креды из ENV | Serilog ES sink, durable buffer | — | в ревью |
| — | fix/gpn-limit-dedup-antiwipeдедуп на стороне ГПН | GazpromLimitService (цикл набора лимитов без дедупа) | — | CI / review |
Разбор по инцидентам
Роснефть Phantom‑zero: «0» поверх реального лимита
Симптом
Жалоба: лимиты не срабатывают по А1353 (карта 7826010121736033), в кабинете gDT=0 при намерении >0. Расхождение зеркало↔кабинет — до 16 240 из 19 640 карт Роснефти (93%).
Корень
CardOwnerLimitsService.GetFileds() отдавал owner‑level тех‑лимит с FuelTypeId=null, InDay=0 без per‑vink фильтра. Эта «фантомная» нулевая категория уходила в кабинет поверх валидного типа топлива и обнуляла лимит.
Фикс — MR !792
Guard hasPositiveTypeLimit (проверка InDay/InWeek/InMonth) в GetFileds + sync‑guard в RosneftApiService: не отправлять 0‑категорию, если по типам есть положительные значения. 2 регресс‑теста.
Верификация на проде
Темп самолечения ~9 карт/мин; острая жалоба закрыта. Полный свип ~19 640 карт — фоном.
Роснефть Заморозка синхры на 3,5 часа
Симптом
С 15:19 МСК встали транзакции Роснефти/Лукойла/Вездехода. GetOperByContract по ISS233681 завис на чтении тела ответа (68 start / 67 finish).
Корень
RestSharp 106 на .NET5: Timeout=80000 ограничивает только получение заголовков, ReadWriteTimeout не задан → чтение тела фактически бесконечно. Зависший поток через [DisallowConcurrentExecution] заморозил общий джоб HistoryTransactions.
Фикс — MR !795
ReadWriteTimeout + CancellationToken для всех 10 ВИНК‑клиентов (Rosneft/Gazprom/Lukoil/Tatneft/Vezdehod/NatCar/Track/TaifNK/Inforkom/S), try/finally в ApiJob, и StartNow() на триггере ApiVinkJob — джоб стартует сразу после деплоя, а не ждёт 35‑мин тик. Локальная сборка net5 чистая (SDK 10 + rollForward=latestMajor).
Связь с требованием
Совпало с гипотезой про динамическую генерацию отдельного джоба на каждый ВИНК — изоляция «одни винки не стопают других».
Роснефть Дубли лимитов и фантомные нули (22.06)
Симптом
СТК‑75 / договор 9 (А1353): карты с противоречивыми лимитами (например 501л + 0л), фантомные строки, ~3089 дублей на 535 картах.
Корень
CardOwnerLimitsService.GetFields() возвращал тех‑лимит per‑owner‑type без фильтра по ВИНК → размножение. Отдельно — минимальный лимит 0 выставлялся при тех‑лимите (логика isOpen).
Фиксы
MR !790/!791 (per‑vink фильтр), временный guard TEMP-ROSNEFT-FREEZE (обратимая заморозка очереди, 431 задача), затем динамические per‑vink джобы, увеличение pool size, чистка фантомов и бэкфилл. Финальный канонический дедуп — MR !789 (бизнес‑ключ + миграция ApiLimitInfo).
7005830021056304 (3 копии LimitId=419497 за 12с) после анализа оказался легитимным фан‑аутом справочника ГПН (GetCustomLimits по FuelTypeVink), а не багом. Реальные orphan‑дубли (301 + старый 1500) — ~1% карт, наследие VESTAFUEL‑1947.ГПН · Лайт Скай Сверка и восстановление лимитов
Запрос
Проверить лимиты ГПН для ООО «Лайт Скай» (Companies.Id=393, договор DirectContracts.Id=2298 «Э1», вендор DCWV=18), подготовить восстановление. Заданный порядок: сначала дубли, потом восстановление; приоритет — корректные лимиты в системе.
Что сделано
Снят бэкап в проде: Limits_lightsky_bak_20260623 (15 690 строк), ApiLimitInfo_lightsky_bak_20260623 (25 417). Написан и развёрнут на oktane инструмент ~/projects/fuel-gpn-lightsky/dryrun/lsky_db_resync.py — режимы compare / apply / classify, 3‑сторонняя сверка (наша БД сейчас / снимок / кабинет ГПН), read‑only по умолчанию.
Ключевое инженерное решение
Источник истины — таблица Limit в БД, не LimitVinkHistory: снимки истории устаревшие (значения расходятся с текущими в разы), слепая заливка из истории создала бы финансовые дубли. Восстановление — через штатный воркер (AddLimitsToCards → AddLimit) после устранения дублей, а не прямым re‑push.
По egress
Прямой скрипт‑отправка / ssh‑туннель / реверс‑прокси на несколько IP — отклонено: ОПТИ‑24 банил oktane именно за множественные входы с неверными кредами с одного egress (бан 18.06, снят 22.06). Мульти‑IP обходит IP‑бан, но не per‑account throttle.
Татнефть «Мёртвый» узел посредника
Корень
Адрес index‑0 прокси (91.190.156.76) был захардкожен в UrlManager и не отвечал — десятки запросов улетали в мёртвый хост.
Фикс — MR !786
Вынос адреса в appsettings, переключение на живой узел oktane (141.101.196.65), деплой #8775. Контейнер tatneftproxy:latest поднят на oktane (:6868, AllowedIPs включает 172.17.0.1). Обходной egress‑релей ГПН через kakao демонтирован — прямой канал восстановлен по всем 4 IP.
Наблюдаемость Web Activity Logging + дашборд
Запрос
Настроить сбор логов (скрейпер) с привязкой к Loki и ротацией, проверить поток логов, оформить MR и слить; отдельный дашборд web‑activity.
Сделано — MR !799
Новый проект FuelProcessing.WebLogging: decorator LoggingRestClient поверх RestSharp‑клиентов всех API (Gazprom/Tatneft/Lukoil/Track), JSON‑сериализация запрос/ответ + маскирование секретов → Loki. Ротация docker‑логов json-file max-size=100m ×5 на всех 4 контейнерах. Grafana‑дашборд web-activity на oktane.
Rosneft.API) писал payload только в stdout, а ES‑sink transactionhandler молчит с июня (индекс ...-2026-06 отсутствует). Отсюда — потребность в сквозном трейсе (!799) и durable‑буфере (!787, в ревью).fuel-architect — доменные эксперты по коду
Внутренний веб‑инструмент для поддержки/доработки FuelProcessing: интерактивная карта архитектуры (127 узлов / 101 связь / 11 доменов / 51 Quartz‑job) + команда LLM‑экспертов по доменам, которые читают реальный код репозитория и предлагают diff‑правки. Backend на 127.0.0.1:8731 (uvicorn / systemd fuel-architect.service). Инвариант: граф и эксперты обязаны соответствовать живому коду (детерминированный drift‑gate).
| Домен | Эксперт | Зона / модель |
|---|---|---|
| Лимиты | fuel-limits-expert | TaskLimits, ApiLimitInfo, синк через ВИНК · kimi-k2.7-code |
| Блокировки | fuel-blocks-expert | TaskBlock, CardBlock, BlockStatus · kimi-k2.7-code |
| ВИНК‑интеграции | fuel-vink-expert | IApiService + 11 вендор‑адаптеров · kimi-k2.7-code |
| Транзакции | fuel-transactions-expert | FinanceTransaction, RabbitMQ · kimi-k2.7-code |
| Биллинг | fuel-billing-expert | Balance, Overdraft, ContractBalance · kimi-k2.7-code |
| Карты | fuel-cards-expert | IssuingCard, CardGroup, CardLog · kimi-k2.7-code |
| Контракты | fuel-contracts-expert | Contract, Discount, TermTemplate · kimi-k2.7-code |
| АЗС | fuel-stations-expert | GasStation, FuelType, маршруты · kimi-k2.7-code |
| Платформа | fuel-platform-expert | EF Core, DataContext, Quartz, миграции · kimi-k2.7-code |
| Дашборд | fuel-dashboard-expert | Report, FuelOnline, Pumping · qwen3-coder-next |
| Мониторинг | fuel-monitoring-expert | Alerting, Serilog, Elasticsearch · qwen3-coder-next |
Все вызовы через единый openai.AsyncOpenAI → LiteLLM‑прокси :4000. Оркестратор (свод нескольких экспертов) → glm-5.2; reviewer / adversarial‑верификация / fallback → deepseek-pro. Наблюдаемость — Arize Phoenix (phoenix.vidak.wellsoft.pro, проект fuel-architect), недоступность Phoenix запрос не роняет.
Возможности
Реконсилятор дрейфа · verify.py
Сверяет задекларированную модель (data/*.json) с реальным деревом FuelProcessing: UNION job‑классов из 3 Quartz‑конфигов (без хардкода «52»), 11 ВИНК‑адаптеров, owns_paths‑глобы, context_pack file:line. Ненулевой код + diff при расхождении → CI drift‑gate.
Карта доменов · /api/domain-graph
Cytoscape‑граф 127 узлов с фильтром по домену и 1‑hop соседями; взвешенные cross‑domain рёбра + топ‑10 bridge‑узлов (золотая граница). Мини‑мета‑граф 11 доменов, FTS5‑поиск.
Безопасный read→diff · sandbox + propose_diff
Чтение только внутри owns_paths‑глобов домена + path‑traversal guard (realpath). propose_diff: hash‑сверка исходника, валидация whatthepatch dry‑run, провенанс модели. Автозаписи в репо нет — аппрув руками.
4 режима ревью
scan_domain (прочёс домена → findings file:line + severity), review_file, propose_diff, adversarial_verify (независимая перепроверка находки вторым экспертом → вердикт real/hallucination).
Статус по фазам
| Фаза | Название | Статус |
|---|---|---|
| 1 | Fidelity & Data Truth | готова · 23.06 |
| 2 | LiteLLM Gateway + Phoenix | готова · 23.06 |
| 3 | Bug Review & Clear Map | готова · 24.06 |
| 4 | Memory & Context (FTS5 memory.db) | в работе · 2/4 планов |
| 5 | Acceptance Eval & Coverage ≥80% | не начата |
174 теста (27 добавлено в последней сессии). Ожидают браузерного UAT: визуальная кластеризация графа, мета‑граф, E2E с живым LLM («Найти баги» → findings → diff → adversarial‑вердикт). Phase 5 — ground‑truth eval на баге «фантом cat=0» (worktree на коммите 407b7cf04^, сверка с реальным фиксом).
Инструменты и бэкапы
lsky_db_resync.py
compare/apply/classify, 3‑сторонняя сверка, read‑only по умолчанию. На oktane, ~/projects/fuel-gpn-lightsky/dryrun/.
Бэкапы в fuel_prod1
*_lightsky_bak_20260623 (Limits 15 690, ApiLimitInfo 25 417); TaskLimits_freeze_bak_20260622.
GSD‑воркспейсы
fuel-rosneft-remediation и fuel-gpn-lightsky в ~/projects/*/.planning/ — ROADMAP/REQUIREMENTS/STATE.
Тест‑стенд
VESTAFUEL‑1943: свежий стенд fueltest, прогон тестов, приведение Jira‑тест‑кейсов в порядок.
Открытые задачи (тех.)
- !794 (RosneftLimitSend → Warning) и !787 (durable ES‑sink + ENV‑креды) — в ревью; без них egress лимитов Роснефти не виден в Kibana
- ES‑sink
fuelprocessing-transactionhandler-production-2026-06отсутствует — причина не установлена HistoryTransactionsоднопоточный — catch‑up после простоя сериализуется; нужна параллелизация поVinkType(как уже сделано для лимитов)- Полный свип Роснефти (~19 640 карт) — автономно в фоне, ETA ~конец 24.06
fix/gpn-limit-dedup-antiwipe— на CI/review