# Cache Rebuild (пересборка кеша)

## Контекст

Механизм prompt caching Anthropic объединяет system → tools → messages (до точки разрыва кеша) в ключ кеша. Когда ключ кеша совпадает с предыдущим запросом, API возвращает `cache_read_input_tokens` (попадание в кеш); когда ключ кеша изменяется, API создаёт кеш заново, возвращая большое количество `cache_creation_input_tokens`, то есть происходит пересборка кеша.

Пересборка кеша означает дополнительные расходы на токены (цена cache creation выше, чем cache read), поэтому определение причин пересборки имеет прямую ценность для оптимизации затрат.

## Классификация причин пересборки кеша

cc-viewer сравнивает тела двух последовательных запросов MainAgent для точного определения причины пересборки кеша:

| reason | Значение | Способ определения |
|--------|------|----------|
| `ttl` | Кеш истёк | С момента предыдущего запроса MainAgent прошло более 5 минут |
| `system_change` | Изменение system prompt | `JSON.stringify(prev.system) !== JSON.stringify(curr.system)` |
| `tools_change` | Изменение определений инструментов | `JSON.stringify(prev.tools) !== JSON.stringify(curr.tools)` |
| `model_change` | Смена модели | `prev.model !== curr.model` |
| `msg_truncated` | Обрезка стека сообщений | В текущем запросе меньше сообщений, чем в предыдущем, обычно из-за обрезки при переполнении контекстного окна |
| `msg_modified` | Изменение истории сообщений | Содержимое префиксных сообщений не совпадает (при нормальном добавлении префикс должен быть идентичным) |
| `key_change` | Неизвестное изменение ключа | Fallback, когда ни одно из вышеуказанных условий не совпало |

## Приоритет определения

1. Сначала проверяется временной интервал — более 5 минут означает `ttl`, без сравнения тел
2. Затем последовательно проверяются: model, system, tools, messages
3. Один запрос может одновременно соответствовать нескольким причинам (например, смена модели + изменение system prompt), тогда массив `reasons` содержит все совпавшие элементы, а tooltip отображает их построчно

## Типичные сценарии

- **`ttl`**: пользователь приостановил работу более чем на 5 минут, кеш естественно истёк
- **`system_change`**: Claude Code обновил system prompt (например, загрузка нового CLAUDE.md, изменение инструкций проекта)
- **`tools_change`**: подключение/отключение MCP-сервера привело к изменению списка доступных инструментов
- **`model_change`**: пользователь переключил модель командой `/model`
- **`msg_truncated`**: слишком длинный диалог вызвал управление контекстным окном, Claude Code обрезал ранние сообщения
- **`msg_modified`**: Claude Code отредактировал исторические сообщения (например, `/compact` заменил оригинальные сообщения сжатым резюме)
