Строка кода в репозитории теперь имеет больше одного возможного происхождения. Её мог набрать человек, мог предложить механизм автодополнения, а мог целиком написать агент по заданию из разговора. Разметка авторства делит вклад ровно на эти три категории и добавляет к каждой то, чего в обычной истории правок нет: какая модель породила фрагмент и из какого диалога он вышел. Поверх этого в виде коммита показывается разбивка вкладов: доли Composer, каждой модели агента и человеческих правок.
Наивное представление здесь особенно естественно, потому что инструмент для ответа на вопрос "кто это написал" существует десятилетиями и работает. История правок называет автора коммита, сообщение, дату - и этого хватало ровно до тех пор, пока автор коммита и источник строки были одним и тем же лицом. Пока текст набирали руками, различать эти две сущности было не нужно: они совпадали по определению, и вся конструкция обзора кода выросла на этом совпадении.
Ломается это в момент, когда совпадение исчезает. Автор коммита теперь означает того, кто отправил изменение, а не того, кто его произвёл. Человек, агент и автодополнение попадают в историю под одним именем и с одинаковым весом, хотя доверять им приходится по-разному: за строкой, набранной вручную, стоит понимание задачи, за принятой подсказкой - беглый взгляд, за агентским фрагментом - формулировка задания, которая в истории не сохранилась вовсе. Обзор, который не различает эти три случая, тратит одинаковое внимание на всё и не тратит дополнительного там, где оно нужнее всего.
Поэтому разметка авторства устроена слоями, и полезно один раз развести их по происхождению - что лежит на машине, а что запрашивается по требованию. Ниже такая карта: категория строки и модель лежат в самой разметке, которая кэшируется локально ради скорости, а при открытии файлов и коммитов данные запрашиваются с сервера; автор, сообщение коммита и относительное время выводятся прямо в строке; при наведении добавляются признак машинного соавторства, сводка разговора и статистика коммита; доли вкладов показывает вид коммита; полная переписка не отдаётся вовсе, только её краткое содержание.
Две строки этой карты и есть всё отличие от обычной истории правок. Имя модели говорит, чем именно произведён фрагмент, а сводка разговора - зачем. Сообщение коммита пишется после факта и описывает намерение автора таким, каким он его помнит; сводка разговора фиксирует то задание, по которому код был написан на самом деле. Для обзора это разные вещи: первое можно переписать задним числом и подогнать под результат, второе привязано к тому, что происходило.
| Слой | Что показывает | Откуда берётся |
|---|---|---|
| Категория строки | Человек, автодополнение или агент | Разметка, кэшируется на машине |
| Модель | Какая модель породила фрагмент | Разметка, кэшируется на машине |
| Сводка разговора | Из какого диалога вышел код | Запрос на сервер по требованию |
| Автор и сообщение коммита | Обычные поля истории правок | Запрос на сервер по требованию |
| Относительное время | Когда строка появилась | Запрос на сервер по требованию |
| Доли вкладов | Распределение между источниками по коммиту | Показывается в виде коммита |
| Полная переписка | Не показывается, только сводка | Недоступна из разметки |
Включение здесь не личная настройка. Функция доступна на корпоративном тарифе, и её открывает администратор команды в настройках; до этого её нет у участников, сколько бы они ни искали. Требуется репозиторий системы контроля версий с отслеживаемыми изменениями - без истории размечать нечего. Дальше уже локально: пометки в редакторе включаются и выключаются командой из палитры, а отдельный вид истории по файлу открывается из контекстного меню. В строке выводятся автор, сообщение коммита и относительное время, а наведение добавляет признак машинного соавторства и сводку разговора.
Приватная сторона сводится к двум оговоркам, и обе стоит проговорить вслух до включения. Первая: наружу отдаётся сводка, а не переписка целиком, то есть разметка не превращает историю репозитория в архив всех диалогов команды. Вторая: часть данных всё же ходит на сервер по требованию, а не живёт целиком на машине, и локальный кэш существует ради скорости, а не ради изоляции. Решение о включении принимает организация за всех сразу, и это правильный уровень для такого решения, но он же означает, что участник не выбирает, размечать его работу или нет.
Цена у разметки двойная. Первая часть техническая и мелкая: пометки занимают место в редакторе, часть данных подтягивается по сети, и на большом файле наведение отвечает не мгновенно. Вторая серьёзнее. Доли вкладов - это число, а числа в организациях начинают жить своей жизнью: их сводят в отчёты, сравнивают между людьми и превращают в показатель. Разметка отвечает на вопрос о происхождении строки и ничего не говорит о её качестве, сложности или ценности; попытка вывести из неё продуктивность даёт прямой стимул набирать руками то, что быстрее и лучше сделал бы агент.
Оправдана разметка в двух работах. В обзоре - чтобы распределить внимание: фрагмент, целиком написанный агентом по короткому заданию, читают иначе, чем строку, набранную человеком, который держал в голове весь контекст. В аудите - чтобы ответить на вопрос происхождения задним числом, когда спустя месяцы выясняют, откуда в кодовой базе взялся кусок и на каком основании. Проверяется работоспособность одним прогоном на известном материале: взять файл, где вы точно помните, что писали руками, а что делал агент, открыть вид истории по файлу и сверить обе категории, а потом навести на агентскую строку и убедиться, что сводка разговора относится к тому самому заданию, а не к соседнему.
Типичные провалы предсказуемы. Ждать пометок там, где администратор не включал функцию, и искать причину в редакторе. Пытаться размечать код, которого нет в истории системы контроля версий. Читать долю вкладов как оценку человека, а не как признак происхождения строки. Считать сводку разговора полной перепиской и строить на ней разбор инцидента. И принимать разметку за замену обзору: она говорит, откуда пришла строка, но не о том, верна ли она.