Files
factory/L0/install-log.md
vitya 1e65232cce L0 11b complete: plugins installed; surface 2 gaps
- Mark step 11b : superpowers + context7 installed via /plugin install
- Gap: /plugin marketplace add claude-plugins-official is NOT needed
  (marketplace pre-registered per github.com/anthropics/claude-plugins-official)
- Gap: $PROJECTS_DIR (PS session var) does not survive shell restart;
  bootstrap.ps1 should re-read projects_dir from ~/.config/factory/home.toml
  in every new session (home.toml is already SoT)
- Update Resume table: 11b , 11c starting

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:01:19 +03:00

382 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
field-test: new-laptop-2026-05-06
host: tbd (нового ноута имя — спросить)
os: Windows 11
director: existing Windows machine (vitya@.meeting-room)
goal: пройти full L0a + L0b на голой Win11 машине, фиксируя каждую команду; превратить итог в bootstrap.ps1
---
# L0 install log — Win11 field-test 2026-05-06
Каждый шаг: что задумано → команда → фактический результат → пометки (что сработало не так / что неочевидно).
Пометка `⏳` — запланировано, ещё не выполнено.
Пометка `✅` — выполнено, результат записан.
Пометка `❌` — выполнено, но упало; gap для L0a-скрипта.
Пометка `🔄` — выполнено, но потребовало ручной правки.
## L0a — System bootstrap
### Шаг 1 — Verify winget ✅
Win11 поставляется с winget из коробки. Проверка наличия и обновление каталогов.
```powershell
winget --version
winget source update
```
**Ожидание:** версия `v1.x` или новее, source update без ошибок.
**Факт (2026-05-06):**
- Версия: `v1.28.240`
- `source update` — три источника: `msstore` ✅, `winget` ✅, `winget-font` ✅ (третий нестандартный, видимо добавлен ранее — некритично).
- Сессия запущена в `cmd.exe`, не в PowerShell. **Gap для bootstrap.ps1**: на чистой Win11 стартовая консоль у юзера часто = `cmd`. Скрипт надо либо запускать строго через `iwr … | iex` уже из PS, либо первой строкой проверять `$PSVersionTable` и вежливо просить перейти в PS.
---
### Шаг 2 — Установить core dev tools (git, gh, PS7) ✅
```powershell
winget install --id Git.Git -e --source winget --accept-package-agreements --accept-source-agreements
winget install --id GitHub.cli -e --source winget --accept-package-agreements --accept-source-agreements
winget install --id Microsoft.PowerShell -e --source winget --accept-package-agreements --accept-source-agreements
```
После установки — **открыть новый PowerShell 7**, чтобы PATH перечитался. Дальше работаем уже в PS7 (`pwsh`).
**Ожидание:** `git --version`, `gh --version`, `pwsh --version` отвечают.
**Факт (2026-05-06):**
- Git 2.54.0 ✅ (Git Credential Manager входит в комплект)
- GitHub CLI 2.92.0 ✅ — **но для приватного gitea (`git.kzntsv.site`) не работает.** Оставлен на случай GitHub.com mirror'ов; настоящий нативный CLI для gitea — `tea` (см. опциональный шаг). Альтернатива — простой HTTPS + Git Credential Manager.
- PowerShell 7.6.1.0 ✅
- **Gap для bootstrap.ps1**: `gh` для приватного gitea бесполезен. На фабриках с private gitea вместо `GitHub.cli` ставить `gitea.tea` (или сделать оба опциональными). Решение принимать на основе `home.toml#git_host`.
---
### Шаг 3 — Установить mise 🔄
```powershell
winget install --id jdx.mise -e --source winget --accept-package-agreements --accept-source-agreements
```
Активировать в профиле PS7 (`$PROFILE` у PS5 и PS7 разные!):
```powershell
if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
Add-Content -Path $PROFILE -Value 'mise activate pwsh | Out-String | Invoke-Expression'
# ⚠️ ОБЯЗАТЕЛЬНО закрыть pwsh и открыть заново — winget правит PATH, эффект только в новой сессии
. $PROFILE
mise doctor
```
**Ожидание:** `mise --version` отвечает, `mise doctor` без warning'ов.
**Факт (2026-05-06):**
- `winget install jdx.mise` нашёл в каталоге, поставил `2026.5.1 windows-x64`. Зависимость `Microsoft.VCRedist.2015+.x64` подтянулась автоматически.
- Winget предупредил: **"Переменная среды пути изменена; перезапустите оболочку"**, но также создал app-execution-alias `mise` (виден глобально). Поэтому `mise --version` сразу сработал.
- `. $PROFILE` (без перезапуска шелла) → `mise: The term 'mise' is not recognized` — alias работает только в свежей сессии.
- **Решение:** закрыть pwsh, открыть заново — alias подхватывается нормально.
- После рестарта `mise doctor` → ✅ "No problems found"; `MISE_SHELL=pwsh`, shims_on_path=no (нормально для PS — активация env-style, не shims).
- На ноуте обнаружен предустановленный VS Code (в PATH `~\AppData\Local\Programs\Microsoft VS Code\bin`). Конфиг дефолтного терминала на pwsh — отдельный опциональный шаг.
- **Gap для bootstrap.ps1**: после `winget install jdx.mise` обязательно перезапустить себя (re-exec) или сообщить пользователю и завершиться. Не пытаться сделать `. $PROFILE` в той же сессии.
---
### Шаг 4 — Установить runtime'ы через mise ✅
```powershell
mise use --global node@lts python@3.12 go@latest
node --version
python --version
go version
mise list
```
**Ожидание:** все три версии печатаются.
**Факт (2026-05-06):**
- `node@24.15.0` (LTS, npm 11.12.1), `python@3.12.13`, `go@1.26.2` — все три встали из mise mirror'ов.
- Конфиг записан в `C:\Users\vitya\.config\mise\config.toml`.
- ⚠️ Warning во время установки: `mise WARN gpg not found, skipping verification` — sha256 mise проверил, gpg-подпись — нет. На Win11 gpg не предустановлен.
- **Gap для bootstrap.ps1**: либо ставить gpg как зависимость (`winget install GnuPG.Gpg4win` или `GnuPG.GnuPG`), либо явно сообщать "verification skipped — install gpg if you need it" и идти дальше. Не блокер, но решение надо принять.
---
### Шаг 5 — Configure git identity ✅
```powershell
git config --global user.name "<имя>"
git config --global user.email "<почта>"
git config --global init.defaultBranch master
git config --global pull.ff only
git config --global core.autocrlf input
```
**Ожидание:** настройки видны через `git config --global --list`.
**Факт (2026-05-06):**
- `user.name="Victor Kuznetsov"`, `user.email="vitya.kuznetsov@gmail.com"`, `init.defaultBranch=master`, `pull.ff=only`, `core.autocrlf=input`
- Решено: gitea credentials через **PAT + Git Credential Manager (HTTPS)**, не SSH. Причина — Win11 ssh-agent капризный (службу `ssh-agent` надо включать вручную), а GCM встал с Git 2.54 из коробки.
- PAT создаётся пользователем в браузере на `git.kzntsv.site/user/settings/applications` (scopes: `read:repository`, `write:repository`, `read:user`). Будет запрошен GCM'ом при первом `git push`.
- **Gap для bootstrap.ps1**: PAT-creation шаг — не автоматизируется (требует браузера и MFA). Скрипт должен напечатать прямой URL и дождаться "press enter when token created", потом сохранить через `git credential approve` или просто положиться на GCM-prompt.
---
### Шаг 6 — Установить AI-клиент Claude Code 🔄
**Что было предложено (npm):**
```powershell
npm install -g @anthropic-ai/claude-code
claude --version
claude doctor
```
**Что выяснилось:** Claude Code, поставленный через npm-global под mise, попадает в `AppData\Local\mise\installs\node\24.15.0\node_modules\...`. `claude doctor` блокирует auto-updates с warning'ом "Insufficient permissions for auto-updates" (эвристика "не sudo — не можем"). Юзер получит протухшего клиента через пару недель.
**Решение** — переключиться на native installer:
```powershell
claude install # native install в ~\.local\bin\claude.exe
# native installer НЕ добавляет ~\.local\bin в PATH сам — нужен ручной фикс:
$nativePath = "$env:USERPROFILE\.local\bin"
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($userPath -notlike "*$nativePath*") {
[Environment]::SetEnvironmentVariable("Path", "$nativePath;$userPath", "User")
}
$env:Path = "$nativePath;$env:Path"
npm uninstall -g @anthropic-ai/claude-code # убрать зомби-копию
claude --version
where.exe claude # должно быть одно вхождение
claude doctor # должно быть зелёное Update permissions
```
**Факт (2026-05-06):**
- npm install ✅ → Claude Code 2.1.131
- `claude doctor` после npm-install: ⚠ "Insufficient permissions for auto-updates", "Failed to fetch versions"
- `claude install` ✅ → native в `C:\Users\vitya\.local\bin\claude.exe`
- ⚠ Native installer НЕ положил `~\.local\bin` в PATH автоматически. Anthropic просит сделать это руками через GUI.
- Ручной фикс PATH через `[Environment]::SetEnvironmentVariable` — работает.
- `npm uninstall -g @anthropic-ai/claude-code` — убрал зомби.
- Финал: `where.exe claude` → одно вхождение `C:\Users\vitya\.local\bin\claude.exe`. `claude doctor` зелёный: `Currently running: native (2.1.131)`, `Auto-updates: enabled`, `Stable version: 2.1.119`, `Latest version: 2.1.131`. ✅
**Gaps для bootstrap.ps1 (критично):**
-**НЕ ставить через npm-global под mise.** Auto-updates ломаются.
-**Канонический путь** — официальный native installer от Anthropic: `irm https://claude.ai/install.ps1 | iex` (скрипт сам кладёт в `~\.local\bin` И, по идее, добавляет в PATH; в отличие от `claude install` из уже-стоящего клиента).
- ✅ Если по какой-то причине идём через `claude install` — после него ОБЯЗАТЕЛЬНО править PATH из скрипта (см. блок выше).
-Не забыть `npm uninstall -g @anthropic-ai/claude-code` если npm-копия была.
---
### Шаг 7 — Опциональные тулы (по диалогу) ⏳
С интерактивным выбором:
| Тула | winget id | Зачем |
|---|---|---|
| VS Code | `Microsoft.VisualStudioCode` | редактор |
| Cursor | `Anysphere.Cursor` | альтернативный AI-IDE |
| Ollama | `Ollama.Ollama` | локальные LLM (для interns-mcp endpoint local) |
| Docker Desktop | `Docker.DockerDesktop` | контейнеры (нужен для части проектов) |
| Windows Terminal | `Microsoft.WindowsTerminal` | многотабовый терминал |
**Факт:**
---
## L0b — Factory bootstrap
### Шаг 8 — Выбрать projects_dir ✅
Дефолт: `C:\Users\<user>\projects`.
```powershell
$PROJECTS_DIR = "C:\Users\vitya\projects"
New-Item -ItemType Directory -Force -Path $PROJECTS_DIR | Out-Null
Set-Location $PROJECTS_DIR
```
**Факт (2026-05-06):**
- `$PROJECTS_DIR = C:\Users\vitya\projects` ✅ (создан, cwd переключён).
- Параллельно: создан пустой репо `git.kzntsv.site/OpeItcLoc03/factory` (private, без README — чтобы `git push` не упёрся в merge).
- Локальный mapping: gitea-имя `factory` → локальная папка `.factory/`.
---
### Шаг 9 — Склонировать .factory ✅
**Pre-step (на директорской машине):** создать репо `git.kzntsv.site/OpeItcLoc03/factory` (private, без README), `git init -b master` в локальной `.factory/`, commit, `git push -u origin master`. Сделано 2026-05-06, root-commit `7e0c158`, 3 файла + папка L0.
**На новом ноуте:**
```powershell
git clone https://git.kzntsv.site/OpeItcLoc03/factory.git "$PROJECTS_DIR\.factory"
```
**Mapping**: gitea-имя репо = `factory` (без точки — gitea не любит точку в начале); локальная папка после клона = `.factory/` (с точкой, чтобы быть сиблингом `.common`/`.wiki`/etc). Это закреплённая конвенция для всех мета-репо.
**Факт (2026-05-06):**
- `git clone` прошёл без интерактивного запроса PAT — Windows Credential Vault уже знал `git.kzntsv.site` (либо через OAuth, либо PAT был сохранён GCM при предыдущей сессии). Удобно для этого ноута, но **gap** для свежей машины нового сотрудника.
- `git log --oneline``7e0c158 Initial commit: factory skeleton + L0 install log (field-test 2026-05-06)`
- `git remote -v` → origin корректный.
- 3 файла + L0/ ✅
**Gap для bootstrap.ps1:** на голой машине нового сотрудника GCM ещё не знает gitea. Скрипт должен явно открыть `https://git.kzntsv.site/user/settings/applications` в браузере, попросить пользователя сгенерить PAT (scopes: `read:repository` + `write:repository` + `read:user`) и нажать Enter. Дальше первый `git clone` всплывёт с GCM-prompt — пользователь введёт username + PAT, GCM сохранит в Credential Vault. Все последующие clone/push молчаливые.
---
### Шаг 10 — Записать home.toml 🔄
⚠ TOML strings с Windows-путями (backslashes) — должны быть **literal strings** (одинарные кавычки), иначе backslash интерпретируется как escape.
**Первая попытка** — через here-string `@" ... "@` — провалилась: после copy-paste закрывающий `"@` оказался с leading whitespace, PowerShell не закрыл here-string и завис в `>>` continuation prompt.
**Рабочая версия — без here-string, через array + Set-Content** (устойчиво к copy-paste):
```powershell
$cfg = "$env:USERPROFILE\.config\factory"
New-Item -ItemType Directory -Force -Path $cfg | Out-Null
$now = Get-Date -Format 'yyyy-MM-ddTHH:mm:ssZ'
$lines = @(
"# factory home — single source of machine-level state",
"# auto-generated by L0b bootstrap; safe to edit by hand",
"",
"projects_dir = '$PROJECTS_DIR'",
"client = 'claude-code'",
"installed_at = '$now'"
)
$lines | Set-Content -Encoding utf8 "$cfg\home.toml"
Get-Content "$cfg\home.toml"
```
**Факт (2026-05-06):**
- Попытка 1 (here-string) — провалилась из-за whitespace перед `"@`.
- Попытка 2 (array + Set-Content) — ✅. `home.toml` содержит:
```toml
# factory home — single source of machine-level state
# auto-generated by L0b bootstrap; safe to edit by hand
projects_dir = 'C:\Users\vitya\projects'
client = 'claude-code'
installed_at = '2026-05-06T11:41:04Z'
```
- TOML literal strings корректно сохраняют backslashes Windows-пути.
**Gap для bootstrap.ps1**: НЕ использовать here-strings (`@" ... "@`) — слишком хрупкие к whitespace-ошибкам при copy-paste. Писать конфиги через `Set-Content -Value $array` или `[System.IO.File]::WriteAllText(...)`. Если нужна BOM-free UTF-8, на PS5.1 `Set-Content -Encoding utf8` создаёт UTF-8 *с BOM* — для cross-version совместимости лучше `[System.IO.File]::WriteAllText($path, $content, [System.Text.UTF8Encoding]::new($false))`.
---
### Шаг 11 — Запустить L1 (`factory install`) — серия под-шагов
L1 пока не существует (нет Go-бинаря). Вместо него — **manual run** через Claude Code, по под-шагам.
#### Шаг 11a — клонировать claude-skills + установить скилы ✅
```powershell
cd $PROJECTS_DIR
git clone https://git.kzntsv.site/OpeItcLoc03/claude-skills.git
cd claude-skills
pwsh scripts/install.ps1
Get-ChildItem -Path "$env:USERPROFILE\.claude\skills" -Directory | Select-Object Name
```
**Факт (2026-05-06):**
- Клон claude-skills (698 объектов, 557 КБ) ✅
- В `claude-skills/scripts/` изначально не было `install.ps1` — только `install.sh`. Добавлен из директорской машины (commit `ef14594`, push в gitea), на ноуте `git pull --ff-only` подтянул.
- `pwsh scripts/install.ps1` — **21 скилл** установлен в `C:\Users\vitya\.claude\skills\` (active-platform, caveman-*, find-skills, project-bootstrap, project-discipline, pulling-before-work, setup-context7, setup-interns, setup-projects-meta, setup-tasks, setup-wiki, using-context7, using-interns, using-markitdown, using-projects-meta, using-tasks, using-wiki) ✅
- Финальный `Get-ChildItem` — те же 21 имени, всё на месте.
#### Шаг 11b — запустить claude, залогиниться, поставить плагины ✅
```powershell
cd $PROJECTS_DIR\.factory
claude
# в Claude:
# /login — OAuth flow в браузере
# /plugin install superpowers@claude-plugins-official
# /plugin install context7@claude-plugins-official
# /reload-plugins — применить
# /exit
```
**Факт (2026-05-06):**
- OAuth login прошёл через браузер ✅
- `/plugin install superpowers@claude-plugins-official` → ✅ установлен
- `/plugin install context7@claude-plugins-official` → ✅ установлен
- **Открытие**: `/plugin marketplace add claude-plugins-official`**НЕ НУЖНО**. Маркетплейс `claude-plugins-official` уже предзарегистрирован в Claude Code. Команда `/plugin install <name>@claude-plugins-official` работает сразу. Подтверждение — README репо `github.com/anthropics/claude-plugins-official`: "You do NOT need to register the marketplace separately".
- `/active-platform` после reload — отрабатывает, Windows + PowerShell ✅
**Gaps для bootstrap.ps1:**
-Не учить юзера `/plugin marketplace add claude-plugins-official` — это лишний шаг. Сразу `/plugin install <name>@claude-plugins-official`. Предыдущая инструкция в наследии установок устарела.
- ⚠ После выхода из `claude` и открытия **новой** PowerShell-сессии переменная `$PROJECTS_DIR` не видна (PS-переменные живут только внутри сессии; нужен `$env:PROJECTS_DIR` через `[Environment]::SetEnvironmentVariable(..., "User")` если хотим персистентности, или просто перезадать в новой сессии). bootstrap.ps1 должен после рестартов либо (а) читать `projects_dir` из `~\.config\factory\home.toml`, либо (б) экспортировать `$env:PROJECTS_DIR` на уровне User через `SetEnvironmentVariable`. Вариант (а) каноничнее — home.toml уже SoT.
#### Шаг 11c — пройтись по setup-* скилам ⏳
Порядок: `/setup-projects-meta``/setup-interns``/setup-tasks``/setup-wiki``/setup-context7` (последний может уже работать через установленный плагин).
(в работе)
---
## Gaps / questions surfaced during field-test
(заполняется по ходу)
- **2026-05-06 шаг 1**: стартовая консоль на чистой Win11 — `cmd`, не PowerShell. bootstrap.ps1 должен или (а) запускаться явно через `powershell -c "iwr … | iex"`, или (б) при старте проверить `$PSVersionTable` и подсказать. На голой Win11 у нового сотрудника `cmd` будет дефолтом.
- **2026-05-06 шаг 2**: `gh` (GitHub CLI) не работает с приватным gitea — лишний пакет. Заменить в bootstrap.ps1 на `gitea.tea` либо сделать выбор по `home.toml#git_host`.
- **2026-05-06 шаг 3**: после `winget install Microsoft.PowerShell` юзер всё ещё может запустить **Windows PowerShell 5.1** вместо PS7 (две разные программы в Start menu, похожие иконки). bootstrap.ps1 должен или явно вызвать `pwsh.exe`, или громко проверить `$PSVersionTable.PSVersion.Major -ge 7` и переоткрыть себя в pwsh. Профили (`$PROFILE`) у 5.1 и 7 разные — путаница приведёт к "mise активирован, но не работает".
- **2026-05-06 conv**: в gitea репо называются БЕЗ точки (`factory`, не `.factory`). Локальная папка — С точкой (`.factory/`). Закрепить mapping `gitea_repo → local_path` в L1 manifest (вероятно как поле `target_dir` отдельно от `source.url`).
- **2026-05-06 шаг 3**: после `winget install jdx.mise` PATH обновлён только для НОВЫХ сессий. App-execution-alias делает `mise --version` рабочим сразу, но команды из `mise activate pwsh` (которые туда не попадают) — нет. bootstrap.ps1 должен после установки mise самозавершиться с инструкцией "открой новую pwsh и запусти `bootstrap.ps1 --resume`" — НЕ пытаться `. $PROFILE` в той же сессии.
- **2026-05-06 VS Code**: на чистой машине VS Code по дефолту цепляет Windows PowerShell 5.1, а не PS7 — даже если PS7 установлен. Нужно явно прописать в `settings.json`: `"terminal.integrated.defaultProfile.windows": "PowerShell"` + профиль с `path: "pwsh.exe"`. Кандидат на L0a опциональный шаг "configure VS Code" (если установлен).
- **2026-05-06 шаг 11a**: в `claude-skills/scripts/` есть только `install.sh` (bash) — `install.ps1` отсутствует. На Windows-машине нативный путь — pwsh, а не git-bash. Нужно добавить `install.ps1` в `claude-skills` (PR в репо), сейчас обходимся inline-PS-блоком.
- **2026-05-06 шаг 11b**: маркетплейс `claude-plugins-official` уже **предзарегистрирован** в Claude Code — `/plugin marketplace add claude-plugins-official` лишний. Сразу `/plugin install <name>@claude-plugins-official`. Любые наследуемые from-the-internet инструкции с `marketplace add` — устарели.
- **2026-05-06 шаг 11b**: `$PROJECTS_DIR` (PS-переменная сессии) **не переживает рестарт shell** — после выхода из `claude` и открытия новой PS она пуста. bootstrap.ps1 должен полагаться на `~\.config\factory\home.toml#projects_dir` (уже SoT) или через `[Environment]::SetEnvironmentVariable("PROJECTS_DIR", $val, "User")` экспортировать на User-уровень. Канон — читать из home.toml в каждой новой сессии.
## Resume point — 2026-05-06 (перерыв)
**Состояние field-test'а на момент паузы:**
| Слой | Шаг | Статус |
|---|---|---|
| L0a | 1. Verify winget | ✅ |
| L0a | 2. Core dev tools (git/gh/PS7) | ✅ |
| L0a | 3. mise install | 🔄 (нужен restart, прошло) |
| L0a | 4. node/python/go через mise | ✅ |
| L0a | 5. git identity | ✅ |
| L0a | 6. Claude Code (npm → native) | 🔄 (npm-зомби убран, native ОК) |
| L0a | 7. Опциональные тулзы | ⏭ skipped (VS Code уже стоял; остальное докатим позже) |
| L0b | 8. projects_dir | ✅ `C:\Users\vitya\projects` |
| L0b | 9. Clone factory | ✅ root-commit `7e0c158` |
| L0b | 10. home.toml | 🔄 (попытка 1 here-string подвисла; попытка 2 array+Set-Content ✅) |
| L1-manual | 11a. claude-skills + 21 skill в `~\.claude\skills\` | ✅ commit `ef14594` (добавил install.ps1) |
| L1-manual | 11b. claude login + плагины superpowers/context7 | ✅ оба плагина встали; `/plugin marketplace add` — не нужен |
| L1-manual | 11c. setup-* скилы (projects-meta, interns, tasks, wiki, context7) | ⏳ начинаем сейчас |
**Что юзер делает в перерыве:** под-шаг 11b — `claude` в `$PROJECTS_DIR\.factory`, OAuth login, `/plugin marketplace add claude-plugins-official`, `/plugin install superpowers@claude-plugins-official`, `/plugin install context7@claude-plugins-official`. После этого `/exit`.
**Первое действие после возвращения:**
1. Спросить юзера: "Чем закончился 11b? Залогинился? Какие плагины встали? Видны `/setup-projects-meta`, `/active-platform` в slash-меню?"
2. Если ОК — переходим к 11c: `/setup-projects-meta` (первый, потому что от него зависят interns и shared wiki). У этого скила интерактивный flow с preview/confirm — нужен PAT в `~/.config/projects-mcp/auth.toml`. Юзер уже в курсе, как генерить PAT.
3. Дальше по списку: `/setup-interns``/setup-tasks``/setup-wiki``/setup-context7` (последний — может уже стоять, если плагин context7 поставился через `/plugin install` в 11b).
**Открытые design-вопросы**`.meeting-room/.brainstorm/factory-bootstrap.md`, секция "Открытые"): Q2 (где живёт factory.yaml), Q3 (slash-bridge для L2), Q4 (версионирование manifest'а), Q5 (secrets unification).
**Где смотреть после возвращения:**
- Этот файл — пошаговый лог.
- `.meeting-room/.brainstorm/factory-bootstrap.md` — design-буфер.
- `git.kzntsv.site/OpeItcLoc03/factory` — если работаешь с другой машины, `git pull` сюда даст актуальный лог.
## Diff plan: log → bootstrap.ps1
После заполнения всех ✅ — пройти список и для каждого шага:
1. Выкинуть всё что было ручной правкой / интерактивным выбором → перенести в `bootstrap.ps1` как функцию с параметрами.
2. Шаги, отмеченные `❌`/`🔄`, сделать первоочередными — там реальные gap'ы native experience.
3. PS-скрипт должен запускаться от user-scope (без admin), кроме шагов где winget сам поднимет UAC.
4. Все интерактивные диалоги — через `Read-Host` или `Select-Object` (ASCII-меню).