Drop the stand page the owner questioned: the one-carrier audit backed him, so three homeless facts move into the map and the rest was duplicate or snapshot
This commit is contained in:
parent
f87a7d9da1
commit
5f49ca9bac
6 changed files with 8 additions and 114 deletions
|
|
@ -76,4 +76,4 @@ Go-бэкенд издательского художественного пер
|
|||
|
||||
1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`. Непонятный жаргон/сокращения — `docs/glossary.md`.
|
||||
2. `docs/architecture/05-decisions-log.md`: **шапка** (карта актуальности + эрраты) и **реестр** `docs/architecture/05-decisions-index.md` — одна строка на ноту. Из тел — только 2–3 последние. ⚠ «Живая голова» целиком в обязательное чтение НЕ входит: это 33 ноты, и требование её прочесть противоречило бы дисциплине «целиком НЕ читать» выше; остальные номера грепаются по мере вопросов. Тела закрытых эр — в слайсах `docs/archive/architecture/` (греп: живой файл → слайсы).
|
||||
3. По роли (пути от КОРНЯ репозитория — прежняя редакция писала их от `docs/`, и от корня они не резолвились): Бэкенд — шапка-таблица `docs/architecture/09-target-architecture.md` (что построено) → `backend/README.md` → `docs/architecture/03-implementation-notes.md` (через баннер) → `docs/architecture/12-go-style-notes.md`; ⚠ порядок именно такой: сессии, впервые видящей движок, механика нужнее стиль-норм; Полигон — `eval/README.md` + `docs/experiments/00-provider-quirks.md` + `docs/experiments/09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `docs/research/16-reader-ide-alignment.md` (через ревью-шапку) + контракт `docs/architecture/14-api-contract/`; Платформа — `platform/README.md` + зонный журнал + `docs/research/23-engine-platform-seam.md` + контракт 14; всем — шапка-таблица `docs/architecture/09-target-architecture.md` (статус слоёв). Как поднять тулчейн и стенд на чистой машине — `docs/dev-stand.md`.
|
||||
3. По роли (пути от КОРНЯ репозитория — прежняя редакция писала их от `docs/`, и от корня они не резолвились): Бэкенд — шапка-таблица `docs/architecture/09-target-architecture.md` (что построено) → `backend/README.md` → `docs/architecture/03-implementation-notes.md` (через баннер) → `docs/architecture/12-go-style-notes.md`; ⚠ порядок именно такой: сессии, впервые видящей движок, механика нужнее стиль-норм; Полигон — `eval/README.md` + `docs/experiments/00-provider-quirks.md` + `docs/experiments/09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `docs/research/16-reader-ide-alignment.md` (через ревью-шапку) + контракт `docs/architecture/14-api-contract/`; Платформа — `platform/README.md` + зонный журнал + `docs/research/23-engine-platform-seam.md` + контракт 14; всем — шапка-таблица `docs/architecture/09-target-architecture.md` (статус слоёв). Тулчейн на чистой машине — строка «Тулчейн» в карте `docs/README.md`.
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -7,7 +7,6 @@
|
|||
## Карта
|
||||
|
||||
- [glossary.md](glossary.md) — жаргон и сокращения (D-номер, паки, банк, голден, K/DC/H/L…) одним экраном.
|
||||
- [dev-stand.md](dev-stand.md) — **поднять проект на чистой машине**: что поставить, в каком порядке, что требует root и чего стенд НЕ проверяет. Версий и рецептов зон не дублирует — называет носитель и команду чтения.
|
||||
- [product-requirements.md](product-requirements.md) — реестр «что продукт обязан уметь»: производное живого брифа владельца и его находок, статусы сверены кодом.
|
||||
- `architecture/` — синтез и контракты:
|
||||
- [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**: ратифицированный контракт, при конфликте побеждает он. Дисциплина чтения (грепать номер, не читать целиком, баннер прежде тела) — в каноне `../CLAUDE.md`, здесь не дублируется. Статус и тело ЛЮБОГО номера одним хопом — реестр [05-decisions-index.md](architecture/05-decisions-index.md) (все ноты, колонка тем для грепа «какой закон по X»).
|
||||
|
|
@ -17,7 +16,8 @@
|
|||
- `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные — отчёты экспериментов. ⚠ **У каждого отчёта статус в его ревью-шапке: читай шапку прежде тела** — она первична и говорит, ратифицированы выводы или заморожены.
|
||||
- `research/` — фактура ресёрчей; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа · 25 холодное ревью шва — **читать перед любым кодом стыка** · 24 арбитраж банка · 26 официальные практики Anthropic · 28 контракт-ревью API v0 — **носитель для исполняющих сессий, читать оригинал, не пересказ**.
|
||||
- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений.
|
||||
- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit`: **`--lint` якорей — при коммите, задевающем ЛЮБОЙ док или `CLAUDE.md`; `--check` чисел и головы — при коммите с D-логом или PROGRESS** (оба `--from-index`, предупреждает, не блокирует). ⚠ Шапка систематически отстаёт от хвоста у ЛЮБОГО автора — потому проверка механическая, а не «посмотрю внимательно».
|
||||
- **Тулчейн на чистой машине.** Версии не здесь — их носители: `backend/Makefile` и `platform/Makefile` (`GO_MIN_VERSION`, `GOLANGCI_VERSION`), `frontend/package.json` (`engines`), `platform/docs/STACK_DECISIONS.md` §«Postgres на стенде без root», `eval/requirements.txt` + `eval/.python-version`. Здесь только то, чего нет нигде: ставим в `~/.local/opt/<инструмент>` с симлинком в `~/.local/bin` (он уже в `PATH`), берём **последний патч пинованного минора, а не следующий минор** — линтер пинован точным равенством и разъедется. Root требуют ровно два пакета: `build-essential` (без C-компилятора нет `-race`, а снять `-race` значит выдать отсутствие тулчейна за зелёный прогон — см. комментарий над целью `test` в `backend/Makefile`) и `python3-venv` (в системном питоне нет `ensurepip`, и установка полигона по `eval/README.md` обрывается на первом шаге).
|
||||
- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit`: **`--lint` якорей — при коммите, задевающем ЛЮБОЙ док или `CLAUDE.md`; `--check` чисел и головы — при коммите с D-логом или PROGRESS** (оба `--from-index`, предупреждает, не блокирует). ⚠ **Диспетчер этого хука ставит ТОЛЬКО `npm install` во фронте** (`frontend/package.json` ключ `prepare`), поэтому на свежем клоне, где зависимости фронта не ставили, гейт МОЛЧА выключен — `.git/hooks/` пуст. Поставить отдельно, без установки зависимостей: `node frontend/scripts/githooks/install.mjs`. ⚠ Шапка систематически отстаёт от хвоста у ЛЮБОГО автора — потому проверка механическая, а не «посмотрю внимательно».
|
||||
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; здесь — только то, что отвечает на вопрос «какой файл мой»; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
|
||||
| Роль | Активный промт | Статус |
|
||||
|---|---|---|
|
||||
|
|
|
|||
|
|
@ -217,4 +217,4 @@
|
|||
| D39.154 | 22.08 | Приёмка и лендинг P8-FIX платформы (фикс-лист приёмки P7 + врезанный первым блокер свипа): **ПРИНЯТ**; `PD-169` — единственная строка регистра, солгавшая ДВУМ приёмкам, — закрыт четырьмя механизмами (разделение прохода на фазы · отсрочка с бэкоффом на выбравший бюджет прогон · порог `StalledAfter` с гейджем и `runs --stalled` · терминальный вердикт оператора `run abandon`), оба числа стали ручками и `RunBudget` присвоен впервые; вся цепь пере-проверена ЖИВОЙ пробой оркестратора (`FAILS 6` → гейдж 1 → `--stalled` с настоящей ошибкой движка), деньги двумя путями из сырого леджера сошлись до цента и холд вернулся целиком; батарея 18 пакетов EXIT=0, линтер 0 issues, тестов 561 против 532; ⚠ «скипов 0» НЕ воспроизведён — третий, неназванный гейт батареи (менеджер systemd), `PD-374`; одиннадцать собственных посадок мутаций, убито восемь, выжили три и различены руками: `StalledAfter` законно (носитель один), `maxAttempts` — `PD-373` (второй носитель прозой в рантбуке), `truncateReason` в `DeferRun` — `PD-372` (пин на функции, ни один из четырёх вызовов не проверен); находка вне карты `PD-371` (исключение «стоп перевешивает отсрочку» без границы, измерено живьём); ⚠ объявлена ОШИБКА харнесса приёмки — две посадки дали ложное «выжила» из-за не того пакета; спил пер-термной подписи банка принят, пол поверхности 15→14 сдвинут явно и гейт СРАБОТАЛ; `PD-370` уезжает открытым мажором (контрактная половина — ломающий минор 0.4.0→0.5.0); порядок паков вышел ОБРАТНЫМ очереди — названная цена перестановки НЕ заплачена, зато §4.7 релея пуст | ЖИВОЕ: `PD-370`/`PD-371`/`PD-372`/`PD-373`/`PD-374`; строка 199(а) ждёт ратификации; читающий пак не запускался | жив | платформа приёмка свип деньги мутации |
|
||||
| D39.155 | 22.08 | Сквозная актуализация доков по многоагентному аудиту (14 линз + опровергатель на каждую находку, 180 агентов; 132 находки, 30 опровергнуто) + **передача роли №18 → №19**. Срезано: `PROGRESS.md` 471→291, зонный журнал платформы 897→239 (слайсы `PROGRESS-2026-08-17`, `-08-10-15`, `platform-PROGRESS-P8`); перед срезом вынесены носители — инвентарь каналов шва в `STACK_DECISIONS` (и там ПОЛНЕЕ: дописан канал текста `tmctl export --pairs`). Ложь, которую читала каждая сессия: `12-go-style-notes` §0 п.4 предписывал снятый ключ `prompts:`, на котором движок НЕ поднимется; таблица §3 компаньона объявляла не построенными шесть работающих поверхностей. Новые строки 206–210; **210 — род не производится авто-путём вовсе** (доставка построена, данных нет: терминолог возвращает три поля без рода, майнер берёт `gender` только из сида) + `gates.voice` нет ни в одном шиппинг-конфиге. ⚠ **СНЯТА ратификация 203(з)/191(б):** гейт движка проверяет полноту ФАЙЛА решений, а не подписей, один файл его снимает — конфликта с моделью «один ОК» нет, обход был костылём под отсутствующую доставку; единственный блокер темы — владение `book.yaml` (199а). Контрактный батч разделён по БЛОКЕРАМ: 0.5.0 гигиена сейчас, 0.6.0 ручка+прогресс после ратификаций. sqlc: гейт SQL съел бо́льшую часть ценности (162 оператора против 41), остаток — арность `Scan` на двух запросах. Названы пять собственных ошибок №18, все в ПРОЗЕ О ФАКТАХ | ЖИВОЕ: строки 199а · 206 · 208 · 210 · 172-г — на владельце; читающий пак платформы выдан и не запускался | жив | доки приёмка банк контракт передача-роли |
|
||||
| D39.156 | 23.08 | **Ратифицирован закон входной двери шва движок↔платформа** — дисциплина из семи пунктов (`17-seam-inbound-law.md`), не каталог команд: двери встают паками без нового решения владельца. Развилка 199(а) РАСТВОРЕНА (конвенционные дефолты путей + движковый глагол-писатель), три выноса по требованию ревьюера (форма Б · фикс-имена шва · отказ лока ровно классом 12), эррата к `research/25`. Заведены строки 211–213, закрыта слепота гейта якорей | жив | живой файл |
|
||||
| D39.157 | 24.08 | Переезд на новую машину: стенд пересобран без root (обе батареи EXIT=0 под `-race`, сквозняк живьём), носитель подъёма — `dev-stand.md`; корень книг переопределён на `<репозиторий>/books` со своим git, якорь `/books/` в игноре починен; цена переезда измерена (движок — 3 хелпера, строка 218; полигон — 104+86 файлов, строка 217); решения владельца: легаси выкидывать, а не чинить (санкция паку на удаление эксп-12–16), GPU на машине нет; маршрут холодного входа починен по СЛЕПОМУ замеру трёх ролей; класс «line-якорь в D-лог» закрыт (51 из 55 съехал), реестр перестал врать про 17 тел, гейт вооружён структурной сверкой и доказан мутацией; транспортный коммит `temp` снят по слову владельца | ЖИВОЕ: строки 217/218; очередь — CURRENT-STATE | жив | инфра процесс доки полигон бэкенд |
|
||||
| D39.157 | 24.08 | Переезд на новую машину: стенд пересобран без root (обе батареи EXIT=0 под `-race`, сквозняк живьём), носитель подъёма — карта `README.md` (отдельный док `dev-stand.md` заведён и снесён тем же днём по возражению владельца, аудит одного носителя его подтвердил); корень книг переопределён на `<репозиторий>/books` со своим git, якорь `/books/` в игноре починен; цена переезда измерена (движок — 3 хелпера, строка 218; полигон — 173 файла по корню книг и 121 по корню репо, два РАЗНЫХ слома, строка 217); решения владельца: легаси выкидывать, а не чинить (санкция паку на удаление эксп-12–16), GPU на машине нет; маршрут холодного входа починен по СЛЕПОМУ замеру трёх ролей; класс «line-якорь в D-лог» закрыт (51 из 55 съехал), реестр перестал врать про 17 тел, гейт вооружён структурной сверкой и доказан мутацией; транспортный коммит `temp` снят по слову владельца | ЖИВОЕ: строки 217/218; очередь — CURRENT-STATE | жив | инфра процесс доки полигон бэкенд |
|
||||
|
|
|
|||
|
|
@ -651,11 +651,11 @@
|
|||
|
||||
## D39.157 — ПЕРЕЕЗД НА НОВУЮ МАШИНУ: СТЕНД ПЕРЕСОБРАН, КОРЕНЬ КНИГ ПЕРЕОПРЕДЕЛЁН, МАРШРУТ ХОЛОДНОГО ВХОДА ПОЧИНЕН ПО СЛЕПОМУ ЗАМЕРУ (24.08, оркестратор №19). ✅
|
||||
|
||||
**1. Стенд.** Тулчейн на машине был нулевой. Носитель подъёма — [`../dev-stand.md`](../dev-stand.md); версий и рецептов зон он не дублирует, а называет их носитель и команду чтения. Root потребовали ровно два пакета (`build-essential` — `-race` требует cgo, снять его значило бы выдать отсутствие тулчейна за зелёный прогон; `python3-venv` — в системном питоне нет `ensurepip`), поставил владелец. Обе батареи прогнаны ЦЕЛИКОМ под `-race`: бэкенд `make battery` EXIT=0, платформа `make check` EXIT=0 при 18 пакетах и скипах 0. Сквозняк проверен живьём: демон → сид через настоящий интейк → движок распарсил книгу. Чего стенд НЕ проверяет — отдельный раздел там же (ни одного платного вызова · Playwright · GPU · OIDC).
|
||||
**1. Стенд.** Тулчейн на машине был нулевой. Носитель подъёма — строка «Тулчейн на чистой машине» в карте [`../README.md`](../README.md). ⚠ Отдельный док `dev-stand.md` я завёл и в тот же день СНЁС по возражению владельца («зачем он нужен, всё и так выводится»): аудит по правилу одного носителя подтвердил его правоту — из шести разделов четыре были дублями или снимком машины, то есть ровно тем классом, который свип D39.155 выносил. Пережили три факта, и они разложены по существующим носителям. Root потребовали ровно два пакета (`build-essential` — `-race` требует cgo, снять его значило бы выдать отсутствие тулчейна за зелёный прогон; `python3-venv` — в системном питоне нет `ensurepip`), поставил владелец. Обе батареи прогнаны ЦЕЛИКОМ под `-race`: бэкенд `make battery` EXIT=0, платформа `make check` EXIT=0 при 18 пакетах и скипах 0. Сквозняк проверен живьём: демон → сид через настоящий интейк → движок распарсил книгу. Чего стенд НЕ проверяет, названо в CURRENT-STATE врезкой (ж): ни одного платного вызова · Playwright · GPU · OIDC.
|
||||
|
||||
**2. Корень книг — `<репозиторий>/books`, отдельный git.** Каталог перенесён владельцем внутрь дерева и версионируется своим репозиторием со своим origin; внешний держит `/books/` в `.gitignore`. Инвариант «книга и производные вне git» в силе — вне ЭТОГО git. Два следствия внесены в `CLAUDE.md`: `git status` внешнего репо правок книг не показывает, а `clean -xdf` снёс бы каталог с историей. ⚠ Правило игнора без якоря (`books/`) ловило ЛЮБОЙ каталог с этим именем, включая живой `platform/internal/books/`, — новый файл там уходил в игнор молча; заякорено в `/books/`, доказано пробой в обе стороны.
|
||||
|
||||
**3. Цена переезда измерена, не оценена.** Движок задет ТРЕМЯ тест-хелперами (дефолт `$HOME/books`), и переопределения в коде уже есть: с ними корпус-батарея зелена, красен только `TestMinerFullBookParity` из-за отсутствующего jieba (строка 123, к переезду отношения не имеет) — строка **218**. Полигон ломает не переезд книг, а переезд МАШИНЫ: `REPO = Path("/home/ubuntu/projects/textmachine")` одной дословной строкой в 104 файлах, плюс корень книг 163 строками в 86; живых носителей 30, включая рабочий гейт фазы Д — строка **217**. Все 20 `book.yaml` репозитория книг несут мёртвые пути по девяти ключам.
|
||||
**3. Цена переезда измерена, не оценена.** Движок задет ТРЕМЯ тест-хелперами (дефолт `$HOME/books`), и переопределения в коде уже есть: с ними корпус-батарея зелена, красен только `TestMinerFullBookParity` из-за отсутствующего jieba (строка 123, к переезду отношения не имеет) — строка **218**. У полигона ДВА РАЗНЫХ слома, и их нельзя валить в один (⚠ **ИСПРАВЛЕНО 24.08 тем же днём:** первая редакция писала «полигон ломает не переезд книг, а переезд МАШИНЫ» — для корня книг это НЕВЕРНО, поймано пере-счётом после уточнения владельца). **Корень репозитория** ломает смена пользователя: литерал `/home/ubuntu/projects/textmachine` в 121 файле, из них 104 — дословно одной строкой `REPO = Path(...)`; портабельная форма есть лишь у 5. **Корень книг** ломают ОБА события порознь: литерал `/home/ubuntu/books` — 86 файлов (смена пользователя), портабельный `Path.home()/"books"` — 89 файлов (135 вхождений; их сломал ПЕРЕЕЗД каталога, на прежних машинах они работали). Объединение — 173 файла, живых носителей 26, и среди ЖИВЫХ портабельная форма преобладает 20:6. Следствие для формы правки: подстановка нового абсолютного префикса чинила бы эту машину и ломала прежние — годится только резолв от МАРКЕРА вверх по дереву — строка **217**. Все 20 `book.yaml` репозитория книг несут мёртвые пути по девяти ключам.
|
||||
|
||||
**4. Решения владельца 24.08.** (а) **Чинить всё; что легаси — выкидывать, а не поддерживать** («незачем копить техдолг») — это САНКЦИЯ полигонному паку на УДАЛЕНИЕ скриптов закрытых эксп-12–16 вместо их починки; довод, снимающий возражение о потере воспроизводимости: те прогоны шли на Ubuntu 24 / CPython ~3.12 с НЕИЗВЕСТНЫМИ версиями, и `eval/requirements.txt` сам объявляет их перепрогон НОВЫМ замером, а не репродукцией. (б) **GPU на машине нет**, локальную модель мерить нечем; ветка не закрыта — «в будущем может понадобиться».
|
||||
|
||||
|
|
|
|||
|
|
@ -1,106 +0,0 @@
|
|||
# Стенд разработки — поднять проект на чистой машине
|
||||
|
||||
> Отвечает на ОДИН вопрос: что поставить и в каком порядке, чтобы все четыре зоны собрались и их
|
||||
> батареи прошли. **Версий и рецептов зон здесь НЕТ** — каждая строка называет свой носитель и
|
||||
> команду, которой номер читается: скопированный сюда номер стал бы вторым носителем и разошёлся
|
||||
> бы с первым (D39.112). Что уже построено и что в очереди — CURRENT-STATE в [PROGRESS.md](PROGRESS.md),
|
||||
> здесь только «как поднять».
|
||||
>
|
||||
> ⚠ **Проверено исполнением 24.08.2026** на чистой Ubuntu 26.04 LTS (WSL2), пользователь `ubuntu-26`,
|
||||
> репозиторий `~/projects/textmachine`. Результаты прогонов — в теле; всё, что не прогнано, названо
|
||||
> вслух в разделе «Чего этот стенд не проверяет».
|
||||
|
||||
## 1. Что ставится БЕЗ root, и где оно живёт
|
||||
|
||||
Схема одна для всех: дистрибутив разворачивается в `~/.local/opt/<инструмент>`, а исполняемое
|
||||
симлинкуется в `~/.local/bin` — он уже в `PATH` из `~/.profile` Ubuntu, поэтому rc-файлы править не
|
||||
надо. Каждый архив ставится ТОЛЬКО после сверки sha256 с подписью вендора.
|
||||
|
||||
| Инструмент | Кто требует и какой версии (носитель) | Как ставится |
|
||||
|---|---|---|
|
||||
| **Go** | `backend/Makefile` `GO_MIN_VERSION` и `platform/Makefile` `GO_MIN_VERSION` (у платформы выше — она сетевая, разбор — комментарий `toolchain` в `platform/go.mod`). Прочесть: `grep -h GO_MIN_VERSION backend/Makefile platform/Makefile` | тарбол с `go.dev/dl` → `~/.local/opt/go`, симлинки `go`/`gofmt`. ⚠ Брать ПОСЛЕДНИЙ ПАТЧ ПИНОВАННОГО МИНОРА, а не следующий минор: линтер пинован и его находки версионно-зависимы |
|
||||
| **golangci-lint** | `GOLANGCI_VERSION` в обоих Makefile, точным равенством (`tools-check` сверяет строку версии). Прочесть: `grep -h GOLANGCI_VERSION backend/Makefile platform/Makefile` | release-бинарь с GitHub → `~/.local/bin/golangci-lint`; чексуммы — `golangci-lint-<v>-checksums.txt` того же релиза |
|
||||
| **Node + npm** | `frontend/package.json` `engines.node`; менеджер — npm из поставки Node (`frontend/docs/STACK_DECISIONS.md` §1). Прочесть: `python3 -c "import json;print(json.load(open('frontend/package.json'))['engines'])"` | тарбол с `nodejs.org/dist` → `~/.local/opt/node`; чексуммы — `SHASUMS256.txt` того же каталога. ⚠ `frontend/.npmrc` ставит `engine-strict=true` — Node ниже пола это ОШИБКА установки, а не предупреждение |
|
||||
| **PostgreSQL** | `platform/README.md` (мажор) — рецепт целиком, включая порт и DSN, живёт в `platform/docs/STACK_DECISIONS.md` §«Postgres на стенде без root» | ровно по тому рецепту: micromamba + conda-forge в `~/.local/pgsql`, кластер в `~/.local/share/tmstand/pgdata`, сокет в `/tmp`. Рецепт ратифицирован зоной и sudo не требует |
|
||||
| **micromamba** | нужен только предыдущей строке | один статический бинарь; ⚠ на чистой Ubuntu 26 НЕТ `bzip2`, поэтому `tar -xjf` падает — архив распаковывается модулем `tarfile` питона (`bz2` в stdlib есть) |
|
||||
|
||||
## 2. Что БЕЗ root не ставится — и почему обход недопустим
|
||||
|
||||
| Пакет | Кто без него не работает | Почему нельзя обойти |
|
||||
|---|---|---|
|
||||
| **`build-essential`** (`gcc` + `make`) | `make test`/`make battery`/`make check` ОБЕИХ Go-зон | Обе цели гоняют `go test -race`, а `-race` требует cgo, то есть C-компилятора. Комментарий над целью в `backend/Makefile` говорит прямо: снять `-race` значит превратить отсутствие тулчейна в зелёный прогон, доказывающий меньше, чем он заявляет. `make` нужен и сам по себе: `platform` `TestTheToolchainGateComparesVersionsRatherThanMatchingThem` зовёт `make version-check` и без `make` СКИПАЕТСЯ |
|
||||
| **`python3-venv`** | вся зона `eval/` | В системном питоне Ubuntu 26 нет `ensurepip`, поэтому `python3 -m venv .venv` создаёт окружение БЕЗ pip. Ратифицированная зоной установка — `python3 -m venv .venv && .venv/bin/pip install -r requirements.txt` (`eval/README.md` п.5) — на этом и останавливается |
|
||||
|
||||
Ставится одной командой; она же — единственное, что в этом файле просит пароль:
|
||||
|
||||
```sh
|
||||
sudo apt-get update && sudo apt-get install -y build-essential python3-venv
|
||||
```
|
||||
|
||||
## 3. Порядок подъёма
|
||||
|
||||
1. **Go + golangci-lint** → `cd backend && make battery` (после шага 2 — `make battery-stand`).
|
||||
2. **Postgres** по рецепту зоны → `cd platform && TM_PLATFORM_TEST_DSN=<из рецепта> make check`.
|
||||
3. **Node** → `cd frontend && npm ci && npm run check`. ⚠ `npm ci` через `prepare` ставит
|
||||
pre-commit-диспетчер в `.git/hooks/` — **это единственный путь, которым включается гейт якорей
|
||||
доков** (`docs/scripts/githooks/pre-commit`). На клоне, где во фронте не ставили зависимости, гейт
|
||||
МОЛЧА выключен. Поставить его отдельно, без установки зависимостей:
|
||||
`node frontend/scripts/githooks/install.mjs`.
|
||||
4. **Python-окружение полигона** — по `eval/README.md` п.5.
|
||||
5. **Данные книг** — раздел 4 ниже.
|
||||
6. **Дев-стенд платформы целиком** (демон + сид через живой интейк + дев-прокси фронта) — рецепт в
|
||||
`platform/deploy/README.md` §«Дев-стенд». Он же — самая дешёвая сквозная проверка: сид гоняет
|
||||
движковый бинарь настоящим вызовом.
|
||||
|
||||
## 4. Каталог книг
|
||||
|
||||
Книги и производные лежат в **`<репозиторий>/books`** и версионируются ОТДЕЛЬНЫМ git-репозиторием
|
||||
(свой `origin`, свой лог); внешний репозиторий держит `books/` в `.gitignore` и о нём ничего не знает.
|
||||
Инвариант канона «книга и производные вне git» этим не нарушен — вне ЭТОГО git, — но следствия
|
||||
новые:
|
||||
|
||||
- `git clean -xdf` во внешнем репозитории снёс бы весь каталог вместе с его историей. `clean` и так
|
||||
запрещён каноном (`CLAUDE.md` §Гардрейлы); здесь у запрета появилась вторая цена.
|
||||
- `git status` внешнего репозитория НЕ показывает правки книг. Состояние книг читается только
|
||||
`git -C books status`.
|
||||
- ⚠ Прежний адрес каталога был `~/books`, и он захардкожен в трёх местах движка и в скриптах
|
||||
полигона. Диспозиция — строки бэклога; до их закрытия корпус-гейченные тесты движка запускаются с
|
||||
переопределениями (`TM_CHECKER_LABELS_DIR`, `TM_MINER_PARITY_{RECORDS,SEED}`), которые в коде уже
|
||||
предусмотрены.
|
||||
|
||||
## 5. Чего этот стенд не проверяет
|
||||
|
||||
Гейт обязан печатать, чего он не смотрит, — иначе его молчание читается как покрытие.
|
||||
|
||||
- **`-race` не гонялся ни в одной зоне** (нет C-тулчейна, раздел 2). Все зелёные прогоны ниже —
|
||||
БЕЗ детектора гонок, и это не «батарея прошла».
|
||||
- **`make` не гонялся** — цели исполнялись командами из самих Makefile. Расхождение цели и того, что
|
||||
запускали, этим не поймано.
|
||||
- **Ни одного платного вызова.** Всё зелёное — $0-пути: сборки, юнит-тесты, `tmctl manifest/status`,
|
||||
интейк платформы. `tmctl translate` не запускался.
|
||||
- **`TestMinerFullBookParity` СКИПАЕТСЯ на любом клоне**: ему нужен `eval/exp16/data/jieba_dict_general_zh.txt`,
|
||||
который в git не попадает (`.gitignore`) и пересобирается — носитель диспозиции — строка бэклога 123.
|
||||
- **Браузеры Playwright не скачаны** ⇒ `npm run check:full` (цели `shot`/`scenes`, оси axe) не гонялся;
|
||||
`npm run check` их не включает.
|
||||
- **Локальной модели нет:** ни `ollama`, ни GPU (`nvidia-smi` отсутствует). Замеры полигона, которым
|
||||
нужна локальная модель, на этой машине не воспроизводимы.
|
||||
- **OIDC-провайдера нет** — вход на стенде идёт дев-логином; боевой путь входа не проверялся.
|
||||
|
||||
## 6. Ловушки, подтверждённые на этой машине
|
||||
|
||||
- **`no_proxy=<local>` в окружении WSL — это Windows-синтаксис, и curl его не понимает.**
|
||||
`curl http://127.0.0.1:8080/healthz` отдаёт **403** от прокси, и это читается как дефект кода,
|
||||
которого нет. Лечится по месту: `curl --noproxy '*'` (так и записано в
|
||||
`platform/docs/STACK_DECISIONS.md` §«Грабли стенда») или `NO_PROXY=127.0.0.1,localhost,::1`.
|
||||
⚠ **Go-бинари проекта эта грабля НЕ задевает, и не потому, что понимают `<local>`:** пробой
|
||||
`http.ProxyFromEnvironment` показано, что loopback не проксируется и при `no_proxy=""` вовсе —
|
||||
это встроенное правило, а не заслуга переменной. Значит симптом асимметричен: ручная проверка
|
||||
curl'ом краснеет там, где сам сервис зелёный.
|
||||
- **`tmctl` берёт глагол ПЕРВЫМ аргументом, флаги после**: `tmctl manifest --config book.yaml`.
|
||||
Обратный порядок печатает `--config book.yaml is required` — сообщение выглядит как «флаг не
|
||||
передан», хотя флаг передан.
|
||||
- **`tmplatformctl seed` требует и `TM_PLATFORM_DSN`, и `TM_PLATFORM_DEV_LOGIN`** в СВОЁМ окружении,
|
||||
а не только в окружении демона: он ходит и в базу, и в HTTP.
|
||||
- **Шаблон книги для платформы (`TM_PLATFORM_BOOK_TEMPLATE`) обязан нести АБСОЛЮТНЫЕ пути** к
|
||||
`pipeline:`/`models:`. `backend/example/book.yaml` годится как заготовка, но его относительные
|
||||
`../configs/...` из каталога книги платформы не разрешаются.
|
||||
Loading…
Add table
Reference in a new issue