Skip to content

Убрать @unchecked Sendable у провайдеров лимитов через @Sendable-замыкания - #156

Merged
Ascurse merged 1 commit into
mainfrom
bd-mac-limits-tracker-0na.4
Aug 7, 2026
Merged

Убрать @unchecked Sendable у провайдеров лимитов через @Sendable-замыкания#156
Ascurse merged 1 commit into
mainfrom
bd-mac-limits-tracker-0na.4

Conversation

@Ascurse

@Ascurse Ascurse commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Закрывает bd mac-limits-tracker-0na.4 (P2).

Пять из шести вхождений @unchecked Sendable в Sources относились к провайдерам и стояли по одной причине, названной в самом комментарии: DI-замыкания были объявлены без @Sendable, поэтому структуры не выводились как Sendable и аннотация проставлялась вручную.

Что сделано

  • ClaudeLimitsProvider, CodexLimitsProvider, KimiLimitsProvider — честный Sendable без @unchecked; все DI-замыкания в полях и в сигнатурах init помечены @Sendable. Стиль взят у DynamicProviderSpec в Providers/LimitsProvider.swift, который уже так объявлен.
  • Дефолтные значения processRunner/keychainReader обёрнуты в замыкания-литералы вместо прямой ссылки на статический метод — прямая ссылка давала предупреждение «converting non-Sendable function value may introduce data races».
  • RpcCallState не тронут и остаётся @unchecked Sendable: это final class с мутабельными buffer и resolved под общим NSLock, continuation резолвится ровно один раз — здесь аннотация корректна и единственно возможна.

Тесты

Настоящее содержание задачи — тестовые подстановки: DI-замыкания в тестах пишут в захваченные var и полагаются на то, что тест не гоняет fetch() параллельно с самим собой. После @Sendable компилятор начал ругаться именно на них.

Шесть накопителей в KimiProviderTests и MacLimitsTrackerTests помечены nonisolated(unsafe) точечно, каждый с комментарием, почему это безопасно: провайдер вызывает замыкания последовательно через await внутри одного fetch(), реальной конкуренции нет, но компилятору это не видно. Огульного глушения аннотацией нет — других подстановок компилятор менять не потребовал.

Оговорка про тестовые замыкания сохранена и уточнена в комментарии рядом с провайдерами: теперь границу проверяет компилятор, а не честное слово.

Проверка

  • swift build — по изменённым файлам чисто. Оставшиеся ~7 предупреждений (retroactive conformance в LimitsViewModel.swift/CostEstimator.swift, неиспользуемая переменная в тесте, deprecated Inspectable) существовали на main до задачи — подтверждено через git stash.
  • swift test --disable-sandbox — 572 теста, 0 сбоев.

🤖 Generated with Claude Code

…кания

ClaudeLimitsProvider, CodexLimitsProvider и KimiLimitsProvider теперь честные
Sendable — все DI-замыкания в полях и init помечены @sendable. RpcCallState
не тронут. Тестовые подстановки, пишущие в захваченные var (KimiProviderTests,
MacLimitsTrackerTests), помечены nonisolated(unsafe) точечно — provider вызывает
их последовательно через await внутри одного fetch(), реальной конкуренции нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Ascurse
Ascurse merged commit c6cd137 into main Aug 7, 2026
2 checks passed
@Ascurse
Ascurse deleted the bd-mac-limits-tracker-0na.4 branch August 7, 2026 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant