Employee Time Tracking · Output-сигналы

timechecker
учёт рабочего времени

Реальное рабочее время сотрудников — по следам их работы (транскрипты Claude Code, сессии OpenAI Codex, git, реестр задач), а не по слежке за компьютером. Что делал, сколько на задачу (в минутах), где простои дольше 30 минут, сколько токенов и каких моделей сожгли ИИ-агенты. От сырых сигналов к дневному отчёту — в БД на вашем сервере (без облака), с автозапуском.

Claude · codex · git · реестр задач SQLite ↔ self-host PostgreSQL боевой режим · автосбор данные текут вживую
↓ листай — данные придут в движение
01 / Суть

Простыми словами

Сначала — что это и как течёт; подробности и схемы — ниже по странице.

timechecker считает реальное рабочее время по output-сигналам — следам, которые человек и так создаёт: транскрипты Claude Code и сессии OpenAI Codex CLI (только метаданные — когда и сколько работал, без текста сообщений), git-коммиты (что и к какой задаче), переходы статусов задач в собственном реестре (когда задача была «в работе»). Это не keylogging и не слежка за окнами.

Из сигналов за день складывается: какие задачи делал, сколько времени на каждую (учёт — в минутах) и простои дольше 30 минут. Данные идут по конвейеру коллекторы → хранилище → метрики → отчёт, а сбоку — эксплуатация (диагностика, расписание, ретеншн). Система работает local-first: агент пишет в локальный SQLite (источник правды, и без сети), а шаг sync доносит данные в PostgreSQL на вашем сервере (не в чужое облако). Новый проект подключается к учёту автоматически.

Система мультивендорная: расход ИИ считается по каждому агенту отдельно — модели (opus / sonnet / haiku / gpt-5.5), токены с разбивкой по кэшу и оценка стоимости. Важно про стоимость: это «≈ API-эквивалент» — токены × API-тариф модели (тарифы обновляются автоматически из LiteLLM раз в неделю). При подписке фактическая оплата фиксированная, поэтому цифра — бенчмарк трудоёмкости, а не реальный счёт.

pipelinecollectors → storage → metrics → reporting → ops
события read daily_* md collectors Claude·codex·git·реестр storage repository · БД metrics 9 метрик · атрибуция reporting дневной отчёт ops health·deploy·prune боевой режим · Task Scheduler
Слои развязаны через repository-интерфейс — те же коллекторы/метрики/отчёты работают на SQLite или PostgreSQL (self-host). Конфиг — из env TIMECHECKER_*.
02 / Сбор

Источники сигналов

Пять коллекторов сходятся в единую ленту событий. Claude и codex дают только метаданные — тела сообщений не читаются.

collectors → activity_eventметаданные · инкрементальное окно · идемпотентно
Claude · транскрипты jsonl ts · sessionId · токены · тул-вызовы codex · rollout jsonl итог сессии · токены · gpt-5.5 · cwd hooks · сессии SessionStart/End/Stop git · коммиты dev_branch · PLANE-ID · ts→UTC реестр задач задачи + переходы статусов activity_event единая лента · UNIQUE(source,id) БД upsert
Оркестратор: изоляция коллекторов (сбой одного → partial, остальные собираются), порядок реестр → git (связи коммит↔задача находят task_id), мульти-проект из реестра. Инкрементальное окно (collect_lookback_days=2) — пишутся только новые события, не вся история (критично для Postgres по сети).
03 / Данные

Где что лежит

14 таблиц: сырьё (события, 30 дней) и агрегаты (дневные срезы, бессрочно). Идемпотентность — upsert ON CONFLICT.

data-modelraw · aggregates · refs · UTC / work_date МСК
Сырьё и справочники
timechecker.db / PostgreSQL (self-host) ├─ activity_eventсырьё 30 днsource·event_type·ts_utc·meta_json ├─ agent_session сессии ИИ-агентов (claude/codex) ├─ git_commit ─ commit_task ↔ task ├─ plane_transition статусы ├─ employee · project · task └─ ingest_run · schema_migrations
Дневные агрегаты
daily_*бессрочно ├─ daily_summaryspan·active·gap·idle≥30 (минуты) ├─ daily_task_timeминуты/commits по задаче ├─ daily_agent_usageтокены/≈$ по задаче × агенту └─ daily_idle эпизоды простоя ≥30 мин
Все ts — в UTC; work_date — дата по МСК. Сырьё чистит prune (ретеншн retention_days=30), агрегаты компактны и хранятся бессрочно.
04 / Метрики

Метрики и атрибуция

Время относится к задаче по окнам «In Progress» из реестра задач; разрыв между событиями > 30 мин = простой.

compute_dayМСК-сутки · 9 метрик · порог простоя 30 мин
attribute activity_event события за день (UTC) plane_transition окна In Progress attribute + idle активные интервалы · gap>30 daily_summary 9 метрик за день daily_task_time минуты по задачам daily_idle простои ≥30 мин daily_agent_usage токены/≈$ · задача × агент
9 метрик: рабочий день (span), активно/простои в минутах, эпизоды ≥30, задач за день, переключения, макс. фокус, коммиты, гигиена (доля коммитов с PLANE-ID); по задачам — adherence к плану (est_h). Расход ИИ — в daily_agent_usage по задаче × агенту (claude / codex): сообщения, токены (кэш отдельно), модели и ≈ API-эквивалент стоимости — оценка по тарифам (авто-обновление из LiteLLM еженедельно), не реальный счёт (при подписке оплата фиксированная). Пересчёт идемпотентен.
05 / Backend

Local-first: SQLite → self-host PostgreSQL

Локальный SQLite — источник правды (офлайн-устойчиво); шаг sync инкрементально реплицирует его на ваш сервер (PostgreSQL).

repository · open_repository(cfg)? → %s · RETURNING · pooler-safe
collect / metrics / report sync · ежечасно инкрементально · id сохраняется агент collect · metrics · report SQLite источник правды · офлайн PostgreSQL копия-архив · ваш сервер
sync доливает новое идемпотентно: лента — по watermark id + окно ts; справочники — upsert по id (id сохраняется → FK консистентны); агрегаты — delete-replace по дню (атомарно). Реплика — копия-архив (локальный prune не реплицируется). sync --reset = чистый ресед (зеркало). DSN — в ~/.wgp/secrets.json. Данные — на вашем сервере, не в чужом облаке (контроль и приватность).
06 / Эксплуатация

Боевой режим и автозапуск

Агент развёрнут в Task Scheduler, пишет в PostgreSQL на вашем сервере. Новый проект подключается сам — через шаг мастера и ежечасный сбор.

onboardingregister-project → реестр → ежечасный collect
шаг 2.7 · «Да» ежечасно /workflow_create_env register-project projects.json реестр мониторинга collect → SQLite → sync git/реестр + Claude → ваш сервер
ЗадачаЧто делаетТриггерТип
collectсбор сигналов → SQLite (инкрементально) Task Scheduler · ежечасно авто · плановый
syncрепликация SQLite → self-host PostgreSQL (инкрементально) Task Scheduler · ежечасно авто · плановый
dailyметрики (сегодня + вчера) + дневной отчёт (md) Task Scheduler · 23:50 авто · плановый
pricing-refreshобновить API-ставки из LiteLLM (Claude + GPT) Task Scheduler · еженедельно авто · плановый
register-projectпривязать новый проект к учёту /workflow_create_env · шаг 2.7 авто · при бутстрапе
health · report · pruneдиагностика · отчёт за дату · ретеншн CLI вручную ручной
Установка: uv tool install --editable --with psycopg[binary] + initdb + deploy (backend по умолчанию — SQLite). Задачи зарегистрированы с абсолютным путём к timechecker.exe. Baseline облака — sync --reset. Проверка — timechecker healthbackend: sqlite · collect_task_scheduled: true.
— / Легенда

Как читать схемы

Узлы

источник / коллектор
хранилище / БД
результат / агрегат

Триггер

авто-событийный
плановый (scheduler)
ручной (CLI)

Данные

сырьё (ретеншн 30 дн)
агрегаты (бессрочно)

Поток

пакет данных в движении
timechecker · учёт рабочего времени по output-сигналам (Claude · git · реестр задач) → SQLite / self-host PostgreSQL
дизайн-язык портирован из лендинга Wexus · JetBrains Mono · #00ff41 · первоисточник: SYSTEM.md
← Все кейсы