You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Epic: accounting correctness and fork hygiene (audit follow-ups) #87
Follow-ups from an audit of how the fork and upstream protect calculation correctness. Finding: neither checks numbers against an external reference — tests prove the code agrees with itself, so a wrong price table passes all of them. This epic fixes the accounting layer (prices, cost, real-data validation) and the project hygiene around it (CI, dead scripts, upstream sync).
It is layer 1 of #78: the waste-detection evaluation there is only meaningful once the base numbers are right. In particular #72 blocks #82, and #74 overlaps #79.
Скиллы и документация — после того как CLI считает правильно, иначе описывать придётся дважды.
Общие правила: одно ишью — один PR; в PR, меняющих числа, прикладывать «было/стало» на своих реальных сессиях (после #79 — вывод corpus:diff); не менять пороги WASTE_THRESHOLDS и логику findings в тех же PR.
test:chunks → vitest run test/main/services/analysis/ChunkBuilder.test.ts; test:noise — проверить, покрывает ли test/main/services/parsing/MessageClassifier.test.ts; для test:semantic и test:task-filtering соответствующих тестов, похоже, нет — удалить.
Одновременно поправить CLAUDE.md и .claude/rules/testing.md: агенты выполняют эти команды буквально.
Взять за основу апстримный workflow (git show upstream/main:.github/workflows/ci.yml): шаг pnpm build + матрица ubuntu-latest / windows-latest с fail-fast: false. Добавить pnpm build:cli. Сохранить форковские --frozen-lockfile и claude plugin validate (последний достаточно на Ubuntu).
Ключ — (family, major, minor) из parseModelString (src/shared/utils/modelParser.ts). Неизвестная версия → unpriced (costPartial), никогда не «цена семейства по умолчанию» — именно так и появился текущий баг.
Пять явных колонок: input, output, cache read, cache write 5m, cache write 1h. Cache read не выводить множителем: у Opus 5.5 и Fable 5.1 он не 0.1×. В комментарии — дата сверки и ссылка на прайс.
ccusage: токены должны совпадать точно; стоимость — с допуском, т.к. у ccusage свой источник цен. Расхождение стоимости по конкретной модели — сигнал ошибки цены у одной из сторон.
Один раз сверить итог за день с Usage в Console — единственный эталон, который не зависит ни от чьей таблицы цен.
Обезличенная мини-фикстура для CI: оставить только usage, model, requestId, timestamps, имена инструментов и размеры; тексты и пути вырезать.
Follow-ups from an audit of how the fork and upstream protect calculation correctness. Finding: neither checks numbers against an external reference — tests prove the code agrees with itself, so a wrong price table passes all of them. This epic fixes the accounting layer (prices, cost, real-data validation) and the project hygiene around it (CI, dead scripts, upstream sync).
It is layer 1 of #78: the waste-detection evaluation there is only meaningful once the base numbers are right. In particular #72 blocks #82, and #74 overlaps #79.
Sub-issues
test:*scriptsНайдено при проверке эпика #2 —⚠️ выводы не проверены человеком, каждый пункт перепроверить дважды (см. раздел «Перепроверка» в каждом ишью):
analyze:sessionиanalyze:sessionsРекомендации по выполнению
Порядок
Общие правила: одно ишью — один PR; в PR, меняющих числа, прикладывать «было/стало» на своих реальных сессиях (после #79 — вывод
corpus:diff); не менять порогиWASTE_THRESHOLDSи логику findings в тех же PR.#76 — мёртвые скрипты (~15 мин)
test:chunks→vitest run test/main/services/analysis/ChunkBuilder.test.ts;test:noise— проверить, покрывает лиtest/main/services/parsing/MessageClassifier.test.ts; дляtest:semanticиtest:task-filteringсоответствующих тестов, похоже, нет — удалить.CLAUDE.mdи.claude/rules/testing.md: агенты выполняют эти команды буквально.#75 — CI
git show upstream/main:.github/workflows/ci.yml): шагpnpm build+ матрицаubuntu-latest/windows-latestсfail-fast: false. Добавитьpnpm build:cli. Сохранить форковские--frozen-lockfileиclaude plugin validate(последний достаточно на Ubuntu).src/main/utils/jsonl.ts,src/shared/turnAccounting.ts,src/cli/analyzeSession.ts,src/renderer/utils/contextTracker.ts) и поставить пороги на этом уровне («храповик»), поднимать по мере tokensWasted mixes prices and ignores residency: express waste in $ and count re-reads #82/Non-overlapping waste attribution and session waste share; split observations from waste #84. Произвольный высокий порог сразу сделает CI красным.#77 — синхронизация с апстримом
upstream/mainв текущийmain: 13 файлов, +39/−5, 2 конфликта —src/renderer/components/chat/ChatHistory.tsxиsrc/renderer/components/chat/LastOutputDisplay.tsx. Остальное сливается автоматически.git merge upstream/main), а не cherry-pick: так сдвигается merge-base, и следующая синхронизация покажет только новое.#72 — таблица цен (главное)
roundCostUsdвsrc/shared/(напр.src/shared/constants/pricing.ts), а не в CLI — иначе в App never computes session cost — costUsd is hardcoded to 0 #73 придётся переносить второй раз.(family, major, minor)изparseModelString(src/shared/utils/modelParser.ts). Неизвестная версия → unpriced (costPartial), никогда не «цена семейства по умолчанию» — именно так и появился текущий баг.usage.cache_creation.ephemeral_5m/1h_input_tokensдобавить вUsageMetadata; если разбивки нет (старые логи) — весьcache_creation_input_tokensсчитать 5-минутным. В проверенной сессии 100 % записей — 1-часовые (см. комментарий в CLI cost estimate uses outdated per-family prices (Opus overstated 3–3.75×) #72).detectBillingSchemeуже различает схемы.#88 — потеря содержимого раундов
#73 — стоимость в приложении
deduplicateByRequestId) с моделью каждого сообщения: в одной сессии бывает несколько моделей.SessionMetrics(src/main/types/domain.ts), а не возвращать 0 для неизвестных моделей.calculateMetricsпо образцуtest/shared/turnAccounting.parity.test.ts.#74 — сверка с реальностью
.env), не коммитить реальные сессии.