timechecker
учёт рабочего времени
Реальное рабочее время сотрудников — по следам их работы (транскрипты Claude Code, сессии OpenAI Codex, git, реестр задач), а не по слежке за компьютером. Что делал, сколько на задачу (в минутах), где простои дольше 30 минут, сколько токенов и каких моделей сожгли ИИ-агенты. От сырых сигналов к дневному отчёту — в БД на вашем сервере (без облака), с автозапуском.
Простыми словами
Сначала — что это и как течёт; подробности и схемы — ниже по странице.
timechecker считает реальное рабочее время по output-сигналам — следам, которые человек и так создаёт: транскрипты Claude Code и сессии OpenAI Codex CLI (только метаданные — когда и сколько работал, без текста сообщений), git-коммиты (что и к какой задаче), переходы статусов задач в собственном реестре (когда задача была «в работе»). Это не keylogging и не слежка за окнами.
Из сигналов за день складывается: какие задачи делал, сколько времени на каждую
(учёт — в минутах) и простои дольше 30 минут. Данные идут по конвейеру
коллекторы → хранилище → метрики → отчёт, а сбоку — эксплуатация (диагностика, расписание,
ретеншн). Система работает local-first: агент пишет в локальный SQLite (источник
правды, и без сети), а шаг sync доносит данные в PostgreSQL на вашем сервере (не в чужое облако).
Новый проект подключается к учёту автоматически.
Система мультивендорная: расход ИИ считается по каждому агенту отдельно — модели (opus / sonnet / haiku / gpt-5.5), токены с разбивкой по кэшу и оценка стоимости. Важно про стоимость: это «≈ API-эквивалент» — токены × API-тариф модели (тарифы обновляются автоматически из LiteLLM раз в неделю). При подписке фактическая оплата фиксированная, поэтому цифра — бенчмарк трудоёмкости, а не реальный счёт.
TIMECHECKER_*.
Источники сигналов
Пять коллекторов сходятся в единую ленту событий. Claude и codex дают только метаданные — тела сообщений не читаются.
partial, остальные собираются),
порядок реестр → git (связи коммит↔задача находят task_id), мульти-проект из реестра.
Инкрементальное окно (collect_lookback_days=2) — пишутся только
новые события, не вся история (критично для Postgres по сети).
Где что лежит
14 таблиц: сырьё (события, 30 дней) и
агрегаты (дневные срезы, бессрочно). Идемпотентность — upsert
ON CONFLICT.
ts — в UTC; work_date — дата по МСК. Сырьё чистит
prune (ретеншн retention_days=30), агрегаты компактны и хранятся бессрочно.
Метрики и атрибуция
Время относится к задаче по окнам «In Progress» из реестра задач; разрыв между событиями > 30 мин = простой.
est_h). Расход ИИ — в daily_agent_usage по
задаче × агенту (claude / codex): сообщения, токены (кэш отдельно), модели и
≈ API-эквивалент стоимости — оценка по тарифам (авто-обновление из LiteLLM еженедельно),
не реальный счёт (при подписке оплата фиксированная). Пересчёт идемпотентен.
Local-first: SQLite → self-host PostgreSQL
Локальный SQLite — источник правды (офлайн-устойчиво);
шаг sync инкрементально реплицирует его на ваш сервер (PostgreSQL).
id (id сохраняется → FK консистентны); агрегаты — delete-replace по дню (атомарно).
Реплика — копия-архив (локальный prune не реплицируется).
sync --reset = чистый ресед (зеркало). DSN — в ~/.wgp/secrets.json.
Данные — на вашем сервере, не в чужом облаке (контроль и приватность).
Боевой режим и автозапуск
Агент развёрнут в Task Scheduler, пишет в PostgreSQL на вашем сервере. Новый проект подключается сам — через шаг мастера и ежечасный сбор.
uv tool install --editable --with psycopg[binary] + initdb +
deploy (backend по умолчанию — SQLite). Задачи зарегистрированы с абсолютным
путём к timechecker.exe. Baseline облака — sync --reset. Проверка —
timechecker health → backend: sqlite · collect_task_scheduled: true.