Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в домашней папке, перенесены в agents/. Разложено по агентам там, где имя файла позволяло определить автора; остальное — в _salvage-2026-08-18/ и разбирается вручную. Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных рабочих копий: она существовала только на диске. Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.7 KiB
PR #15: доделать, не отключая аналайзеры
Состояние
Рабочая папка C:\Users\Ochenstarik\projects\smm-antigravity, ветка antigravity/reproducible-builds, PR #15, последний запушенный коммит 5ca4832 (CI красный). В рабочей копии есть незакоммиченные правки: Directory.Build.props и четыре packages.lock.json.
Разбор трёх дефектов — в задании smm-antigravity-task-locked-restore-fix-2026-08-07.md, оно остаётся в силе.
Дефект 2 — закрыт правильно
packages.lock.json теперь содержат все три RID:
"net10.0": {},
"net10.0/linux-arm64": {},
"net10.0/linux-x64": {},
"net10.0/win-x64": {}
Это предпочтительный вариант из задания. Сохранить.
Дефект 1 — решается запрещённым способом
Незакоммиченная правка Directory.Build.props:
- <EnableNETAnalyzers>true</EnableNETAnalyzers>
- <AnalysisLevel>latest-recommended</AnalysisLevel>
В задании этот вариант назван недопустимым дословно: «Отключить EnableNETAnalyzers или понизить AnalysisLevel, чтобы CI позеленел: это отменяет смысл изменения». Аналайзеры — половина ценности Directory.Build.props; удалив их, PR перестаёт отличаться от простого переноса версий.
Вернуть обе строки и решить дефект 1 одним из разрешённых способов:
Предпочтительно. Разделить проверки в CI: dotnet format whitespace --verify-no-changes и dotnet format style --verify-no-changes вместо общего dotnet format. Тогда гейт проверяет форматирование, а диагностики аналайзеров остаются warning'ами в сборке и не блокируют.
Допустимо. Оставить общий dotnet format, но подавить конкретные правила в .editorconfig, перечислив каждое с причиной в отчёте. Сейчас мешают CA1848 (LoggerMessage-делегаты, десять вхождений в ControlMaintenance.cs и LinkReconciliationBackgroundService.cs) и CA1865 (TimezoneProvisioningExecutor.cs:76). Подавлять семейство целиком нельзя — только поимённо.
Дефект 3 — не сделан
--locked-mode стоит только в двух явных шагах dotnet restore. Все dotnet publish восстанавливают неявно и без него:
linux-control-agent.yml— строки 58, 61, 64, 67, 71, 74, 77;linux-platform-matrix.yml— строки 49, 52, 55;linux-release.yml— строки 82, 85, 88.
Это ровно те шаги, которые собирают артефакты, уходящие пользователям. Воспроизводимость, не покрывающая путь выпуска, не решает исходную задачу.
Добавить --locked-mode (либо -p:RestoreLockedMode=true) во все перечисленные шаги. Дефект 2 закрыт, поэтому RID-специфичная публикация больше не должна падать по NU1004 — но это надо подтвердить прогоном, а не рассуждением.
Критерий приёмки
EnableNETAnalyzersиAnalysisLevel=latest-recommendedприсутствуют вDirectory.Build.props;buildиbuild-and-testзелёные;--locked-modeдействует во всех шагах восстановления и публикации всех пяти workflow;- продемонстрирована работа гарантии: правка одного lock-файла во временном коммите даёт красный прогон на RID-специфичной публикации, затем коммит откатывается — со ссылкой на красный прогон;
- версии пакетов не изменились относительно
main; - если правила подавлены — каждое перечислено поимённо с причиной;
TreatWarningsAsErrorsпо-прежнему не включён;- границы прошлого задания соблюдены:
git diff --name-only mainне содержитLinkService.cs,LinkPolicyApplier.cs,LinkReconciliationBackgroundService.cs,ControlStore.cs,ControlMaintenance.cs,ControlOptions.cs,appsettings.json,src/ServerMonitorManager.Provisioning.Helper/**,deploy/**,CertificateAuthority.cs,CertificateLifecycleService.cs,AgentClient.cs, содержимого файлов вtests/**кроме.csproj; - PR не смержен.
Отчёт
Описание PR обновляется после завершения CI. Ссылки на конкретные завершённые прогоны с их статусом. Если прогон красный — сказать прямо и держать PR черновиком.
Отдельно объяснить выбор по дефекту 1: почему выбран именно этот из двух разрешённых вариантов.