---
pr: 73
title: fix(docker): use node:22-trixie-slim instead of non-existent noble-slim
---

## Что сделано
Follow-up к PR#71 (который переключил base image на `node:22-trixie-slim`, но коммитил через PR#71 с placeholder'ом в ADR). PR#73 закрывает хвосты PR#71: обновляет ADR-030 (переименован в `030-pr-71-base-image-trixie-slim.md`, контент обновлён под реальный тег), переименовывает handoff `pr-71-base-image-noble-slim.md` → `pr-71-base-image-trixie-slim.md`, обновляет project map. Сам Docker base image (`Dockerfile:1` `FROM node:22-trixie-slim`) **уже был сменён в PR#71** — в PR#73 правок кода нет.

Конкретно:
- `Dockerfile:1` — без правок в этом PR (`FROM node:22-trixie-slim` уже стоит из PR#71)
- `docs/decisions/030-pr-71-base-image-trixie-slim.md` — ADR-030 переименован с `030-pr-71-base-image-noble-slim.md`, контент обновлён: указан реальный тег trixie-slim, пояснена ошибка PR#71 (noble-slim не существует в Docker Hub, node images публикуются только на Debian), chromium snap problem отпадает, добавлены альтернативы (`node:lts-trixie-slim`, `node:trixie-slim`)
- `docs/handoff/pr-71-base-image-trixie-slim.md` — переименован с `pr-71-base-image-noble-slim.md`, контент обновлён под trixie-slim
- `docs/project-map/README.md` — теги PR#73 на затронутых строках
- этот handoff `pr-73-base-image-trixie-slim.md` — создан, потому что `pipeline-status.py` ищет handoff по **PR номеру** (`pr-<PR>-*.md`), а PR#71 handoff назван по issue/исходному PR и не матчится на PR#73

## Почему
PR#71 изначально использовал несуществующий тег `node:22-noble-slim` — Docker Hub API возвращает `count=0` для этого тега (node images публикуются только на Debian: bookworm, bullseye, trixie; Ubuntu noble — только для официального ubuntu образа, не для node). Пересборка падала с `manifest unknown`. `node:22-trixie-slim` — реальный тег (Debian 13 trixie, glibc 2.41 ≥ 2.39, Node 22 LTS), решает ту же задачу PR#71: `@mathew-cf/rag-cli` Rust native binary требует GLIBC_2.39, а `node:20-slim` (Debian Bookworm, glibc 2.36) слишком старый.

Debian 13 trixie НЕ использует snap (в отличие от Ubuntu noble) → chromium ставится через `apt-get install -y chromium` как обычный пакет, не transitional wrapper. Known limitation из PR#71 (chromium snap problem) отпадает.

## Pending
— после merge PR#73:
- Пересборка Docker образа локально (`docker compose build`), проверка что `FROM node:22-trixie-slim` резолвится с Docker Hub без `manifest unknown`
- Проверка `rag --version` внутри контейнера (`docker compose run --rm opencode rag --version`) — подтверждает что GLIBC_2.39 доступен и semantic search работоспособен
- memory update `technical/opencode-log-subagent-stumbles-analysis.md` (noble-slim не существует → trixie-slim) — на фазе MEMORY через memory-syncer subagent, если pipeline дойдёт

## Watch out
- **`commit` tool НЕ делает `git add`** — коммитит только уже staged файлы (`git diff --cached --name-only` → `git commit -m`). Staging ответственность агента: `git add <files>` явно перед `commit`. Если в индексе случайно оказались лишние файлы (например `package-lock.json` через `git add -A`), они уйдут в коммит. Урок: проверять `git status` перед `commit`. Для unstage лишнего: `git restore --staged <file>` (added to allow-list в PR#80, ADR-035) — `git reset *` заблокирован deny (`opencode.json:311-314`). См. ADR-035, memory `technical/commit-tool-staging-truth.md`.
- **Урок PR#71: проверять существование Docker тега через Docker Hub API перед коммитом.** `curl -s "https://hub.docker.com/v2/repositories/library/node/tags/noble-slim/" | jq .` — `name: null` = тег не существует. `trixie-slim` возвращает `name: "trixie-slim"`. Также `curl -s "https://hub.docker.com/v2/repositories/library/node/tags?page_size=100&name=trixie"` — список реальных trixie тегов.
- **scaffold-handoff.sh создаёт и ADR, и handoff** — для этого PR ADR уже существовал (030-pr-71-...), но паттерн поиска `*-pr-<PR>-<slug>.md` использует PR=73 → не нашёл 030-pr-71 → создал пустой файл `031-pr-73-*.md`. Лишний файл `031-pr-73` удалён вручную (`rm`, не `git rm` — файл ещё не в индексе). Если scaffold запускается после переименования ADR с другим PR-номером — нужно либо переименовать ADR ДО scaffold под целевой PR, либо удалять дубликат после.
- **pipeline-status.py ищет handoff по PR-номеру, НЕ issue-номеру** — конвенция репо: `pr-<PR>-<slug>.md`. PR#71 handoff назван по исходному PR#71 (который этот PR исправляет), поэтому pipeline-status для PR#73 не находил его → нужен отдельный `pr-73-*.md`. См. memory `technical/video_uniq-pr51-channel-profile-discoveries.md` §2.
- **`.opencode/package-lock.json` untracked** — не относится к этому PR (зафиксировано в pr-69 handoff), не коммитить. `git status` показывает его как untracked — нужно игнорировать при `commit` (агент должен `git add` только целевые файлы, НЕ `git add -A`; `commit` tool коммитит только staged, не делая `git add` сам — см. Watch out выше).