Quality Attribution

Прод сломался — какая именно сессия (или цепочка) написала эту строку. LinearB / Faros / GetDX видят git + ticketing; мы видим какая команда / какой prompt / какая версия AGENTS.md написала тот код.

Зачем#

Research dossier рекомендовал session-grain quality attribution как #1 strategic bet — никто из competitor'ов этого не делает, потому что у них нет данных уровня “что harness делал внутри session”. У нас есть.

Источники incident'ов#

  • Daemon revert detection — daemon следит за git log в репо с активными сессиями. При появлении revert-commit'а эмиттит quality_event WS-сообщение с файлами, которые он откатил. (Daemon-side detector — work-in-progress; вручную можно репортить через REST.)
  • External webhook — PagerDuty / Sentry / GitHub security advisory → POST на /plugins/quality-attribution/incidents. Bearer auth, тот же что для остальных API.
  • Manual entry — оператор может зарегистрировать incident руками через UI (полезно когда не настроен webhook).

Алгоритм attribution#

Для каждого incident'а: ищем сессии user'а за lookback_days (default 30), у которых хотя бы в одном events.payload присутствует substring любого из file_paths. Возвращаем уникальные session_id'ы, сортируем по recency, ограничиваем max_sessions (default 25).

Когда attribution ошибся — на странице incident'а нажимаешь «dispute» рядом с конкретной сессией. POST /incidents/{id}/unlink просто делает array_remove(attributed_session_ids, $1). raw_payload не трогается — audit trail сохраняется. По частоте disputes можем потом тюнить substring-heuristic.

Endpoints#

  • POST /plugins/quality-attribution/incidents — UPSERT по (user_id, kind, ref) с пересчётом attribution
  • GET /plugins/quality-attribution/incidents — список (filter: kind, limit)
  • GET /plugins/quality-attribution/incidents/{id} — деталь
  • POST /plugins/quality-attribution/incidents/{id}/unlink — отвязать сессию
  • GET /plugins/quality-attribution/sessions/{id}/incidents — reverse view: «эту сессию упрекают в N инцидентах»

Kind#

  • revert — обнаруженный или вручную записанный git revert. ref = SHA revert-коммита
  • incident — внешний инцидент (PagerDuty, Sentry advisory). ref = ID того тула
  • rollback — production rollback (по сути revert'а в deploy). ref = деплой-ID

Config#

  • lookback_days — как далеко в прошлое сканировать events (default 30)
  • max_sessions — потолок результата attribution (default 25)