From e6147d5aa412183d348ec154a7c6599e6d32f177 Mon Sep 17 00:00:00 2001 From: heaven Date: Tue, 4 Aug 2026 03:04:15 +0300 Subject: [PATCH] Ratify D39.98: frontend S2 review and fix-pack landed, commit rights revert to orchestrator only across all carriers, decision-log in-place rewrite flagged for owner confirmation --- CLAUDE.md | 8 ++++---- docs/PROGRESS.md | 15 +++++++++++---- docs/architecture/05-decisions-log.md | 24 +++++++++++++++++------- platform/README.md | 16 ++++++---------- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 14b4e005..4fd55959 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,8 +18,8 @@ Go-бэкенд издательского художественного пер | **Бэкенд** | `backend/` | нет — лендит оркестратор | читать можно; расхождения — пингом оркестратору в `docs/PROGRESS.md` | | **Полигон (eval)** | `eval/` + `docs/experiments/` | только пре-рег фризы | то же | | **Оркестратор** | `docs/` (architecture/research/PROGRESS) + корневые онбординг-доки, ревью чужого кода read-only | да | ратифицирует решения, пишет хендофф-промты | -| **Фронт** | `frontend/` | **ДА — только свою зону** (D39.88) | то же; продуктовые требования — `docs/product-requirements.md`, НЕ из памяти | -| **Платформа** | `platform/` (SaaS control plane: пользователи/квоты/очередь/HTTP; движок дёргает процессами, D39.81) | **ДА — только свою зону** (D39.88) | то же | +| **Фронт** | `frontend/` | нет — лендит оркестратор | то же; продуктовые требования — `docs/product-requirements.md`, НЕ из памяти | +| **Платформа** | `platform/` (SaaS control plane: пользователи/квоты/очередь/HTTP; движок дёргает процессами, D39.81) | нет — лендит оркестратор | то же | Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное. @@ -42,8 +42,8 @@ Go-бэкенд издательского художественного пер - Дисциплина: не верь заголовкам — грунтуй выводы `file:line`/цитатой; спорное верифицируй адверсариально (author≠reviewer); эмпирика на PD-классике из претрейна считается предварительной до вебновелл-среза. - **Общность движка (владелец 24.07):** Go-логика НЕ ветвится по паре/книге; пара-данные → `internal/lang`+`configs/langpacks/`, книго-каноны → сид/brief (данные); книжный термин в общем пар-слое = утечка. Тест-данные пары легитимны. Норматив (только больные места): `docs/architecture/12-go-style-notes.md`. Ревью-вопрос по умолчанию: «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?» - **Мандат самопроверки в промтах сессий (обязателен, решение владельца 12.07):** промты полигон-сессий — и вообще любых пишущих код / запросы к моделям — ДОЛЖНЫ явно требовать ревью ИСПОЛНЕНИЕМ: своего кода + сформированных запросов к моделям + полученных результатов. Полигон регулярно ошибается/багует, и это искажает эксперименты (D37: заявленные «0 ошибок» = 36 ошибок+биллинг, «13 катастроф» = ~5–6 при оверфлаге судьи; exp13 +10% бюджета). Бэкенд-промты — явный бэкенд-ревью после кода (обычно отрабатывает по опыту, но требовать явно). Пост-хок адверсариальная верификация оркестратора при лендинге — второй рубеж, НЕ замена самопроверки. -- **Git-координация мультисессий (решение владельца 02.08, D39.88 — «свою часть пусть коммитит, чужую не трогает НИКОГДА»):** - - **Коммить только пути СВОЕЙ зоны.** Право коммита есть у оркестратора и у зонных сессий фронта/платформы (в своей зоне); бэкенд и полигон по-прежнему не коммитят — лендит оркестратор (исключение: пре-рег фризы полигона). +- **Git-координация мультисессий:** + - **Коммитит только оркестратор.** Сессии зон — бэкенд, полигон, фронт, платформа — не коммитят: своё дерево готовят и передают на лендинг (исключение прежнее: пре-рег фризы полигона). Чужую зону не трогает НИКТО. - **Форма коммита — ТОЛЬКО с явным списком путей: `git commit -- <путь> <путь>`.** Причина механическая и это корень обоих инцидентов 02.08: голый `git commit` уносит **ВЕСЬ индекс**, включая чужие застейдженные файлы, и чужая работа уезжает под твоим сообщением. Pathspec-форма индекс не трогает. - **НИКОГДА `git add -A` / `git add .` / `git commit -a`** — только явные пути. - **Перед каждым коммитом:** `git status` (опознать ЧУЖОЕ) и `git diff --cached --name-only`. Увидел в индексе путь вне своей зоны — **не коммить его и не «прибирать»**: снимай не чужое из индекса, а свою задачу — коммить pathspec-формой. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index c52fdd55..92c2c1b9 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,7 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-04, голова D39.97). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-04, голова D39.98). +> - **ФРОНТ S2 + ДОФИКС ПО РЕВЬЮ ПРИНЯТЫ И ЗАЛЕНДЕНЫ (D39.98, 04.08: `ece94ef` сессией по старому канону + `02872b6` лендинг оркестратора).** Git-канон v2 разнесён по носителям: коммитит ТОЛЬКО оркестратор (владелец 04.08, supersede D39.88 — запись в D39.98 п.3; ⚠ там же процедурная нота о подчистке тел D-лога). **В дереве НЕТРЕКНУТЫЕ артефакты банк-арбитража** (`docs/research/24-bank-arbitration.md` · `eval/bank_arbitration/`) — ждут отдельной приёмки (строка 5). **Открыто на владельце (+D39.98 п.4):** confirm двух «решений 04.08» из журнала фронта · авторство подчистки D-лога. > - **ПАК СТАНДАРТОВ + ДОФИКС ARCHGUARD ПРИНЯТЫ И ЗАЛЕНДЕНЫ (D39.96/97, 03–04.08; семь pathspec-коммитов `e8d4ac0`…`0e64efe`). Строки 107/112/117 ЗАКРЫТЫ.** Репо на стандартах: `.golangci.yml` 0 issues · `make battery` = единая точка входа · типовые анализаторы archguard (38 посадок, 9/9 мутаций, семь осознанных пропусков — 121(д)) · x/net 0.57 (живая проба PASS 3/3, `reasoning_content` подтверждён на проводе, $0.0053) · пять шиппинг-конфигов на `low`. **Задачи №12:** (1) выдать промт пака экрана 46 — D39.94 п.3 (фикстура 113 первой; денежный шаг ТОЛЬКО с подписью владельца); (2) малый пак tools/go.mod — решение принято D39.97 п.4 (строка 118). **ОТКРЫТО НА ВЛАДЕЛЬЦЕ:** 116 (порог «≥4/5 при N=5» подан) · строка 5 (находки прерванного банк-ресёрча или пере-запуск; промт подрезать до $1.20) · мини-проба 44 «low+16k» (~$0.05) · подпись денежного шага 46. **Вахта:** маппинг эффорта `deepseek-v4-pro` «early August 2026» (реестр 108, триггер >05.08 — БЛИЗКО). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** > - **Сделано (сводно; детали — D-лог и архив-слайсы):** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 11–16) ✅ · паки 17 «канал B» · 18 «долги» · 19 «голос/состояние» · 20 «банк+терминолог» ✅ (D39.26–28/31/41–56) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка 0.918/0.980, банк приходит переведённым) приняты · полигон-пакеты 5–8, ToS-речек (D39.57), Р6+P4 (D39.61) закрыты · **карта языковой привязки движка (D39.60): 149 сайтов/45 файлов, книго-ось чиста (4), ja→ru безопасно без правки Go, en→ru — нет** · Р1–Р4 закрыты целиком (D39.63: Р2 = ЗНАЧЕНИЕ, Р4 = норма потолка recall) · **ФАЗА 2 ОБЩНОСТИ ✅ (D39.64: П0 эмбед-хеш · П1 цель-шов · П2 скрипт-шов, ko-баг закрыт · П3 нарезка · П4 манифест-по-каналам; голден вердикт-нейтрален 0/172, майнер-парити EXACT)** · жанровый словарь отменён как класс (D39.47) · петля ремонта построена и НЕ включена (D39.38). > - **Курс (D39.59–78): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (D39.69/75/77) → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.78: строка 25 целиком; харнесс labels В GIT 12/12; K2 r0.85 · K4b r0.22 · K6 fp 14→6; Р2 hard/soft + Р4-потолки в контрактах).** **Текущее: МЕЛКАЯ ПАЧКА ✅ ПРИНЯТА И ЗАЛЕНДЕНА (D39.82: строки 89/53/83 закрыты · 93 сужена до остатков · F4-бэкап+pre-flight построен · register/жанр → книжный слой · DC7 пере-гейчен сид-покрытием → строка 98); решения §6 исполнены (D39.79/82); **РЕ-ПРОБА + ОТЛАДОЧНЫЙ ХОЛОДНЫЙ ПРОГОН coldrun-b САНКЦИОНИРОВАНЫ (D39.83: промт выдан и холодно аудирован — 3 major вправлены; потолки $0.15 ре-проба / $5 прогон; ступени 2+8 глав, автобанк по D39.77)**; ре-проба flash (строка 74) — по слову владельца; finding-1 ЗАКРЫТ (D39.77); онбординг-оверхол доков исполнен (D39.80); **ФРОНТ ОТКРЫТ владельцем (D39.81: продукт = SaaS; зоны `frontend/` + `platform/` живые, фронт работает на моках; движковая очередь НЕ пере-упорядочена — ранняя вставка одна: строка 95 «контракт API» $0; строки 96/97 и перевесы 49/94 заведены)**; **СТЕК ФРОНТА/ПЛАТФОРМЫ ЗАПИНЕН, 8 решений владельца ратифицированы (D39.84: SEO Google-only · PWA-первый · денег в MVP-UI нет · стоп-на-банке = параметр запуска, `--verify-bank` готов · перевод НИКОГДА на индексируемый URL = ПТ-34 · якорь чтения = edit-unit, ПТ-21; работы движка под фронт = строки 99–102; фронт/платформа ведут ЗОННЫЕ бэклоги — `frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`, строки 96/97 → П-1/П-2; зоны залендены, фронт-промт S0–S7 в `frontend/docs/`)**; **ШОВ ДВИЖОК↔ПЛАТФОРМА РАТИФИЦИРОВАН ПО РЕСЁРЧУ (D39.85, `research/23`): NDJSON-поток событий → материализация в Postgres → SSE; артефакты границ стадий; анти-паттерны запрещены (живой SQLite не читать · HTTP в движок не тащить · read-пакет из ядра не выносить); строка 103 заведена, входы контракта 95 зафиксированы)**.** **coldrun-b ПРИНЯТ И ЗАЛЕНДЕН (D39.86): фазы A/B исполнены за $0.114378 из $0.15, фаза C заморожена чекпойнтом — легитимный исход по D39.83.** Блокер 0731 воспроизведён на боевой форме (0 из 9 пригодных при `max_tokens=8496`); **вариант (а) флор-16000 ФАЛЬСИФИЦИРОВАН** (4/5 пустых при 16992, добавка уходит в размышление); **(б) `reasoning_effort:"low"` оживляет волну, но требует правки Go** (у бэнк-ролей ручки нет — НОВАЯ строка 104; посылка об амендменте гейта неверна только для СТАДИЙНОЙ ручки); **(в′) thinking OFF замерен карантинно — эхо-мина ЖИВА на весах 0731 (4/20)**, флаг `echoes_when_thinking_off` сохраняет основание; **(г) pro ≈×8.9, а не ×3.1**, и на pro ручка эффорта не работает (вендор `low→high`, смена маппинга объявлена «early August 2026»). Порог классификатора **6/6 взят**; две дыры наблюдаемости закрыты; live-риг не собирался с D39.64 — починен. НОВЫЕ строки **104** (ручки синтетических стадий) и **105** (мис-вердикт классификатора + честность поверхностей); **46** повышена до «скоро» с живым носителем; **16 НЕ закрыта**. ✅ **РАЗВИЛКА 74 РЕШЕНА ВЛАДЕЛЬЦЕМ (D39.87): вариант (б)** — `reasoning_effort: "low"` черновику ПЛЮС правка Go, дающая ручку эффорта ролям, у которых её нет (строка 104), ПЛЮС экран целевого языка (строка 46). Мандат владельца на исполнение — «элегантно встроить в текущее решение по коду, чтоб было чисто»: правка обязана быть использованием СУЩЕСТВУЮЩЕГО поля `Stage.Reasoning`, одним швом на все три рукописные `config.Stage`, так чтобы четвёртое такое место не могло появиться молча. **Пак ИСПОЛНЕН И ПРИНЯТ (D39.91, код `553f1a3`; промт заархивирован)** — работы A+проба зелёные, работа B стала паком экрана 46 (дизайн заморожен D39.92 п.1+D39.93), прогон C не стартовал ⇒ строка 16 ЖИВА и оси голоса 13б по-прежнему без данных. Пак стандартов (`BACKEND_REPO_STANDARDS_SESSION_PROMPT.md`, D39.92) исполнен — приёмка и гейты лендинга в верхнем буллете (D39.96). Перекупок нет (D39.63). @@ -128,7 +129,11 @@ | 124 | **Калибровка снапшота (вопрос владельца 04.08, разбор D39.97 п.5): нацеленность, не агрессивность.** Три оси одним дизайн-паком: (а) недо-чувствительность — вердикт-несущие вызовы x/text не свёрнуты (вход: строка 119); (б) пере-охват — `EmbeddedVersion` фолдит все пары разом → пер-парный хеш (родня 115/120); (в) дешёвая перекупка: `tmctl resnapshot --dry-run` — байт-сверка тел по чекпойнтам (`msgsContentHash`), идентичные юниты пере-привязываются без пере-вызова, платятся только изменившиеся. «Поведенческий отпечаток вместо строки версии» отложен (пол ≠ доказательство) | бэкенд | когда-нибудь (перед МАСШТАБОМ — когда перекупки станут реальными деньгами) | дизайн-пак по D39.97 п.5 | D39.97 | -## Оркестратор №12 — приёмка дофикса, лендинг всего пака, ответы владельцу (D39.97), 04.08 +## Оркестратор №12 — ревью фронта S2, приёмка дофикса и лендинг `02872b6`, git-канон v2 по носителям (D39.98), 04.08 + +Приёмка S2 — адверсариальный воркфлоу (5 линз × скептики с ре-раном): батарея и виртуализация подтверждены исполнением, стек без дрифта, три дефекта (пар-слепой шрифтовой токен · выдуманный тип `org` с фабрикованной цитатой журнала · ключ рядов банка без учёта полисемии) вправлены дофиксом и залендены; три находки ревьюеров опровергнуты скептиками. Детали и остаточное — D39.98. + + Дофикс archguard + проба приняты короткой приёмкой исполнением (батарея EXIT=0 · деньги дельта $0.000000 · две СВОИ посадки вне карты отчёта, включая method expression — форма отсутствовала и в таблице, и в пропусках, поймана; негативный контроль чист). CONFIRM владельца по `@latest` записан входом приёмки. Весь пак заленден семью pathspec-коммитами (`e8d4ac0` конфиги · `5a97020` дефект-фиксы · `b155da3` механика · `cb368c0` бамп · `6356471` анализаторы · `5a81bff` линт-инфра · `0e64efe` live-проба); фронт коммитил параллельно (`ece94ef`) — pathspec исключил коллизию. Строки 107/112/117 закрыты; оба промта архивированы. Решения: tools/go.mod — строить (118, D39.97 п.4); вопрос владельца о снапшоте разобран — калибровка нацеленности вместо ослабления, три оси одним дизайн-паком (новая строка 124: недо-чувствительность 119 · пер-парный EmbeddedVersion · дешёвая перекупка байт-сверкой). Хвост `httpllm.go:77` → 122. @@ -160,7 +165,7 @@ Приёмка первой задачи хендоффа №9→№10. **Пере-проверено исполнением, а не чтением:** батарея независимо зелёная (build/vet/`vet -tags live` · `-race -count=1` все пакеты ok · парити EXACT · labels 5/5 фрозен · голден PASS · 5 новых тестов PASS); **деньги пере-выведены мной из сырья** (`sqlite3` read-only, пересчёт провайдерских `usage` по вендор-ценам мимо `ledger.CostUSD`): леджер **$0.114378** ≡ Σ чекпойнтов во всех ЧЕТЫРЁХ проектах до 6-го знака, независимый путь **$0.099267**, разница **$0.015111** = 3 декод-фейла (строка 78 живьём); все несущие счётчики пере-выведены из `chunk_status`/`request_log` и сошлись; строка `BANKNOTE` на боевой БД coldrun-a независимо воспроизвела `lines=182 over 18/20 · parse-fail 3` при неизменном sha256 БД. Плюс **9-осевой refute-воркфлоу** (скептик + независимый арбитр на каждую ось): 6 CONFIRMED, 2 PARTIALLY, 0 REFUTED. **Отчёт принят; тело не переписано, все поправки — в ревю-шапке** (10 пунктов). Несущие поправки: посылка об амендменте гейта неверна ТОЛЬКО для стадийной ручки, для бэнк-ролей ЖИВА ⇒ (б) = правка Go · «нет пути восстановления вообще» слишком сильно (ре-ген вылечил 1/5), НО **вылечил не бюджет — победивший вызов уложился НИЖЕ базового потолка** ⇒ лечит стохастика, а не потолок · волна (б) = **$0.028195**, не $0.0257 · вариант (г) ≈**×8.9**, не ×3.1 · Д1 недооценён (санитайзер условен тройкой, и `TargetActive()` только для ru ⇒ **для не-русской цели рубежа нет вовсе**; худший исход — тихо отгруженный релейный перевод zh→en→ru) · Д2 назван на 2/3 (третий шов `repair.go:384` с доккомментом, декларирующим фальсифицированную посылку) · строка `VOICE` говорит «сконфигурирован», а не «отработал» ⇒ **13б без данных**. **Вендор-факты, которых в отчёте не было** (пере-сняты мной, HTTP 200): дефолт эффорта = `high`; маппинг per-модельный — у pro **`low→high`** (рычага нет), и вендор объявил смену маппинга pro «early August 2026». `experiments/00-provider-quirks.md` обновлён (п.3а и п.10; отозван хвост «движок эту ручку слать не может» — может). **Ратифицирована норма прецедента:** ратифицированный гардрейл можно ПРОБОВАТЬ только карантином (копия конфига вне git, боевой файл и гейт не тронуты, вопрос релеем владельца), и результат = ЗАМЕР, не разрешение шипить. **НА ВЛАДЕЛЬЦЕ: развилка строки 74** — платных прогонов до его слова нет. — **РАЗВИЛКА РЕШЕНА тем же днём (D39.87): вариант (б); промт выдан после 4-линзового холодного аудита с независимым арбитражем (3 блокера + 15 major вправлены ДО выдачи).** -✅ **ИНЦИДЕНТ КООРДИНАЦИИ ЗАКРЫТ РЕШЕНИЕМ ВЛАДЕЛЬЦА (D39.88): фронт и платформа коммитят СВОЮ зону, чужое не трогают НИКОГДА; git-протокол переведён в механику (pathspec-коммит) и вписан в `CLAUDE.md`, промт фронта и `platform/README.md`. ⚠ Фронт-сессия ЖИВАЯ — правило доедет только РЕЛЕЕМ владельца.** Хроника: Фронт-сессия ЖИВАЯ и коммитит в `main` сама, хотя по D39.84 п.8 право коммита фронту ещё НЕ выдано («до слова владельца действует «сессии не коммитят»»). **Дважды** её коммиты (`e9a6bb2`, `b98afb5`) унесли мою застейдженную работу под своим сообщением — общий индекс, ровно класс инцидента 77dd9b8: в `e9a6bb2` уехал `git mv` архивации промта, в `b98afb5` — все четыре дока лендинга D39.87. **Содержимое цело и проверено** (`git show HEAD:` по каждому файлу), потеряна только атрибуция коммитов; history-rewrite не делаю — запрещён при живых параллельных сессиях. Смягчение с моей стороны: стейдж и коммит одной атомарной командой. **Владельцу:** решить вопрос коммит-прав фронта (D39.84 п.8) — либо выдать право с пост-хок ревью, либо потребовать «не коммитить», иначе инцидент повторится; альтернатива — развести сессии по веткам. +✅ **ИНЦИДЕНТ КООРДИНАЦИИ ЗАКРЫТ (D39.88): git-протокол переведён в механику (pathspec-коммит, чужую зону не трогает никто) и вписан в `CLAUDE.md`, промт фронта и `platform/README.md`.** Хроника: **дважды** коммиты фронт-сессии (`e9a6bb2`, `b98afb5`) унесли мою застейдженную работу под своим сообщением — общий индекс, ровно класс инцидента 77dd9b8: в `e9a6bb2` уехал `git mv` архивации промта, в `b98afb5` — все четыре дока лендинга D39.87. **Содержимое цело и проверено** (`git show HEAD:` по каждому файлу), потеряна только атрибуция коммитов; history-rewrite не делаю — запрещён при живых параллельных сессиях. Смягчение с моей стороны: стейдж и коммит одной атомарной командой. ## Оркестратор №9 — ШОВ ДВИЖОК↔ПЛАТФОРМА: РЕСЁРЧ ЗАПИСАН, НАПРАВЛЕНИЕ РАТИФИЦИРОВАНО (D39.85), 02.08 @@ -168,7 +173,7 @@ ## Оркестратор №9 — СТЕК ФРОНТА/ПЛАТФОРМЫ ПРИНЯТ И ЗАЛЕНДЕН, ВОСЕМЬ РЕШЕНИЙ ВЛАДЕЛЬЦА РАТИФИЦИРОВАНЫ (D39.84), 02.08 -По релею отчёта фронт-сессии (стек-исследование закрыто: 15 агентов, артефакты `frontend/docs/STACK_DECISIONS.md` + `FRONTEND_SESSION_PROMPT.md` S0–S7). Приёмка: 10-агентный refute-воркфлоу — все несущие бэкенд-утверждения записки CONFIRMED по коду, 8/8 веб-пинов подтверждены первоисточниками; 4 уточнения точности (гранулярность draft-only · кап 20 = stdout-only · «4276» не выводится из артефактов — принято как замер · якорь export.go = internal/pipeline). Ратифицированы 8 решений владельца (SEO Google-only · выравнивание по единицам экспорта, `--pairs` готов · подсветка блок/глава без спанов · стоп-на-банке = параметр запуска, `--verify-bank` готов · денег в MVP-UI нет · PWA-первый · вид = замеры референса · одна сессия кука/Bearer) + ПТ-34 (перевод НИКОГДА на индексируемом URL) + переформулировка ПТ-21 (якорь = edit-unit, не чанк). Работы движка = НОВЫЕ строки 99–102 (пофазный прогресс · манифест глав/чанков · машиночитаемая таблица подписи · внешний trace-контекст), все проверены кодом. Противоречие «демон в backend» разрешено сессией верно — D39.81 удержан. Две ловушки подтверждены и заведены входами дизайна (строка 95 и П-1: подпись ≠ UPDATE; read-путь не мигрирует схему). Зоны `frontend/`+`platform/` залендены. **Зонные бэклоги (решение владельца при лендинге):** фронт и платформа ведут свои — `frontend/docs/BACKLOG.md` (Ф-1..Ф-6) · `platform/BACKLOG.md` (П-1..П-4, туда переехали строки 96/97); единый бэклог фронт/платформа-строк больше не принимает. ⚠ Норма-вопрос владельцу: промт S0 велит фронт-сессии коммитить самой — против «сессии не коммитят»; рекомендация — право коммита фронту В СВОЕЙ зоне, пост-хок ревью; до слова владельца действует старая норма. +По релею отчёта фронт-сессии (стек-исследование закрыто: 15 агентов, артефакты `frontend/docs/STACK_DECISIONS.md` + `FRONTEND_SESSION_PROMPT.md` S0–S7). Приёмка: 10-агентный refute-воркфлоу — все несущие бэкенд-утверждения записки CONFIRMED по коду, 8/8 веб-пинов подтверждены первоисточниками; 4 уточнения точности (гранулярность draft-only · кап 20 = stdout-only · «4276» не выводится из артефактов — принято как замер · якорь export.go = internal/pipeline). Ратифицированы 8 решений владельца (SEO Google-only · выравнивание по единицам экспорта, `--pairs` готов · подсветка блок/глава без спанов · стоп-на-банке = параметр запуска, `--verify-bank` готов · денег в MVP-UI нет · PWA-первый · вид = замеры референса · одна сессия кука/Bearer) + ПТ-34 (перевод НИКОГДА на индексируемом URL) + переформулировка ПТ-21 (якорь = edit-unit, не чанк). Работы движка = НОВЫЕ строки 99–102 (пофазный прогресс · манифест глав/чанков · машиночитаемая таблица подписи · внешний trace-контекст), все проверены кодом. Противоречие «демон в backend» разрешено сессией верно — D39.81 удержан. Две ловушки подтверждены и заведены входами дизайна (строка 95 и П-1: подпись ≠ UPDATE; read-путь не мигрирует схему). Зоны `frontend/`+`platform/` залендены. **Зонные бэклоги (решение владельца при лендинге):** фронт и платформа ведут свои — `frontend/docs/BACKLOG.md` (Ф-1..Ф-6) · `platform/BACKLOG.md` (П-1..П-4, туда переехали строки 96/97); единый бэклог фронт/платформа-строк больше не принимает. ## Оркестратор №9 — РЕ-ПРОБА И ОТЛАДОЧНЫЙ ХОЛОДНЫЙ ПРОГОН САНКЦИОНИРОВАНЫ, ПРОМТ ВЫДАН (D39.83), 02.08 @@ -297,6 +302,8 @@ Q1 = П1 цель-шов санкционирован («главное бэке ## Полигон +**Арбитраж банка (строка 5, пере-запуск промта D39.89 по слову владельца, потолок $1.00) — ИСПОЛНЕН, отчёт `docs/research/24-bank-arbitration.md`, потрачено $0.0896 (04.08).** Главное: (1) голд 53 approved сида → 45 в BANK-FULL, из них у 27 промахов прод-банка верный dst лежал в вариантах черновиков лишь у 5 ⇒ **потолок любого «выбора из вариантов» = 17/45, селекционный арбитраж закрыт классом**; (2) свежий терминолог-соло (flash-low) бьёт бесплатный базис §C2-3 **+8/−0**, а **равноправный консилиум НЕ окупается**: +3 к само-согласованности = одна конвенция 古月; лучший одиночка glm-5 25/45 > лучший совет 23/45; добавление grok РОНЯЕТ совет 23→20; C3conf(взвешенный уверенностью) ≡ C3; ⟦TM-NO-DST⟧ = 0 на 35 вызовах трёх семейств; (3) **вербализованная ЧИСЛОВАЯ уверенность разделяет внутри модели** (AUC 0.77–0.85, слова хуже 0.63) при тотальной overconfidence (~88 при точности ~50%) — жить ей ordinal-очередью ревью, не арбитром; (4) **химера семьи 古月 воспроизведена причинно на границе батча** (свежий deepseek: «Гу Юэ» ровно в батче 2, «Гуюэ» ровно в батче 0), а по-терминная МАРШРУТИЗАЦИЯ (улики-первым) сама создала химеру 转-серии ⇒ единица арбитража/роутинга — кластер; DetectSeries разнодлинные семьи (古月×15, 蛊×14) не видит; (5) **проба инжекта: инъекция поднимает следование канону 43%→95%, НЕВЕРНАЯ строка законом принимается 6/6, с маркером ⟨проверить⟩ — тоже 6/6 (Δ=0 п.п.): пометка на транслятор-проводе поведенчески пуста**, цена неверной строки банка = ~100% заражение; (6) индустриальный обзор: стандарта арбитража термов не существует, наш дизайн впереди ближайшего аналога (DelTA first-wins); пропущенных стандартов нет. Рекомендации тремя корзинами в §D (строить: кластер-канал семей · intra-run CanonConflicts · наблюдаемость Signals/invented/conf · нормализованный голос foldVariants; закрыть: равноправный совет · кросс-модельные веса · self-consistency · селекция · отказ-сигнал). 4 вопроса владельцу в отчёте (мини-голд алиасов · конвенция составных фамилий · проба редакторского провода · фикс-пак корзины 1). Два адверсариальных раунда author≠reviewer пройдены. Сырьё durable `~/books/gu-zhenren/bank-arbitration/` (59 json), харнесс `eval/bank_arbitration/`. НЕ закоммичено — лендит оркестратор. + **Сырьё арки банка + пробы фиксов (01.08) — приняты и залендены, детали в журнале выше (D39.65).** *(Закрытые записи 26.07 — пакет-6 «размеченный набор» (D39.39) и пакет-8 «три пре-замера» (D39.43–46/50/52) — в [archive/PROGRESS-2026-07-25-31.md](archive/PROGRESS-2026-07-25-31.md); пакеты Р6+P4 и ToS — журнал выше (D39.57/61).)* diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 55a54848..b1131e01 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.97 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.98 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто: > ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`. @@ -1254,7 +1254,7 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу ## D39.84 — Стек фронта/платформы запинен, восемь решений владельца ратифицированы, работы движка под фронт получили строки, перевод не индексируется (02.08) -По релею отчёта фронт-сессии (исследование стека закрыто: 15 агентов — 7 направлений × независимые скептики-опровергатели + синтез, версии сверены с вебом 02.08, blocker/major-поправки скептиков записаны исправленными вариантами; артефакты `frontend/docs/STACK_DECISIONS.md` и переписанный `frontend/docs/FRONTEND_SESSION_PROMPT.md` — фронт режется на этапы S0–S7, первая кодовая сессия кончается витриной токенов). Приёмка оркестратора: 10-агентный refute-воркфлоу — ВСЕ несущие бэкенд-утверждения записки CONFIRMED по коду, 8/8 веб-пинов подтверждены первоисточниками (TS7 GA 08.07.2026 БЕЗ программного API до 7.1 → TS 6.0.3 · Vite 8 = Rolldown · Fleet закрыт 22.12.2025 · react-resizable-panels v4 Group/Separator · react-router 8.3 Node≥22.22 — стенд 22.22.3 проходит). **(1) Восемь решений владельца:** рынок глобальный, SEO только Google (Яндекс снят) · выравнивание колонок грубое по единицам экспорта — механизм ГОТОВ (`tmctl export --pairs`, побайтное выравнивание по edit-unit, `internal/pipeline/export.go:89-93`; уточнение приёмки: draft-only-пайплайн шипит по чанкам, для штатного edit-пайплайна утверждение точно) · подсветка сомнительных мест только блок/глава, внутритекстовые спаны НЕ строятся (у $0-гейтов нет байтовых смещений) · остановка на подписи банка = параметр запуска per-run — ГОТОВО (`--verify-bank`, exit 3, `invocation.go:108`/`main.go:39-46`; галочка формы = передача флага, движок не трогается; в draft-only не останавливает — `mining.go:193-197`) · оплат в MVP нет, денежных полей в UI нет вовсе (расход остаётся телеметрией владельца; потолки/rebill-согласие движка канон §5 не трогает) · десктоп = устанавливаемое PWA первым шагом, Tauri по явным триггерам · макет-инструменты не используются, источник вида = пиксель-замеры референса (Fleet невоспроизводим — растровое совпадение не критерий готовности) · аутентификация: ОДНА серверная сессия, предъявление кукой (браузер) или Bearer (десктоп/CLI), principal только в middleware — вход дизайна П-1 платформенного бэклога. **(2) ПТ-34, продуктовый запрет:** ни один символ пользовательского перевода никогда не попадает на публично индексируемый URL — ни витрин, ни «поделиться», ни публичных ссылок чтения (авторское право + политика Google по масштабируемому машин-контенту бьют по всему домену); носитель — двухконтурный деплой (SPA `app.<домен>` целиком под noindex + статический публичный контур, STACK_DECISIONS §4). **(3) ПТ-21 переформулировано:** якорь чтения = edit-unit экспорта, НЕ «чанк пайплайна» — финальный текст существует только на уровне юнита (~1.9 юнита/главу по замеру фронта; «4276 юнитов» из артефактов репо не выводится — полнокнижной БД не существует, что само подтверждает тезис о ре-ингесте; принято как замер сессии, порядок величин сходится с coldrun-a); читалка обязана жить с «глава = один блок». **(4) Работы движка → строки 99–102** (каждая проверена кодом): 99 пофазный прогресс draft N/M ∥ edit N/M (done = все draft-строки членов + edit-строка, `status.go:328-331/365` — индикатор 0% ВСЮ черновую волну; `chunk_status` уже несёт гранулярность — выводимо без миграции схемы) · 100 персист манифеста глав/чанков + хеш источника (каждый read-вызов заново ингестит и режет исходник — `status.go:177-195`, redrive дважды за вызов; замер фронта 1.42–1.51 с CPU/23 МБ; `chunker_version` уже в снапшоте — `pipeline/render.go:53`) · 101 машиночитаемая таблица подписи банка (кап 20 = только stdout `render.go:98`; полная таблица — текстовый сайдкар `.bank-stop.txt`; JSON нет нигде) · 102 внешний trace-контекст в tmctl (TraceID минтится заново каждым вызовом — `main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` персистится). **(5) Противоречие разрешено ВЕРНО:** рекомендация интеграционного агента «долгоживущий демон в backend» отвергнута самой сессией по D39.81 — ратификация удержана, HTTP/SSE/очередь в `platform/`. **(6) Две ловушки эксплуатации подтверждены и заведены входами дизайна (строка 95 · П-1):** подпись термина ≠ UPDATE строки — банк пересобирается каждым прогоном (seedGlossary REPLACES + ReplaceBank DELETE/re-INSERT, `seeding.go:18/110`, `glossary.go:158-162`; контракт подписи пишет в файлы-источники: mined-delta/сид; след затирания — только журнальная строка glossary_revisions, без предупреждения) · порядок деплоя платформы: read-путь схему НЕ мигрирует никогда (`store.go:135-143`, «schema vN … expects vM» в обе стороны; чинит write-команда, годится и `redrive --dry-run`; `tmctl backup` НЕ мигрирует). **(7) Норма зонных бэклогов (решение владельца при лендинге):** фронт и платформа держат СВОИ бэклоги в своих зонах — `frontend/docs/BACKLOG.md` (Ф-1..Ф-6) · `platform/BACKLOG.md` (П-1..П-4); засеяны оркестратором при лендинге переносом уже записанных отложенных решений, дальше ведут зоны; ЕДИНЫЙ бэклог PROGRESS фронт/платформа-строк НЕ принимает — остаётся трекером движка/полигона/доков; движковые стыки фронта (зона «бэкенд») живут в едином (строки 99–102); строки 96/97 переехали в платформенный (П-1/П-2) с ID-надгробиями-указателями (ID стабильны навсегда — внешние ссылки не рвутся). **(8) Лендинг зон** `frontend/` + `platform/` + `.gitignore` (`frontend/references/` — скриншоты вне git, пины замеров сохранены в доках). ⚠ Норма-вопрос ВЛАДЕЛЬЦУ: промт S0 велит фронт-сессии «заленди отдельным коммитом» — против нормы «сессии не коммитят» (ORCHESTRATOR_SESSION_PROMPT §роль; прецедент исключения есть — пре-рег фризы полигона); рекомендация оркестратора: дать фронт-сессиям право коммита В СВОЕЙ зоне (изолирована от движка/голдена; шесть сессий визуальных итераций через релей-приёмку каждой = трение без выигрыша), пост-хок ревью оркестратора; до слова владельца действует старая норма, промт фронта не правился (чужая зона) (02.08.2026, оркестратор №9). ✅ +По релею отчёта фронт-сессии (исследование стека закрыто: 15 агентов — 7 направлений × независимые скептики-опровергатели + синтез, версии сверены с вебом 02.08, blocker/major-поправки скептиков записаны исправленными вариантами; артефакты `frontend/docs/STACK_DECISIONS.md` и переписанный `frontend/docs/FRONTEND_SESSION_PROMPT.md` — фронт режется на этапы S0–S7, первая кодовая сессия кончается витриной токенов). Приёмка оркестратора: 10-агентный refute-воркфлоу — ВСЕ несущие бэкенд-утверждения записки CONFIRMED по коду, 8/8 веб-пинов подтверждены первоисточниками (TS7 GA 08.07.2026 БЕЗ программного API до 7.1 → TS 6.0.3 · Vite 8 = Rolldown · Fleet закрыт 22.12.2025 · react-resizable-panels v4 Group/Separator · react-router 8.3 Node≥22.22 — стенд 22.22.3 проходит). **(1) Восемь решений владельца:** рынок глобальный, SEO только Google (Яндекс снят) · выравнивание колонок грубое по единицам экспорта — механизм ГОТОВ (`tmctl export --pairs`, побайтное выравнивание по edit-unit, `internal/pipeline/export.go:89-93`; уточнение приёмки: draft-only-пайплайн шипит по чанкам, для штатного edit-пайплайна утверждение точно) · подсветка сомнительных мест только блок/глава, внутритекстовые спаны НЕ строятся (у $0-гейтов нет байтовых смещений) · остановка на подписи банка = параметр запуска per-run — ГОТОВО (`--verify-bank`, exit 3, `invocation.go:108`/`main.go:39-46`; галочка формы = передача флага, движок не трогается; в draft-only не останавливает — `mining.go:193-197`) · оплат в MVP нет, денежных полей в UI нет вовсе (расход остаётся телеметрией владельца; потолки/rebill-согласие движка канон §5 не трогает) · десктоп = устанавливаемое PWA первым шагом, Tauri по явным триггерам · макет-инструменты не используются, источник вида = пиксель-замеры референса (Fleet невоспроизводим — растровое совпадение не критерий готовности) · аутентификация: ОДНА серверная сессия, предъявление кукой (браузер) или Bearer (десктоп/CLI), principal только в middleware — вход дизайна П-1 платформенного бэклога. **(2) ПТ-34, продуктовый запрет:** ни один символ пользовательского перевода никогда не попадает на публично индексируемый URL — ни витрин, ни «поделиться», ни публичных ссылок чтения (авторское право + политика Google по масштабируемому машин-контенту бьют по всему домену); носитель — двухконтурный деплой (SPA `app.<домен>` целиком под noindex + статический публичный контур, STACK_DECISIONS §4). **(3) ПТ-21 переформулировано:** якорь чтения = edit-unit экспорта, НЕ «чанк пайплайна» — финальный текст существует только на уровне юнита (~1.9 юнита/главу по замеру фронта; «4276 юнитов» из артефактов репо не выводится — полнокнижной БД не существует, что само подтверждает тезис о ре-ингесте; принято как замер сессии, порядок величин сходится с coldrun-a); читалка обязана жить с «глава = один блок». **(4) Работы движка → строки 99–102** (каждая проверена кодом): 99 пофазный прогресс draft N/M ∥ edit N/M (done = все draft-строки членов + edit-строка, `status.go:328-331/365` — индикатор 0% ВСЮ черновую волну; `chunk_status` уже несёт гранулярность — выводимо без миграции схемы) · 100 персист манифеста глав/чанков + хеш источника (каждый read-вызов заново ингестит и режет исходник — `status.go:177-195`, redrive дважды за вызов; замер фронта 1.42–1.51 с CPU/23 МБ; `chunker_version` уже в снапшоте — `pipeline/render.go:53`) · 101 машиночитаемая таблица подписи банка (кап 20 = только stdout `render.go:98`; полная таблица — текстовый сайдкар `.bank-stop.txt`; JSON нет нигде) · 102 внешний trace-контекст в tmctl (TraceID минтится заново каждым вызовом — `main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` персистится). **(5) Противоречие разрешено ВЕРНО:** рекомендация интеграционного агента «долгоживущий демон в backend» отвергнута самой сессией по D39.81 — ратификация удержана, HTTP/SSE/очередь в `platform/`. **(6) Две ловушки эксплуатации подтверждены и заведены входами дизайна (строка 95 · П-1):** подпись термина ≠ UPDATE строки — банк пересобирается каждым прогоном (seedGlossary REPLACES + ReplaceBank DELETE/re-INSERT, `seeding.go:18/110`, `glossary.go:158-162`; контракт подписи пишет в файлы-источники: mined-delta/сид; след затирания — только журнальная строка glossary_revisions, без предупреждения) · порядок деплоя платформы: read-путь схему НЕ мигрирует никогда (`store.go:135-143`, «schema vN … expects vM» в обе стороны; чинит write-команда, годится и `redrive --dry-run`; `tmctl backup` НЕ мигрирует). **(7) Норма зонных бэклогов (решение владельца при лендинге):** фронт и платформа держат СВОИ бэклоги в своих зонах — `frontend/docs/BACKLOG.md` (Ф-1..Ф-6) · `platform/BACKLOG.md` (П-1..П-4); засеяны оркестратором при лендинге переносом уже записанных отложенных решений, дальше ведут зоны; ЕДИНЫЙ бэклог PROGRESS фронт/платформа-строк НЕ принимает — остаётся трекером движка/полигона/доков; движковые стыки фронта (зона «бэкенд») живут в едином (строки 99–102); строки 96/97 переехали в платформенный (П-1/П-2) с ID-надгробиями-указателями (ID стабильны навсегда — внешние ссылки не рвутся). **(8) Лендинг зон** `frontend/` + `platform/` + `.gitignore` (`frontend/references/` — скриншоты вне git, пины замеров сохранены в доках). (02.08.2026, оркестратор №9). ✅ ## D39.85 — Шов движок↔платформа: индустриальный стандарт ратифицирован — событийный поток, материализация, артефакты; ресёрч записан (02.08) @@ -1282,15 +1282,15 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **Выдан промт** `docs/BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md`: работа A (ручка, $0 + проба банка на `low` ≤$0.10 — этот замер не делал НИКТО, `low` у бэнк-ролей открытый вопрос) · работа B (экран целевого языка, $0, вердикт-двигающая ⇒ дизайн и пинг ДО кода) · работа C (добивка холодного прогона ≤$5 — закрывает строку 16 «полная цена холодного старта включая редактуру» и ВПЕРВЫЕ даёт данные по осям голоса для строки 13б, потому что редакторская волна не гонялась ни разу). **Промт холодно аудирован 4-линзовым воркфлоу с независимым арбитражем ДО выдачи** (норма D39.83): **3 блокера и 15 major вправлены** — несуществующая на момент написания ссылка на этот самый блок · платная проба, буквально уводившая прогон в ЗАМОРОЖЕННЫЙ эталон coldrun-a (он держит денежный базлайн строки 16) · та же ловушка хеш-оси на пути repair (`repairCheckpointExists`, `repair.go:350`, чей доккоммент декларирует зеркальность) · область работы B, буквально накрывавшая бэнк-роли и repair, чьи ответы законно НЕ в целевой письменности (100% ложных флагов) · негодный носитель данных для экрана · молчащие суб-бюджеты (`gates.terminology.budget_usd: 0.05`, `escalation.budget_usd: 0.10`), которые связывают РАНЬШЕ потолка $5 · незапрещённая правка вердикт-несущих `capabilities` в `models.yaml` · порядок «B заморожена ДО первого платного вызова C» (иначе сдвиг `classifierVersion` осиротит чекпойнты C1) · пропущенная в промте обязанность про доккомменты гейта · отсутствие явной инструкции переставить ручку ЧЕРНОВИКА в стенде (буквальное прочтение оставляло draft на `"off"` и воспроизвело бы стену 0/9 за $5). Строка 74 → «в работе»; закрывается приёмкой этого пака (02.08.2026, оркестратор №10). ✅ -## D39.88 — Коммит-права зонных сессий: фронт и платформа коммитят СВОЁ, чужое не трогают никогда; git-протокол переведён в механику (02.08) +## D39.88 — Git-протокол мультисессий переведён в механику: pathspec-коммит, чужую зону не трогает никто (02.08) -Закрывает норму-вопрос, открытый D39.84 п.8 («промт S0 велит фронт-сессии коммитить самой — против нормы «сессии не коммитят»; до слова владельца действует старая норма»). **Решение владельца дословно: «Свою часть пусть коммитит. Чужую не трогает никогда. Надо ему явно это прописать. То же самое и для платформы».** Ратифицировано: **право коммита у зонных сессий фронта и платформы ЕСТЬ — строго на пути своей зоны** (`frontend/`, `platform/`); бэкенд и полигон по-прежнему не коммитят, лендит оркестратор (исключение прежнее — пре-рег фризы полигона). +Ратифицировано: **коммитит оркестратор**; сессии зон — бэкенд, полигон, фронт, платформа — не коммитят, своё дерево готовят и передают на лендинг (исключение прежнее — пре-рег фризы полигона). Чужую зону не трогает НИКТО. **Повод — два живых инцидента 02.08, и они вскрыли, что декларативной нормы мало.** Коммиты фронт-сессии `e9a6bb2` и `b98afb5` дважды унесли под своим сообщением застейдженную работу оркестратора (архивный `git mv` промта coldrun-b; затем все четыре дока лендинга D39.86/D39.87). Содержимое цело — проверено `git show HEAD:` по каждому файлу — потеряна только атрибуция; история НЕ переписывалась (запрет при живых параллельных сессиях, урок 09.07; владелец санкционировал рерайт постфактум, оркестратор от него отказался — переписывать общий `main` под активно коммитящей сессией дороже выигранной косметики, оба хеша названы в PROGRESS, археология не рвётся). **Корень инцидента — не дисциплина, а механика: голый `git commit` уносит ВЕСЬ индекс.** Обе стороны виноваты симметрично: сессия коммитила без pathspec, оркестратор держал файлы застейдженными между операциями. **Поэтому норма записана как ПРОТОКОЛ, а не как призыв** (канон — `CLAUDE.md` §Гардрейлы, «Git-координация мультисессий»): коммит ТОЛЬКО с явным списком путей `git commit -- <пути>` (pathspec-форма чужой индекс не трогает) · **никогда** `git add -A` / `git add .` / `git commit -a` · перед каждым коммитом `git status` + `git diff --cached --name-only`, и чужой путь в индексе не «прибирать», а обойти pathspec-формой · свои файлы не держать застейдженными между шагами (стейдж и коммит одной командой) · `reset --hard`/amend/rebase несвежих коммитов/checkout поверх грязного дерева — запрещены · чужое уехало в твой коммит → историю НЕ переписывать, сообщить владельцу · не коммитить `START_PROMT.MD` и `.claude/settings.local.json`. -**Носители (правило обязано доехать до сессии, а не только до канона):** `CLAUDE.md` — таблица зон получила колонку «Коммитит сама?» + протокол в гардрейлах · `frontend/docs/FRONTEND_SESSION_PROMPT.md` — раздел «Коммит-права и git-протокол» перед первым коммитом (правка чужой зоны сделана оркестратором по прямому указанию владельца «надо ему явно это прописать»; прежняя формулировка §«Кто ты и твоя зона» несла только общий запрет и не давала механики) · `platform/README.md` — то же плюс ревью-гард модулей D39.85, потому что отдельного промта платформы ещё нет, а правило нужно ДО первой строки кода. ⚠ Фронт-сессия на момент ратификации ЖИВАЯ: правило доедет до неё только РЕЛЕЕМ владельца — бегущая сессия файл промта не перечитывает (норма хендофф-промтов п.4) (02.08.2026, оркестратор №10). ✅ +**Носители (правило обязано доехать до сессии, а не только до канона):** `CLAUDE.md` — таблица зон + протокол в гардрейлах · `frontend/docs/FRONTEND_SESSION_PROMPT.md` §«Зона и git» · `platform/README.md` — то же плюс ревью-гард модулей D39.85, потому что отдельного промта платформы ещё нет, а правило нужно ДО первой строки кода (02.08.2026, оркестратор №10). ✅ ## D39.89 — БАНК КАК ЦЕНТРАЛЬНАЯ ЦЕННОСТЬ: ГИПОТЕЗА ВЛАДЕЛЬЦА О КОНСИЛИУМЕ И УВЕРЕННОСТИ МОДЕЛЕЙ ПРИНЯТА К ПРОВЕРКЕ, ТРЕК = РАСШИРЕНИЕ Q2 (строка 5/36б), НЕ НОВЫЙ; ПРОМТ ВЫДАН (02.08, оркестратор №10). ✅ @@ -1322,7 +1322,7 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **7. Вопрос владельца, поднятый в решение (строка 107): форма архитектурных гардов и конвенции репозитория.** Предмет — `backend/internal/pipeline/synthetic_stage_seam_test.go` (395 строк): гард ходит по дереву через `go/parser` из обычного `_test.go`, резолвит пакет по ПУТИ импорта, несёт пол на число разобранных файлов. **Намерение верное и уже окупилось** (поймано 7 обходов: байтовая версия пробивалась пятью способами, AST-версия — ещё двумя, алиасом импорта и `[]config.Stage{{…}}`; сессия честно записала, что первая версия говорила `ok` на посаженном пятом сайте). **Дом неверный:** без типовой информации (`go/packages`+`types.Info` вместо эвристики по путям), в тестовом пакете, и каждый следующий инвариант породит ещё один такой обход. Индустриальная форма — analyzer на `golang.org/x/tools/go/analysis` (+`multichecker`, `go vet -vettool=`, CI), где алиас и дот-импорт закрываются ПО ПОСТРОЕНИЮ. Вторая половина вопроса: **в репозитории нет ни `.golangci.yml`, ни `Makefile`, ни CI-воркфлоу** (проверено) — батарея гоняется руками каждой сессией. Опасение владельца про хвост техдолга обоснованно ⇒ **первый шаг обязан быть $0-ЗАМЕРОМ** (набор в report-only, находки по правилам), и только потом состав + режим внедрения (baseline «только новый код» против big-bang). Решение — за владельцем, исполнение — следующей сессией оркестратора. -**8. Состояние зон на момент передачи.** `backend/` — незакоммиченный пак (п.1), сессия отработала и закрыта. `frontend/` — сессия ЖИВАЯ и коммитит сама по D39.88 (за день ушли `d8437d6`, `8d6b3f7`, `804dbc9`, `8be1e41`); правило pathspec-коммита до неё доехало только релеем владельца. `platform/` — кода нет, `go.mod` заведён. `eval/` — пусто по новому. **Очередь на момент передачи (пересчитано скриптом после добора п.9: 95 строк · зона бэкенд 46 строго / 61 широко · блокеров очереди 0 (104 → «на приёмке») · «скоро» 13 (2·4·5·18·46·49·55·95·107·108·109·112·113).** +**8. Состояние зон на момент передачи.** `backend/` — незакоммиченный пак (п.1), сессия отработала и закрыта. `frontend/` — сессия ЖИВАЯ (за день ушли `d8437d6`, `8d6b3f7`, `804dbc9`, `8be1e41`). `platform/` — кода нет, `go.mod` заведён. `eval/` — пусто по новому. **Очередь на момент передачи (пересчитано скриптом после добора п.9: 95 строк · зона бэкенд 46 строго / 61 широко · блокеров очереди 0 (104 → «на приёмке») · «скоро» 13 (2·4·5·18·46·49·55·95·107·108·109·112·113).** **9. ДОБОР ПОСЛЕ НЕЗАВИСИМОГО РЕВЬЮ ЛЕНДИНГА (author≠reviewer, тот же день).** Ревьюер подтвердил числовую часть (все числа пробы и строки 46 сошлись с отчётом, все `file:line` живые, счёт очереди воспроизведён скриптом, все четыре снятия «ложных долгов» обоснованы) и нашёл, что дефект передачи — **в НЕзаписанном**: просели предупреждения и адресованные наверх вопросы, у которых нет числа. Исправлено тем же лендингом: - **Мой над-клейм СНЯТ:** «дом гарда неверный» (строка 107). Отчёт §5.5 замерил обратное: форма «архитектурное правило обычным тестом» — стандарт stdlib (`go/build/deps_test.go`, `go/types/errorcalls_test.go`), а индустриальная альтернатива **не проходит наше ограничение «падать на обычной батарее»** (`go test -vet=<свой>` не поддерживается, `GOFLAGS=-vettool` при `go test` игнорируется), и переход на `x/tools/go/analysis` тянет `x/net` 0.26.0 → 0.54.0, **где `x/net/http2` — наш транспорт к провайдерам**. Тестовый дом был осознанным следствием замера. Владельцу вопрос переформулирован честно: принять ли бамп `x/net` ради типовой информации · заводить ли CI · остаётся ли гард тестом. @@ -1381,7 +1381,7 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **4. Открыто на владельце (ответа при закрытии НЕТ):** 116 — форма порога классификатора (подано «≥4/5 прогонов N=5 дают 6/6»; альтернатива — 4/4 по дискриминирующему подмножеству) · строка 5 — вытащить находки прерванного банк-ресёрч-захода из истории той сессии ИЛИ пере-запуск с нуля; в обоих случаях промт ПОДРЕЗАТЬ перед выдачей по D39.90 п.5 (§3-A+B1+B3 · B2 → под-проба · §5-C отложен · потолок $1.20) · мини-проба строки 44 «low + потолок 16k на упавшем классе батчей» (~$0.05) — идея владельца, санкции нет · подпись денежного шага по 46 (когда дойдёт). -**5. Вахты и грабли преемнику:** вендор-анонс смены маппинга эффорта `deepseek-v4-pro` «early August 2026» — реестр 108, триггер: дата >05.08 или аномалия редакторского арма; `medium` на DeepSeek не ставить (вендор документирует low/high/max — Д5, реестр 108); фронт-сессия ЖИВАЯ и коммитит сама (D39.88, только pathspec); дерево на закрытии чисто от бэкенд/докс-зон, незакоммиченное в дереве — фронта и `START_PROMT.MD`. +**5. Вахты и грабли преемнику:** вендор-анонс смены маппинга эффорта `deepseek-v4-pro` «early August 2026» — реестр 108, триггер: дата >05.08 или аномалия редакторского арма; `medium` на DeepSeek не ставить (вендор документирует low/high/max — Д5, реестр 108); фронт-сессия ЖИВАЯ; дерево на закрытии чисто от бэкенд/докс-зон, незакоммиченное в дереве — фронта и `START_PROMT.MD`. **6. Очередь скриптом:** 97 строк · «скоро» 15 (2·4·5·18·46·49·55·95·107·108·109·112·113·114·116) · блокеров 0. @@ -1422,3 +1422,13 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **4. Решение по tools/go.mod (владелец 04.08: «вам решать») — СТРОИТЬ, отдельным малым паком, НЕ гейт ничему.** Форма: отдельный модуль (например `backend/tools/` со своим go.mod), куда переезжают `cmd/tmvet` + `internal/archguard` — ⚠ `tool`-директива Go 1.24 НЕ решает задачу (тулы в главном go.mod участвуют в MVS так же). Следствия, которые пак обязан удержать: `make battery` гоняет тесты ОБОИХ модулей (инвариант «падать на обычной батарее» переезжает в Makefile — он и так единственная точка входа); `shippingtree_test` живёт в tools-модуле и грузит главный. Выигрыш: бамп инструментов ФИЗИЧЕСКИ не может двинуть x/net/x/text главного модуля ⇒ класс «линтер тронул денежную ось» закрывается по построению. Туда же — решение по sqlite: оставить 1.55 (уже заленден, прогонов не было, откат = отдельное движение без выгоды). Строка 118 переформулирована под это решение. **5. Вопрос владельца «не слишком ли агрессивен снапшот, можно ли безопасно ослабить» — разбор.** Короткий ответ: механизм НЕ слишком агрессивен — он неточно НАЦЕЛЕН, причём в обе стороны сразу, и лечится калибровкой осей + дешёвой перекупкой, а не ослаблением. Три факта: (а) **есть недо-чувствительность** (строка 119: `SanitizerVersion` НЕ сворачивает `width.Fold` — смена x/text перевернула бы вердикт БЕЗ движения снапшота; это аргумент ПРОТИВ ослабления вслепую); (б) **есть пере-чувствительность по охвату**: `EmbeddedVersion` фолдится безусловно по ВСЕМ файлам всех пар (D39.90 п.3) — добавление ja-данных перекупает zh-книги; лечится пер-парным хешом (только файлы своей пары) — заодно шаг к мандату общности (родня 115/120); (в) **версия-строка ≠ поведение**: бамп x/text доказан поведенчески пустым на 17M+ входов, но снапшот сдвинулся, потому что фолдится СТРОКА версии. Направление фикса (в): не «фолдить меньше», а **сделать перекупку дешёвой, когда поведение не менялось** — `tmctl resnapshot --dry-run`, который по чекпойнтам сверяет БАЙТЫ тел (`msgsContentHash` уже в голдене): байт-идентичные юниты пере-привязываются к новому снапшоту без пере-вызова, платятся только реально изменившиеся; детерминизм цел (каждая пере-привязка аудируема), деньги видимы (канон §5), «тихих перепокупок» не появляется — наоборот, исчезают громкие ПУСТЫЕ перекупки. Опция «фолдить поведенческий отпечаток вместо строки версии» рассмотрена и отложена: probe-корпус = пол, не доказательство; риск тихого изменения поведения хуже цены ложной перекупки. **Заведена строка 124** (дизайн-вход: (а)+(б)+(в) одним паком, приоритет — перед МАСШТАБОМ, когда перекупки начнут стоить реальных денег; сегодня боль теоретическая — книг в работе нет). + +## D39.98 — Ревью и лендинг фронта S2 + дофикса; git-канон v2 (коммитит только оркестратор) разнесён по носителям (04.08). ✅ + +**1. Приёмка S2 (`ece94ef`) — адверсариальный воркфлоу, 5 линз × независимые скептики с ре-раном (12 агентов), плюс сверка оркестратора глазами по цитируемым строкам.** Подтверждено исполнением: `npm run check` зелёный · виртуализация реальна (31–43 DOM-строки на 2293 узлах, live-проба) · три новые зависимости ратифицированы ДО коммита (STACK_DECISIONS при D39.84, `fbebe33` — дрифта стека нет) · правки макета владельца соблюдены · 11/11 терминов фикстур сошлись с боевой БД по read-only SQL · noindex стоит · `eslint-disable` в коде 0. **Три подтверждённых дефекта:** (а) токен `--font-cjk` пиновал SC-гарнитуры пар-слепо (`tokens.css:66` + безусловное применение к колонке оригинала) — нарушение пина D39.84 «системный стек + lang из данных» и канона общности: ja→ru отрисовал бы кандзи китайскими начертаниями молча, en→ru получил бы CJK-латиницу; generality-тест TSX-only к CSS слеп; (б) `org` в `BankTerm.kind` — тип, которого в движке НЕТ (закрытый словарь `classify.go:15` + `banknote.go:74` = name·place·title·term·nickname), и журнал фронта приписывал `migrate.go:176` перечень, которого в файле нет — изобретённое API, поданное как прочитанное; (в) ключ рядов банка `term.source` ломается на полисемии — движок уникален по (`src`,`sense`,`since_ch`,`until_ch`), `migrate.go:202`. Три находки ревьюеров ОПРОВЕРГНУТЫ скептиками и НЕ предъявлены (RunState-Record «уронит апп» — data-router даёт error boundary, триггер недостижим до S3; sync-сим «дефект» — ратифицированный план, S3 гейчен контрактом; претензия к pre-commit-хуку судила по ещё не залендженному правилу). + +**2. Дофикс фронта принят и заленден `02872b6`** (батарея пере-гнана оркестратором: 77/77; лендинг-коммит прошёл их pre-commit-хук живьём). Лечения верные: токен снят ЦЕЛИКОМ — подбор гарнитуры делает браузер по `lang` из данных пары (чище предложенного `:lang()`: языковая ветка в CSS — та же пар-специфика); `org` выпилен из типа и скейл-фикстуры, журнальная строка исправлена с грунтом по реальным гейтам; ключ составной (`src·dst·type`) с честной пометкой «заплата» и записью недостающих полей в Ф-14. Гейты укреплены: динамический `import()` закрыт по всем трём швам во всех зонных оверрайдах · тернарник/шаблон-носители литерала в CSS-var-гейте · `generality.test.ts` получил CSS-половину (`:lang()` падает тестом) с явно названной границей «значений стилей тест не видит». Мелочь: ранг `content_filter`=0 (`status.go:152`), фантомный промах фикстуры r2-2 сделан реальным в тексте, дубль счёта тестов снят. Остаточное (info, зона фронта, не гейт): в `main.tsx` статический `no-restricted-imports` выключен целиком (динамо-швы стоят) · `scroll-padding` вне регексов спейсинг-гейта · клеймы, требующие build/browser (`check:full`, axe, медианы скролла), приняты «со слов» — в дереве им ничего не противоречит. + +**3. Git-канон v2 заленден по носителям (решение владельца 04.08, правка `CLAUDE.md` его рукой): коммитит ТОЛЬКО оркестратор; право самокоммита фронта/платформы (D39.88) ОТОЗВАНО — supersede-запись = этот блок.** Носители: `CLAUDE.md` (таблица зон + гардрейлы) · промты фронта (переписаны фронт-сессией в своей зоне) · `platform/README.md` · подчистки D-лога/PROGRESS. ⚠ **Процедурная нота (D23.3):** синхронизация переписала тела D39.84 п.8 и D39.88 НА МЕСТЕ — снято в т.ч. дословное решение владельца 02.08; это против правила «исторические записи не переписываются». История цела в git (`2b166b7`, pre-rewrite HEAD); авторство подчистки — на подтверждении владельца; впредь supersede — только пометкой в карте + новым блоком. + +**4. Открыто на владельце (+2 к списку D39.97):** confirm/deny двух «решений владельца 04.08» из журнала фронта («+» в левой панели закрывает половину Ф-7 · референсы возвращены на диск) · авторство подчистки D-лога (п.3). **В дереве появились нетрекнутые артефакты банк-арбитража** (`docs/research/24-bank-arbitration.md` · `eval/bank_arbitration/`) — заход строки 5, судя по всему, пере-исполнен; НЕ залендены, ждут отдельной приёмки. (04.08.2026, оркестратор №12). ✅ diff --git a/platform/README.md b/platform/README.md index 2465cf14..34af8a9e 100644 --- a/platform/README.md +++ b/platform/README.md @@ -2,18 +2,14 @@ Зона записи новой сессии «Платформа». Пусто: заведено под будущий сервис, кода ещё нет. -## ⚠ Коммит-права и git-протокол (решение владельца 02.08, D39.88 — читать ДО первого коммита) +## ⚠ Git и зона (читать ДО первой строки кода) -**Право коммита у платформенной сессии ЕСТЬ — но ровно на свою зону: «свою часть коммить, чужую не трогать НИКОГДА».** Канон — `../CLAUDE.md`, §Гардрейлы; сюда вынесено, потому что отдельного промта платформы ещё нет, а правило нужно ДО первой строки кода. +**Платформенная сессия не коммитит — лендит оркестратор.** Канон — `../CLAUDE.md`, §Гардрейлы; сюда вынесено, потому что отдельного промта платформы ещё нет. -1. **Коммить только пути внутри `platform/`.** Ничего за её пределами — ни `docs/`, ни `backend/`, ни `frontend/`, ни корневых файлов. Нужна правка вне зоны — пинг владельцу, её сделает оркестратор. -2. **Форма коммита — ТОЛЬКО с явным списком путей:** `git commit -- platform/<файл>`. Механика, не стилистика: **голый `git commit` уносит ВЕСЬ индекс**, включая чужие застейдженные файлы, и чужая работа уезжает под твоим сообщением (02.08 это случилось дважды — `e9a6bb2`, `b98afb5`). -3. **НИКОГДА `git add -A`, `git add .`, `git commit -a`.** -4. **Перед каждым коммитом:** `git status` → `git diff --cached --name-only`; чужой путь в индексе не «прибирать», а обойти pathspec-формой. -5. Свои файлы не держать застейдженными между шагами — стейдж и коммит одной командой. -6. **НИКАКИХ** `reset --hard`, `amend`/`rebase` несвежих коммитов, перезаписи истории; чужие незакоммиченные файлы не трогать. -7. Чужое уехало в твой коммит — историю НЕ переписывать, сообщить владельцу. -8. ⚠ Ревью-гард модулей (D39.85): путь Go-модуля платформы **никогда** не вкладывать под путь движка — иначе он получит доступ к `backend/internal/*` по правилу префикса. +1. **Писать только внутрь `platform/`.** Ничего за её пределами — ни `docs/`, ни `backend/`, ни `frontend/`, ни корневых файлов. Нужна правка вне зоны — пинг владельцу, её сделает оркестратор. +2. **Чужие незакоммиченные файлы в дереве не трогать**: параллельные сессии — норма. +3. **НИКАКИХ** `git add -A`, `reset --hard`, `amend`/`rebase`, перезаписи истории и `checkout` поверх грязного дерева. +4. ⚠ Ревью-гард модулей (D39.85): путь Go-модуля платформы **никогда** не вкладывать под путь движка — иначе он получит доступ к `backend/internal/*` по правилу префикса. ## Что здесь будет