Часть #1090.
Что случилось
Две пчелы работали параллельно с непересекающимися границами:
#1110 сделала baseBranch() возвращающим String? — именно то, что требовал критерий: если ветка по умолчанию не определяется, PR не открывать. Место вызова находится в ChatViewModel.swift, то есть в границе другой пчелы. Обе поступили правильно, ни одна границу не нарушила, сборка сломана:
rings/SR-02/ChatViewModel.swift:4142: error: value of optional type 'String?'
must be unwrapped to a value of type 'String'
Что это значит
Правило одного владельца на путь защищает от конфликта записи. От конфликта интерфейса оно не защищает вообще: смена сигнатуры в своём файле ломает чужой, и заметить это может только сборка, которой в цикле пчелы нет.
Это станет обычным делом ровно по мере того, как параллельность начнёт работать.
Возможные направления
- Собирать объединённое состояние перед приёмкой, а не только каждую ветку отдельно.
- Считать смену публичной сигнатуры особым случаем: такая задача не идёт параллельно с задачами, чьи границы содержат вызовы.
- Разрешать пчеле правку чужого файла, если она вынуждена изменением своего, но помечать это явно.
Выбор направления — часть задачи; ни одно не очевидно.
Готово, когда
- Параллельный прогон двух задач, одна из которых меняет сигнатуру, а вторая владеет вызовом, не оставляет дерево несобирающимся.
- Проверка ломается, если вернуть прежнее поведение.
Что уже сделано
Новый файл: чистое правило, решающее, расходятся ли две ветки по интерфейсу.
Сам сторож уже есть — runInterfaceDivergenceWatchdog в ChatViewModel
собирает объединённое дерево перед приёмкой, и первое из трёх направлений
выше тем самым закрыто. Не закрыт второй критерий: drift-guard судит
рассогласование между двумя времянками, которые строит сам, а не между двумя
состояниями ЭТОГО дерева, поэтому возврат прежнего поведения его не двигает.
Правило выносится в SR-00 отдельным файлом, потому что там оно проверяемо
однофайловым набором и не требует трогать ChatViewModel, которым владеют
другие задачи.
Границы
rings/SR-00/QueenInterfaceDivergence.swift
Часть #1090.
Что случилось
Две пчелы работали параллельно с непересекающимися границами:
rings/SR-02/QueenBranchCommitter.swiftrings/SR-00/QueenReviewVerdictRequest.swift,rings/SR-02/ChatViewModel.swift#1110 сделала
baseBranch()возвращающимString?— именно то, что требовал критерий: если ветка по умолчанию не определяется, PR не открывать. Место вызова находится вChatViewModel.swift, то есть в границе другой пчелы. Обе поступили правильно, ни одна границу не нарушила, сборка сломана:Что это значит
Правило одного владельца на путь защищает от конфликта записи. От конфликта интерфейса оно не защищает вообще: смена сигнатуры в своём файле ломает чужой, и заметить это может только сборка, которой в цикле пчелы нет.
Это станет обычным делом ровно по мере того, как параллельность начнёт работать.
Возможные направления
Выбор направления — часть задачи; ни одно не очевидно.
Готово, когда
Что уже сделано
Новый файл: чистое правило, решающее, расходятся ли две ветки по интерфейсу.
Сам сторож уже есть —
runInterfaceDivergenceWatchdogвChatViewModelсобирает объединённое дерево перед приёмкой, и первое из трёх направлений
выше тем самым закрыто. Не закрыт второй критерий:
drift-guardсудитрассогласование между двумя времянками, которые строит сам, а не между двумя
состояниями ЭТОГО дерева, поэтому возврат прежнего поведения его не двигает.
Правило выносится в SR-00 отдельным файлом, потому что там оно проверяемо
однофайловым набором и не требует трогать
ChatViewModel, которым владеютдругие задачи.
Границы
rings/SR-00/QueenInterfaceDivergence.swift