Над функцией или классом в редакторе появляются небольшие кнопки-подсказки - code lenses, и их легко принять за одну общую "магию ИИ". Соблазн - нажимать, не разбираясь, какая из них что запускает: результат ведь всё равно приходит в тот же редактор. Но за тремя кнопками стоят два разных механизма, и путать их - значит не понимать, куда ушла задача и чем её проверять.
Code Lenses в Devin Desktop показываются над подходящими символами - функциями и классами - и дают три действия. Explain объясняет, что делает символ и как он устроен, и для этого обращается к агенту. Refactor открывает список готовых инструкций с возможностью написать свою и выполняет правку через Command. Docstring через Command генерирует комментарий-документацию над заголовком функции, а в Python - под ним.
Отсюда полезная развилка, которую линзы задают самой конструкцией: сначала понять, потом менять. Explain - это чтение: он передаёт код агенту и возвращает объяснение, ничего не трогая. Refactor и Docstring - это уже локальный diff через Command. Разумный порядок повторяет эту границу: незнакомый символ сперва объясняют, а рефакторят или документируют только тогда, когда стало ясно, что именно и зачем меняется.
Ломается наивное доверие на docstring. Сгенерированный комментарий выглядит авторитетно и встаёт ровно там, где ожидается документация, - и его принимают как истину о коде. Но модель описывает то, что видит в тексте функции, а не бизнес-смысл, который в тексте не записан. Docstring должен фиксировать наблюдаемое поведение, выбрасываемые исключения и единицы измерения, а не догадку о том, зачем эта функция нужна.
Профессиональный приём - относиться к сгенерированному docstring как к черновику, который вы заверяете своим знанием. Прочитайте его рядом с телом функции и вычеркните всё, чего в коде не подтверждается: придуманные гарантии, не те единицы, отсутствующее упоминание ошибки. То, что осталось и проверено, - документация; то, что модель дописала от себя, - гипотеза, которой не место над рабочим кодом.
Отдельная граница, которую документация называет прямо: code lenses пока не запускают Devin Local. Значит, за кнопкой стоит либо агент (Explain), либо Command (Refactor, Docstring), но не полноценный локальный агент с его правами и sandbox. Практический вывод: если вы ждали от линзы поведения Devin Local - проверки diff, permission-решений, прогона тестов, - вы ждали не от того механизма и увидите поведение Command или чата, а не агента.
Почему линзы устроены как быстрые кнопки, а не как вход в агента. Их задача - убрать трение на самых частых мелких действиях: понять чужую функцию, привести её в порядок, поставить комментарий. Для этого не нужен цикл с правами и проверкой; нужен один клик и немедленный результат. Развести Explain как чтение агентом и Refactor с Docstring как правку через Command - значит держать дешёвое дешёвым, не притворяясь, что каждая кнопка это проектная работа.
Цена смешения не в поломке, а в неверных ожиданиях. Приняв docstring не глядя, вы оставляете в коде правдоподобную неправду, которую следующий читатель примет за проверенную. Ожидая от Refactor масштаба Devin Local, вы получаете правку в пределах символа и удивляетесь, что соседние вызовы не согласованы. Обе беды дешёвые по отдельности, но они копятся именно потому, что выглядят как завершённая работа.
Проверять результат линз стоит по тому, какой механизм вы запустили. После Explain убедитесь, что поняли символ, а не просто прочитали связный абзац: объяснение агента - вход в задачу, а не сама задача. После Refactor и Docstring прочитайте diff как любой diff Command: сигнатура, поведение, границы. И помните, что ни одна из линз не проверит код за вас так, как это сделал бы Devin Local, - этой проверки здесь просто нет.
У Refactor есть удобная деталь, которую стоит использовать осознанно: он предлагает список готовых инструкций и позволяет дописать свою, и по сути это то же, что выделить код и вызвать Command. Готовый пункт экономит формулировку на типовой правке - извлечь функцию, упростить условие, - но своя инструкция с названными границами почти всегда точнее шаблонной, когда важно, чего именно не трогать. Docstring же ставит комментарий над заголовком функции, а в Python под ним, и это стоит держать в голове, чтобы не искать результат не там.
Типичные провалы растут из смешения слоёв. Docstring приняли как факт - и в кодовой базе поселилось уверенное описание того, чего функция не делает. От Refactor ждали проектной согласованности - и получили аккуратную правку одного места среди рассогласованных остальных. Решили, что линза "запустила Devin Local", - и ищут permission-карту, которой не было. Признак один: кнопку нажали, не назвав, агент это, Command или чтение. Назвать механизм прежде клика - и объяснение почти всегда там же.