← [Раздел](README.md) · [Главная](../README.md)

# Lab 02 — Rules в действии

## Цель

Создать **project rule** в `.cursor/rules/`, убедиться, что агент следует ему (immutability, запрет console.log, формат коммитов), и отладить globs.

## Предварительно

- [04 — Rules](../04-rules/README.md)
- Lab 01 завершена в том же репо

## Время

~60 минут.

---

## Шаг 1 — Rule immutability

`.cursor/rules/lab-immutability.mdc`:

```yaml
---
description: Lab 02 — не мутировать аргументы функций
globs: "**/*.{py,ts,js}"
---

# Immutability (учебное)

При рефакторинге:
- НЕ изменяй объекты/списки, переданные в функцию, in-place
- Возвращай НОВЫЙ объект/копию
- Если нужна мутация — явно спроси пользователя
```

---

## Шаг 2 — Тестовая задача

```text
Рефактори calc.py: добавь функцию normalize(values), 
которая удваивает каждый элемент списка. 
Соблюдай @.cursor/rules/lab-immutability.mdc
```

**Проверка вручную:** исходный список после вызова не изменился.

```python
v = [1, 2, 3]
normalize(v)
assert v == [1, 2, 3]  # добавьте сами или попросите агента
```

---

## Шаг 3 — Rule git (опционально)

`.cursor/rules/lab-git.mdc`:

```yaml
---
description: Conventional commits для лаб
globs: "**/*"
---

Коммиты только в формате: type: description
Types: feat, fix, docs, test, chore
Не используй --no-verify
```

Попросите агента «закоммить изменения» — сообщение должно соответствовать формату (если вы явно разрешили коммит в учебном репо).

---

## Шаг 4 — Негативный тест

Временно **переименуйте** rule (`.bak`) и повторите шаг 2.

Зафиксируйте в журнале: агент снова мутирует список?

Верните rule обратно.

---

## Шаг 5 — Globs

Создайте файл `notes.txt` с просьбой «отрефактори список» — rule с `*.{py,ts,js}` **не** должен применяться к `.txt`.

Запишите наблюдение.

---

## Шаг 6 — Commit

```bash
git add .cursor/rules/
git commit -m "lab02: add immutability and git rules"
```

---

## Критерии успеха

- [ ] Rule с корректным frontmatter
- [ ] Агент соблюдал immutability с активным rule
- [ ] Журнал: diff с rule и без
- [ ] Понимание globs на примере

---

## Самопроверка

1. Что делает поле `globs`?
2. Зачем негативный тест с `.bak`?
3. Rule на git — always или по glob?
4. Чем rule отличается от промпта Lab 01?

---

## Дальше

→ [Lab 03 — Skill](lab-03-skill.md)  
← [Lab 01](lab-01-promt.md)
