---
pr: 80
title: fix(docs): commit tool staging truth + allow git restore --staged
---

## Что сделано
3 направления правок, 7 файлов изменено (+50/-6 строк примерно).

1. Исправлена ложь в handoff pr-73 (L28, L32) про `commit` tool.
   - `docs/handoff/pr-73-base-image-trixie-slim.md` L28: было «`commit` tool делает `git add -A` под капотом» — ЛОЖЬ. Стало: «`commit` tool НЕ делает `git add` — коммитит только уже staged файлы (`git diff --cached --name-only` → `git commit -m`). Staging ответственность агента: `git add <files>` явно перед `commit`.»
   - L32: аналогично — было «tool сделает `git add -A`, если файл не в .gitignore → уйдёт в коммит», стало «агент должен `git add` только целевые файлы, НЕ `git add -A`; `commit` tool коммитит только staged, не делая `git add` сам».
   - Причина лжи: автор handoff pr-73 перепутал `commit` tool с `memory_save` tool (плагин @mathew-cf/opencode-memory), который ДЕЙСТВИТЕЛЬНО делает `git add -A` под капотом (задокументированный gotcha, memory `technical/memory-save-git-add-all-gotcha.md`, инцидент PR#30 с SSH-ключами). См. ADR-035, memory `technical/commit-tool-staging-truth.md`.

2. Усилены skills: добавлен явный `git status` шаг перед `commit` в 5 SKILL.md.
   - `.opencode/skills/add-skill/SKILL.md` — `git status` в bash-блок + blockquote с правилом
   - `.opencode/skills/release/SKILL.md` — `git status` в bash-блок + blockquote с правилом
   - `.opencode/skills/repo-init/SKILL.md` — `git status` в bash-блок + blockquote с правилом
   - `.opencode/skills/run-pipeline/SKILL.md` — 3 вставки: Template A (общее правило перед КАЖДЫМ commit: `git status` + `git add <конкретные-пути>` НЕ `git add -A`), Template B (`git status` между add/commit), Template D (`git status` перед commit)
   - `.opencode/skills/configure-opencode/SKILL.md` — 2 вставки: секция 2 (prose bullet) + секция 8 (усиление существующей строки)
   - Формулировки единообразны: «`commit` tool НЕ делает `git add` — коммитит только уже staged файлы. Используй `git add <конкретные-пути>`, НЕ `git add -A`. Если лишнее stage'нулось — `git restore --staged <file>` (теперь в allow-list).»

3. Расширен allow-list в opencode.json для self-correction staging.
   - `.opencode/opencode.json` — добавлены 2 правила в allow:
     - `"git restore --staged *": "allow"` (L180)
     - `"git -C * restore --staged *": "allow"` (L189)
   - Даёт агенту возможность unstage случайно добавленные файлы без user approval. Раньше `git restore --staged` был в catch-all `ask` (требовал подтверждения пользователя), а `git reset *` — deny (не давал unstage вообще). См. ADR-035.
   - Проверено: `git restore --staged *` не матчится ни одним deny-rule (`git reset *` L245, `git clean *` L246 — другие команды, не matчат restore).

## Почему
Агент ругался что `commit` tool коммитит лишние файлы. Root cause НЕ в tool — `commit.ts` коммитит только уже staged файлы (`git diff --cached --name-only` → `git commit -m`), НЕ делая `git add` (подтверждено ADR-015, handoff pr-38, тестами test_commit_tool.py, кодом commit.ts L42-56).

Причины попадания лишних файлов в коммит:
1. Агент сделал `git add -A` / `git add .` (allow) и забыл/не заметил, что staged лишнее.
2. `memory_save` tool (плагин @mathew-cf/opencode-memory) stage'ит ВСЁ через `git add -A` под капотом — задокументированный gotcha (memory `technical/memory-save-git-add-all-gotcha.md`, инцидент PR#30 с SSH-ключами).
3. Агент не запустил `git status` перед `commit` для проверки staged set.

Self-correction был заблокирован: `git reset *` = deny (L245), `git restore --staged` = catch-all `ask` (требовал user approval). Если случайно stage'нул лишнее — агент не мог unstage без пользователя.

Handoff pr-73 L28/L32 содержал ложь про `git add -A` под капотом `commit` tool — активно вредил: будущие агенты могли верить, что staging вне их контроля, и не проверять `git status`.

Решение: (1) исправить ложь в handoff pr-73, (2) усилить skills явным `git status` шагом перед `commit`, (3) добавить `git restore --staged` в allow-list для self-correction. См. ADR-035.

## Pending
—

## Watch out
- `memory_save` tool (MCP plugin @mathew-cf/opencode-memory) ДЕЙСТВИТЕЛЬНО делает `git add -A` под капотом — это НЕ исправлено (плагин сторонний, так задумано). Это отдельный gotcha (memory `technical/memory-save-git-add-all-gotcha.md`). Новый `git restore --staged` allow-rule даёт агенту путь self-correction после `memory_save`.
- `git reset *` остаётся deny (L245) — `restore --staged` безопаснее (не трогает working tree, только индекс). `reset` может перемотать коммиты — поэтому остаётся deny.
- Handoff pr-73 исправлен, но историческая ложь осталась в memory `technical/commit-tool-staging-truth.md` (создан в предыдущей сессии) — там зафиксировано что handoff pr-73 L28/L32 WRONG. Memory обновлять не нужно (она уже корректна).
- `commit` tool не имеет параметра `paths` (только `message`) — агент должен `git add <files>` явно перед `commit`. Добавление параметра `paths` в tool API — отдельное решение (через ADR + тесты), не в этом PR.
- Check-permissions.py guard script прогон обязателелен в CI (permissions-check.yml) — проверяет что новые allow-паттерны не опасны. В этом PR `git restore --staged *` — безопасный (только индекс, не working tree, не коммиты).