# План v8: регенерация larastan baseline (импульс-устойчивый указатель)

## Цель

Перезаписать `app/phpstan-baseline.neon` текущим набором сообщений larastan, чтобы
поглотить дрейф lead-region и шум вывода типов Pest, затем убедиться, что
`composer stan` проходит чисто. Изменяется только baseline-конфиг; код приложения
не трогается. Опирается на спеку
[2026-06-16-larastan-baseline-regen-v2.md](../specs/2026-06-16-larastan-baseline-regen-v2.md)
(D1 — контракт регенерации, D2 — критерий приёмки).

**Предусловие (read-only, уже выполнено).** Рабочая копия `app/phpstan-baseline.neon`
совпадает с HEAD (`git diff --exit-code --quiet` → exit 0). Значит зафиксированная в
HEAD версия — валидная точка восстановления. Это read-only проверка, она не мутирует
файлы и потому не является исполняемым шагом плана. **Откат после перезаписи:**
`git checkout HEAD -- app/phpstan-baseline.neon`.

**Каталог гарантирован явно, без смены CWD.** Оба шага запускают composer с флагом
`--working-dir=app`, который детерминированно указывает composer на `app/composer.json`
вне зависимости от состояния текущего каталога между вызовами.

```skills-json
[]
```

```steps-json
[
  {
    "op": "Bash",
    "object": "composer --working-dir=app stan -- --generate-baseline",
    "ref": "D1"
  },
  {
    "op": "Bash",
    "object": "composer --working-dir=app stan",
    "ref": "D2"
  }
]
```

```verified-context-json
[
  {
    "id": "phpstan-config",
    "kind": "EXTRACTED",
    "ref": "app/phpstan.neon",
    "anchor": "checkModelProperties: true"
  },
  {
    "id": "baseline-file",
    "kind": "EXTRACTED",
    "ref": "app/phpstan-baseline.neon",
    "anchor": "ignoreErrors:"
  }
]
```

## Переговоры

### Круг 1

Контекст: в плане v7 первым шагом стояла read-only проверка
`git diff --exit-code --quiet app/phpstan-baseline.neon`. Это привело к десинку
указателя impl-режима: read-only команда проходит как разрешённое чтение и **не
продвигает** указатель плана, из-за чего следующий (мутирующий) шаг отбивался как «не
в плане». В v8 это исправлено по корню: исполняемые шаги — только мутирующая
регенерация и verify-прогон; read-only guard вынесен в раздел «Предусловие» (он уже
выполнен, exit 0, baseline == HEAD).

Снятые ранее замечания наставника (по v6/v7), оставлены закрытыми:

1. **Директория.** Оба шага используют `composer --working-dir=app stan`, что
   детерминированно задаёт каталог `app` без зависимости от CWD и без риска `app/app`.
2. **Навык #12 Larastan** — это CLI-инструмент composer, вызываемый шагами командой
   `composer … stan`, а не Superpowers-skill; `skills-json` корректно пуст.

Гарантия отката сохранена полностью: baseline версионируется, предусловие подтвердило
равенство рабочей копии и HEAD, откат — `git checkout HEAD -- app/phpstan-baseline.neon`.
