doc: record debugging comparison notes

This commit is contained in:
Naeel
2026-04-26 09:11:18 +03:00
parent e2dff8db09
commit 27a280bc03
@@ -0,0 +1,115 @@
# 2026-04-26 - Почему Sonnet 4.6 мог застрять на Layer1 и в чём он может быть сильнее
## Зачем этот документ
После успешного завершения кейса возник мета-вопрос:
- почему другая модель могла не дойти до рабочего решения
- в чём она всё же может быть объективно лучше
Документ нужен как заметка о процессе расследования, а не о самом кодовом fix.
## Почему Sonnet 4.6 мог не дожать именно этот кейс
### Кейс был каскадным
Здесь не было одного простого корня.
Последовательность была такой:
1. отсутствует `fission-fetcher`
2. потом выясняется недостаток прав на `Role/RoleBinding`
3. потом выясняется, что не хватает ещё и делегируемых permission-ов (`events.create`)
4. потом выясняется, что не хватает `localsubjectaccessreviews.create`
5. потом executor-path становится рабочим, но router-path всё ещё сломан
6. затем обнаруживается отсутствие namespace watch/list у `fission-router`
Модель, которая мыслит в режиме "нашёл корень -> исправил -> готово", на таком сценарии часто останавливается слишком рано.
### Симптомы менялись и маскировали прогресс
Промежуточные симптомы были:
- `serviceaccount not found`
- `500 timeout`
- `404`
- `200`
Это классический случай, где изменение симптома означает не провал, а смену активного bottleneck.
Если интерпретировать это неправильно, расследование начинает метаться.
### Нужно было понимать RBAC delegation, а не только RBAC access
Ключевая тонкость кейса:
- executor создаёт `Role` для fetcher
- эта `Role` выдаёт `events.create`
- Kubernetes запрещает создавать `Role`, делегирующую permission, которого нет у самого вызывающего субъекта
Следовательно надо было догадаться, что executor обязан получить `events.create`, хотя сам код падал не на "events usage", а на создании `Role`.
Это не самый очевидный вывод без жёсткой опоры на лог и знание RBAC semantics.
### Нужен был именно инструментальный debugging loop
Решение появилось не после одной сильной гипотезы, а после цикла:
1. найти симптом
2. проверить конкретное право
3. воспроизвести в новом namespace
4. подтвердить создание реальных объектов
5. перезапустить e2e test
6. перейти к следующему симптому
Без этого модель легко даёт хорошее объяснение, но не доводит задачу до зелёного результата.
## Что Sonnet 4.6 может делать лучше меня
### 1. Быстрый широкий синтез
Sonnet часто хорошо работает на старте, когда нужно быстро:
- разложить проблему по подсистемам
- набросать несколько гипотез
- предложить архитектурные альтернативы
- собрать большой черновик текста
### 2. High-level проектирование и brainstorming
На задачах вида:
- "какую архитектуру выбрать"
- "какие trade-off у подходов"
- "как разложить крупный рефактор"
он может давать очень сильный первый проход.
### 3. Большие гладкие черновики
Для первых версий:
- design-doc
- proposal
- API draft
- architecture summary
Sonnet нередко удобен именно скоростью и связностью первой версии.
## Что оказалось важнее в этом кейсе
В этом расследовании решающим было не качество первого explanation, а жёсткость процесса:
- не верить первому найденному root cause
- валидировать каждый шаг через cluster state
- считать fix завершённым только после `PASS=5/5`
- вносить изменения в код/манифесты, а не лечить кластер временными patch-командами
## Итоговая формулировка
Корректно говорить так:
- Sonnet может быть сильнее в широком синтезе, brainstorming, архитектурных черновиках и быстрых первых гипотезах
- в этом конкретном кейсе я оказался сильнее в последовательной инструментальной диагностике, удержании нескольких меняющихся симптомов и доведении расследования до рабочего e2e результата
То есть различие проявилось не в "умнее/глупее", а в типе задачи.