From 2b166b7e2ef1d1aa788869439f913f25fbb34a2b Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 2 Aug 2026 15:14:13 +0300 Subject: [PATCH] Ratify D39.88: zone sessions commit their own zone only, never others, with pathspec commit protocol written into root guardrails, frontend prompt and platform readme --- CLAUDE.md | 24 ++++++++++++++++-------- docs/PROGRESS.md | 4 ++-- docs/architecture/05-decisions-log.md | 12 +++++++++++- frontend/docs/FRONTEND_SESSION_PROMPT.md | 17 +++++++++++++++-- platform/README.md | 13 +++++++++++++ 5 files changed, 57 insertions(+), 13 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ebe7638e..14b4e005 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,13 +13,13 @@ Go-бэкенд издательского художественного пер ## Роли сессий и зоны (НЕ править чужую зону) -| Роль | Зона записи | Всё остальное | -|---|---|---| -| **Бэкенд** | `backend/` | читать можно; расхождения — пингом оркестратору в `docs/PROGRESS.md` | -| **Полигон (eval)** | `eval/` + `docs/experiments/` | то же | -| **Оркестратор** | `docs/` (architecture/research/PROGRESS), ревью чужого кода read-only | ратифицирует решения, пишет хендофф-промты | -| **Фронт** | `frontend/` | то же; продуктовые требования — `docs/product-requirements.md`, НЕ из памяти | -| **Платформа** | `platform/` (SaaS control plane: пользователи/квоты/очередь/HTTP; движок дёргает процессами, D39.81) | то же | +| Роль | Зона записи | Коммитит сама? | Всё остальное | +|---|---|---|---| +| **Бэкенд** | `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) | то же | Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное. @@ -42,7 +42,15 @@ 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-координация мультисессий:** НИКАКИХ `reset --hard`, перезаписей истории (amend/rebase несвежих коммитов) и `checkout` поверх грязного дерева, пока возможны незакоммиченные правки параллельных сессий — сначала `git status` и опознание ЧУЖИХ изменений; чужое не трогать; history-rewrite — только по согласованию через оркестратора при чистом дереве (урок 09.07: rewrite оркестратора стёр незакоммиченные правки полигона). +- **Git-координация мультисессий (решение владельца 02.08, D39.88 — «свою часть пусть коммитит, чужую не трогает НИКОГДА»):** + - **Коммить только пути СВОЕЙ зоны.** Право коммита есть у оркестратора и у зонных сессий фронта/платформы (в своей зоне); бэкенд и полигон по-прежнему не коммитят — лендит оркестратор (исключение: пре-рег фризы полигона). + - **Форма коммита — ТОЛЬКО с явным списком путей: `git commit -- <путь> <путь>`.** Причина механическая и это корень обоих инцидентов 02.08: голый `git commit` уносит **ВЕСЬ индекс**, включая чужие застейдженные файлы, и чужая работа уезжает под твоим сообщением. Pathspec-форма индекс не трогает. + - **НИКОГДА `git add -A` / `git add .` / `git commit -a`** — только явные пути. + - **Перед каждым коммитом:** `git status` (опознать ЧУЖОЕ) и `git diff --cached --name-only`. Увидел в индексе путь вне своей зоны — **не коммить его и не «прибирать»**: снимай не чужое из индекса, а свою задачу — коммить pathspec-формой. + - **Не оставляй свои файлы застейдженными** между операциями: пока они в индексе, их может унести чужой коммит (этим оркестратор №10 сам подставился дважды). Стейдж и коммит — одной командой. + - **НИКАКИХ `reset --hard`, перезаписей истории (amend/rebase несвежих коммитов) и `checkout` поверх грязного дерева**, пока возможны незакоммиченные правки параллельных сессий; history-rewrite — только по согласованию через оркестратора при чистом дереве (урок 09.07: rewrite оркестратора стёр незакоммиченные правки полигона). + - **Чужое уже уехало в твой коммит?** Историю НЕ переписывать — сообщить владельцу/оркестратору; содержимое при этом цело, теряется только атрибуция. + - Никогда не коммитить: `START_PROMT.MD` (файл владельца) · `.claude/settings.local.json` · книгу и производные (живут в `~/books`, вне git). ## Онбординг новой сессии (порядок чтения) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index fc65c41e..ea8a67e6 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.87). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.88). **Источник истины по РЕШЕНИЯМ — `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`, так чтобы четвёртое такое место не могло появиться молча. **Промт выдан** — `BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md` (работы A/B $0 + проба банка ≤$0.10 + добивка прогона ≤$5, закрывающая строку 16 и впервые дающая данные по осям голоса для 13б). Перекупок нет (D39.63). > - **Горизонт (D39.62/67):** ре-проба flash (74; + платный порог 6/6 классификатора + пробы 36б-замера Q2/эмиссии Q7 по слову) → **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · итерация №2 редакторов 65 · цена 16 · веса K1–K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 · строка 74 перед любым платным прогоном. @@ -115,7 +115,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 вправлены ДО выдачи).** -⚠ **ИНЦИДЕНТ КООРДИНАЦИИ (02.08, к решению владельца).** Фронт-сессия ЖИВАЯ и коммитит в `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`. ⚠ Фронт-сессия ЖИВАЯ — правило доедет только РЕЛЕЕМ владельца.** Хроника: Фронт-сессия ЖИВАЯ и коммитит в `main` сама, хотя по D39.84 п.8 право коммита фронту ещё НЕ выдано («до слова владельца действует «сессии не коммитят»»). **Дважды** её коммиты (`e9a6bb2`, `b98afb5`) унесли мою застейдженную работу под своим сообщением — общий индекс, ровно класс инцидента 77dd9b8: в `e9a6bb2` уехал `git mv` архивации промта, в `b98afb5` — все четыре дока лендинга D39.87. **Содержимое цело и проверено** (`git show HEAD:` по каждому файлу), потеряна только атрибуция коммитов; history-rewrite не делаю — запрещён при живых параллельных сессиях. Смягчение с моей стороны: стейдж и коммит одной атомарной командой. **Владельцу:** решить вопрос коммит-прав фронта (D39.84 п.8) — либо выдать право с пост-хок ревью, либо потребовать «не коммитить», иначе инцидент повторится; альтернатива — развести сессии по веткам. ## Оркестратор №9 — ШОВ ДВИЖОК↔ПЛАТФОРМА: РЕСЁРЧ ЗАПИСАН, НАПРАВЛЕНИЕ РАТИФИЦИРОВАНО (D39.85), 02.08 diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 93e51ae3..528b49e3 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.87 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.88 (развязки 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`. @@ -1281,3 +1281,13 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **Обязанность, унаследованная от D39.86 п.2:** санкция (б) тем же диффом приводит в соответствие доккомменты эхо-гейта (`config/models.go:440-448`, `llm/capability.go:52-58`), которые утверждают инвариант «echo-prone провайдер держит thinking на дефолте провайдера» — после (б) тот же провод легален через `stages[].reasoning` и запрещён через `model.extra_body`, и защита перестаёт быть полной. Гардрейл «thinking у DeepSeek не выключать» при этом НЕ ослабляется и остаётся в силе: (б) — уровень эффорта, а не тумблер. **Выдан промт** `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.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). ✅ diff --git a/frontend/docs/FRONTEND_SESSION_PROMPT.md b/frontend/docs/FRONTEND_SESSION_PROMPT.md index 42d9c00e..0bf3a8b3 100644 --- a/frontend/docs/FRONTEND_SESSION_PROMPT.md +++ b/frontend/docs/FRONTEND_SESSION_PROMPT.md @@ -31,9 +31,22 @@ ## Кто ты и твоя зона -Ты фронтенд-сессия. **Зона записи — только `frontend/`.** `backend/`, `platform/`, `docs/`, `eval/` — read-only; расхождения и вопросы — пингом владельцу, не правкой чужой зоны. Параллельные сессии в проекте — норма: перед любой git-операцией `git status`, чужие незакоммиченные файлы не трогать, никаких `reset --hard` и перезаписи истории. +Ты фронтенд-сессия. **Зона записи — только `frontend/`.** `backend/`, `platform/`, `docs/`, `eval/` — read-only; расхождения и вопросы — пингом владельцу, не правкой чужой зоны. -Общие правила проекта — в `CLAUDE.md` в корне. Коммиты: английский, одно предложение ≤30 слов, без Co-Authored-By. +### ⚠ Коммит-права и git-протокол (решение владельца 02.08, D39.88 — читать ДО первого коммита) + +**Право коммита у тебя ЕСТЬ — но ровно на свою зону: «свою часть коммить, чужую не трогать НИКОГДА».** + +1. **Коммить только пути внутри `frontend/`.** Ничего за её пределами — ни `docs/`, ни `backend/`, ни `platform/`, ни корневых файлов, ни `.gitignore`. Нужна правка вне зоны — пинг владельцу, её сделает оркестратор. +2. **Форма коммита — ТОЛЬКО с явным списком путей:** `git commit -- frontend/<файл> frontend/<файл>`. Это не стилистика, а механика: **голый `git commit` уносит ВЕСЬ индекс**, включая файлы, застейдженные параллельной сессией, — и чужая работа уезжает под твоим сообщением. Так уже произошло ДВАЖДЫ 02.08 (`e9a6bb2`, `b98afb5` унесли доки оркестратора). Pathspec-форма чужой индекс не трогает. +3. **НИКОГДА `git add -A`, `git add .`, `git commit -a`.** Только явные пути. +4. **Перед каждым коммитом:** `git status` (опознать чужое) → `git diff --cached --name-only`. Увидел в индексе чужой путь — **не «прибирай» его**, просто коммить pathspec-формой, и он останется на месте. +5. **Не оставляй свои файлы застейдженными** между шагами: пока они в индексе, их может унести чужой коммит. Стейдж и коммит — одной командой. +6. **НИКАКИХ** `reset --hard`, `amend`/`rebase` несвежих коммитов, `checkout` поверх грязного дерева, перезаписи истории. Параллельные сессии — норма, их незакоммиченные файлы не трогать. +7. **Чужое всё-таки уехало в твой коммит?** Историю НЕ переписывать — сообщить владельцу; содержимое цело, теряется только атрибуция. +8. Никогда не коммитить: `START_PROMT.MD` (файл владельца), `.claude/settings.local.json`. + +Общие правила проекта — в `CLAUDE.md` в корне (там же эта норма в каноническом виде). Коммиты: английский, одно предложение ≤30 слов, без Co-Authored-By. ## Что за продукт diff --git a/platform/README.md b/platform/README.md index 2f6a52bf..2465cf14 100644 --- a/platform/README.md +++ b/platform/README.md @@ -2,6 +2,19 @@ Зона записи новой сессии «Платформа». Пусто: заведено под будущий сервис, кода ещё нет. +## ⚠ Коммит-права и git-протокол (решение владельца 02.08, D39.88 — читать ДО первого коммита) + +**Право коммита у платформенной сессии ЕСТЬ — но ровно на свою зону: «свою часть коммить, чужую не трогать НИКОГДА».** Канон — `../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/*` по правилу префикса. + ## Что здесь будет Сервис между фронтом и движком перевода. Всё, что относится к ПОЛЬЗОВАТЕЛЯМ и не относится