Skip to content

feat(report): разобранные примеры решений в отчёте — просьба экспертов на чекпоинте 2 - #7

Merged
retrobich921 merged 2 commits into
mainfrom
feat/report-examples
Sep 5, 2026
Merged

retrobich921 merged 2 commits into
mainfrom
feat/report-examples

Conversation

@retrobich921

Copy link
Copy Markdown
Contributor

Сделано то, о чём попросили эксперты на чекпоинте 2 (05.09).

«Добавьте несколько примеров в отчёт — если в итоговом отчёте видна логика отмены заявок
и поиска новых решений, проверяющий быстрее найдёт соответствующий код и оценит его.»

Что появилось

Блок examples в routing_report.json — четыре характерных случая, по одному на каждый механизм:

ключ что показывает
choice_among_several среди нескольких допустимых выбран лучший по сумме взвешенных целей
single_eligible hard-правила оставили одного кандидата — скоринг уже ничего не решает
retry_after_failure провайдер отказал, заявка переотправлена следующему по рангу
fallback_to_self_provider внешние кончились — заявка ушла на self-provider

У каждого примера: кто выбран и почему (reason, score, чем именно обошёл соперника),
почему отсеяны остальные (код правила и детали), исход — и source с файлом и методом,
где это решение принимается. Ровно то, о чём просили: по отчёту находится код.

"fallback_to_self_provider": {
  "what_it_shows": "внешние кандидаты кончились — заявка ушла на self-provider",
  "operation": { "operation_id": "op_107", "amount": 800, "bank": "sberbank" },
  "selected": { "provider": "spacepayments", "reason": "fallback_self_provider",
                "why": "all 1 eligible providers failed: vipay: amount_below_minimum; ..." },
  "skipped": [ { "provider": "payflow", "reason": "provider_timeout",
                 "why": "dispatched, simulated result: expired after 631s (score 0.5683; ...)",
                 "dispatched": true, "simulated_result": "expired" } ],
  "outcome": { "simulated_result": "approved", "retries": 1, "fallback_used": true },
  "source": "lib/payout_router/routing/router.rb → Router#fallback (пул внешних исчерпан ...)"
}

То же самое отдельной раскрывающейся секцией в HTML-дашборде.

Чтобы примеры были всегда

  1. Демонстрационный прогон подбирает seed так, чтобы в отчёт попали обе ветки каскада сразу —
    и переотправка после отказа, и fallback. Раньше искал только отказ, и fallback мог остаться нулём.
  2. Большая очередь больше не отключает демонстрацию. Раньше очередь длиннее 500 заявок оставляла
    в отчёте только строчку «слишком велика, запустите вручную» — то есть на большой тестовой очереди
    пропали бы ровно те примеры, которые просили эксперты. Теперь демонстрация считается по первым
    500 заявкам, и об этом прямо написано в note. Проверено на очереди из 1200 заявок: все четыре
    примера на месте.

Риск для сдачи: нулевой

routing_decisions.json не изменился — логика роутинга не тронута, менялся только отчёт.
Кастомные поля в отчёте эксперты подтвердили дважды: на чекпоинте 1 («кастомные поля можно»)
и на чекпоинте 2 («собственные названия и константы на баллы не влияют»).

Как проверить

$env:PATH = "C:\Ruby40-x64\bin;" + $env:PATH

bundle exec rake            # 242 спека, 0 падений; RuboCop 166 файлов, 0 замечаний
bundle exec rake validate   # скрипт организаторов 29/0/0, наш валидатор 30/0/0
bundle exec rake public     # git status после него пустой — сдаваемые файлы не поехали

Смотреть: routing_report.json → examples, или открыть routing_report.html и раскрыть
секцию «Разобранные примеры». Разбор чекпоинта — docs/checkpoint.md §4.6.

🤖 Generated with Claude Code

https://claude.ai/code/session_01N7LBzBD5qBUzAAPsGTB9Nk

retrobich921 and others added 2 commits September 5, 2026 15:39
…в на чекпоинте 2

Эксперты 05.09: «добавьте несколько примеров в отчёт — если в итоговом отчёте видна логика
отмены заявок и поиска новых решений, проверяющий быстрее найдёт соответствующий код
и оценит его». Агрегатов для этого мало, а полный трейс лежит в другом файле.

В routing_report.json появился блок examples: четыре характерных случая, по одному
на каждый механизм — выбор среди нескольких допустимых, единственный допустимый после
hard-правил, отказ провайдера с переотправкой следующему, исчерпание внешних и уход
на self-provider. У каждого примера кто выбран и почему, почему отсеяны остальные,
исход — и source с файлом и методом, где это решение принимается.

Демонстрационный прогон теперь подбирает seed так, чтобы в отчёте были видны обе ветки
каскада сразу: и переотправка после отказа, и fallback на self-provider.

То же самое в HTML-дашборде отдельной секцией.

routing_decisions.json не изменился: логика роутинга не тронута, менялся только отчёт.
Кастомные поля в отчёте эксперты подтвердили дважды — на чекпоинте 1 и 2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7LBzBD5qBUzAAPsGTB9Nk
…е, а не пропускать

Раньше очередь длиннее 500 заявок отключала второй прогон целиком: в отчёте оставалась
только строчка «слишком велика, запустите вручную». То есть ровно на тестовой очереди,
если она окажется большой, пропали бы и примеры отказа с переотправкой, и fallback —
именно то, что эксперты попросили показать в отчёте.

Теперь демонстрация всегда есть: на большой очереди она считается по первым 500 заявкам,
и об этом прямо написано в note. Проверено на очереди из 1200 заявок — все четыре примера
на месте.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7LBzBD5qBUzAAPsGTB9Nk
@retrobich921
retrobich921 merged commit 3daf90b into main Sep 5, 2026
1 check passed
@retrobich921
retrobich921 deleted the feat/report-examples branch September 5, 2026 13:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant