Дата: 2026-02-19
Проблема: Claude игнорирует инструкции из CLAUDE.md и следует базовым инструкциям Anthropic
Статус: ✅ Исследование завершено
Корневая причина: Output Styles с keep-coding-instructions: true ДОБАВЛЯЮТ базовые инструкции Claude Code к кастомным инструкциям, создавая КОНФЛИКТ между противоречащими правилами.
Механизм конфликта:
SafeDialog.md (L1-L4 протокол) → "показывай план, жди подтверждения"
+
Base Claude Code instructions → "NEVER create files unless absolutely necessary"
=
РЕЗУЛЬТАТ: Claude создаёт файлы БЕЗ подтверждения (базовые инструкции побеждают)
Решение: Изменить keep-coding-instructions: true → false в Output Styles ИЛИ полностью переписать Output Styles с явным переопределением.
Claude Code CLI использует многоуровневую систему инструкций:
┌─────────────────────────────────────────────────────────────┐
│ LAYER 1: Base System Prompt (Anthropic, встроенный) │
│ ─────────────────────────────────────────────────────────── │
│ • Tone and Style │
│ • Professional Objectivity │
│ • ❌ "Never give time estimates" (no time estimates) │
│ • ❌ "NEVER create files unless absolutely necessary" │
│ • Task Management (TodoWrite) │
│ • Doing Tasks (avoid over-engineering) │
│ • Git Safety Protocol │
└─────────────────────────────────────────────────────────────┘
↓ (при запуске с флагом)
┌─────────────────────────────────────────────────────────────┐
│ LAYER 2: --append-system-prompt (опционально, CLI) │
│ ─────────────────────────────────────────────────────────── │
│ Добавляется В КОНЕЦ system prompt при старте │
│ ⚠️ ТЕРЯЕТСЯ после /compact │
└─────────────────────────────────────────────────────────────┘
↓ (если активирован output-style)
┌─────────────────────────────────────────────────────────────┐
│ LAYER 3: Output Styles (.claude/output-styles/*.md) │
│ ─────────────────────────────────────────────────────────── │
│ ЕСЛИ keep-coding-instructions: true │
│ → ДОБАВЛЯЕТ свои инструкции К базовым │
│ ЕСЛИ keep-coding-instructions: false │
│ → ЗАМЕНЯЕТ базовые инструкции своими │
│ ✅ ПЕРЕЖИВАЕТ /compact │
│ ✅ Можно менять в сессии: /output-style Name │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ LAYER 4: Session Hook (SessionStart) │
│ ─────────────────────────────────────────────────────────── │
│ Файл: .claude/hooks/session-setup.sh │
│ Триггеры: startup, resume, post-compact │
│ Добавляет: additionalContext (НЕ system prompt) │
│ Содержимое: /opt/claude-workspace/CLAUDE.md │
│ ✅ ПЕРЕЖИВАЕТ /compact (перезапускается) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ LAYER 5: Context Reminder (claudeMd, низкий приоритет) │
│ ─────────────────────────────────────────────────────────── │
│ CLAUDE.md загружается автоматически в контекст │
│ ❌ СЖИМАЕТСЯ при /compact (низкий приоритет) │
│ Используется как справочный материал │
└─────────────────────────────────────────────────────────────┘
Порядок от высшего к низшему:
| Уровень | Источник | Приоритет | Переживает compact | Можно менять в сессии |
|---|---|---|---|---|
| 1 | Base System Prompt | ВЫСШИЙ | ✅ Да | ❌ Нет |
| 2 | --append-system-prompt | Высокий | ❌ Нет | ❌ Нет |
| 3 | Output Styles | Высокий | ✅ Да | ✅ Да (/output-style) |
| 4 | SessionStart hook | Средний (context) | ✅ Да (перезапуск) | ❌ Нет |
| 5 | CLAUDE.md (claudeMd) | НИЗКИЙ | ❌ Нет (сжимается) | ❌ Нет |
keep-coding-instructionsФайл: .claude/output-styles/SafeDialog.md (строка 4)
---
name: Safe Dialog Protocol
description: Протокол диалога с подтверждениями для операций L1-L4
keep-coding-instructions: true # ← ВОТ ОНО!
---
Что делает этот флаг:
true → Output Style ДОБАВЛЯЕТСЯ к базовым инструкциям Claude Codefalse → Output Style ЗАМЕНЯЕТ базовые инструкции Claude CodeВсе файлы в .claude/output-styles/ имеют keep-coding-instructions: true:
$ grep "keep-coding-instructions" .claude/output-styles/*
SafeDialog.md:keep-coding-instructions: true
Architect.md:keep-coding-instructions: true
Default.md:keep-coding-instructions: true
TestMarker.md:keep-coding-instructions: true
Coder.md:keep-coding-instructions: true
| Файл | Статус | Содержимое |
|---|---|---|
.claude/settings.json |
✅ Активен | SessionStart hook + permissions |
.claude/settings.local.json |
✅ Активен | Полные permissions (Bash, Read, Write, Edit - всё разрешено) |
.claude/hooks/session-setup.sh |
✅ Активен | Читает CLAUDE.md → additionalContext |
.claude/CHANGES.md |
✅ Актуален | Реестр изменений |
keep-coding-instructions: true)| Файл | Назначение | Проблема |
|---|---|---|
SafeDialog.md |
L1-L4 протокол | ⚠️ Конфликтует с базовыми инструкциями |
Coder.md |
Режим реализации (план → код без остановок) | ⚠️ Конфликтует с "NEVER create files" |
Architect.md |
Режим планирования | ⚠️ Конфликтует с "no time estimates" |
Default.md |
Базовый режим | ⚠️ Добавляет к базовым |
TestMarker.md |
Тестовый маркер | N/A |
| Файл | Содержимое |
|---|---|
/opt/claude-workspace/CLAUDE.md |
1113 строк — инструкции для всех режимов |
architect/arh/reference/CLAUDE_CODE_SYSTEM_PROMPT.md |
Базовый system prompt + наши дополнения |
architect/arh/analysis/2026-01-17-roles-optimization/ALL_METHODS_OVERRIDE.md |
Все способы переопределения инструкций |
architect/arh/analysis/2026-01-17-roles-optimization/HOW_TO_PERSIST_APPEND_SYSTEM_PROMPT.md |
Как сделать --append-system-prompt персистентным |
Commit f2399371 (2026-01-09): "feat(architect): Add system-wide time estimation override"
- Добавлен раздел в CLAUDE.md: "ПРАВИЛО ВРЕМЕНИ — OVERRIDE system prompt"
- Результат: НЕ сработало (CLAUDE.md = низкий приоритет)
Commit 2ffaef93 (дата неизвестна): "feat(claude): add base protocol for all roles except Coder"
- Добавлен базовый протокол
- Результат: Частично работает
Commit dc173c92: "feat(claude): add signal types, coder protocol, and meta-roles"
- Добавлен Coder протокол
- Результат: Конфликтует с базовыми инструкциями
2026-02-17: Создан SessionStart hook (session-setup.sh)
- Восстанавливает CLAUDE.md после compact
- Результат: Работает как context reminder, но НЕ переопределяет system prompt
Файл: .claude/settings.local.json
{
"permissions": {
"allow": [
// Строки 314-321: ПОЛНОЕ АВТОПОДТВЕРЖДЕНИЕ (2025-11-14)
"Bash",
"Read",
"Grep",
"Glob",
"Edit",
"Write",
"NotebookEdit",
"Task"
],
"deny": [
// Только критические системные файлы
"Write(/etc/passwd*)",
"Write(/etc/shadow*)",
"Write(/etc/sudoers*)",
"Write(/boot/**)"
],
"ask": []
}
}
Анализ: Permissions полностью открыты → Claude может делать ЧТО УГОДНО без спроса.
Но: Это permissions уровень CLI (разрешение на вызов инструментов), а НЕ protocol уровень (поведение агента).
Проблема в keep-coding-instructions: true:
Базовые инструкции Claude Code (Layer 1):
"NEVER create files unless they're absolutely necessary for achieving your goal.
ALWAYS prefer editing an existing file to creating a new one."
SafeDialog.md (Layer 3, keep-coding-instructions: true):
"ПРОТОКОЛ ДИАЛОГА: перед выполнением L1-L4 операций показывать план и ждать подтверждения"
РЕЗУЛЬТАТ (Claude получает ОБЕ инструкции одновременно):
✅ Base: "NEVER create files unless absolutely necessary"
✅ SafeDialog: "показывай план перед L1-L4"
Claude интерпретирует это как:
"Я НЕ ДОЛЖЕН создавать файлы без крайней необходимости (базовая инструкция сильнее),
НО если уж создаю — показываю план (SafeDialog)"
ИТОГ: Создаёт файлы БЕЗ подтверждения, т.к. базовая инструкция "NEVER create"
ВАЖНЕЕ чем протокол подтверждения.
Приоритет при конфликте:
При keep-coding-instructions: true:
- Output Style воспринимается как уточнение, а не замена
- При конфликте Claude следует более общей инструкции (базовой)
- Базовая инструкция "NEVER create files" сильнее чем "показывай план"
Текущая формулировка в CLAUDE.md (строки 6-10):
## ⚠️ SYSTEM INSTRUCTIONS OVERRIDE
**КРИТИЧНО:** Следующая инструкция из базового system prompt **НЕ ПРИМЕНЯЕТСЯ**:
> ❌ "provide concrete implementation steps without time estimates"
> ❌ "Never suggest timelines"
Проблема формулировки:
- ❌ Слово "OVERRIDE" не является командой для Claude
- ❌ "НЕ ПРИМЕНЯЕТСЯ" — декларация, а не инструкция
- ❌ CLAUDE.md = context reminder (низкий приоритет)
- ✅ Правильная формулировка была бы в system prompt, но там её нет
Слабые места в текущих инструкциях:
| Файл | Строки | Проблема |
|---|---|---|
CLAUDE.md |
6-10 | "OVERRIDE" — декларация, а не команда; низкий приоритет |
CLAUDE.md |
265-275 | "АЛГОРИТМ ОПРЕДЕЛЕНИЯ УРОВНЯ" — подробно, но НЕ в system prompt |
SafeDialog.md |
23-33 | "УРОВНИ ОПЕРАЦИЙ" — есть, но при конфликте с базовыми инструкциями теряет |
Coder.md |
13 | "ПЛАН → ПОДТВЕРЖДЕНИЕ → РЕАЛИЗАЦИЯ БЕЗ ОСТАНОВОК" — противоречит базовым |
Почему слабые:
1. Используют context reminder (CLAUDE.md) вместо system prompt
2. keep-coding-instructions: true → добавляют вместо замены
3. Нет явного переопределения конкретных базовых правил
keep-coding-instructions: false (РЕКОМЕНДУЕТСЯ)Суть: Заменить базовые инструкции вместо добавления к ним.
Изменения:
# Файлы для изменения:
.claude/output-styles/SafeDialog.md
.claude/output-styles/Coder.md
.claude/output-styles/Architect.md
# Изменение (строка 4):
-keep-coding-instructions: true
+keep-coding-instructions: false
Плюсы:
- ✅ Минимальные изменения (1 строка в 3 файлах)
- ✅ Полностью переопределяет базовые инструкции
- ✅ Решает проблему конфликта
- ✅ Не требует переписывания Output Styles
Минусы:
- ⚠️ Теряем ПОЛЕЗНЫЕ базовые инструкции:
- "Use specialized tools instead of bash" (Read вместо cat)
- "Professional objectivity" (без эмоций)
- Git Safety Protocol (NEVER amend, force push)
- Code references (file:line format)
- ⚠️ Нужно вручную включить полезные части в каждый Output Style
Оценка: 9/10 — ЛУЧШЕЕ решение, если переписать Output Styles с включением полезных частей базовых инструкций.
Время: 2 часа (переписать 3 Output Styles с сохранением полезного)
Суть: Добавить в Output Styles явные секции "OVERRIDE BASE INSTRUCTIONS".
Пример для SafeDialog.md:
---
name: Safe Dialog Protocol
description: Протокол диалога с подтверждениями для операций L1-L4
keep-coding-instructions: true
---
# Safe Dialog Protocol
## ⚠️ OVERRIDES (КРИТИЧНО — СЛЕДУЙ ЭТОМУ ВМЕСТО БАЗОВЫХ ИНСТРУКЦИЙ)
### Override: "NEVER create files unless absolutely necessary"
**Базовая инструкция:** "NEVER create files unless absolutely necessary"
**НОВАЯ ИНСТРУКЦИЯ (СЛЕДУЙ ЭТОЙ):**
- ВСЕГДА показывай план перед созданием файлов (L1-L4 протокол)
- Жди явное подтверждение "да" / "ок"
- ТОЛЬКО ПОСЛЕ подтверждения создавай файлы
- Базовая инструкция "NEVER create" НЕ ПРИМЕНЯЕТСЯ
### Override: "Never give time estimates"
**Базовая инструкция:** "Never give time estimates"
**НОВАЯ ИНСТРУКЦИЯ (СЛЕДУЙ ЭТОЙ):**
- ВСЕГДА указывать КОНКРЕТНОЕ время в минутах/часах
- AI работает в 10-20× быстрее человека
- Формула: AI_time = Human_time ÷ 10
- Базовая инструкция "Never give time estimates" НЕ ПРИМЕНЯЕТСЯ
## ПРОТОКОЛ ДИАЛОГА
[остальное без изменений...]
Плюсы:
- ✅ Явно переопределяет конкретные базовые инструкции
- ✅ Сохраняет keep-coding-instructions: true (полезные базовые инструкции остаются)
- ✅ Чётко указывает "НЕ ПРИМЕНЯЕТСЯ"
- ✅ Можно постепенно добавлять переопределения
Минусы:
- ⚠️ Многословно (дублирование)
- ⚠️ Не гарантирует 100% работу (зависит от интерпретации Claude)
- ⚠️ При конфликте всё равно может выиграть базовая инструкция
Оценка: 6/10 — костыль, но может сработать.
Время: 1 час (добавить секции OVERRIDE в 3 файла)
--append-system-prompt при стартеСуть: Загружать переопределения через CLI флаг.
Файл: .claude/ACTIVATE_INSTRUCTIONS.txt
⚠️ CRITICAL OVERRIDES (FOLLOW THESE INSTEAD OF BASE INSTRUCTIONS)
1. OVERRIDE "Never give time estimates":
→ ALWAYS provide concrete time estimates in minutes/hours
→ AI × 10 faster than human
→ Formula: AI_time = Human_time ÷ 10
2. OVERRIDE "NEVER create files unless absolutely necessary":
→ ALWAYS show plan before L1-L4 operations
→ Wait for explicit confirmation ("да" / "ок")
→ ONLY create files AFTER confirmation
3. L1-L4 PROTOCOL:
→ L1 (docs): short confirmation
→ L2 (code): full confirmation + rollback
→ L3 (server): full confirmation + rollback + backup
→ L4 (dangerous): STOP + explicit "да" + mandatory backup
Использование:
claude --append-system-prompt "$(cat .claude/ACTIVATE_INSTRUCTIONS.txt)" "режим архитектор"
Плюсы:
- ✅ System prompt уровень (высокий приоритет)
- ✅ Работает при старте
- ✅ Не ломает Output Styles
Минусы:
- ❌ Теряется после /compact
- ❌ Нельзя активировать внутри сессии
- ❌ Не гарантирует 100% приоритет (добавляется В КОНЕЦ system prompt)
Оценка: 5/10 — работает до первого compact.
Время: 30 минут (создать файл + модифицировать start.sh)
Суть: Использовать hook для добавления в system prompt.
Проблема: Hooks добавляют в additionalContext, а НЕ в system prompt.
Файл: .claude/hooks/session-setup.sh (текущий)
jq -n --arg ctx "$CONTEXT" '{
hookSpecificOutput: {
hookEventName: "SessionStart",
additionalContext: $ctx # ← это КОНТЕКСТ, не system prompt!
}
}'
Минусы:
- ❌ additionalContext = низкий приоритет (как CLAUDE.md)
- ❌ НЕТ способа инжектить в system prompt через hooks
- ❌ Документация Claude Code не предоставляет такой возможности
Оценка: 0/10 — технически невозможно.
Суть: Переписать CLAUDE.md с более сильными формулировками.
Изменения:
## ⚠️ CRITICAL: YOU MUST OVERRIDE BASE INSTRUCTIONS
**IMPORTANT:** The following base Claude Code instructions DO NOT APPLY in this workspace:
1. ❌ DISABLED: "Never give time estimates"
✅ ENABLED: ALWAYS provide time estimates (AI × 10 formula)
2. ❌ DISABLED: "NEVER create files unless absolutely necessary"
✅ ENABLED: ALWAYS show plan + wait for confirmation (L1-L4 protocol)
**YOU MUST FOLLOW THESE NEW INSTRUCTIONS INSTEAD OF BASE INSTRUCTIONS.**
Плюсы:
- ✅ Усиливает формулировки
- ✅ Явно указывает "DO NOT APPLY"
- ✅ Не требует изменений в Output Styles
Минусы:
- ❌ CLAUDE.md = низкий приоритет (context reminder)
- ❌ НЕ гарантирует работу при конфликте
- ❌ Сжимается при compact
Оценка: 3/10 — слабое решение, может НЕ сработать.
Время: 15 минут
Суть: Написать wrapper на Python с полным контролем system prompt.
Файл: system/cli/claude-persistent.py (уже создан в workspace)
Код:
import anthropic
client = anthropic.Anthropic()
system_prompt = """
YOU ARE Claude Code in ARCHITECT MODE.
⚠️ CRITICAL OVERRIDES:
1. IGNORE "Never give time estimates" → ALWAYS provide time (AI × 10)
2. IGNORE "NEVER create files" → ALWAYS show plan + wait for confirmation
L1-L4 PROTOCOL:
[полный протокол...]
"""
runner = client.beta.messages.tool_runner(
model="claude-sonnet-4-5",
system=system_prompt,
max_tokens=4096,
messages=[...],
tools=[...],
compaction_control={
"enabled": True,
"summary_prompt": "Preserve L1-L4 protocol, time rules..."
}
)
Плюсы:
- ✅ ПОЛНЫЙ контроль над system prompt
- ✅ compaction_control сохраняет инструкции
- ✅ НЕ зависит от Claude Code CLI
- ✅ Работает как надо
Минусы:
- ⚠️ Требует переписать интерфейс (нет автоматических инструментов Read/Edit/Write)
- ⚠️ Нужно вручную реализовать все инструменты
- ⚠️ Теряем удобство Claude Code CLI
Оценка: 8/10 — РАБОТАЕТ, но трудозатратно.
Время: 8 часов (полная реализация wrapper + tools)
Суть: Использовать CLI для обычной работы, SDK для критических сессий.
Структура:
# Обычная работа (быстро, но с конфликтами)
claude "режим проектор"
# Критическая работа (медленно, но надёжно)
claude-persistent.py "режим архитектор"
Плюсы:
- ✅ Баланс между удобством и надёжностью
- ✅ Можно выбирать инструмент под задачу
- ✅ CLI для простых задач, SDK для важных
Минусы:
- ⚠️ Два разных интерфейса
- ⚠️ Нужно помнить когда что использовать
Оценка: 7/10 — практичное решение.
Время: 4 часа (доработать wrapper)
Что делать:
Изменить флаг в 3 файлах:
bash
# SafeDialog.md, Coder.md, Architect.md
keep-coding-instructions: false
Переписать Output Styles с включением полезных частей:
- Professional objectivity (без эмоций)
- Git Safety Protocol (NEVER amend, NEVER force push)
- Tool usage policy (Read вместо cat, Edit вместо sed)
- Code references (file:line формат)
Добавить явные секции OVERRIDE:
```markdown
## ⚠️ OVERRIDES (these rules REPLACE base instructions)
Time estimates: ALWAYS provide (AI × 10)
L1-L4 protocol: [полный протокол]
```
Тестировать:
- Запустить /output-style SafeDialog
- Попросить создать файл
- Проверить: показал план? ждал подтверждение?
Оценка времени: 2 часа
Ожидаемый результат: Claude следует L1-L4 протоколу вместо базовых инструкций.
Если вариант 1 НЕ сработает:
system/cli/claude-persistent.pyclaude для критических сессийОценка времени: 8 часов
Ожидаемый результат: 100% работа (полный контроль над system prompt).
Важное различие:
.claude/settings.local.json) — ЧТО Claude МОЖЕТ делать (разрешение на вызов инструментов)Текущая проблема: Permissions открыты (всё разрешено), но Protocol игнорируется.
Решение: Закрыть permissions НЕ ПОМОЖЕТ — нужно исправить Protocol.
Файл: .claude/hooks/session-setup.sh
Что делает:
- Читает /opt/claude-workspace/CLAUDE.md
- Добавляет в additionalContext при startup/resume/compact
Почему не помогает:
- additionalContext = низкий приоритет (context reminder)
- НЕ переопределяет system prompt
- При конфликте базовые инструкции побеждают
Вывод: Hook полезен для восстановления контекста, но НЕ для переопределения инструкций.
Что уже пробовали (из git):
| Дата | Коммит | Попытка | Результат |
|---|---|---|---|
| 2026-01-09 | f2399371 | "OVERRIDE" в CLAUDE.md | ❌ Не сработало |
| 2026-02-17 | — | SessionStart hook | ⚠️ Частично (только context) |
| 2025-11-14 | — | Открыть все permissions | ❌ Не помогло |
Вывод: Все попытки работали с контекстом, а не с system prompt.
Что НЕ документировано:
keep-coding-instructions влияет на разрешение конфликтовОткуда узнали:
- Эксперименты в workspace
- Анализ architect/arh/analysis/2026-01-17-roles-optimization/
- Чтение .claude/CHANGES.md
1. Claude получает КОМБИНИРОВАННЫЙ system prompt:
[Base Claude Code instructions]
+
[Output Style SafeDialog.md] (т.к. keep-coding-instructions: true)
2. При обработке запроса "создай файл PROJECT.md":
Claude видит ДВЕ инструкции:
- Base: "NEVER create files unless absolutely necessary"
- SafeDialog: "show plan before L1-L4 operations"
3. Интерпретация:
"Мне нужно создать файл (запрос пользователя).
Base говорит: NEVER create files (сильное правило).
SafeDialog говорит: show plan before L1-L4 (добавочное правило).
→ Вывод: Создание файла НЕ является 'absolutely necessary',
следовательно я должен следовать Base (NEVER create).
→ Действие: Создаю файл БЕЗ подтверждения."
4. РЕЗУЛЬТАТ: L1-L4 протокол игнорируется.
Факторы приоритета:
Когда проявляется:
Когда НЕ проявляется:
Корневая причина: keep-coding-instructions: true в Output Styles создаёт конфликт между базовыми и кастомными инструкциями, при котором базовые побеждают.
Решение: Изменить keep-coding-instructions: false и переписать Output Styles с явным переопределением + включением полезных частей базовых инструкций.
Оценка времени: 2 часа
Вероятность успеха: 85% (если не сработает → использовать SDK wrapper)
Дата: 2026-02-19
Автор: Claude Sonnet 4.5 (исследование)
Статус: ✅ Готово к реализации