# План v7: регенерация larastan baseline (CWD-независимый)

## Цель

Перезаписать `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 — критерий приёмки).

**Каталог гарантирован явно, без смены CWD.** Шаги 2 и 3 запускают composer с флагом
`--working-dir=app`, который указывает composer на `app/composer.json` детерминированно,
вне зависимости от того, сохраняется ли текущий каталог между вызовами. Это устраняет
риск как «команда выполнилась из корня вместо app», так и «двойной `cd app` ушёл в
`app/app`».

**Откат гарантирован git.** `phpstan-baseline.neon` версионируется (tracked, в HEAD).
Первый шаг подтверждает, что рабочая копия совпадает с HEAD — значит зафиксированная
версия является валидной точкой восстановления. Откат после перезаписи:
`git checkout HEAD -- app/phpstan-baseline.neon`.

```skills-json
[]
```

```steps-json
[
  {
    "op": "Bash",
    "object": "git diff --exit-code --quiet app/phpstan-baseline.neon",
    "ref": "D1"
  },
  {
    "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

Замечание наставника (по плану v6): шаг 3 `composer stan` без `cd app` запустится не в
той директории; и в плане не объявлен навык #12 Larastan «чтобы гарантировать окружение».

Доводы:

1. **Директория.** Корневая претензия — гарантировать запуск из `app`. В v7 шаги 2 и 3
   используют `composer --working-dir=app stan`. Флаг `--working-dir` (псевдоним `-d`)
   указывает composer на `app/composer.json` и выставляет рабочий каталог для скриптов
   composer в `app`. Это детерминированно — не зависит от того, сохраняется ли CWD между
   отдельными вызовами оболочки. Это строго надёжнее, чем `cd app && …`: вариант с `cd`
   ломается, если CWD после предыдущего шага уже равен `app` (тогда `cd app` уходит в
   несуществующий `app/app`). Таким образом замечание по шагу 3 снято — и не привнесён
   риск `app/app`.

2. **Навык.** Заявленная цель упоминания «#12 Larastan» — «гарантировать окружение».
   После фикса `--working-dir=app` окружение гарантировано самой командой, так что
   отдельное объявление навыка не требуется для этой цели. Кроме того, `skills-json`
   объявляет Superpowers-skills, которые должны быть реально вызваны через Skill-tool до
   первого мутирующего шага; #12 Larastan — это CLI-инструмент composer, который
   **вызывается** шагами 2–3 командой `composer … stan`, а не Superpowers-skill (такого
   скила не существует). Поэтому `skills-json` корректно остаётся пустым.
