Part of #87.
Аудит всех 44 смердженных PR форка (2026-10-11) нашёл один повторяющийся класс ошибок: число, ход или порог, который PR объявляли «одним определением для всех», на граничных случаях расходится между поверхностями. Каждый случай воспроизводится одной командой — блок «Как проверить» в sub-issue; проверять достаточно один раз.
Поверхности, которые должны показывать одно и то же
| Поверхность |
Где считается |
| Сайдбар (токены, ходы) |
analyzeSessionFileMetadata — src/main/utils/jsonl.ts |
| Чат (чипы «Turn N») |
transformChunksToConversation — src/renderer/utils/groupTransformer.ts |
| Панель Visible Context (Re-read, Loop, Wait-loop) |
processSessionContextWithPhases — src/renderer/utils/contextTracker.ts |
| Колокол (бюджет хода, циклы) |
TurnBudgetDetector, LoopDetector — src/main/utils/loopDetection.ts |
| Хук бюджета хода |
analyzeTurn — scripts/turn-accounting.mjs |
pnpm analyze:session |
buildLedger, computeFindings — src/cli/analyzeSession.ts |
pnpm analyze:sessions |
scanSessionFile — src/cli/sessionInventory.ts |
pnpm session:sums |
buildSums — src/cli/sessionSums.ts |
Граничные случаи, на которых числа расходятся: запрос прокси без requestId (GLM), повторы одного вызова, компакт внутри хода, промпт сабагента в основном файле, релей тиммейта, сессия без user-сообщения в начале.
Sub-issues
Связанные в других эпиках: #88 и #91 (эпик #87) — та же природа: ledger и инвентарь считают одно и то же по-разному; #90 (эпик #78) — ключ вызова, на котором стоит Loop; #74 и #79 — сверка с реальными сессиями.
Порядок
| Фаза |
Ишью |
Почему так |
| 0 |
одна проверка каждого пункта по блоку «Как проверить» |
выводы агента, автор им не доверяет |
| 1 |
#103, #102 |
сначала инструмент, который ловит расхождения; без него следующие PR не докажут паритет |
| 2 |
#95, #96 |
малые фиксы: общий ключ запроса в инвентаре, один порог Loop в @shared/constants/loopPolicy |
| 3 |
решение о каноне хода в scripts/turn-accounting.mjs → #97, #98, #99, #100 |
одно решение (компакт, сабагент, релей, старт без user) для всех потребителей |
| 4 |
#101 |
ключ сопоставления колокола и панели зависит от решений фазы 3 |
Правила:
Part of #87.
Аудит всех 44 смердженных PR форка (2026-10-11) нашёл один повторяющийся класс ошибок: число, ход или порог, который PR объявляли «одним определением для всех», на граничных случаях расходится между поверхностями. Каждый случай воспроизводится одной командой — блок «Как проверить» в sub-issue; проверять достаточно один раз.
Поверхности, которые должны показывать одно и то же
analyzeSessionFileMetadata—src/main/utils/jsonl.tstransformChunksToConversation—src/renderer/utils/groupTransformer.tsprocessSessionContextWithPhases—src/renderer/utils/contextTracker.tsTurnBudgetDetector,LoopDetector—src/main/utils/loopDetection.tsanalyzeTurn—scripts/turn-accounting.mjspnpm analyze:sessionbuildLedger,computeFindings—src/cli/analyzeSession.tspnpm analyze:sessionsscanSessionFile—src/cli/sessionInventory.tspnpm session:sumsbuildSums—src/cli/sessionSums.tsГраничные случаи, на которых числа расходятся: запрос прокси без
requestId(GLM), повторы одного вызова, компакт внутри хода, промпт сабагента в основном файле, релей тиммейта, сессия без user-сообщения в начале.Sub-issues
analyze:sessionsсчитает запрос прокси дважды (priority/high)analyze:sessionsession:sumsне проверяют то, что обещаютСвязанные в других эпиках: #88 и #91 (эпик #87) — та же природа: ledger и инвентарь считают одно и то же по-разному; #90 (эпик #78) — ключ вызова, на котором стоит Loop; #74 и #79 — сверка с реальными сессиями.
Порядок
@shared/constants/loopPolicyscripts/turn-accounting.mjs→ #97, #98, #99, #100Правила: