santa-method
affaan-m/ECC
Для проверки качества конечного результата задействуются два независимых эксперта; перед отправкой необходимо, чтобы оба дали одобрение.
...Расширить всеМетод Санты
Многоагентная среда для верификации с противостоянием. Составьте список, проверьте его дважды. Если что-то не так, исправляйте, пока не станет хорошо.
Основная идея: отдельный агент, проверяющий собственный результат, страдает теми же предвзятостями, пробелами в знаниях и систематическими ошибками, которые привели к получению этого результата. Два независимых рецензента, не имеющих общего контекста, устраняют этот режим сбоя.
Когда применять
Используйте этот навык, когда:
- Результат будет опубликован, внедрён или использован конечными пользователями
- необходимо обеспечить соблюдение нормативных требований, регулирующих ограничений или требований бренда
- Код передаётся в производственную среду без проверки человеком
- Важна точность контента (техническая документация, учебные материалы, тексты для клиентов)
- Происходит массовое пакетное создание контента, при котором выборочная проверка не позволяет выявить системные закономерности
- Повышен риск появления неверных сведений (утверждения, статистика, ссылки на API, юридические формулировки)
НЕ используйте для внутренних черновиков, исследовательских работ или задач с детерминированной проверкой (для них используйте конвейеры сборки/тестирования/линтинга).
Архитектура
┌─────────────┐
│ GENERATOR │ Phase 1: Make a List
│ (Agent A) │ Produce the deliverable
└──────┬───────┘
│ output
▼
┌──────────────────────────────┐
│ DUAL INDEPENDENT REVIEW │ Phase 2: Check It Twice
│ │
│ ┌───────────┐ ┌───────────┐ │ Two agents, same rubric,
│ │ Reviewer B │ │ Reviewer C │ │ no shared context
│ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │
└────────┼──────────────┼────────┘
│ │
▼ ▼
┌──────────────────────────────┐
│ VERDICT GATE │ Phase 3: Naughty or Nice
│ │
│ B passes AND C passes → NICE │ Both must pass.
│ Otherwise → NAUGHTY │ No exceptions.
└──────┬──────────────┬─────────┘
│ │
NICE NAUGHTY
│ │
▼ ▼
[ SHIP ] ┌─────────────┐
│ FIX CYCLE │ Phase 4: Fix Until Nice
│ │
│ iteration++ │ Collect all flags.
│ if i > MAX: │ Fix all issues.
│ escalate │ Re-run both reviewers.
│ else: │ Loop until convergence.
│ goto Ph.2 │
└──────────────┘
Детали этапов
Этап 1: Составление списка (генерация)
Выполните основную задачу. Никаких изменений в вашем обычном рабочем процессе генерации. Метод Санта — это уровень проверки после генерации, а не стратегия генерации.
# The generator runs as normal
output = generate(task_spec)
Этап 2: Проверьте дважды (независимая двойная проверка)
Запустите два агента проверки параллельно. Критические инварианты:
- Изоляция контекста — ни один из рецензентов не видит оценку другого
- Идентичные критерии оценки — оба получают одинаковые критерии оценки
- Одинаковые входные данные — оба получают исходную спецификацию И сгенерированный результат
- Структурированный результат — каждый возвращает типизированный вердикт, а не прозу
REVIEWER_PROMPT = """
You are an independent quality reviewer. You have NOT seen any other review of this output.
## Task Specification
{task_spec}
## Output Under Review
{output}
## Evaluation Rubric
{rubric}
## Instructions
Evaluate the output against EACH rubric criterion. For each:
- PASS: criterion fully met, no issues
- FAIL: specific issue found (cite the exact problem)
Return your assessment as structured JSON:
{
"verdict": "PASS" | "FAIL",
"checks": [
{"criterion": "...", "result": "PASS|FAIL", "detail": "..."}
],
"critical_issues": ["..."], // blockers that must be fixed
"suggestions": ["..."] // non-blocking improvements
}
Be rigorous. Your job is to find problems, not to approve.
"""
# Spawn reviewers in parallel (Claude Code subagents)
review_b = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer B")
review_c = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer C")
# Both run concurrently — neither sees the other
Разработка критериев оценки
Рубрика — это самый важный входной параметр. Неясные рубрики приводят к неясным рецензиям. Каждый критерий должен иметь объективное условие «прошел/не прошел».
| Критерий | Условие прохождения | Сигнал о несоответствии |
|---|---|---|
| Точность фактов | Все утверждения должны поддаваться проверке по исходным материалам или общеизвестным фактам | Вымышленные статистические данные, неверные номера версий, несуществующие API |
| Отсутствие галлюцинаций | Отсутствие вымышленных субъектов, цитат, URL-адресов или ссылок | Ссылки на несуществующие страницы, цитаты без указания источника |
| Полнота | Учтены все требования спецификации | Отсутствующие разделы, пропущенные крайние случаи, неполный охват |
| Соответствие | Выполняет все ограничения, специфичные для проекта | Использование запрещенных терминов, нарушения стилистических норм, несоответствие нормативным требованиям |
| Внутренняя согласованность | Отсутствие противоречий в итоговом тексте | В разделе A сказано X, а в разделе B — не X |
| Техническая корректность | Код компилируется/работает, алгоритмы корректны | Синтаксические ошибки, логические ошибки, неверные утверждения о сложности |
Расширения критериев оценки для конкретной области
Контент/маркетинг:
- Соблюдение стиля бренда
- Соблюдение требований SEO (плотность ключевых слов, мета-теги, структура)
- Отсутствие неправомерного использования товарных знаков конкурентов
- Наличие призыва к действию (CTA) и правильная ссылка
Код:
- Типовая безопасность (отсутствие
anyутечек, правильная обработка значений null) - Покрытие обработки ошибок
- Безопасность (отсутствие секретов в коде, проверка входных данных, предотвращение инъекций)
- Покрытие тестами новых путей
Требования к соблюдению нормативных требований (регуляторные, юридические, финансовые):
- Отсутствие гарантий результата или необоснованных заявлений
- Наличие обязательных отказов от ответственности
- Использование только утвержденной терминологии
- Формулировки, соответствующие юрисдикции
Этап 3: «Плохо или хорошо» ( этап вынесения вердикта)
def santa_verdict(review_b, review_c):
"""Both reviewers must pass. No partial credit."""
if review_b.verdict == "PASS" and review_c.verdict == "PASS":
return "NICE" # Ship it
# Merge flags from both reviewers, deduplicate
all_issues = dedupe(review_b.critical_issues + review_c.critical_issues)
all_suggestions = dedupe(review_b.suggestions + review_c.suggestions)
return "NAUGHTY", all_issues, all_suggestions
Почему необходимо пройти обе фазы: если проблема обнаруживается только одним рецензентом, значит, она действительно существует. «Слепое пятно» другого рецензента — это именно тот режим отказа, для устранения которого и был разработан «Метод Санты».
Этап 4: Исправление до «хорошего» (Цикл сходимости)
MAX_ITERATIONS = 3
for iteration in range(MAX_ITERATIONS):
verdict, issues, suggestions = santa_verdict(review_b, review_c)
if verdict == "NICE":
log_santa_result(output, iteration, "passed")
return ship(output)
# Fix all critical issues (suggestions are optional)
output = fix_agent.execute(
output=output,
issues=issues,
instruction="Fix ONLY the flagged issues. Do not refactor or add unrequested changes."
)
# Re-run BOTH reviewers on fixed output (fresh agents, no memory of previous round)
review_b = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
review_c = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
# Exhausted iterations — escalate
log_santa_result(output, MAX_ITERATIONS, "escalated")
escalate_to_human(output, issues)
Критически важно: в каждом раунде рецензирования используются новые агенты. Рецензенты не должны запоминать результаты предыдущих раундов, так как предыдущий контекст создаёт эффект «якоря».
Шаблоны реализации
Шаблон A: Субагенты с кодом Клода (рекомендуется)
Субагенты обеспечивают истинную изоляцию контекста. Каждый рецензент представляет собой отдельный процесс без общего состояния.
# In a Claude Code session, use the Agent tool to spawn reviewers
# Both agents run in parallel for speed
# Pseudocode for Agent tool invocation
reviewer_b = Agent(
description="Santa Review B",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
reviewer_c = Agent(
description="Santa Review C",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
Шаблон B: Последовательная встроенная обработка (резервный вариант)
Если субагенты недоступны, имитируйте изоляцию с помощью явного сброса контекста:
- Генерируйте выходные данные
- Новый контекст: «Вы — рецензент № 1. Оценивайте ИСКЛЮЧИТЕЛЬНО по этой шкале. Найдите проблемы».
- Запишите результаты дословно
- Полностью очистить контекст
- Новый контекст: «Вы — рецензент № 2. Оценивайте ИСКЛЮЧИТЕЛЬНО по этой шкале. Найдите проблемы».
- Сравните обе оценки, исправьте, повторите
Шаблон «субагент» является безусловно лучшим — при встроенном моделировании существует риск переноса контекста между рецензентами.
Шаблон C: Пакетная выборка
Для больших партий (100+ элементов) полное выполнение «Санта» для каждого элемента является слишком затратным. Используйте стратифицированную выборку:
- Запустите «Санта» на случайной выборке (10–15 % от партии, минимум 5 элементов)
- Классифицируйте ошибки по типам (галлюцинации, соответствие требованиям, полнота и т. д.)
- Если выявлены систематические закономерности, примените целевые исправления ко всей партии
- Проведите повторную выборку и повторную проверку исправленной партии
- Продолжайте до тех пор, пока чистая выборка не пройдет проверку
import random
def santa_batch(items, rubric, sample_rate=0.15):
sample = random.sample(items, max(5, int(len(items) * sample_rate)))
for item in sample:
result = santa_full(item, rubric)
if result.verdict == "NAUGHTY":
pattern = classify_failure(result.issues)
items = batch_fix(items, pattern) # Fix all items matching pattern
return santa_batch(items, rubric) # Re-sample
return items # Clean sample → ship batch
Типы отказов и меры по их устранению
| Тип неисправности | Симптом | Меры по устранению |
|---|---|---|
| Бесконечный цикл | Рецензенты продолжают находить новые проблемы после исправлений | Максимальное количество итераций (3). Передача на рассмотрение вышестоящему уровню. |
| Формальное одобрение | Оба рецензента одобряют всё | Провокационный вопрос: «Ваша работа — находить проблемы, а не одобрять». |
| Субъективный уклон | Рецензенты отмечают стилистические предпочтения, а не ошибки | Строгие критерии оценки, включающие только объективные показатели «прошел/не прошел» |
| Исправление регрессии | Исправление проблемы A приводит к появлению проблемы B | Новые рецензенты в каждом раунде выявляют регрессии |
| Предвзятость в согласии рецензентов | Оба рецензента упускают одно и то же | Смягчается за счёт независимости, но не устраняется. Для критически важных результатов добавьте третьего рецензента или проведите выборочную проверку силами персонала. |
| Резкий рост затрат | Слишком много итераций при работе с большими объёмами результатов | Модель пакетной выборки. Ограничения бюджета на каждый цикл проверки. |
Интеграция с другими навыками
| Навык | Взаимосвязь |
|---|---|
| Цикл верификации | Используется для детерминированных проверок (сборка, lint, тестирование). Santa — для семантических проверок (точность, галлюцинации). Сначала запускайте цикл верификации, затем — Santa. |
| Набор тестов Eval | Результаты метода Santa поступают в метрики eval. Отслеживайте показатель pass@k по ходу запусков Santa, чтобы оценивать качество генератора с течением времени. |
| Непрерывное обучение v2 | Результаты Santa становятся инстинктами. Повторные сбои по одному и тому же критерию → выученное поведение, позволяющее избежать данного паттерна. |
| Стратегическое сжатие | Запустите Santa ДО компактирования. Не теряйте контекст проверки в середине процесса верификации. |
Показатели
Отслеживайте эти показатели для оценки эффективности метода «Санта»:
- Коэффициент прохождения с первого раза: % результатов, прошедших проверку «Санта» в первом раунде (цель: >70%)
- Среднее количество итераций до сходимости: среднее количество раундов до NICE (цель: <1,5)
- Таксономия проблем: распределение типов ошибок (галлюцинации, неполнота, несоответствие)
- Согласованность рецензентов: % проблем, отмеченных обоими рецензентами по сравнению с теми, что были отмечены только одним (низкая согласованность = необходимо ужесточить критерии оценки)
- Коэффициент ускользания: проблемы, обнаруженные после выпуска, которые «Санта» должен был выявить (цель: 0)
Анализ затрат
Стоимость метода «Санта» составляет примерно 2–3 раза больше стоимости генерации токенов за один цикл верификации. Для большинства критически важных результатов это выгодное вложение:
Cost of Santa = (generation tokens) + 2×(review tokens per round) × (avg rounds)
Cost of NOT Santa = (reputation damage) + (correction effort) + (trust erosion)
для пакетных операций схема выборки снижает затраты до ~15–20 % от стоимости полной верификации, при этом выявляя более 90 % систематических проблем.
---
name: santa-method
description: Uses two independent review agents to verify output quality, requiring both to pass before shipping.
---
# Santa Method
Multi-agent adversarial verification framework. Make a list, check it twice. If it's naughty, fix it until it's nice.
The core insight: a single agent reviewing its own output shares the same biases, knowledge gaps, and systematic errors that produced the output. Two independent reviewers with no shared context break this failure mode.
## When to Activate
Invoke this skill when:
- Output will be published, deployed, or consumed by end users
- Compliance, regulatory, or brand constraints must be enforced
- Code ships to production without human review
- Content accuracy matters (technical docs, educational material, customer-facing copy)
- Batch generation at scale where spot-checking misses systemic patterns
- Hallucination risk is elevated (claims, statistics, API references, legal language)
Do NOT use for internal drafts, exploratory research, or tasks with deterministic verification (use build/test/lint pipelines for those).
## Architecture
```
┌─────────────┐
│ GENERATOR │ Phase 1: Make a List
│ (Agent A) │ Produce the deliverable
└──────┬───────┘
│ output
▼
┌──────────────────────────────┐
│ DUAL INDEPENDENT REVIEW │ Phase 2: Check It Twice
│ │
│ ┌───────────┐ ┌───────────┐ │ Two agents, same rubric,
│ │ Reviewer B │ │ Reviewer C │ │ no shared context
│ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │
└────────┼──────────────┼────────┘
│ │
▼ ▼
┌──────────────────────────────┐
│ VERDICT GATE │ Phase 3: Naughty or Nice
│ │
│ B passes AND C passes → NICE │ Both must pass.
│ Otherwise → NAUGHTY │ No exceptions.
└──────┬──────────────┬─────────┘
│ │
NICE NAUGHTY
│ │
▼ ▼
[ SHIP ] ┌─────────────┐
│ FIX CYCLE │ Phase 4: Fix Until Nice
│ │
│ iteration++ │ Collect all flags.
│ if i > MAX: │ Fix all issues.
│ escalate │ Re-run both reviewers.
│ else: │ Loop until convergence.
│ goto Ph.2 │
└──────────────┘
```
## Phase Details
### Phase 1: Make a List (Generate)
Execute the primary task. No changes to your normal generation workflow. Santa Method is a post-generation verification layer, not a generation strategy.
```python
# The generator runs as normal
output = generate(task_spec)
```
### Phase 2: Check It Twice (Independent Dual Review)
Spawn two review agents in parallel. Critical invariants:
1. **Context isolation** — neither reviewer sees the other's assessment
2. **Identical rubric** — both receive the same evaluation criteria
3. **Same inputs** — both receive the original spec AND the generated output
4. **Structured output** — each returns a typed verdict, not prose
```python
REVIEWER_PROMPT = """
You are an independent quality reviewer. You have NOT seen any other review of this output.
## Task Specification
{task_spec}
## Output Under Review
{output}
## Evaluation Rubric
{rubric}
## Instructions
Evaluate the output against EACH rubric criterion. For each:
- PASS: criterion fully met, no issues
- FAIL: specific issue found (cite the exact problem)
Return your assessment as structured JSON:
{
"verdict": "PASS" | "FAIL",
"checks": [
{"criterion": "...", "result": "PASS|FAIL", "detail": "..."}
],
"critical_issues": ["..."], // blockers that must be fixed
"suggestions": ["..."] // non-blocking improvements
}
Be rigorous. Your job is to find problems, not to approve.
"""
```
```python
# Spawn reviewers in parallel (Claude Code subagents)
review_b = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer B")
review_c = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer C")
# Both run concurrently — neither sees the other
```
### Rubric Design
The rubric is the most important input. Vague rubrics produce vague reviews. Every criterion must have an objective pass/fail condition.
| Criterion | Pass Condition | Failure Signal |
|-----------|---------------|----------------|
| Factual accuracy | All claims verifiable against source material or common knowledge | Invented statistics, wrong version numbers, nonexistent APIs |
| Hallucination-free | No fabricated entities, quotes, URLs, or references | Links to pages that don't exist, attributed quotes with no source |
| Completeness | Every requirement in the spec is addressed | Missing sections, skipped edge cases, incomplete coverage |
| Compliance | Passes all project-specific constraints | Banned terms used, tone violations, regulatory non-compliance |
| Internal consistency | No contradictions within the output | Section A says X, section B says not-X |
| Technical correctness | Code compiles/runs, algorithms are sound | Syntax errors, logic bugs, wrong complexity claims |
#### Domain-Specific Rubric Extensions
**Content/Marketing:**
- Brand voice adherence
- SEO requirements met (keyword density, meta tags, structure)
- No competitor trademark misuse
- CTA present and correctly linked
**Code:**
- Type safety (no `any` leaks, proper null handling)
- Error handling coverage
- Security (no secrets in code, input validation, injection prevention)
- Test coverage for new paths
**Compliance-Sensitive (regulated, legal, financial):**
- No outcome guarantees or unsubstantiated claims
- Required disclaimers present
- Approved terminology only
- Jurisdiction-appropriate language
### Phase 3: Naughty or Nice (Verdict Gate)
```python
def santa_verdict(review_b, review_c):
"""Both reviewers must pass. No partial credit."""
if review_b.verdict == "PASS" and review_c.verdict == "PASS":
return "NICE" # Ship it
# Merge flags from both reviewers, deduplicate
all_issues = dedupe(review_b.critical_issues + review_c.critical_issues)
all_suggestions = dedupe(review_b.suggestions + review_c.suggestions)
return "NAUGHTY", all_issues, all_suggestions
```
Why both must pass: if only one reviewer catches an issue, that issue is real. The other reviewer's blind spot is exactly the failure mode Santa Method exists to eliminate.
### Phase 4: Fix Until Nice (Convergence Loop)
```python
MAX_ITERATIONS = 3
for iteration in range(MAX_ITERATIONS):
verdict, issues, suggestions = santa_verdict(review_b, review_c)
if verdict == "NICE":
log_santa_result(output, iteration, "passed")
return ship(output)
# Fix all critical issues (suggestions are optional)
output = fix_agent.execute(
output=output,
issues=issues,
instruction="Fix ONLY the flagged issues. Do not refactor or add unrequested changes."
)
# Re-run BOTH reviewers on fixed output (fresh agents, no memory of previous round)
review_b = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
review_c = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
# Exhausted iterations — escalate
log_santa_result(output, MAX_ITERATIONS, "escalated")
escalate_to_human(output, issues)
```
Critical: each review round uses **fresh agents**. Reviewers must not carry memory from previous rounds, as prior context creates anchoring bias.
## Implementation Patterns
### Pattern A: Claude Code Subagents (Recommended)
Subagents provide true context isolation. Each reviewer is a separate process with no shared state.
```bash
# In a Claude Code session, use the Agent tool to spawn reviewers
# Both agents run in parallel for speed
```
```python
# Pseudocode for Agent tool invocation
reviewer_b = Agent(
description="Santa Review B",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
reviewer_c = Agent(
description="Santa Review C",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
```
### Pattern B: Sequential Inline (Fallback)
When subagents aren't available, simulate isolation with explicit context resets:
1. Generate output
2. New context: "You are Reviewer 1. Evaluate ONLY against this rubric. Find problems."
3. Record findings verbatim
4. Clear context completely
5. New context: "You are Reviewer 2. Evaluate ONLY against this rubric. Find problems."
6. Compare both reviews, fix, repeat
The subagent pattern is strictly superior — inline simulation risks context bleed between reviewers.
### Pattern C: Batch Sampling
For large batches (100+ items), full Santa on every item is cost-prohibitive. Use stratified sampling:
1. Run Santa on a random sample (10-15% of batch, minimum 5 items)
2. Categorize failures by type (hallucination, compliance, completeness, etc.)
3. If systematic patterns emerge, apply targeted fixes to the entire batch
4. Re-sample and re-verify the fixed batch
5. Continue until a clean sample passes
```python
import random
def santa_batch(items, rubric, sample_rate=0.15):
sample = random.sample(items, max(5, int(len(items) * sample_rate)))
for item in sample:
result = santa_full(item, rubric)
if result.verdict == "NAUGHTY":
pattern = classify_failure(result.issues)
items = batch_fix(items, pattern) # Fix all items matching pattern
return santa_batch(items, rubric) # Re-sample
return items # Clean sample → ship batch
```
## Failure Modes and Mitigations
| Failure Mode | Symptom | Mitigation |
|-------------|---------|------------|
| Infinite loop | Reviewers keep finding new issues after fixes | Max iteration cap (3). Escalate. |
| Rubber stamping | Both reviewers pass everything | Adversarial prompt: "Your job is to find problems, not approve." |
| Subjective drift | Reviewers flag style preferences, not errors | Tight rubric with objective pass/fail criteria only |
| Fix regression | Fixing issue A introduces issue B | Fresh reviewers each round catch regressions |
| Reviewer agreement bias | Both reviewers miss the same thing | Mitigated by independence, not eliminated. For critical output, add a third reviewer or human spot-check. |
| Cost explosion | Too many iterations on large outputs | Batch sampling pattern. Budget caps per verification cycle. |
## Integration with Other Skills
| Skill | Relationship |
|-------|-------------|
| Verification Loop | Use for deterministic checks (build, lint, test). Santa for semantic checks (accuracy, hallucinations). Run verification-loop first, Santa second. |
| Eval Harness | Santa Method results feed eval metrics. Track pass@k across Santa runs to measure generator quality over time. |
| Continuous Learning v2 | Santa findings become instincts. Repeated failures on the same criterion → learned behavior to avoid the pattern. |
| Strategic Compact | Run Santa BEFORE compacting. Don't lose review context mid-verification. |
## Metrics
Track these to measure Santa Method effectiveness:
- **First-pass rate**: % of outputs that pass Santa on round 1 (target: >70%)
- **Mean iterations to convergence**: average rounds to NICE (target: <1.5)
- **Issue taxonomy**: distribution of failure types (hallucination vs. completeness vs. compliance)
- **Reviewer agreement**: % of issues flagged by both reviewers vs. only one (low agreement = rubric needs tightening)
- **Escape rate**: issues found post-ship that Santa should have caught (target: 0)
## Cost Analysis
Santa Method costs approximately 2-3x the token cost of generation alone per verification cycle. For most high-stakes output, this is a bargain:
```
Cost of Santa = (generation tokens) + 2×(review tokens per round) × (avg rounds)
Cost of NOT Santa = (reputation damage) + (correction effort) + (trust erosion)
```
For batch operations, the sampling pattern reduces cost to ~15-20% of full verification while catching >90% of systematic issues.
Все файлы
1 файловУстановить santa-method
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/affaan-m/ECC/tree/main/skills/santa-method # Copy SKILL.md to your .claude/skills/ directory
Копировать





Дом
