Атлас

прогоны → источники → сессии → доски → к индексу →

Конвейер

Порядок фиксирован в pipeline/stages.py: как бы стадии ни перечислили в аргументах, прогон расставит их в этом порядке. Числа справа — из журнала прогонов.

Профили и расписание

«Профиль» здесь — набор аргументов прогона, и разворачивается он в одном месте: case в run-pipeline.sh. Стадии в строках посчитаны тем же парсером аргументов, которым их читает CLI, а расписание взято из docker/crontab.

Источники

Адаптер на ATS и агрегаторы, которые обходятся целиком. В индексе они неразличимы по устройству: агрегатор пишет вакансии тем же полем ats, а slug у него — имя работодателя, поэтому и разрез один.

Треки

Трек — это списки слов: любое из include в названии заносит вакансию в трек, любое из exclude забирает обратно. Списки и есть определение — и SQL-предикат, и функция на пути записи выводятся из них. Порядок важен: трек присваивается ПЕРВЫЙ подошедший, а не лучший.

Какой это трек?
Тот же перебор, что на пути записи: треки в объявленном порядке, первое совпадение выигрывает.

Словари разметки

Офлайн-слой чист: ни базы, ни сети. Любой классификатор вправе ответить «не знаю» — половина названий не несёт грейда, две трети не несут семейства роли, и классификатор, который угадывает, врёт.

Под кого ищем

Профиль поиска — это контролы (видимые поля формы, их можно ослабить), отбор (условия, которые контролами не выражаются) и балл. Сигналы и балл — один список: слагаемое, которого не видно, и подпись, которая ничего не весит, разошлись бы на второй правке.