architect/arh/analysis/2026-01-17-roles-optimization/HOW_TO_PERSIST_APPEND_SYSTEM_PROMPT.md

Как сделать --append-system-prompt персистентным

Проблема: --append-system-prompt теряется после compaction
Дата исследования: 2026-01-17


НАЙДЕННАЯ ИНФОРМАЦИЯ

Claude Code Hooks (официальная документация)

Документация:
- Hooks Guide
- Hooks Reference
- GitHub Examples

Доступные hook events:
1. PreToolUse - перед вызовом инструмента
2. PostToolUse - после успешного выполнения
3. UserPromptSubmit - когда пользователь отправляет промпт
4. Notification - при уведомлениях
5. Stop - когда агент заканчивает ответ
6. SubagentStop - когда субагент заканчивает
7. SessionEnd - когда сессия завершается

❌ КРИТИЧНО: Нет хука on-compaction или post-compaction


ВОЗМОЖНЫЕ РЕШЕНИЯ

❌ РЕШЕНИЕ 1: Хук на compaction

Статус: Невозможно

Почему:
- Нет события для compaction в списке hooks
- Compaction происходит внутри Claude Code автоматически
- Нет способа перехватить этот момент


⚠️ РЕШЕНИЕ 2: Хук UserPromptSubmit

Идея: Добавлять инструкции при каждом сообщении пользователя

Конфигурация:

// ~/.claude/settings.json или .claude/settings.local.json
{
  "hooks": [
    {
      "event": "UserPromptSubmit",
      "command": "cat $WORKSPACE/.claude/system-additions.md"
    }
  ]
}

Проблемы:
- ❌ Добавится к user message (не к system prompt)
- ❌ Будет в каждом сообщении (спам контекста)
- ❌ Не переопределит system prompt
- ⚠️ Может не сработать

Вердикт: Скорее всего НЕ РАБОТАЕТ для нашей задачи


⚠️ РЕШЕНИЕ 3: Wrapper скрипт с периодическим restart

Идея: Скрипт следит за временем и перезапускает до compaction

Файл: ~/.local/bin/claude-persistent

#!/bin/bash
# Claude Code с авто-рестартом до compaction

WORKSPACE="$WORKSPACE"
ADDITIONS="$WORKSPACE/.claude/system-additions.md"
SESSION_TIME=1800  # 30 минут (до compaction)

while true; do
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "Starting Claude Code with custom additions..."
    echo "Session duration: $SESSION_TIME seconds"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

    timeout $SESSION_TIME claude --append-system-prompt "$(cat $ADDITIONS)" "$@"
    EXIT_CODE=$?

    if [ $EXIT_CODE -eq 124 ]; then
        # Timeout - restart
        echo ""
        echo "⚠️  Session timeout - restarting to preserve custom prompt..."
        echo "Press Ctrl+C to exit, or wait 3 seconds to continue..."
        sleep 3
    elif [ $EXIT_CODE -eq 130 ]; then
        # Ctrl+C - exit
        echo "Session ended by user"
        exit 0
    else
        # Normal exit
        exit $EXIT_CODE
    fi
done

Установка:

chmod +x ~/.local/bin/claude-persistent
echo 'alias claude="claude-persistent"' >> ~/.bashrc

Проблемы:
- ❌ Теряем контекст каждые 30 минут
- ❌ Пользователь должен следить за временем
- ⚠️ Прерывает работу

Вердикт: Костыль, но РАБОЧИЙ


✅ РЕШЕНИЕ 4: Вернуть всё в CLAUDE.md (РЕКОМЕНДУЕТСЯ)

Идея: Расширить CLAUDE.md с SafeDialog протоколом

Почему это ЛУЧШЕ:

  1. CLAUDE.md всегда читается (через claudeMd механизм)
  2. Не теряется (читается каждый раз когда нужен контекст)
  3. Версионируется (в git)
  4. Не требует флагов при запуске

Что делать:

  1. Добавить в CLAUDE.md секцию с SafeDialog протоколом:
    - Алгоритм работы (Шаги 1-6)
    - Форматы подтверждений L1-L4
    - Обязательные проверки
    - Git операции детально
    - Примеры диалогов

  2. Размер: 1113 → ~1350 строк (+237)

  3. Удалить дублирующие файлы:
    - .claude/output-styles/SafeDialog.md (дублирование)
    - system/monitor/dialog-testing/test-prompt.md (тестовый)

Плюсы:
- ✅ Всегда активен (не теряется)
- ✅ В одном месте
- ✅ Версионируется
- ✅ Не требует костылей

Минусы:
- ⚠️ Низкий приоритет (context reminder, не system prompt)
- ⚠️ Может не всегда применяться на 100%
- ⚠️ При сжатии может упроститься

Но: Это лучшее из доступных решений


⚠️ РЕШЕНИЕ 5: Ждать фикса от Claude Code

Статус: В процессе

Что сделано:
- Создан вопрос в поддержку
- Подготовлен Feature Request

Что ждём:
- Официальное решение
- Или подтверждение что хуки могут помочь
- Или новый флаг в settings.json

Временно: Используем РЕШЕНИЕ 4 (CLAUDE.md)


✅ ФИНАЛЬНОЕ РЕШЕНИЕ (НАЙДЕНО!)

Ответ поддержки получен: compaction_control существует в Anthropic Python SDK tool_runner!

Что работает

import anthropic

client = anthropic.Anthropic()

runner = client.beta.messages.tool_runner(
    model="claude-sonnet-4-5",
    max_tokens=4096,
    system="ваши инструкции (L1-L4 протокол, время, правила)",
    messages=[...],
    tools=[...],
    compaction_control={
        "enabled": True,
        "context_token_threshold": 100000,
        "summary_prompt": "Preserve L1-L4 protocol, time rules..."
    }
)

Как это решает проблему

Проблема Решение
CLI теряет --append-system-prompt ✅ Используем SDK вместо CLI
После compaction инструкции пропадают ✅ summary_prompt сохраняет их
Нет hooks для compaction ✅ compaction_control встроен в SDK
CLAUDE.md низкий приоритет ✅ system= высокий приоритет

Что создано

Wrapper скрипт: $WORKSPACE/system/cli/claude-persistent.py

# Использование
chmod +x system/cli/claude-persistent.py
ln -s $WORKSPACE/system/cli/claude-persistent.py ~/.local/bin/claude-persistent

# Запуск
claude-persistent "режим архитектор"
claude-persistent  # интерактивный режим

Особенности:
- ✅ Загружает CLAUDE.md + кастомный протокол
- ✅ compaction_control с custom summary_prompt
- ✅ Сохраняет L1-L4, правила времени, делегирование
- ✅ Статистика токенов
- ✅ Интерактивный и one-shot режимы

Документация

ИТОГО

CLI ❌SDK ✅ = ПРОБЛЕМА РЕШЕНА

Больше не нужно:
- ❌ Рестартить сессию каждые 30 мин
- ❌ Ждать фикса от Claude Code
- ❌ Использовать wrapper с timeout
- ❌ Полагаться на CLAUDE.md (низкий приоритет)

Используй: claude-persistent.py с anthropic SDK 0.75.0+


ИСТОЧНИКИ

Документация Claude Code:
- Hooks Guide
- Hooks Reference
- GitHub Examples
- Awesome Claude Code

Наши документы:
- .claude/QUESTION_TO_SUPPORT.txt - вопрос в поддержку
- .claude/FEATURE_REQUEST_outputStyle_persistence.md - детальный запрос
- .claude/KNOWN_ISSUES.md - известные проблемы
- .claude/COMPARISON_ADDITIONS.md - что добавили в SafeDialog


СЛЕДУЮЩИЙ ШАГ

Делаем:

  1. Отправляем вопрос в поддержку (.claude/QUESTION_TO_SUPPORT.txt)
  2. Возвращаем всё в CLAUDE.md (добавляем SafeDialog)
  3. Ждём ответа

Оценка времени на возврат в CLAUDE.md: 45 минут

Делаем?