Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
@@ -0,0 +1,91 @@
namespace Deal.Modules.Discovery.Application;
// Часть DiscoveryWorkerService: константы — действия тика, пороги/размеры воркера и метки кандидатов
// (1:1 python discovery_worker L5–6/L74–89).
public sealed partial class DiscoveryWorkerService
{
// ── Действия тика (python discovery_worker L5–6) ──
/// <summary>
/// Тик: работы нет (паузы/нет задач/заняты шаги других задач).
/// </summary>
public const string ActionNone = "none";
/// <summary>
/// Тик: выполнен шаг поиска/закрыт проход ключей.
/// </summary>
public const string ActionSearch = "search";
/// <summary>
/// Тик: кандидат оценён и переведён в review.
/// </summary>
public const string ActionReview = "review";
/// <summary>
/// Тик: кандидат пропущен (мало участников/язык/мало подходящих/3 неудачи join).
/// </summary>
public const string ActionSkip = "skip";
/// <summary>
/// Тик: авто-вступление выполнено.
/// </summary>
public const string ActionJoin = "join";
/// <summary>
/// Тик: кандидат отклонён повторной проверкой перед авто-вступлением.
/// </summary>
public const string ActionReject = "reject";
/// <summary>
/// Тик: FloodWait — стоп авто-вступлений до конца суток.
/// </summary>
public const string ActionFlood = "flood";
/// <summary>
/// Тик: сбой шага (не роняет задачу/воркер).
/// </summary>
public const string ActionError = "error";
/// <summary>
/// Тик: задача выполнила план вступлений — done.
/// </summary>
public const string ActionDone = "done";
// ── Пороги/размеры воркера (python L74–89) ──
// Минимальный объём содержательной выборки для вердикта оценки (python _MIN_CONTENT L77).
private const int MinContentMessages = 3;
// Ошибки поиска одного ключа подряд, после которых ключ пропускается (python L80).
private const int SearchErrorsToSkip = 3;
// Неудачные авто-вступления подряд, после которых кандидат удаляется (python L417–419).
private const int MaxJoinFailures = 3;
// Верхняя граница результатов глобального поиска (прототип discovery_search default 30).
private const int SearchResultLimit = 30;
// ── Метки кандидата (marks; python discovery_worker L85–89) ──
/// <summary>
/// Метка: число участников не подтверждено (minSubscribers задан, participants неизвестны).
/// </summary>
public const string MarkParticipantsNotConfirmed = "участники не подтверждены";
/// <summary>
/// Метка: язык не подтверждён (доля кириллицы между порогами).
/// </summary>
public const string MarkLangNotConfirmed = "язык не подтверждён";
/// <summary>
/// Метка: канал, история недоступна без членства (контент не оценён).
/// </summary>
public const string MarkChannelNoHistory = "канал: история недоступна";
/// <summary>
/// Метка: закрытая группа — история скрыта, вступите сами (контент не оценён).
/// </summary>
public const string MarkClosedGroup = "закрытая группа (история скрыта) — вступите сами";
/// <summary>
/// Метка: содержательных сообщений выборки меньше трёх (решает человек).
/// </summary>
public const string MarkFewMessages = "мало сообщений";
}