Ratify D39.139: trim decision log and progress tails into archive slices, sweep planning docs of three zones, fix stale K-9, K-13, genre, 0.2.2 and S4 mentions
This commit is contained in:
parent
0961a10d5d
commit
f10c6f7f07
11 changed files with 421 additions and 391 deletions
|
|
@ -25,7 +25,7 @@ Go-бэкенд издательского художественного пер
|
|||
|
||||
## Источники истины (по убыванию)
|
||||
|
||||
1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (диета D39.125): живой файл = карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `docs/archive/architecture/05-decisions-*.md`. Греп номера: сначала живой файл, затем слайсы; тело ноты — строка `^## D<номер>`, прочие хиты = упоминания; целиком НЕ читать. Статус/тело любого номера одним хопом — реестр `docs/architecture/05-decisions-index.md` (D39.126).**
|
||||
1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (диета D39.125, подрезка D39.139): живой файл = карта + эрраты + живые тела + голова D39.124+; тела закрытых эр — слайсы `docs/archive/architecture/05-decisions-*.md`. Греп номера: сначала живой файл, затем слайсы; тело ноты — строка `^## D<номер>`, прочие хиты = упоминания; целиком НЕ читать. Статус/тело любого номера одним хопом — реестр `docs/architecture/05-decisions-index.md` (D39.126).**
|
||||
2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров).
|
||||
3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема) · `14-api-contract/` — **ратифицированный контракт API v0 фронт↔платформа** (OpenAPI 3.1 + компаньон, D39.99).
|
||||
3а. `docs/product-requirements.md` — реестр «что продукт обязан уметь» (производный от ЖИВОГО брифа владельца `START_PROMT.MD` V0–V5 + находок H6–H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые V-идеи владельца разбираются сюда, не остаются невидимыми.
|
||||
|
|
@ -59,5 +59,5 @@ Go-бэкенд издательского художественного пер
|
|||
**⚠ Всю документацию и код проекта пишут нейросети — они могут ошибаться; учитывай при чтении.**
|
||||
|
||||
1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`. Непонятный жаргон/сокращения — `docs/glossary.md`.
|
||||
2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.106+). Целиком НЕ читать; тела закрытых эр — в слайсах `archive/architecture/` (греп: живой файл → слайсы).
|
||||
2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.124+). Целиком НЕ читать; тела закрытых эр — в слайсах `archive/architecture/` (греп: живой файл → слайсы).
|
||||
3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; Фронт/продукт — `docs/product-requirements.md` + `research/16` (через ревью-шапку) + контракт `architecture/14-api-contract/`; Платформа — `platform/README.md` + зонный журнал + `research/23` + контракт 14; всем — шапка-таблица `09-target-architecture.md` (статус слоёв).
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
## Онбординг (порядок чтения, ~20 мин после диеты 25.07)
|
||||
|
||||
1. `CLAUDE.md` (вкл. новое правило чтения D-лога) → `docs/README.md` → CURRENT-STATE в `docs/PROGRESS.md`.
|
||||
2. D-лог `05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.106+); тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md` (греп: живой → слайсы).
|
||||
2. D-лог `05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.124+, подрезка D39.139); тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md` (греп: живой → слайсы).
|
||||
3. Шапка-таблица `09-target-architecture.md` (статус 7 слоёв) + `12-go-style-notes.md` (нормы общности §0) + `10-prompt-architecture.md` (промпт-тема).
|
||||
4. Авто-память — point-in-time, сверяй с доками.
|
||||
|
||||
|
|
|
|||
177
docs/PROGRESS.md
177
docs/PROGRESS.md
File diff suppressed because one or more lines are too long
|
|
@ -9,7 +9,7 @@
|
|||
- [glossary.md](glossary.md) — жаргон и сокращения (D-номер, паки, банк, голден, K/DC/H/L…) одним экраном.
|
||||
- [product-requirements.md](product-requirements.md) — реестр «что продукт обязан уметь»: START_PROMT V0–V5 + находки H6–H18, статусы сверены кодом.
|
||||
- `architecture/` — синтез и контракты:
|
||||
- [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Живой файл после диеты D39.125: карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md`. Грепай номер сначала в живом, затем в слайсах (тело ноты = строка `^## D<номер>`, прочие хиты — упоминания); целиком не читать. **Статус/суть/тело ЛЮБОГО номера одним хопом — реестр [05-decisions-index.md](architecture/05-decisions-index.md)** (все ноты, колонка тем для грепа «какой закон по X»; D39.126).
|
||||
- [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Живой файл после диеты D39.125 и подрезки D39.139: карта + эрраты + живые тела + голова D39.124+; тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md`. Грепай номер сначала в живом, затем в слайсах (тело ноты = строка `^## D<номер>`, прочие хиты — упоминания); целиком не читать. **Статус/суть/тело ЛЮБОГО номера одним хопом — реестр [05-decisions-index.md](architecture/05-decisions-index.md)** (все ноты, колонка тем для грепа «какой закон по X»; D39.126).
|
||||
- [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга + археология выселенных строк бэклога §Б-* (справочник к бэклогу, НЕ трекер) · [14-api-contract/](architecture/14-api-contract/) — **контракт API v0 фронт↔платформа (D39.99)**: нормативная спека OpenAPI 3.1 (типы фронта генерятся из неё) + компаньон-README (провенанс ✓/◆/○, К-вопросы; зонная копия `frontend/docs/api-contract/` — байт-зеркало, сверять при лендинге).
|
||||
- Топикальные входы (D39.126; НЕ источники истины, при конфликте побеждает D-лог): [15-money-path.md](architecture/15-money-path.md) — деньги от гранта до settle одним маршрутом · [16-events-emitter.md](architecture/16-events-emitter.md) — сборка-норматив эмиттера шва (обязательное пре-чтение сессии строки 103) · [STACK.md](STACK.md) — карта «роль → модель → конфиг → квирки».
|
||||
- Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md).
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
- `research/` — фактура ресёрчей 01–28; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (транспорт superseded D39.106) · 25 холодное ревью шва — форма D39.106, отвергнутые альтернативы, требования к эмиттеру (читать перед любым кодом стыка) · 24 арбитраж банка (ПРИНЯТ D39.102: консилиум закрыт классом, вход фикс-пака банка — §G) · 26 официальные практики Anthropic (D39.121: записка-план, сниппеты хендоффов, карта «уже делаем/перенять») · **28 контракт-ревью API v0 (ПРИНЯТ D39.138: решения владельца 16.08 — §8, состав батча 0.3.0 — §5; НОСИТЕЛЬ для исполняющих сессий, читать оригинал, не пересказ)**.
|
||||
- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений.
|
||||
- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit` при коммите, задевающем D-лог или PROGRESS — предупреждает, не блокирует. Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов.
|
||||
- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Контракт-ревью ОТРАБОТАЛО и ПРИНЯТО** (D39.138; отчёт [research/28-contract-review.md](research/28-contract-review.md) — носитель решений владельца §8 и состава батча 0.3.0 §5; промт в `archive/prompts/`; следующий промт — спек-сессия батча 0.3.0, очередь №17) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); разморозка = лендинг P7 + гейт-ответы S5 (В-10 · фразы В-11); живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность + форвард-половина 0.2.3: чтение `title` и проекция `reject_reason`, D39.135 п.2в + хвосты D39.134 п.4), промт — очередь №17 · **Бэкенд: активного промта НЕТ** — пере-пин цен DeepSeek ИСПОЛНЕН и ПРИНЯТ (D39.137, лендинг `76049bb`; промт в `archive/prompts/`), потолки снова защищают; `tmctl migrate` — D39.134 (`d55edd4`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100).
|
||||
- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Контракт-ревью ОТРАБОТАЛО и ПРИНЯТО** (D39.138; отчёт [research/28-contract-review.md](research/28-contract-review.md) — носитель решений владельца §8 и состава батча 0.3.0 §5; промт в `archive/prompts/`; следующий промт — спек-сессия батча 0.3.0, очередь №17) · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08, потолок фазы $4.50; выводы 22/23 заморожены до неё) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен) . **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); разморозка = лендинг P7 + гейт S5 (~~В-10~~ закрыт 16.08 «вежливость» · фразы В-11 — форма из ревью 28: клиент рисует по машинному `code`, после батча 183); живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); следующий пак — P7 (читающая поверхность + форвард-половина 0.2.3: чтение `title` и проекция `reject_reason`, D39.135 п.2в + хвосты D39.134 п.4), промт — очередь №17 · **Бэкенд: активного промта НЕТ** — пере-пин цен DeepSeek ИСПОЛНЕН и ПРИНЯТ (D39.137, лендинг `76049bb`; промт в `archive/prompts/`), потолки снова защищают; `tmctl migrate` — D39.134 (`d55edd4`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100).
|
||||
- Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) (П-1..П-14) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · архив промтов P0–P5).
|
||||
- `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять.
|
||||
- Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code).
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Реестр D-нот — карта актуальности v2 (D1–D39.138; строка 167; титул — носитель головы, бампать при каждом аппенде — испр. оркестратором №17 15.08 по аудиту: отставал на четыре ноты)
|
||||
# Реестр D-нот — карта актуальности v2 (D1–D39.139; строка 167; титул — носитель головы, бампать при каждом аппенде — испр. оркестратором №17 15.08 по аудиту: отставал на четыре ноты)
|
||||
|
||||
> Одна строка на КАЖДУЮ ноту журнала решений: № · дата · суть · статус · где тело · темы. Ведёт оркестратор при лендингах: новая нота = новая строка ТЕМ ЖЕ коммитом (полноту сторожит `docs/scripts/counts.py --check`). Суть и статус здесь — НАВИГАЦИЯ, не контракт: при конфликте побеждает ТЕЛО ноты (живой [`05-decisions-log.md`](05-decisions-log.md) → слайсы `../archive/architecture/05-decisions-*.md`). Несущие эрраты к фактам старых нот живут в шапке живого D-лога — их читать ОБЯЗАТЕЛЬНО, реестр их не дублирует. Темы (для грепа оси «какой закон по X»): деньги · шов · банк · промпт · судья · гейты · контракт · платформа · фронт · полигон · ToS · общность · процесс · нарезка · голос · инфра · модели.
|
||||
> Родословная: прозаическая карта D1–D39.28 (ревизии D31–D38.2) пересобрана в реестр докс-паком 167 (09.08.2026, №16): извлечение 6+6 агентов по worksheet `../archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`, полнота сверена скриптом против заголовков всех шести файлов. «тело: жив» = живой D-лог; «слайс N» = `../archive/architecture/05-decisions-N.md`.
|
||||
|
|
@ -191,3 +191,4 @@
|
|||
| D39.136 | 15.08 | Пакет слов владельца напрямую №17: санкции фазы Д и ja-книги; фриз фронта до P7+гейт-ответов; структура глав в очередь (гейт D39.122 п.4 пал: Этап 0 паком, 161 дизайн-паком); контракт-ревью 0.3.0 заказан (строка 179, кросс-модельное судейство буллетов до бэклога); фразы PD-173 пере-заказ + граница ПТ-33 пере-читана (алгоритмы, не минорку); поля BankTerm не заводить, строка 178 (sense коротковат); Ф-62 в контракт, Ф-63/Ф-28 одобрены; PD-203 ратифицирован (флаг аккаунта только по аккаунт-причинам); 116 закрыта (порог выборкой), 126 закрыта; промт DeepSeek-репина выдан | ЖИВОЕ: строки 178/179; вендор-сессия DeepSeek отработала — D39.137; форма ревью — эррата 15.08-в (отдельная сессия) | жив | владелец фронт контракт банк деньги |
|
||||
| D39.137 | 15.08 | Приёмка вендор-сессии пере-пина DeepSeek (76049bb, инлайн исполнением: вендор-страница пере-прочитана независимо, голден бит-в-бит, дифф = 3 строки): пик запинен (flash 0.44/1.32/0.014, pro 1.32/3.96/0.044), множитель счёта c1 ×4.2–4.4 пик; строка 172 пере-скоуплена (схема time-based на владельце, ставка 166, exp08 v3, вахта весов Pro-0813); новые 180 (prices_checked одно поле) и 181 (консент-число ребилла врёт по историческим ценам); ToS-дельты нет (Wayback-дифф 0) | ЖИВОЕ: посылка интерим-редактора D39.22 в пике перевёрнута (dspro дороже glm ×1.26) — вход ратификации фазы Д; coldrun-a пробивает потолок 0.25 новой ценой | жив | деньги вендор бэкенд приёмка |
|
||||
| D39.138 | 16.08 | Приёмка контракт-ревью research/28 (4 опровергателя, 42 улики исполнением, 0 опровергнуто; находка приёмки: К-10 закрывается «не строить»): решения владельца 16.08 ратифицированы — конвейер с провода (Progress один счётчик до остановки, знаменатель купленный), модель ошибок вариант B (машинный code+request_id, два класса конкретности §8а, К-9 грубым кодом), жанр выкинуть, дописывание глав POST /parts + гейт молчаливой перекупки, транспорт не менять (сжатие→ETag/304→скоуп→дельты), экспорт остаётся с Б-4, история прогонов не нужна, В-10 «вежливость», PD-104 закрыт (грант 0 на бете); батч 0.3.0 заказан отдельной спек-сессией (Б-1 первой; канон первым, компаньон вместе со спекой); 179 закрыта, новые 183–187 | ЖИВОЕ: промт батча — очередь №17; кросс-семейный проход доклада — отдельный заказ | жив | контракт владелец приёмка фронт платформа деньги |
|
||||
| D39.139 | 16.08 | Подрезка хвостов по слову владельца (D-лог: тела D39.107–123 в слайс, голова D39.124+, живое тело D39.106; PROGRESS: бэкенд-записи 14–15.08 в слайс 2026-08-14-15) + свип планировочных доков трёх зон: К-9/К-13/жанр/лестница фаз/0.2.2/S4-гейт вычищены из product-requirements и README, шапка 09-target освежена; зонам розданы аддендумы (платформа: $5-дефолт против PD-104, баннер §3 закрыт D39.132; фронт: пофазный прогресс §9/§6/§8 устареет батчем, Ф-59/Ф-37/Ф-39 диспозиции) | ЖИВОЕ: пол чтения D-лога = D39.124+ | жив | процесс докс оркестратор |
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Журнал решений оркестратора — контракт D1–D39.138 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||||
# Журнал решений оркестратора — контракт D1–D39.139 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||||
|
||||
> **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто:
|
||||
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+).
|
||||
|
|
@ -232,207 +232,7 @@
|
|||
|
||||
**3. Обязательные механизмы при постройке — research/25 §«Обязательные механизмы» (реконсилятор на каждый выход юнита + перезапуск после ребута · intent/`uncertain` + ночная сверка с провайдером · пиннинг версии бинаря на прогон · гейт потолка пер-вызов). Следствия: PD-59 superseded; пайп-путь `supervisor.go` P1 = дев-режим; ответ PD-13 переезжает на cgroup юнита прогона. Строка 103 и денежные строки единого бэклога — при освобождении PROGRESS.md; задачи зонам — промтами.**
|
||||
|
||||
## D39.107 — ЗАКРЫТИЕ СЕССИИ №14 И ПЕРЕДАЧА №15: P0 принят и заленден, по P1 выдан пул доработок (приёмка доработанного дерева — №15), D39.106 ратифицирован пятью верификациями (06.08). ✅
|
||||
|
||||
**1. Итог №14:** приёмка P0 платформы — ПРИНЯТ, заленден `eeeef89`+`954c034` (регистр PD-1..19) · направление платформы ратифицировано (`PLATFORM_DIRECTION.md`, `99c9cb0`) · решения владельца по кредитам записаны (`87be7b9`, `6469479`) · по P1 проведена адверсариальная проверка (43 посадки, 31 поймана; сверка с RFC 9700 · ASVS 5.0 L2 · OIDC Core) — она дала ПУЛ ДОРАБОТОК (регистр до PD-59), сессия платформы взяла его в работу, и **дерево зоны с тех пор сильно изменилось (≈40 файлов, новая миграция 00008) — эта доработка НЕ принята и НЕ залендена: полная приёмка изменённого дерева = №15** · **D39.106 ратифицирован** (шов: журнал в каталоге книги + systemd-юнит-на-прогон, платформа не родитель) после пяти верификаций — 4 чистых панели + кросс-чек GPT; фактура и требования к постройке — `research/25` · промт S3 актуализирован и готов к запуску (`6ac26f3`).
|
||||
|
||||
**2. Дельта норм (уроки №14, оплачены):** проверки ВНУТРИ репозитория ≠ приёмка решения — решения зон сверять с действующим первоисточником нормы (RFC/ASVS/спека) с номером раздела; слабая аргументация ≠ неверная позиция — сильные прецеденты искать САМОМУ до вердикта; свой контраргумент проверять чужими руками; допущения в ПОСТАНОВКЕ — такой же объект проверки, как ответ; изоляция панелей = запрет ФАЙЛОВЫХ тулов + аудит постфактум по journal.jsonl (сеть не запрещать — заземляет); адвокатская постановка покупает риторику за счёт строгости. Также в memory `acceptance-antipatterns`.
|
||||
|
||||
**3. Очередь №15 (PROGRESS CURRENT-STATE не обновлён — занят живым полигоном; обновить при его лендинге):** (1) **приёмка доработанного дерева платформы** после передачи: ВСЕ изменённые файлы, по `ENGINEERING_STANDARDS` §3, со СВОИМИ посадками (готовый тест PD-52 — в журнале зоны; батарею гонять с живым PG — рецепт стенда без root в `platform/docs/STACK_DECISIONS.md`), лендить pathspec-формой · (2) по освобождении PROGRESS.md: строка 103 = эмиттер журнала по `research/25` §эмиттер + 4 денежные строки (реконсилятор · uncertain-эскроу · сверка с провайдером · пер-вызовный гейт) + пиннинг версии; пересчёт очереди скриптом · (3) по команде владельца: промты бэкенду (эмиттер) и платформе (реконсилятор/тейлер/юниты; пайп-`supervisor.go` → дев-режим) — носители: D39.106 + research/25 включая пометки (GPT) · (4) приёмки полигона: экспы 18/19/20 живые · (5) незакоммиченное Приложение А (`14-api-contract/README.md`) — слово владельца · (6) запуск S3 — промт готов · (7) вахта deepseek-v4-pro (триггер прошёл) · (8) мини-проба флора (строка 44) одобрена, промт не выдан. **Грабли:** сессии зон ЖИВЫ, пока владелец не сказал обратного — платформа и полигон работают прямо сейчас; git только pathspec-формой.
|
||||
|
||||
## D39.108 — ПРИЁМКА ЭКСПОВ 18/19/20: приняты и залендены; закрытие D21.4/D21.10; курс на эксп-21 «топология ролей» (06.08). ✅
|
||||
|
||||
**1. Приёмка** (7 верификаторов: слепой вердикт до чтения отчёта · ре-раны «заявление=команда» · деньги из сырья двумя путями · бэкенд-пинги исполнением боевого Go-кода · охота вне карты · свип квирк-цитат; изоляция панелей аудирована по журналам). Экспы 18 (`41cde9f`) · 19 (`0c3b55f`) · 20 (`3d5d5d5`) ПРИНЯТЫ; квирк-отзыв §3б заленден (`bb82876`, §3а в силе). Несущие вердикты чисты ре-раном: закон-блок 21/21 · неверная строка банка 6/6 (вытеснение 5/6, единогласие 6/6) · контроль без блока ломает 5–12/20 · гейт Q4b «диффы откладываются» · фронтир терминолога не оправдан (конвенция 古月 = 18% голда — рычаг данных) · польза второго прохода = свойство пары модель×роль (dspro отрицателен, glm-5 положителен). Поправки приёмки — в ревью-шапках отчётов; главные: §5.2 экспа 20 НЕ персистирован (статус «со слов»; направление держит персистированный судья §5.3) · offblock-числа сняты до-фризовым стемом (черновик 16/41, не 18/41) · цена раунда починки не входила в дифф (lu/ON 0.89→1.08) · «вся сессия $2.1793» включала $0.107335 сырья research/24 — фактическая цена 18+19+20 = **$2.0720** · оба бэкенд-пинга: наблюдения верны, вердикты опровергнуты (микро-утечку ловит санитайзер; банкнота жива ран-локальным конфигом D39.42 п.4 — реальный дефект = декларация против shipping-конфига, строка 140). Фризы предшествуют платным вызовам (46 с · 21 с · 49 мин); amend `4d1d9e5` разобран по reflog — пре-рег-текст не трогал (девиация арма E + premise_review); процесс-нота: девиации оформлять новым коммитом, не amend'ом фриза. Эксп-20 шёл без фриза — принят exploratory по санкции.
|
||||
|
||||
**2. Решения владельца 06.08:** санкции экспов 19/20 и подъёмы потолков — CONFIRM · лендинг и актуализация доков санкционированы · направление эксп-21 подтверждено · норма «гард проклятия знанием» (онбординг-блок проблемы в каждом хендофф-промте) вписана в промт оркестратора п.1а.
|
||||
|
||||
**3. Эксп-21 «топология ролей» — промт выдан** (`docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md`); двойной аудит: слепая панель 3 линз без файловых тулов (изоляция чиста) + полноконтекстный анти-паттерн-агент. Добавки панели, принятые в промт: арм F do-nothing (потерянная норма exp15:486) · MQM-lite/error-span протокол + мощность/MDE и шумовой пол ДО бейк-оффа · guarded+routed арм G · обратная связка E · Палладий-линт транскрипции · мини-проба глоссарий-лока · факторная рамка на замороженных черновиках · декой D39.46(б) и запрет судьи семейства жильца · пере-проба маппинга dspro до Ф1 (вахта 108). Потолки ПРЕДВАРИТЕЛЬНЫЕ (≈$7.3 стадиями с ранним отсевом; пере-сверка сметы после предзамера мощности — обязательна); запуск = слово владельца. Два тезиса разжалованы в гипотезы бейк-оффа (анти-соглашательство): «экономическое оправдание черновика пало» и «черновик = опора верности».
|
||||
|
||||
**4. Закрытия и диспозиции:** **D21.4 (арм minimal-diff с тирингом) и D21.10 (поручение спеки апплая) ЗАКРЫТЫ явно** по букве гейта Q4b (exp15:147): аппликатор построен полигоном и замерен (15/15; комплаенс 0.966 на боевой единице), диффы отложены; реактивация — через строку 106/эксп-21. Строки **135–144** заведены (денежный пакет шва D39.107 п.2: пер-вызовный гейт · uncertain-эскроу · сверка с провайдером · реконсилятор · пиннинг версии; находки приёмки: банкнота-декларация 140 · дыра сносок 141 · механизм починки-по-флагу 142 · норматив судейства 143 · вахта grok-биллинга 144); строки 103/106/134/65/55/12 пере-диспозиционированы. Исполненный промт пробы 18 архивирован. PROGRESS CURRENT-STATE обновлён на №15 (долг D39.107 погашен).
|
||||
|
||||
## D39.109 — ПРИЁМКА ПЛАТФОРМЫ P1+P2: приняты и залендены одним коммитом; регистр до PD-107, одна major; два вопроса владельцу (07.08). ✅
|
||||
|
||||
**1. Вердикт.** Дерево зоны `platform/` (30 изменённых отслеживаемых файлов, 22 новых, миграции 00004–00008) ПРИНЯТО и заленжено. ⚠ **Факт, который доки завышали:** журнал зоны объявлял «P1 ПРИНЯТ и заленден» — в git код P1 не уезжал (`git ls-files platform/internal/login` = 0 до этого коммита), уехали только P0 (`eeeef89`/`954c034`), направление (`99c9cb0`) и решения владельца (`87be7b9`/`6469479`). Формулировка исправлена на месте с пометкой оркестратора; строки регистра ошибки не несли — они честно говорят `fixed(P1, дерево сессии)`. Живой уязвимости приёмка не нашла.
|
||||
|
||||
**2. Метод — исполнением, второй рубеж по своей карте.** Батарея пере-прогнана мной: офлайн зелёная (линтер 0 issues), с живым PostgreSQL 18.4 без root — **скипов ноль** (26 БД-тестов отработали), `make vuln` чист. **Свои 45 мутаций в четыре батча по СВОЕЙ карте несущих свойств (не по таблице пинов зоны): 33 поймано поимённо, 8 выжило, 4 моих посадки оказались негодными и разобраны вслух.** Мутации ставились в КОПИИ зоны вне репозитория — незакоммиченное дерево сессии не тронуто, сверено хешами диффа до и после. Живые пробы на боевом бинаре: PD-2 (10 полу-кормленных POST отпущены на 30.0 с), пять форм CSRF, ПТ-34-заголовки, RFC 9207 (Google действительно шлёт `iss`; сорванный → `issuer_missing`, чужой → `issuer_mismatch`, обмена кода нет). PD-71 пере-проверен своим прогоном на боевых данных: `DownTo(4)` падает на `users_email_key` SQLSTATE 23505, данные целы. Фаззеры: 3.0 и 3.35 млн исполнений, крэшеров нет. **Цитаты норм сверены по первоисточникам, не по пересказу** — RFC 9700 §4.4.2/§4.4.2.2, NIST SP 800-63B-4 §2.1.3, ASVS 5.0 7.1.1/7.1.2/7.1.3/7.6.1/7.6.2 дословны, номера и уровень L2 верны; это несущая проверка, на этих цитатах стоит смена боевого значения 90 → 30 суток. Плюс воркфлоу-панель: семь линз с зажатыми промтами (отчётные доки зоны запрещены) и адверсариальный опровергатель на каждую находку весом minor+ — 20 подтверждено, 2 опровергнуто.
|
||||
|
||||
**3. Ратифицировано (6 из 6):** абсолютный срок сессии **30 суток** (буква NIST AAL1; у прежних 90 обоснования не было) · контрмера mix-up = **`iss` авторизационного ответа (RFC 9207)**, миграция 00008, а не раздельные redirect URI (норма объявляет их фолбэком) · **`STACK_DECISIONS §13`** как документ соответствия ASVS 7.1.1/7.1.2/7.1.3 с прямо названным рассогласованием с федеративной сессией · **ломающие изменения зоны** (`NewServer` без `Timeouts` — устранение класса сильнее теста · `Prober.Ready` · `login.Fail` без `*http.Request`; внешних потребителей нет, фронт говорит по HTTP) · **`MemoryMax=80%` + явный `OOMPolicy=continue`** (сверено с `systemd.resource-control(5)`/`systemd.service(5)`; ⚠ под systemd не исполнялось) · **PD-71 принят риском** в форме зоны: правило append-only дороже доступности отката ниже версии 5, место записи — `deploy/README.md` у оператора.
|
||||
|
||||
**4. Найдено приёмкой: 29 строк PD-79…PD-107, одна major.** **PD-80 (major):** ведро лимитера одно на `/auth/login` и `/auth/callback`, а колбэк стирает login-куку ДО своей проверки лимитера ⇒ анонимный поток ~3 rps закрывает вход всем И добивает начатые входы невосстановимо (воспроизведено мной на бинаре и независимо панелью; фикс — порядок двух строк плюс раздельные ведра). Остальное minor/info, несущие: строковый `"null"` в `committed_usd` читается как НОЛЬ денег (PD-79, закрыть до воркера) · три «закрыто, но не запинено» по собственному правилу зоны — половина PD-3, лимитер PD-29, ветка обновления адреса (PD-83/84/85) · установка по наброску даёт нестартующий юнит и `ProtectHome` против «книги в `~/books`» (PD-91) · админ-CLI, единственный писатель денег, без единого теста (PD-106) · доккоммент `events.go` предлагает то, что PD-59 уже отклонил (PD-95) · дрейф реализованной поверхности `/auth/*`+`X-TM-Client` против контракта 14 (PD-96/остаток) · декодер и норматив зоны расходятся на дубле `seq`, и после PD-12 цена — убитый платный прогон (PD-105: разрешать ратификацией вместе с промтом эмиттера, строка 103) · удаление аккаунта обходит защиту PD-25 через каскад `users → reservations` (PD-107, гейт перед появлением такой операции).
|
||||
|
||||
**5. Опровергнуто приёмкой, включая свои промахи** (дисциплина «заявление=команда» действует и на приёмку): версия панели «удаление аккаунта падает на композитном FK при закрытых резервациях» — мой прогон удаляет · «`money` читает JSON `null` как ноль» — голый `null` даёт nil, дыра в СТРОКЕ `"null"` · «WARN на каждый отбитый вход = неограниченная запись в лог» — `AccessLog` и так пишет INFO на каждый запрос · моя посадка «грант фри-тира не запинен» НЕГОДНА (грант живёт в ветке новой личности; корректная посадка ловится тестом) · моё «падение `FuzzDecoder`» — голод по CPU от параллельных батчей, чистый прогон зелёный · PD-20 — калибровка, а не находка: пин вероятностный по природе дефекта. Отдельно названо, что `TestMigrationsRollBackAndReapply` откатывает ПУСТУЮ базу и для 00005 не доказывает ничего.
|
||||
|
||||
**6. Владельцу — два вопроса:** (а) срок сессии 30 суток означает, что не заходивший месяц человек увидит экран входа — если это против замысла, это одна переменная `TM_PLATFORM_SESSION_MAX_AGE` плюс явная запись отклонения в §13; (б) **новое (PD-104):** фри-тир печатается неаутентифицированным потоком по $5 за каждую новую подтверждённую пару `(provider, subject)`, агрегатного потолка и счётчика аномалий нет нигде — нужен ли суточный лимит грантов до открытия беты.
|
||||
|
||||
**7. Долг лендинга, названный вслух:** PROGRESS CURRENT-STATE **не обновлён** — файл занят живым полигоном (его пинг по эксп-21 лежит незакоммиченным, коммит `d472599` его же). Тот же случай, что D39.107 п.3: обновляет тот, кто лендит полигон. `docs/README.md` обновлён этим же коммитом (норма D39.80), промт P0 платформы получил баннер-исход.
|
||||
|
||||
**D39.109-эррата (07.08, по вопросу владельца — процессом НЕ поймано).** Приёмка №15 при лендинге пропустила, что **D39.106 п.3 снял пайп-транспорт**: «PD-59 superseded; пайп-путь `supervisor.go` P1 = дев-режим; ответ PD-13 переезжает на cgroup юнита прогона». Зонный журнал платформы при этом длинно доказывает обратное («канал остаётся stdout», SIGPIPE-аргумент), и я принял эту секцию как живое решение — классический анти-паттерн «связность вместо истинности»: аргументация убедительна, а голова D-лога её уже перекрыла. Ошибка ушла в мою же строку PD-95, которая ссылалась на снятый PD-59 как на действующий. **Исправлено:** секция журнала помечена SUPERSEDED с дословным перечислением ратифицированной формы (`research/25` §Форма: транзиентный systemd-юнит на прогон · платформа НЕ родитель · `events.jsonl` в каталоге книги как outbox-проекция коммитов SQLite · тейл платформой с курсором `(engine_run_id, seq)` в одной транзакции с эффектом; отвергнуты с нулём голосов: родитель+пайп 0/15, выделенный fd 3 — 0, stdout/journald как источник — 0) · PD-95 переписан на верное основание и поднят в вес (его прочтёт эмиттер-сессия как задание) · **PD-92 понижен до info** (дефект дев-пути: в проде родителя нет, `cmd.StdoutPipe()` не существует) · **PD-105 повышен** (при тейле журнала повторное чтение строк после краша читателя — НОРМА, значит норматив зоны «at-least-once, дубль не ошибка» буквально верен, а фатальный отказ декодера ему противоречит) · **PD-60 пере-диспозиционирован** (постановка про 64 КиБ пайпа устарела; переформулируется вместе со строкой 103 как «что делает движок, когда журнал не пишется»). Вердикт лендинга не меняется: код принят как дев-путь, которым его и объявил D39.107 п.3, — меняются ДОКИ зоны и вес трёх строк. **Носители работы существовали и до эрраты:** строка 103 несёт эмиттер уже в форме D39.106, строки 138/139 — реконсилятор и пиннинг версии, строка 126 — механизм поднятия потолка. **Урок в норму:** при лендинге зоны каждый вывод зонного дока, спорящий с транспортом или швом, грепается по D-логу на supersede ДО ратификации — «решение, живущее только в зонном доке при противоречащем каноне, — дефект синхронизации» (норма D39.99 п.4) действует и в обратную сторону: канон мог снять зонный вывод, а не только наоборот.
|
||||
|
||||
## D39.110 — ПОТОЛОК ПРОГОНА УПРАВЛЯЕМЫЙ: решение владельца 07.08 ратифицировано формой; фри-тир — предложение оркестратора на confirm; строка 145 заведена (07.08). ✅
|
||||
|
||||
**1. Решение владельца 07.08 (дословно по смыслу):** потолок управляется двумя вещами — «выключить потолок» и «выставить вручную с фронта»; форма — шкала в интерфейсе от минимума (ноль выбрать НЕЛЬЗЯ, подсвечен серым) до максимума баланса аккаунта, конкретный виджет на выбор исполнителя. **Ратифицировано формой, и форма сама снимает конфликт с Р7:** максимум = баланс ⇒ движок всегда получает положительное число, состояния «потолка нет» не существует, валидатор `book.go:250-251` («a ledger with no ceiling is forbidden, Р7») не правится и Р7 не амендируется. Носитель — пере-поставленная строка **126**.
|
||||
|
||||
**2. Три следствия, без которых форма неполна (добор оркестратора, каждое проверено кодом).** **(а) Единица шкалы — НЕ доллары, а главы (либо % баланса).** Тогда минимум объясняет себя сам («одна глава», ниже прогон бессмыслен — владелец сам отметил, что непонятно, какое минимальное число ставить), а **D39.84 остаётся цел**: читатель не видит структуру наших расходов, платформа сама переводит главы в доллары по оценке движка. Доллары на ПОЛЬЗОВАТЕЛЬСКОМ экране = осознанный амендмент D39.84, и это отдельное решение владельца, а не побочный эффект виджета (П-5 показывает процент ровно по этой причине). **(б) Это потолок ПРОГОНА, значит он не пишется в `book.yaml`.** Дизайн платформы объявлял её владельцем `book.yaml` и намеревался поднимать `ceilings.book_usd` правкой файла — тогда пользовательское число становится постоянной записью в данных движка, что смешивает зоны против D39.81/D39.85. В коде этого НЕТ (проверено: платформа только ставит `cmd.Dir`), значит форма выбирается бесплатно ⇒ **НОВАЯ строка 145**: движок принимает потолок аргументом прогона; сегодня ни флага, ни ENV не существует (`tmctl` таких флагов не имеет, значение идёт только через `Ceilings.BookUSD`, `stagerun.go:480,505`). Цена нулевая: `Ceilings` в `BriefHash` не входит (`book.go:280-297`) — ни снапшот, ни ре-билл не двигаются. **(в) Максимум шкалы = доступный остаток аккаунта.** ⚠ **ИСПРАВЛЕНО 08.08 приёмкой S3 (D39.115): первая редакция этого подпункта говорила «баланс МИНУС открытые холды» — это ОШИБКА, вычитание дважды.** `Hold` пишет в леджер отрицательную строку и тем же знаком двигает кэш баланса (`credits.go:179` → `appendLedger` `:297-305`), поэтому баланс УЖЕ не содержит открытых холдов; `Reserved` — отдельная справочная сумма. Замерено приёмкой на живом PG: грант $10, холд $1 → `Balance=9.000000`, `Reserved=1.000000`, а «баланс минус Reserved» дало бы $8. Поймала фронт-сессия S3 чтением Go-кода платформы, а не доков — и ради этого нарушила мой же запрет ходить в чужую зону. Платформа берёт холд на сумму потолка ДО спавна, поэтому ползунок в упоре запирает весь баланс на одну книгу и вторую начать нельзя; `ReadAccount` уже отдаёт `Balance` и `Reserved` раздельно, данных хватает.
|
||||
|
||||
**3. Фри-тир — вопрос владельца («а как это обычно делается в бэкендах?»), ответ и ПРЕДЛОЖЕНИЕ, а не ратификация.** Разделяется на две половины, и стандартный ответ есть только у одной. **Где живёт начисление:** учебник — промо-кредит пишется строкой леджера в ТОЙ ЖЕ транзакции, что создание аккаунта, идемпотентно по `(аккаунт, source, source_id)`; код зоны это уже делает верно (`upsertIdentityTx`), менять нечего. **Стреляет ли само:** норма — «автоматически, но с ЯКОРЕМ, который стоит абьюзеру денег» (карта на файле — AWS/GCP; телефон — OpenAI добавил его к своим $5 после фарминга; инвайт), плюс бюджет кампании отдельной суммой и алерт при упоре. `email_verified` от Google якорем НЕ является — аккаунты бесплатны и создаются пачками, признак доказывает существование ящика, а не отдельного человека. У нас нет ни одного из трёх, а деньги — предоплаченные ключи владельца. **Предложение: на бете дефолт в НОЛЬ и начисление руками** (платёжного инструмента нет ⇒ между скриптом и ключами нет ничего; бета-тестеров столько, что одна команда в шелле на человека не работа); при появлении платежей дефолт возвращается к $5 ВМЕСТЕ с суточным агрегатным потолком — якорь и потолок приезжают по одному поводу. Ждёт слова владельца; носитель — PD-104.
|
||||
|
||||
**4. Расхождение док↔код, чинится независимо от п.3:** реестр при закрытии PD-30 утверждает «аккаунт создаётся с нулём, начисление руками из админки», а код создаёт аккаунт С $5 (`config.go:73` дефолт `5 * 1_000_000` → `main.go:99` → `login.go:285`). Один из двух текстов лжёт прямо сейчас; строка PD-104 переписана и несёт оба факта.
|
||||
|
||||
**5. Счёт очереди пере-считан скриптом (норма D39.101):** всего **120** строк · зона бэкенд **62** строго / **79** широко · «скоро» **32** (добавлены 126 и 145).
|
||||
|
||||
## D39.111 — ПРОМТ S3 ДОПИСАН приёмкой платформы (управляемый потолок + запрет кросс-origin); фикс-пак платформы передан запиской (07.08). ✅
|
||||
|
||||
**1. S3 получил два новых пункта списка правок спеки** (`frontend/docs/S3_SESSION_PROMPT.md`, шапка списка пере-атрибутирована №15; промт НЕ запущен, поэтому правка файла легальна без релея). **В-трис — управляемый потолок прогона** по решению владельца 07.08 (D39.110): шкала от минимума до доступного остатка, ноль недоступен, виджет на выбор сессии, и три «делай РОВНО так» — единица ГЛАВЫ (доллары = амендмент D39.84, он не выдан) · максимум = баланс МИНУС открытые холды (иначе шкала в упоре запирает весь баланс на одну книгу) · потолок принадлежит ПРОГОНУ, не книге; пересчёт «главы → деньги» наружу не выходит вовсе. **В-кватер — фронт живёт на том же origin, и это факт, а не выбор:** CORS-слоя в платформе нет, preflight `OPTIONS` с чужим `Origin` получает 401 от гарда сессии (замер приёмки на живом бинаре, PD-96) ⇒ в деве ходить через прокси dev-сервера, кросс-origin не проектировать; `X-TM-Client` обязателен и на same-origin — он не про CORS.
|
||||
|
||||
**2. Фикс-пак платформы передан ЗАПИСКОЙ, а не отдельным промтом** — по прецеденту №14 (восемь пунктов жили разделом зонного журнала и были отработаны) и по норме пропорциональности: это точечные фиксы, а не дизайн. Носитель — раздел «Ратификация приёмкой P2» зонного журнала, фикс-лист там же с порядком. Состав: **PD-80** (единственная major — доступность входа: лимитер прежде очистки login-куки плюс раздельные ведра) · **PD-79** (строковый `"null"` = ноль денег, до появления вызывающего у `Settle`) · **PD-100** (колбэк глотает ошибки стора и discovery — класс PD-5, закрытый в `auth/`, но не в `login/`) · **PD-83/84/85** (три «закрыто, но не запинено» по собственному правилу зоны) · **PD-106** (админ-CLI — единственный писатель денег — без единого теста) · **PD-91** (установка по наброску даёт нестартующий юнит; `ProtectHome` против «книги в `~/books`») · **PD-95** (транспортный доккоммент — ДО промта эмиттера, иначе эмиттер-сессия прочтёт его как задание). **Граница пака названа явно:** PD-92/93/96/99/102/105/107 НЕ трогать — они латентны за воркером и эмиттером, и правка сейчас означала бы угадывание формы, которую задаёт строка 103.
|
||||
|
||||
**3. Условный пункт:** если владелец подтверждает предложение по фри-тиру (D39.110 п.3), в тот же пак заходит дефолт `SignupGrantMicroUSD` в НОЛЬ; расхождение док↔код (PD-104) чинится независимо от ответа.
|
||||
|
||||
## D39.112 — ВЕРИФИКАЦИЯ ЗАПИСЕЙ №15 НЕЗАВИСИМЫМ АГЕНТОМ: восемь фактических правок и восемь пробелов закрыты; поправка к D39.109/D39.110 (07.08). ✅
|
||||
|
||||
**1. Заказ владельца:** один чистый агент читает промт оркестратора и доки «где мы сейчас» и проверяет записи №15 по четырём осям — факты, пробелы, понятность холодной сессии, вода. Вердикт агента: «можно доверять С ПРАВКАМИ». Он пере-считал очередь своим скриптом (120 · 62/79 · «скоро» 32 — сошлось до строки), механически сверил ВСЕ `file:line` новых строк реестра (все существуют и говорят заявленное), пере-проверил номера норм по первоисточникам, прогнал `build`/`vet`/`test`/`golangci-lint` в зоне (0 issues) и подтвердил существование всех пинов ратифицированных решений. Не заверено им (стенд без Postgres): 45 мутаций, 26 БД-тестов, живые пробы на бинаре, `make vuln`, счёт фаззеров — остаются со слов приёмки, и так и помечено.
|
||||
|
||||
**2. Поправки к D39.109 — принять как исправление, буква нот не переписывается (D23.3).** **(а) п.3 пере-формулировал NIST.** Сказано «30 суток — БУКВА NIST AAL1»; по первоисточнику SP 800-63B-4 §2.1.3 буква иная: SHALL — только «установить определённый reauthentication overall timeout», сами 30 суток — **SHOULD**, и это интервал ре-аутентификации, который успешная ре-аутентификация СБРАСЫВАЕТ, а не неснимаемый предел; термин «absolute maximum session lifetime» принадлежит ASVS, не NIST. Верная формулировка: **NIST требует (SHALL) установить определённый overall-таймаут ре-аутентификации и рекомендует (SHOULD) не более 30 суток на AAL1; наш жёсткий абсолютный срок 30 суток этой планке соответствует и трактует её строже.** ⚠ **Поправка к поправке, внесена в тот же день по перепроверке у первоисточника:** первая редакция этого пункта утверждала со слов верификатора, что 30 суток — интервал, который успешная ре-аутентификация СБРАСЫВАЕТ. Проверено у NIST: документ этого НЕ говорит — про сброс там не сказано ничего, поведение оставлено открытым. Значит наше чтение «жёсткий предел, который ничем не продлевается» — НАШ выбор, и он строже нормы, а не вычитан из неё. Подтверждается только вторая половина находки верификатора: термин «absolute maximum session lifetime» в NIST действительно отсутствует, он из ASVS. **Урок сессии: верификатор убедителен, и его собственные подпункты подлежат той же сверке с первоисточником, что и проверяемый текст — иначе приёмка приёмки просто переносит доверие на шаг.** Зонные носителя (`STACK_DECISIONS §13`, `config.go:62-64`) цитируют верно — ошибка была только в ноте, то есть в источнике истины №1. Номера разделов всех трёх норм верны. **Замечание по прицелу:** 7.1.x требуют ДОКУМЕНТА, величину требуют 7.3.1/7.3.2 — если §13 будут судить как соответствие ЗНАЧЕНИЮ, ссылка нужна на 7.3.2, её нет ни в одном доке. **(б) п.4 сохранил снятое основание** «доккоммент предлагает то, что PD-59 уже отклонил»: PD-59 сам superseded (D39.106 п.3), эррата это признала и переписала строку реестра, но текст п.4 остался — читать через эту поправку. **(в) «Живой уязвимости приёмка не нашла»** — термин не определён и гасит единственную major. Верно так: уязвимости с потерей денег, данных или захватом сессии нет; отказ в обслуживании входа ЕСТЬ и воспроизведён (PD-80, класс `vuln`). Формулировка в зонном журнале и CURRENT-STATE исправлена.
|
||||
|
||||
**3. Поправка к D39.110:** п.1 назван «решение владельца (дословно по смыслу)» — оксюморон, запрещённый нормой «цитаты только дословные, овер-атрибуция — типовой провал»; читать как **пересказ** решения. Форма и три следствия не меняются.
|
||||
|
||||
**4. Закрытые пробелы (все — в носителях, а не в нотах, потому что сессии зон читают носители).** PD-100 объявлялся в составе фикс-пака, а в фикс-листе зонного журнала отсутствовал — **добавлен пунктом 7** · граница пака («PD-92/93/96/99/102/105/107 не трогать») жила только в D-логе, а фикс-лист говорил обратное «остальное по весу строк» — **перенесена в журнал пунктом 8, формулировка «по весу» снята** · пункт 6 фикс-листа был одиннадцатью строками истории моей ошибки без задания — **сжат до задания** («переписать доккоммент `events.go:6-12` под форму D39.106 ДО промта эмиттера») · «три строки блокируют деплой и воркер» не называли, какие — **названы поимённо** (PD-91 деплой · PD-79 воркер · PD-95 промт эмиттера) · счёт весов регистра отстал от эрраты — **пере-считан скриптом: 37 открытых, 3 major, 14 minor, 20 info**, исправлен в двух местах · PD-105 нёс `minor` в колонке при «повышен» в теле — **колонка приведена** · словарь классов в шапке реестра не знал `doc`/`standards`, введённых новыми строками — **дописан** · PD-60/PD-61 выпали из списка «разрулить до промта эмиттера» — **возвращены** · пересчёт «главы → деньги» и ручка границ шкалы не были поручены никому — **носитель назван в строке 126** (считает платформа, поверхность объявляется правкой спеки; ручки в контракте сегодня нет) · «CONFIRM владельца на 30 суток» стоял в CURRENT-STATE как полученный, а в ноте и журнале — как открытый вопрос: **confirm получен 07.08, тексты сведены**.
|
||||
|
||||
**5. Два пробела класса «повторил свой же урок».** **(а)** Эррата D39.109 ввела правило «каждый вывод зонного дока, спорящий со швом, грепается на supersede ДО ратификации» — и не применила его к ПОТОЛКУ: раздел П-5 зонного журнала продолжал объявлять платформу владельцем `book.yaml`, хотя D39.110 п.2(б) это отменил в тот же день. Абзац помечен SUPERSEDED. **(б)** Голова CURRENT-STATE отставала — **третий раз в истории проекта** (после D39.81 и D39.83, оба названы в промте оркестратора): нота D39.111 была ратифицирована, а шапка показывала D39.110. Механический чек головы обязателен ПОСЛЕ каждого аппенда, а не после «важных».
|
||||
|
||||
**6. Не минтить номера чужим сессиям.** CURRENT-STATE ввёл «оркестратор №16» для параллельной приёмки полигона — при том что счётчик объявлен каноническим и ОДНИМ, живёт в промте оркестратора и показывает №15, а по D-логу №16 не существует. Номер снят: второй оркестратор назван ролью («параллельный, приёмка полигона»), номер выдаёт тот, кто пишет ему промт.
|
||||
|
||||
**7. Долг, оставленный сознательно:** срез хроники PROGRESS в архивный слайс (живой хвост несёт №11–№13, эра D39.91–105, всё закрытое) — НЕ сделан, потому что файл держит живая полигон-сессия, а срез это перекладывание сотни строк в контендящемся файле. Режет тот, кто лендит полигон. Туда же: архивация отработанного `PLATFORM_SESSION_PROMPT.md` (баннер-исход на нём стоит) — после приёмки фикс-пака, чтобы не ломать ссылку живой сессии.
|
||||
|
||||
## D39.113 — ИНЦИДЕНТ 08.08: агент панели откатил незакоммиченные правки двух параллельных сессий; один файл восстановлен, шесть потеряны; норма изоляции панелей ужесточена (08.08). ✅
|
||||
|
||||
**1. Что произошло.** В 00:13:39 агент воркфлоу-панели, которому я дал шелл, попытался работать в песочнице; его `cd` молча провалился (каталог песочницы исчез между вызовами), и следующая команда той же строки — `git reset -q; git checkout -q -- .` — отработала в РЕАЛЬНОМ рабочем дереве. Подтверждение: `git reflog` — два `reset: moving to HEAD` с этой меткой времени. Откатились незакоммиченные правки СЕМИ отслеживаемых файлов двух чужих сессий (полигон эксп-21 и параллельный оркестратор его приёмки). Коммиты обеих сессий целы; нетрекаемые файлы (`eval/role_topology/phase2b.py`) уцелели — `checkout -- .` их не трогает.
|
||||
|
||||
**2. Корень — МОЯ ошибка проектирования панели, не поведение агента.** Две причины, обе мои: (а) трём агентам панели я выдал ОДИН путь скрэтчпада, и они затирали друг другу подкаталоги — отсюда исчезнувшая песочница; (б) агентам с шеллом не был запрещён `git`, меняющий состояние дерева, при том что промт панели содержал запрет «ничего не редактируй в репозитории» — запрет прозой против команды, которая правит дерево не редактором, а git-ом. Прецедент этого класса в проекте уже был (урок 09.07: перезапись истории оркестратором стёрла незакоммиченные правки полигона) и не был превращён в механизм.
|
||||
|
||||
**3. Восстановлено одно из семи.** `docs/PROGRESS.md` — пинг полигона (26 строк секции «Полигон») восстановлен из моего собственного бэкапа, снятого в 00:08 при тестировании хука, за пять минут до инцидента; сверено, что дельта к HEAD = ровно эти 26 строк и ни одной моей. ⚠ Правки полигона в окне 00:08–00:13:39, если они были, в бэкап не попали. **Потеряно безвозвратно** (git-объектов нет — файлы не стейджились, `git fsck` и полный обход `--batch-all-objects` по маркерам дали пусто): незакоммиченные правки `docs/experiments/21-role-topology.md` · `docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md` · `docs/architecture/14-api-contract/README.md` (заполненное Приложение А от №14 — в HEAD осталась ЗАГОТОВКА с плейсхолдерами) · `eval/role_topology/absjudge.py` · `drift.py` · `verify_report.py`. Инвентарь и уцелевшие материалы — в скрэтчпаде сессии, записка `ИНЦИДЕНТ_08-08_потери.md`; текст Приложения А я держу в контексте и отдаю как РЕКОНСТРУКЦИЮ-черновик, а в дерево сознательно не писал: подменить потерянный файл правдоподобным хуже честной дыры.
|
||||
|
||||
**3-эррата (08.08, по ответу параллельного оркестратора — моя таблица потерь ошиблась в двух местах).** **(а) Неверная атрибуция.** Я записал незакоммиченные правки `docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md` как потерю ПАРАЛЛЕЛЬНОГО ОРКЕСТРАТОРА. Он это опровергает и грунтует: после лендинга `73a7e7a` он не держал в этом файле ничего незакоммиченного, HEAD (21838 байт) — его финальная версия. Модифицированное состояние файла до инцидента принадлежало ПОЛИГОНУ, который аннотировал промт (требование ригов, стр. 59); суть той правки уцелела в пинге, а её ратификация — работа приёмки полигона. Атрибуция исправлена здесь; в потерях у параллельного оркестратора не осталось ничего, кроме Приложения А, унаследованного от №14. **(б) Ущерб отчёта я преуменьшил.** Я записал «незакоммиченные правки отчёта»; фактически на HEAD лежит ВТОРАЯ-ТРЕТЬЯ редакция (деньги стр. 49: «$4.85… третья $0.55»; слов «четвёртая/пятая» в файле нет), а пинг описывает ПЯТУЮ ($4.92166, absjudge, агенты-судьи, семейство Холма из семи). Потеряны две ЦЕЛЫЕ редакции, а не правки. **(в) Восстановление полигоном оказалось неточным:** параллельный оркестратор нашёл в восстановленном `eval/role_topology/verify_report.py:237` затенение `med = med(costs)` при функции `med` на строке 53 — `UnboundLocalError` на первой итерации, секция ЭКОНОМИКА и всё после неё не исполняются. Пере-проверено мной по коду: находка верна. Чинит полигон (его зона); для приёмки это значит, что «восстановлено из контекста» ≠ «восстановлено верно», и восстановленное подлежит той же проверке исполнением, что и новое.
|
||||
|
||||
**4. Норма (жёстче прежней, потому что прозой не сработала).** Агенту панели с шеллом: **свой каталог песочницы на КАЖДОГО агента** (общий путь = гонка и исчезающие каталоги) · **запрет на state-changing git явным перечислением** (`reset` · `checkout --` · `restore` · `clean` · `stash` · `add` · `commit`), а не общей фразой «не редактируй» · перед панелью, работающей в дереве с чужими незакоммиченными правками, **снимать бэкап этих правок** (`git diff > файл` вне репозитория) — сегодня спас именно случайный бэкап, а не процедура · формулировка «работай в копии» без выданного пути и без проверки, что копия существует, — приглашение к этому же инциденту. ⚠ Для читающего дальше: три доступных мне механизма изоляции (worktree на агента, запрет тулов, копия репозитория) не были применены ни один.
|
||||
|
||||
## D39.114 — ФИКС-ПАК ПЛАТФОРМЫ (P3) ПРИНЯТ И ЗАЛЕНДЕН: девять строк регистра закрыты, 8/8 моих посадок поймано, PD-80 и PD-91 пере-проверены исполнением (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, заленден `99f049c` (18 файлов, +856/−86). Отработаны все восемь пунктов фикс-листа приёмки P2; закрыты **PD-79 · PD-80 · PD-83 · PD-84 · PD-85 · PD-91 · PD-95 · PD-100 · PD-106**. Приёмка по весу пака — инлайн и своим исполнением, без панели (норма пропорциональности; после инцидента D39.113 панели без слова владельца я не запускаю).
|
||||
|
||||
**2. Метод.** Батарея пере-прогнана мной: офлайн и с живым PostgreSQL 18.4 под `-race` — все десять пакетов зелёные, включая новый `cmd/tmplatformctl`, линтер 0 issues, `make vuln` чист. **Свои посадки — 8 из 8 поймано поимённо**, в копии зоны вне репозитория; посадки ставились В СВОЙСТВО каждой закрытой строки, потому что предмет проверки фикс-пака — именно карта пинов зоны, а не поиск мимо неё. ⚠ Первая редакция моей посадки PD-100 была нацелена мимо (регексп снял соседний лог) и «выжила»; точная посадка ловится `TestInfrastructureFailuresInTheCallbackAreLogged` — записано, потому что «заявление=команда» действует и на приёмку.
|
||||
|
||||
**3. Пере-проверено исполнением, не со слов.** **PD-80** на собранном бинаре: сорок запросов выжигают ведро `/auth/login`, после чего честный колбэк с живым state получает **400, а не 429** — бюджет завершения входа флудом начала больше не тратится (до фикса тот же сценарий давал 429 со стёртой login-кукой; воспроизводилось дважды независимо). **PD-91**: замер зоны воспроизведён моими руками — `systemd-run --user --wait -p ProtectSystem=strict -p ReadWritePaths=<несуществующий>` даёт `226/NAMESPACE`, тот же путь созданным даёт `0/SUCCESS`. Способ проверки БЕЗ sudo зона нашла сама, и это сильнее, чем предполагала строка PD-91: свойства песочницы теперь измерены, а не вычитаны из доки; что не проверено (юнит целиком, `MemoryMax`/`OOMPolicy`) названо на месте. **PD-95**: доккоммент `events.go` несёт ратифицированную форму D39.106 — устранён риск, что эмиттер-сессия прочтёт снятую форму как задание.
|
||||
|
||||
**4. Ратифицировано отдельно: PD-104 оставлен открытым ПРАВИЛЬНО.** Зона починила половину док↔код (ячейка PD-30 больше не обещает нулевой аккаунт при автогранте) и строку не закрыла, потому что продуктовая половина — ноль на бете, суточный агрегатный потолок, счётчик аномалий — ждёт слова владельца. Это правило PD-83 («свойство без пина закрытым не считается»), применённое зоной к себе.
|
||||
|
||||
**5. Оговорка зоны принята как честная:** адверсариального ревью вторым читателем у P3 не было — сессия без права на субагентов. Второй читатель — эта приёмка. **Живой счёт регистра руками больше не переписывается** (норма D39.112): `python3 docs/scripts/counts.py`; исторические числа в CURRENT-STATE помечены историческими, а литерал веса снят с автопроверки, потому что легитимного живого носителя в зоне `docs` у него нет.
|
||||
|
||||
## D39.115 — S3 «СЛОЙ ДАННЫХ» ПРИНЯТ И ЗАЛЕНДЕН: контракт 0.2.0 в каноне, три ошибки ОРКЕСТРАТОРА поймала сама сессия, правило 0.x ратифицировано (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, заленден `60595f6` (46 файлов). Пере-прогнано мной: `npm run check` — 108 тестов, prettier/eslint/stylelint/tsc чисты, spectral по спеке без замечаний; `npm run check:full` — сборка плюс СЕМЬ кадров с axe, включая новый маршрут `/partial` (отказал один рид при рабочих остальных — ветка жила незамеченной именно потому, что её нельзя было открыть по ссылке). Кадр `/scale` прочитан глазами: пер-главный счётчик замечаний на месте, и честно оставленный Ф-30 виден прямо на экране — глава без заголовка показана голым номером «12», а не выдуманной «Главой N».
|
||||
|
||||
**2. Три моих ошибки, найденные сессией. Это главный результат пака.** **(а) «Максимум шкалы = баланс МИНУС открытые холды» (D39.110 п.2(в), строка 126, промт S3 п.17) — НЕВЕРНО, вычитание дважды.** `Hold` пишет отрицательную строку в леджер и тем же знаком двигает кэш баланса (`credits.go:179` → `appendLedger` `:297-305`), значит баланс УЖЕ не содержит открытых холдов, а `Reserved` — справочная сумма. Пере-мерено мной на живом PostgreSQL: грант $10 и холд $1 дают `Balance` 9.000000 при `Reserved` 1.000000, а моя формула дала бы 8 — шкала вдвое короче правды. Исправлено во всех трёх носителях. **(б) Форма `nullable: true`,** которую я вписал в промт для `GET /usage`, в OpenAPI 3.1 невалидна; сессия выразила через `oneOf` с `type: 'null'`, как во всей остальной спеке. **(в) Инструкция ВНУТРИ нормативного дока протухает от исполнения:** я оставил в шапке спеки фразу «version всё ещё `-draft` — S3 бампнет первым действием», и после бампа она стала ложной; сессия заменила её на правду и назвала это отступлением вслух. Тот же класс, что рукописные производные числа (D39.112): предписание, записанное в артефакт, живёт до первого действия.
|
||||
|
||||
**3. Норму «не ходить в чужую зону» АМЕНДИРУЮ, потому что она и была источником (а).** Сессия объявила вслух, что нарушила мой запрет и читала Go платформы (только чтение, ничего не тронуто) — и ровно этим нашла ошибку в моей ратификации. Новая формулировка: **в чужую зону НЕ ПИСАТЬ; ЧИТАТЬ код для сверки несущего утверждения — можно и НУЖНО**, потому что доки врут, и это норма проекта («не верь заголовкам, грунтуй `file:line`»). Запрет читать превращал сессию в заложника моего текста. Отдельно: раскрытие нарушения вслух — правильное поведение, и его надо поощрять, а не наказывать.
|
||||
|
||||
**4. Ратифицировано.** Форма управляемого потолка — `GET /books/{bookId}/run-options` → `CeilingBounds` отдельным ресурсом, а не полем карточки книги (максимум зависит от АККАУНТА и двигается, когда книга не менялась; карточка кэшируется библиотекой и назвала бы протухший максимум ровно в момент выбора) · три числа вместо двух, `max_chapters` приходит уже подрезанным и клиенту подрезать второй раз запрещено, `default_chapters` — продуктовая политика платформы, `max_chapters: 0` легален и означает «прогон начать нельзя» · `ceiling_chapters` обязателен в запросе старта и на `Run` · `409` покрывает «потолок больше не помещается». **Правило версий 0.x:** минорный бамп — законная полоса ломающих правок (semver §4), клиент пинит точную 0.x-версию; с 1.0.0 действует общее правило. Сессия НЕ стала править раздел Versioning своей рукой, а назвала противоречие — это верно, правило версий принадлежит владельцу контракта; вписано мной в обе копии. **Блоки компаньона 2.14 (поверхность входа) · 2.15 (потолок) · 2.16 (тот же origin — факт, CORS-слоя нет)** внесены в канон; патч-файл `S3_CONTRACT_HANDOFF.md` применён и удалён, как он сам себя и объявил.
|
||||
|
||||
**5. Канон и зонная копия снова байт-равны** (`ba7f3745…`), spectral по обеим чист.
|
||||
|
||||
**6. На владельце — три вопроса, сессия их назвала сама.** (а) Метка «остановлена: лимиты» в дереве — сжатие ратифицированной фразы «перевод остановлен: лимиты исчерпаны», сделанное сессией; продуктовые слова по В-3/Ф-21 не её. (б) **К-13 (Ф-31): упереться в СВОЙ потолок прогона и остаться без кредита сегодня неразличимо** — `paused_reason` имеет одно значение `credit_exhausted`, и первому из двух фраза врёт, а следующее действие у него другое. (в) Ф-30: глава без заголовка показана голым порядковым номером, потому что синтез «Глава N» запрещён К-3; это вопрос В-4, уже стоящий владельцу. Плюс три поля, придуманные сессией по её собственному признанию и ратифицированные мной выше: `default_chapters`, `maxLength: 200` у заголовка, `paused_reason` в кадре статуса.
|
||||
|
||||
**7. Открытые хвосты зоны, заведённые честно:** Ф-29 (мок едет в прод-бандл — цена того, что скриншот-цикл гоняет прод-сборку; папка удаляется в день живой платформы) · Ф-32 (замечания читаются пер-книжно, показываются пер-главно: экран починен, память нет — на книге с тысячами замечаний клиент тянет весь список ради трёх строк) · `ceiling_chapters` обязателен сегодня бесплатно, после первого реального прогона это станет ломающей правкой.
|
||||
|
||||
## D39.116 — АКТУАЛИЗАЦИЯ ДОКОВ: 78 находок свипа, отработанные промты в архив, живая ошибка счёта исправлена, три строки заведены (08.08). ✅
|
||||
|
||||
**1. Заказ владельца:** полная актуализация — занести незанесённое, перенести в архив сделанное, убрать воду, снять stale. Метод — read-only фан-аут по четырём осям (активные промты · stale-факты · вода и дубли · незанесённые обязательства) по ВСЕМ 107 живым докам (~25 тыс. строк), правки делал я. **Изоляция панели по норме D39.113:** свой каталог каждому агенту, запрет state-changing git перечислением (плюс тот же запрет теперь в `deny` настроек — проверено, `git stash list` отбивается), бэкап всего чужого незакоммиченного снят ДО запуска. Итог свипа: **78 находок** — 14 по промтам, 29 stale, 19 воды, 16 незанесённых.
|
||||
|
||||
**2. Живая ошибка в МОИХ числах, найденная и исправленная.** Счётчик `docs/scripts/counts.py` читал колонки таблицы СЛЕВА, а строка бэклога 127 законно несёт `seed|ruby|auto` внутри ячейки — разбор принимал за зону слово «ruby». В CURRENT-STATE стояло «зона бэкенд 62 строго / 79 широко» при истине 63/80. Исправлено: колонки читаются С КОНЦА (хвостовые короткие и `|` в них не бывает), **битая форма строки теперь расхождение, а не тихий `IndexError`**, голова берётся по МАКСИМАЛЬНОМУ номеру, а не по последней строке файла (в D-логе уже есть внеочередные аппенды `D39.17`→`D39.19`→`D39.18`), регекспы больше не прибиты к эре `D39`. Все четыре дефекта назвала панель ревью, ни один не был моей находкой.
|
||||
|
||||
**3. Отработанные промты — в архив с баннером-исходом.** `frontend/docs/S3_SESSION_PROMPT.md` (исполнен двумя сессиями, принят D39.115) и `platform/docs/PLATFORM_SESSION_PROMPT.md` (ЧЕТЫРЕ сессии, P3 принят D39.114) → копии в `docs/archive/prompts/`, указатели `docs/README.md` переписаны. Цена отсутствия баннера была названа прямо: следующая фронт-сессия открыла бы S3-промт с императивом «первый шаг — правки спеки» и **откатила бы ратифицированный контракт 0.2.0**. Из платформенного баннера убран рукописный перечень живых PD-строк — он разошёлся с реестром на первом же фиксе, то есть я сам нарушил свою же норму D39.112 «один носитель на факт»; заменён указателем на скрипт и реестр.
|
||||
|
||||
**4. Снятые stale, которые сработали бы на холодной сессии.** Живой бэкенд-промт нёс «в дереве живёт ЧУЖОЕ `platform/*`, ждёт приёмки P0» — платформа принята и залендена, а РЕАЛЬНО живая параллельная работа (полигон) в промте не названа вовсе; заменено на «сверь `git status` в начале сессии» с указанием живой зоны. Тот же промт велел писать пинг в `docs/PROGRESS.md` без протокола — файл держат три сессии, и его секция уже терялась (D39.113); дописан протокол «только append своей секции, CURRENT-STATE не касаться». `POLYGON_PACKAGE4` §1 требовал исполнить сид-обогащение, исполненное D32, указывая на МЁРТВЫЙ `guzhenren-seed.yaml` v1 при живом v2 — помечено исполненным. Компаньон КАНОНА контракта четверо суток называл себя «черновиком фронт-сессии S3 на ратификацию» — тот же класс, что шапка `info` спеки, исправлено. Зонный журнал фронта в «Текущем состоянии» говорил «S3 НЕ сделана, контракта нет» против собственной хроники; журнал платформы — «дерево НЕ закоммичено, ждёт приёмки» после лендинга. Висячие ссылки на удалённый патч `S3_CONTRACT_HANDOFF.md` починены в трёх живых доках (в D-логе оставлены как история — append-only).
|
||||
|
||||
**5. Заведены строки 146 · 147 · 148** (обязательства без носителя): два техдолга движка, жившие только в справочнике якорей (`prices_checked` гейтит $0-путь · `cache_write_per_m` под один TTL) · транспортные частичные research/21 §16–17 (HTTP/1.1-escape как диагностика тихого усечения · assistant-prefill continuation вместо ре-рана) · **восстановление Приложения А контракта после инцидента** — решение владельца. Счёт очереди пере-выставлен скриптом: **123** строки · бэкенд 64 строго / 82 широко · «скоро» 33.
|
||||
|
||||
**6. Норма изоляции панелей перенесена из D-лога в промт оркестратора** — она жила только в ноте, а читают промт. Там же пустой заголовок «Текущее состояние и очередь — НЕ здесь» получил тело: где именно они живут и что числа берутся скриптом.
|
||||
|
||||
**7. Что НЕ сделано и почему.** Срез хроники PROGRESS в архивный слайс (живой хвост несёт №11–№13, эра D39.91–105) — не делал: файл прямо сейчас держит полигон-сессия, а срез это перекладывание сотни строк в контендящемся файле, то есть способ потерять чужую работу второй раз за сутки. Режет тот, кто лендит полигон. Из 78 находок закрыт первый эшелон (промты, статусы, висячие ссылки, незанесённое) — остаток воды (дубли пин-таблиц, историческое тело `API_CONTRACT_DRAFT.md`, §1 «как есть» в `09-target-architecture.md`) в этот проход не тронут: он не вводит сессию в заблуждение, а только удлиняет чтение.
|
||||
|
||||
## D39.117 — ЭКСП-21 ПРИНЯТ; подтверждения владельца по тратам и агент-судейству получены; строка 65 закрыта; курс — эксп-22 «панель жильцов» + Sol-арбитраж (08.08, параллельный оркестратор — приёмка полигона, мандат владельца 08.08). ✅
|
||||
|
||||
**1. Вердикт: ПРИНЯТ.** Проверено исполнением 08.08: `verify_report.py` — 90 проверок, ноль провалов, код 0; `itog.py` пере-снимает каждое число ИТОГа из сырья, код 0. Встречные аудиты полигона (снизу вверх / сверху вниз) приняты; мой краш-репорт `med = med(costs)` (`verify_report.py:237`, неточное восстановление после инцидента D39.113) полигоном починен, линтер зоны заведён. Приёмка по норме пропорциональности — инлайн + исполнение гейтов, без панели. Механика — пинг «Полигон» и §18 отчёта, здесь не дублируется (D39.112).
|
||||
|
||||
**2. Подтверждения владельца 08.08** (в чате этой сессии; пересказ, не цитаты): **(а)** траты 07.08 — устная санкция владельца по ходу сессии БЫЛА и подтверждена («я разрешал тратить»); против буквы промта пробития остаются зафиксированными в отчёте, промт эксп-22 закрывает класс механическим стопом и тестом кассы на свои теги. **(б)** Амендмент «судья пака не покупается за токены» (агент-судейство вместо платного) — подтверждён ⇒ числа §11–§18 легитимны, платный пере-суд не нужен. **(в)** Правка риг-требований («оба порядка» → абсолютная шкала) — это девиация от промта ОРКЕСТРАТОРА, не решение владельца, ратифицирую сам: требование зеркальности писалось под платного ПАР-судью; в абсолютном протоколе позиции пары не существует, а позиционный сдвиг замерен и вычтен (+0.147/шаг метки); все четыре агента независимо свернули парные пакеты в абсолютные оценки — инструмент сам отверг форму. Для ПАРНЫХ предъявлений (Sol-пакеты) оба порядка остаются обязательными.
|
||||
|
||||
**3. Диспозиции гейт-строк (гейт «эксп-21» исполнен).** **142** — точечная починка ОТКЛОНЕНА как замена редактора (`C2/A_law` −3.75 Holm 0.0006; при реальной детекции не лучше черновика, `C2/F3` −0.94; гипотеза эксп-20 «$0.0002 чинит всё» мерилась при идеальных флагах и пала) и ПРИНЯТА формой «механический пре-гейт ПЕРЕД редактором» (брак 5 клеток против 10/23 при половинной цене $0.00298/$0.00602; ремонт ТОЛЬКО с банком — без банка ломает канон 0.917→0.895); стройка — бэкенд-промтом по команде владельца. **65** — ЗАКРЫТА: движки dspro/glm-5 неразличимы (`A/B` +0.06 p=0.95; `A_law/B` −0.69 порога не проходит) ⇒ жилец редактора — вопрос ЦЕНЫ, то есть конфиг; остаток строки (слепое чтение инструментарием D39.8(3)) переезжает в Sol-протокол, строка 150. **106** — НЕ закрывается: эксп-21 дал довод против диффов (полный regen выигрывает у ремонта), но с оговоркой полигона — чинил дешёвый фиксер по предложению, а не сильный редактор узким мандатом; гейт «перепроверить до стройки» в силе, приоритет понижен. **55** — частично закрыта (направление главного вывода воспроизведено на чистом en-материале, узнавание 1/5); остаток «неконтаминированный zh-срез» — заказ ПОВТОРЁН эксп-22 Ф0 жёстко: эксп-21 его не исполнил (главный zh-замер на книге 4/5, без пинга).
|
||||
|
||||
**4. Опровергнута продуктовая строка D39.108 «второй проход на dspro отрицателен по слепому суду»** — она стояла на непersisted замере §5.2 эксп-20 и была помечена «со слов»; эксп-21 честным ригом дал обратное (`A/F3` +2.50 Holm 0.0004 · `A_law/F3` +2.81 Holm 0.0098 · нога 2×2: работает топология, не жилец). Стек-баннер CURRENT-STATE поправлен, supersede-указатель добавлен в карту. Пометка «со слов» отработала как задумано — величина не успела стать основанием стройки.
|
||||
|
||||
**5. Курс владельца 08.08:** **(а)** эксп-22 «панель жильцов» — промт выдан (`docs/POLYGON_TENANT_PANEL_SESSION_PROMPT.md`): профиль-скрин с pass/fail порогами, записанными ДО замера → панель черновиков (слот несёт ~70% эффекта финала — §16.2; за всю историю проекта черновиком была одна модель) → панель редакторов поверх замороженных черновиков (обязательный кандидат `gemini-3.1-pro` — аутлаер-гипотеза эксп-04, современным ригом не мерена) + шумовой пол (§8 п.1) + прямой `D_/A` (§8 п.2) довесками. **(б)** Слепое чтение владельца ЗАМЕНЕНО Sol-арбитражем (владелец черновики читать не хочет; ChatGPT Sol high-reasoning руками владельца через подписку = внешний контур третьего семейства): пере-суживаются расходящиеся контрасты эксп-21 (`A/F`: luna +0.84 против gemini +3.03 — расхождение 2.19 балла = 14 стандартных отклонений шума судьи-замены, собственным шумом не объясняется) и слепые пары эксп-22. **Правило ничьей эксп-22 ратифицировано:** при перевесе ниже порога различимости рекомендация отчёта — самый дешёвый жилец. Оговорка записана честно: Sol — LLM, «издательское качество для человека» им не доказывается; человеческий контур остаётся за пилотом Ф2.5. **(в)** Агент-судейство — под явным капом (агенты не бесплатны — слово владельца 08.08; кап ≤60 запусков в промте эксп-22).
|
||||
|
||||
**6. Хвосты в трекер:** строки **149–153** заведены (эксп-22 · Sol-арбитраж · отказной режим связки · слипание абзацев · чистый контраст мандата); строки **12 и 82** получили $0-прототипы эксп-21 (`battery.check_numbers` — синтетика 16/16 · `battery.check_gender` по карточкам сида, 86–112 сверок/арм) — указатели внесены в их тела, сами строки живы (движковые гейты не построены); кредиты xAI — в лист владельца; три провод-факта эксп-21 §8 внесены в quirks 00 (Gemini fail-closed приходит БЕЗ объекта `message` · `gpt-5.6-luna` без ручки эффорта — пустой оплаченный выход · `glm-5` гасится `extra_body`).
|
||||
|
||||
**7. Поправка к D39.113:** строка таблицы потерь «незакоммиченные правки промта — параллельный оркестратор» — ошибочная атрибуция: HEAD `73a7e7a` и был финальной версией промта параллельного оркестратора, его правки не терялись. Чьи модификации были в дереве — достоверно неизвестно; вероятно, полигона (его пинг предлагает правку требования стр.59 того же файла), и тогда их суть уцелела в пинге. Буква D39.113 не переписывается (D23.3) — читать через эту поправку.
|
||||
|
||||
## D39.118 — ФИКС-ПАК БАНКА (строки 128+129+130-минимум) ПРИНЯТ И ЗАЛЕНДЕН: семьи термов со-батчатся юнитами, наблюдаемость подписи построена, дофикс-раунд закрыл major приёмки (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, код заленден **`bccf2d8`** (27 файлов, +2935/−201; деньги пака $0). Метод — четырёхконтурный воркфлоу приёмки: слепой дифф-ревьюер с мнением ДО чтения отчёта · пере-ран всех заявлений исполнением · 8 своих посадок в копии зоны вне репозитория (6 CAUGHT сразу, 2 выжившие) · охота вне карты отчёта; затем дофикс-раунд сессии и ре-чек (battery целиком EXIT=0 · `-race` EXIT=0 · счёт тестов 685→717 подтверждён независимо · пере-посадки 3/3 CAUGHT, выживших 0). Механика и полный фикс-лист — ревью-шапка `archive/reports/BANK_CLUSTER_FIXPACK_2026-08-08.md` и пинг «Бэкенд» PROGRESS; здесь не дублируются (D39.112).
|
||||
|
||||
**2. Находки приёмки, закрытые дофиксом:** клейм «батарея зелёная» первой редакции был ложным — lint не гонялся и был красным (3× errcheck), исправлено с честным признанием в отчёте · MAJOR вне карты: WARN строки 130 структурно мёртв в проде — `ownerHandled` на сыром seed само-исключал строки движка со второго прогона; закрыт `unsignedEngineSurfaces(seed)` + e2e-тест двумя реальными прогонами через стор · две дыры пинов на space-run-форме (conf-хвост и ре-джойн банкноты отключались незаметно) · `bankParseVersion` не потреблялся ничем — теперь логируется на стопе, v2.1/v2.2-артефакты различимы · три тихих отказа канала семей: script-колонка валидируется по реестру диапазонов, пол-таблица отвергается, словарь типов синхронизирован (`CandidateTypes` с `nickname` + правило пары + пин покрытия каждого типа).
|
||||
|
||||
**3. Ратифицировано:** **сдвиг edit-волны bank-only ПРИНЯТ** (слово владельца 08.08 «не против реснапшота»; сдвиг громкий `--resnapshot`, `moveBankOnly` даёт $0-репин юнитам без терма; уточнение приёмки: двигается и при выключенном гейте терминолога, classify-чекпойнты перекупаются тем же центовым разом) · **bankdata-плоскость** — отдельный `//go:embed` вне волнового фолда со своей `BankDataVersion` (вместо колонки `script-series.txt` — та фолдится в `EmbeddedVersion` и перекупила бы драфт-волну без права $0-репина; девиация ратифицирована как правильный шов) · **инверсия ранжирования семей** (размер прежде длины якоря; спековый порядок ломал критерий линейки 转) — принята, девиация дописана в §4 отчёта по требованию приёмки · **имена эвиктнутых — лог, миграция НЕ заводится** (гейт: доказанная потребность; строка 159, вместе с 49а) · **«двойной пробел» закрыт замером:** 0 внутренних прогонов на 585 строк эталона (пере-ран приёмкой; наивный grep без rstrip даёт 55 хвостовых — парсер их триммит).
|
||||
|
||||
**4. Строки трекера:** **128 и 129 ЗАКРЫТЫ** · **130 пере-скоуплена** (минимум исполнен; остаток = накопительный мердж/слоты — СТОП-решение владельца, материал даст WARN со второго прогона) · **заведены 154–159** (одноруновая голова семьи · скрипт-слепой резолв к ja→ru · `banknote_truncated`-пол за гейтом канала · пере-подтверждение `family_max_members=24` · conf без гейта данных пары · durable-имена эвиктнутых) · дописаны 37 (вынос Aho-Corasick = рефакторинг слоя, «чисто не ложится») · 38 (ординальная механика подтверждена кодом: G1 двигает состав юнитов — на первом прогоне после пака перекупаются все бэнк-батчи, центы) · 57 (ссылка на фикс-пак закрыта). Остаточный принятый риск: пин покрытия типов работает по зеркальной фикстуре `zhFamily` — рассинхрон зеркала со shipped-строками пином не ловится.
|
||||
|
||||
**5. Верификация эффекта** — §6 отчёта (10 конкретных проверок по артефактам, $0); гейт — первый холодный прогон: `families=`/`families_held=` · химера 古月/转 в стоп-таблице · `self_conflicts=` · колонка `confidence` при не выросшем `bad_lines` · WARN диффа авто-банка со второго прогона. Активного промта бэкенда после этого лендинга НЕТ — следующий (эмиттер строки 103 + денежные строки шва) по слову владельца (D39.107 п.3). *(⚠ поправка курса тем же днём: следующим выдан пак «блокеры контракта», эмиттер — за ним; слово владельца — D39.119 п.1.)*
|
||||
|
||||
## D39.119 — КУРС ВЛАДЕЛЬЦА 08.08: эмиттер отложен, выданы ДВА промта (бэкенд «блокеры контракта» · платформа «раннер»); S4 гейчен качеством оболочки; PD-105 ратифицирован (08.08). ✅
|
||||
|
||||
**1. Слово владельца 08.08 (пересказ):** с эмиттером jsonl подождать — вокруг него техдолг бэклога; но платформу и фронт пора разблокировать. Разбор оркестратора, подтверждённый владельцем формой «пиши»: настоящие разблокираторы фронта/платформы — движковые строки контракта **99/100/101/125/145** (строка 49 annot-v1 — следующим паком) и платформенный раннер с ручками; эмиттер нужен СВЕЖЕСТИ статуса и деньгам шва, не первым экранам — резерв на это время = периодический `status --json`-резюнк (построен в P1). Поправка к D39.118 п.5: эмиттер идёт бэкенд-промтом ПОСЛЕ пака блокеров.
|
||||
|
||||
**2. Выданы два промта** (оба аудированы перед выдачей: два холодных читателя + фактчекер, 35 опор подтверждено, поправки внесены): **бэкенд** — `docs/BACKEND_CONTRACT_BLOCKERS_SESSION_PROMPT.md` (строки 99+100+101+125+145; $0; сетевых поверхностей в движке не появляется — D39.81) · **платформа** — `platform/docs/PLATFORM_RUNNER_SESSION_PROMPT.md` (транзиентные юниты D39.106 · River+воркер+холд-до-спавна · реконсилятор 138 · тейлер наготове · первые ручки /v0 по контракту 0.2.0 (П-1/П-5) · PD-99; координация с бэкенд-паком — узкие интерфейсы с дев-стабами, форма только из HEAD). Запуск сессий — владелец.
|
||||
|
||||
**3. Ратификация PD-105:** доставка событий шва = at-least-once; ДУБЛЬ `seq` — норма повторного чтения, декодер обязан принимать идемпотентно без фатала; тот же `seq` с ДРУГИМ payload = карантин прогона (research/25). Девиация от буквы реестра («ратифицировать вместе с промтом эмиттера») осознанная — тейлер-сторона строится сейчас; строку реестра обновляет платформа-сессия паком.
|
||||
|
||||
**4. Слово владельца о КАЧЕСТВЕ ФРОНТА — гейт на S4.** Владельцу не нравится «логика спама вкладками»: вкладки обязаны работать как в VS Code (preview-вкладка от одиночного клика, замещение её следующим, пин по двойному клику/взаимодействию). Полный список претензий владелец сформулирует отдельным входом. Диспозиция: **S4 не стартует до списка**; форма — «S3.5 фикс-пак оболочки» (VS Code-вкладки + Ф-19 + список владельца) → S4 на починенной оболочке. Носитель — запись оркестратора в `frontend/docs/frontend-PROGRESS.md` 08.08; ПТ-строка в продуктовый реестр — при полном списке. Бэкенд/платформа фронт не ждут.
|
||||
|
||||
## D39.120 — КРОСС-МОДЕЛЬНЫЕ КОНТУРЫ РЕВЬЮ И ПРЕДМЕТНЫЕ ОСИ САМОПРОВЕРКИ — нормой-направлением (владелец 08.08). ✅
|
||||
|
||||
**1. Ратифицировано словом владельца 08.08 (пересказ; финал — «да, нормально» с оговоркой свободы):** (а) в приёмочных панелях ≥1 опровергатель ДРУГОЙ моделью семейства на текстовых/оценочных линзах (глушит контекстное закрепление и self-preference; механические линзы от смены модели не выигрывают); (б) тяжёлые ратификации класса D39.106 и периодический аудит записей оркестратора — параллельная сессия-ревьюер другой моделью с СОБСТВЕННЫМ онбордингом (снимает фрейминг оркестратора; промт — оркестратор, старт — владелец, мнение — владельцу ДО ратификации; прецеденты D39.106/D39.112); (в) семейный слепой участок кросс-моделью внутри Anthropic не снимается — оценочные вердикты по-прежнему калибруются внешним семейством, первичны пере-ран и исполнение; (г) каждый кодовый промт несёт 1–3 ПРЕДМЕТНЫЕ оси самопроверки по характеру работы (бэкенд — общность §0.1; платформа — индустриальный первоисточник/stdlib прежде велосипеда; фронт — контракт/доступность), дисциплина ревьюера (шесть антипаттернов) в сессионные промты не грузится.
|
||||
|
||||
**2. Оговорка владельца — часть нормы:** всё выше — НАПРАВЛЕНИЕ, не буква; сессиям и оркестратору оставлена свобода суждения, разумное отступление с аргументом легитимно и приветствуется; упарывание в букву стандарта и соглашательство с нормой ради нормы — сами по себе антипаттерн. Носитель — промт оркестратора (два новых буллета «Методологии»).
|
||||
|
||||
## D39.121 — ЗАПИСКА-ПЛАН ПОСЛЕ ТЯЖЁЛОГО РЕВЬЮ + ОФИЦИАЛЬНЫЕ ПРАКТИКИ ANTHROPIC абсорбированы нормой-направлением (владелец 09.08). ✅
|
||||
|
||||
**1. Слово владельца 09.08 (пересказ):** сессии должны решать свои проблемы максимально самостоятельно — после сложного ревью с верифицированными находками сессия составляет МИНИ-ПРОМТ САМОЙ СЕБЕ (записанный план) и движется по нему, а не по памяти; плюс заказ: разобрать официальные гайды Anthropic и перетянуть применимое. Исполнено веб-ресёрчем (3 агента, 86 рекомендаций с URL-грунтовкой) — выжимка и карта применимости: **`docs/research/26-anthropic-guidance-digest.md`**.
|
||||
|
||||
**2. Ратифицировано (направление, не буква — оговорка D39.120 п.2 действует):** (а) **записка-план**: после тяжёлого ревью — структурированный файл «ID находки → статус → улика» (не проза: инцидент диспозиций 08.08 случился в прозе, и Anthropic это же говорит о Markdown против JSON), движение по записке, сдача гейтится сверкой «все ID имеют диспозицию»; (б) «заявление=команда» распространяется на клеймы ревью о себе; (в) комплектность против заказа — механически (пункт промта → исполнено/отказ), для паков среднего+ веса; (г) числовой гейт сторожит присутствие, не истинность — сравнительные/пороговые утверждения приёмка читает списком; (д) стандартный блок будущих кодовых хендоффов из официальных сниппетов (ground-progress-claims · «проверь последний абзац» · запрет подгонки тестов · интервальная самоверификация против явных критериев); (е) панелям — obstacle reporting обязательным полем схемы и анти-оверфлаг-рамки ревьюеру. Носители: промт оркестратора (два буллета) + CLAUDE.md (компакция-инструкция и запрет подгонки тестов — механизм-уровень, читается каждой сессией).
|
||||
|
||||
**3. Конвергенция зафиксирована** (research/26 §2): половина канона проекта совпала с официальными рекомендациями независимо («заявление=команда» = show-evidence · author≠reviewer = fresh-context verifiers · execute-first приёмка = grade-final-state · онбординг-диета = lean CLAUDE.md · «один носитель на факт» = JIT-указатели). Не перенимается: promptfoo · lock-файлы (нужны только при двух сессиях в одной зоне) · метапромпт как прод-механизм (§5 research/26). Вопрос владельца о «сайте prompts md» закрыт указателем — research/26 §4.
|
||||
|
||||
## D39.122 — ПАК «ДВИЖКОВЫЕ БЛОКЕРЫ КОНТРАКТА» ПРИНЯТ И ЗАЛЕНДЕН; ратификации приёмки; строки 99·100·101·125·145 закрыты; research/27 (главы) принят фактурой (09.08). ✅
|
||||
|
||||
**1. Приёмка (оркестратор №15, полный аппарат + новые нормы).** Три раунда: (а) 7-агентный воркфлоу — слепой дифф-ревьюер · **кросс-модельный опровергатель отчёта на Opus (первое применение D39.120)** · пере-ран заявлений (battery целиком, 717→738, формы артефактов на стенде, cmp проекций) · 7/7 посадок CAUGHT в копии зоны · два охотника вне карты · перф-замер на независимом стенде с бинарём «до» из `06f0342` (status 1.40–1.46→0.05–0.07 c — таблица §2.4 воспроизведена); (б) фикс-лист F1–F6 (несущее: **F1 MAJOR от опровергателя — `unit.id` первого юнита главы переживал любой разрез**, «граница инвалидации» отчёта была ложной; закрыт ТЕГОМ РАЗРЕЗА в id) + ре-чек с пере-мутациями (поймано: V2-1 не исполнен и не задекларирован · клейм покрытия F6 ложен · зазор МОЕЙ спеки cutTag без langpack/embedded/norm · manifestVersion не бампнут); (в) микро-раунд V2-1..4 исполнен, и сессия СВЕРХ заказа провела третий слепой аудит своих клеймов — нашла 4 непокрытых тестами оси (худшая: быстрый путь манифеста удалялся при зелёной батарее — тест сравнения проекций вырождался в «медленный против медленного»; проводка `--ceiling-usd` в CLI не пинилась) и запинила; призналась в холостых прогонах двух мутаций (`go test -run` без совпадений = ok) и добавила сторож. Итог: тестов **717→749** (+32/−0), battery EXIT=0 целиком, голден/снапшот/подпись банка нетронуты. (г) Финальный ре-чек V2+аудита (по слову владельца) — ВСЁ CONFIRMED исполнением: состав V2-диффа точен (5 файлов, ничего сверх), каждая V2-ось и все три §11б-теста перебиты мутациями заново (слепое пятно «ServesTheReadModelsIdentically зелёный при мёртвом быстром пути» воспроизведено буквально), счёт 749 поимённо, стенд `tm-manifest-v2` 2283/4276/5071 c единым cutTag, cmp-проекции IDENTICAL (0.08–0.16 c против 1.42–1.43 c). Одна MINOR-находка ре-чека принята БЕЗ дофикса: тест границы `manifestMaxChunks` пинит механизм, но не значение константы (absurd выводится из неё же — поднятие до 1<<62 тест переживает); диспозиция — значение константы сторожится ревью, NOTE в ревью-шапке отчёта.
|
||||
|
||||
**2. Ратификации приёмки.** (а) **Граница `report`/`export --pairs`/ре-билла на пере-нарезке — ГРАНИЦА, не долг**: `QualityReport` по построению требует исходный текст юнита (residual-скан), манифест текст не несёт намеренно. (б) **`done` пофазных счётчиков = «разрешено волной»** (ok/flagged/skipped); следствие `edit.done ≥ done` — честное, с оговоркой draft-only в доккоменте. (в) **`--ceiling-usd` = КНИЖНЫЙ потолок в силе, не бюджет прогона**: леджер сравнивает с накопленным committed+reserved книги; пересчёт «пользовательский прирост → абсолют» — обязанность ПЛАТФОРМЫ, данные уже отдаются (`committed_usd`/`reserved_usd` в `status --json`); вторая денежная ось НЕ заводится. (г) Все 8 девиаций §8 отчёта приняты (`tmctl manifest` · `--ceiling-usd` в redrive · счётчики на главу · `draftOnly` · ленивый провайдер · `BankStopVariant` · асимметрия таблиц · length-prefix ключа id). (д) **`heading` манифеста = ВРЕМЕННЫЙ рендер движка (решение владельца 09.08)**: противоречие с закрытым К-3 признано, настоящие заголовки — строка 160 (titleRaw, Этап 0 структуры глав). (е) **Форма артефактов для потребителей**: `unit.id = <chapterID>:<cutTag>:<firstChunkIdx>`, манифест `tm-manifest-v2` — платформе читать как новую форму (пинг в зонный журнал). (ж) `.gitignore` дополнен паттернами сайдкаров.
|
||||
|
||||
**3. Бэклог.** Строки 99·100·101·125·145 ЗАКРЫТЫ (удалены из таблицы). Новые: **163** — версии модулей x/text|x/net меняют нарезку, не двигая ни ключ/снапшот/чекпойнты (класс всей чекпойнт-плоскости, унаследован манифестом); **164** — rebill-проекция `status` с nil baseMemory может завышать `RebillUSD` против translate (преexisting, консервативная сторона). NOTE без строк: провести `--ceiling-usd` в `status` — по желанию платформы (в пинге зоны); fsync каталога; U+001F закрыт V2-1. Строки 160–162 (структура глав по research/27) заведены до лендинга тем же днём.
|
||||
|
||||
**4. research/27 «Определение глав» принят ФАКТУРОЙ** (веб-ресёрч · панель двух моделей · карта по коду · жизненный цикл дерева §3а · развилка парсинг-стадии закрыта словом владельца: оригинальные названия, платный перевод со старта прогона; мини-сессия названий §5а — редакторский слот · инъекция банка · двухфазность вокруг подписи). **Дизайн стройки НЕ ратифицирован** — отдельное решение при постановке строк 160–162 в очередь.
|
||||
|
||||
**5. Очередь дальше:** приёмка платформы-раннера (сессия жива) · лендинг эксп-22 (8 CONFIRM/DENY владельца) · промт эмиттера (103 + деньги шва) — эмиттер-сессии ПЕРЕД стартом прочесть PD-95/105/79/99/107/60/61 и D39.106 (09.08.2026, оркестратор №15). ✅
|
||||
|
||||
## D39.123 — ПАК ПЛАТФОРМЫ P4 «РАННЕР» ПРИНЯТ И ЗАЛЕНДЕН (`d29e30c`); ратификации приёмки вкл. поправку формулы потолка (PD-158); строки 138·139 закрыты (09.08). ✅
|
||||
|
||||
**1. Приёмка (оркестратор №15, три раунда, 13 агентов).** (а) 7-агентный воркфлоу: слепой дифф · опровергатель-Opus (D39.120) · пере-ран батареи · 10 посадок (8 CAUGHT) · контракт-сверка 47 wire-проверок · охотник-деньги · охотник-systemd с РЕАЛЬНЫМ tmctl из HEAD (argv/поля status/exit-контракт/маркер — совпали; четыре systemd-клейма пере-мерены). Пять MAJOR: **F1 — аргумент `--ceiling-usd` = чистый прирост против кумулятивной семантики движка** (двустороннее исполнение; сквозная проба сессии прошла на фейке без кумулятива — сессия строила параллельно лендингу 145 и честно это записала) · **F2 — PD-129 закрыт ложным клеймом**, дедлок books↔run_attempts 258/300 через реальные API + транзиентный 40P01 карантинил проекцию навсегда · F3/F4 — два незапиненных денежных свойства (мутации пережили полную батарею) · **F5 — settle по устаревшему снапшоту свипа возвращал холд целиком потратившему прогону** (исполнением). (б) Дофикс F1–F8 + селф-ревью сессии нашло **PD-159** (отложенный расчёт прогона N оплачивал работу N+1, и N+1 платил снова — $2.10 за прогон ценой $0.10; закрыт `SpendBound` = min базовых линий последующих попыток; воспроизведён приёмкой на до-фиксном дереве, 4 края границы точны). Ре-чек дельты нашёл V2-1 (классификация транзиентности неполна: 57P0x/08/net reset карантинили навсегда) и V2-2 (ретрай спавна передавал потолок от сдвинутого счётчика — PD-161 наполовину). (в) V2 исполнен; финальный ре-чек: 5/5 пере-мутаций убиты поимённо, правка комментов миграций 00009/00011 правомерна (тела SQL байт-равны, обе рождены паком, причина в шапке sha256). Итог: тестов **105→261** (+156/−0), батарея EXIT=0 с живым PG 18.4 под -race, скипов 0, регистр 171 строка (открыт 1 major — PD-113). Сессия поймала и мою ошибку: PD-167 = коммент 00009, не 00011.
|
||||
|
||||
**2. Ратификации приёмки.** (а) **Privilege-модель: linger-пользователь, не polkit** — по свойству (polkit авторизует глагол; транзиентный системный юнит без `User=` идёт от root; до v257 в запросе нет имени юнита), разбор — STACK_DECISIONS §15; уточнение верификатора (шаблонный системный юнит с фикс-`User=` не рассматривался) приложено, выбора не меняет. (б) **ПОПРАВКА к D39.122(в)/пингу: формула аргумента потолка = `committed + прирост×ставка`, БЕЗ reserved (PD-158)** — `store.Open` движка зануляет утёкший reserved до первой судимой резервации, read-only `status` этого не делает ⇒ reserved из status всегда leftover; исполнение обеих формул против гейта: ратифицированная переплачивала запасом ровно на leftover сверх холда, консервативная точна и не недодаёт (flock исключает второго писателя). Формула моего пинга в зонном журнале была неверна в этом нюансе — прав оказался «громкий» отказ зоны исполнять её молча. (в) **PD-105-реализация: карантин ПРОЕКЦИИ (попытки), не прогона** — уточнение D39.119; деньги прогона сеттлятся ремонт-каналом. (г) **Ставка $0.03/глава конфиг-константой платформы** (провенанс exp08 v2 $0.0219 → D30.4 +15–25% → вверх; сверен). (д) Формы: MaxAttempts:1 · холд+прогон+попытка+очередь в одной транзакции · ExecStopPost-маркер вместо D-Bus · ceiling-шаблон из конфига. (е) **Решения по вопросам зоны (владелец делегировал 09.08)**: `default_chapters` = верх шкалы ОСТАЁТСЯ (дробный дефолт непонятен; компромисс «весь баланс под одну книгу» принят осознанно) · **503 внесён в контракт** (0.2.0→0.2.1, зеркало фронта синхронно; PD-112 закрыт ратификацией) · PD-114: env-only остаётся, строка переформулирована в «печать эффективной конфигурации на старте» · PD-115: направление «внешний версионированный эталон на каждую ось» ратифицировано. (ж) PD-113 остаётся ЕДИНСТВЕННЫМ открытым major до эмиттера; после PD-158 его цена выросла — консервативный потолок останавливает ровно на исчерпании холда, и «деньги кончились» неотличимо от «инфраструктура упала».
|
||||
|
||||
**3. Бэклог.** Строки 138·139 ЗАКРЫТЫ (реконсилятор со свипом+бутом построен; пиннинг бинаря исполняется и резюмом — PD-143/134 закрыты с пинами). Новые строки движку: **165** — различимые exit-коды tmctl для потолочной остановки и graceful-stop (сегодня оба = 1: платформа отдаёт «failed» на штатный стоп и на исчерпание потолка; вскрыто реальным tmctl — фейк пробы умирал ОТ сигнала; приоритет поднят PD-158) · **166** — движковая поверхность оценки $/глава (П-10 зоны; ставка-константа — временная мера беты). `.gitignore` += `.check.log`; `counts.py` научен статусу `open (…)` (аннотированные строки регистра считались «иное»).
|
||||
|
||||
**4. Очередь дальше:** лендинг эксп-22 (8 CONFIRM/DENY владельца; у полигона в дереве уже виден незаявленный эксп-23 editor_tier — при лендинге спросить) · промт эмиттера (103 + деньги шва; читать PD-95/105/79/99/107/60/61 + D39.106 + новые 165) · следующий платформенный промт по слову владельца (кандидаты: стоп/резюм-ручки + эскроу 136) (09.08.2026, оркестратор №15). ✅
|
||||
*(Тела D39.107–D39.123 — слайс [`../archive/architecture/05-decisions-D39-106-123.md`](../archive/architecture/05-decisions-D39-106-123.md), вынесено D39.139; D39.106 ниже — живое тело.)*
|
||||
|
||||
## D39.124 — ЗАКРЫТИЕ СЕССИИ №15, передача №16; докс-диета: хроники в архив-слайсы, CURRENT-STATE и зонный журнал платформы подрезаны (09.08). ✅
|
||||
|
||||
|
|
@ -586,3 +386,14 @@
|
|||
**4. Строки.** 179 ЗАКРЫТА (сессия → доклад → эта ратификация; исполнение — 183). Новые: **183** батч 0.3.0 (носитель состава — research/28 §5) · **184** жанр вон · **185** дописывание глав + гейт молчаливой перекупки · **186** сеть/перф §5б · **187** два лживых комментария движка о `memory_version` (`snapshot.go:188-189` + `membank/memory.go:360-363` — оба описывают до-pack-20 поведение). Владелец-лист: PD-104 и В-10 закрыты; Ф-56/Ф-57/Ф-61/Ф-62 — диспозиции §6 (исполнение батчем); К-13-остаток (описание `:879`) — в батч.
|
||||
|
||||
**5. Пинги розданы** (§8б п.4/§9): платформе — деньги/надёжность §9 + PD-104 + платформенная половина батча + К-10 «не строить»; фронту — диспозиции четырёх вопросов зоны + мок-находки §9 + перф-входы разморозки. Движковые находки §9 — строки 187 и 185 (ja-мина: новый ruby-алиас двигает `memory_version` → снапшот; громкий `--resnapshot`, не тихая перекупка — уточнение приёмки). (16.08.2026, оркестратор №17) ✅
|
||||
|
||||
## D39.139 — ПОДРЕЗКА ХВОСТОВ И АКТУАЛИЗАЦИЯ ПЛАНИРОВОЧНЫХ ДОКОВ (заказ владельца 16.08: «перечитай закоммиченное, пройди все доки планирования, спили протухшее»). ✅
|
||||
|
||||
**1. Хвосты подрезаны (санкция — слово владельца 16.08 «не пора ли подрезать»).** (а) D-лог: тела D39.107–123 (закрытые эры №14–15) → слайс `archive/architecture/05-decisions-D39-106-123.md`; живая голова теперь **D39.124+**, живым телом оставлен D39.106 (шов — на него ссылаются классом); пол обновлён во всех носителях правила чтения (CLAUDE.md ×2 · README · ORCHESTRATOR_SESSION_PROMPT · титул D-лога); 591→389 строк. (б) PROGRESS: три закрытые бэкенд-записи 14–15.08 (эмиттер · migrate · DeepSeek-репин) → слайс `archive/PROGRESS-2026-08-14-15.md`; секция «Полигон» НЕ тронута (живая зона); 578→406 строк. Реестр 05-decisions-index.md покрывает все номера одним хопом — counts `--check` зелёный.
|
||||
|
||||
**2. Свип планировочных доков трёх зон (прочитаны целиком: product-requirements · 09-target · ORCHESTRATOR_SESSION_PROMPT · backend/README · platform/README+BACKLOG+PLATFORM_DIRECTION · frontend FRONTEND_PLAN+FRONTEND_SESSION_PROMPT+BACKLOG+STACK_DECISIONS §8). Противоречия найдены и разведены:**
|
||||
(а) **Моя зона — исправлено этим лендингом:** ПТ-16/ПТ-18 держали «открытый К-9» (закрыт D39.138 п.2б) · ПТ-20 держал «живой 0.2.2» и «гейт S4 пал» (0.2.3; S4 принят, зона заморожена) · ПТ-22 нёс жанр (выкинут — строка 184) · ПТ-33 нёс «лестницу фаз» как норму (устная фраза владельца, §8 п.15) и опровергнутый ответ §5 компаньона (Б-0) · ПТ-34 дополнен носителем Б-4 · ПТ-35 держал открытый К-13 (закрыт) · README держал В-10 в гейте разморозки (пропуск МОЕГО лендинга D39.138 — пойман пере-чтением коммита) · шапка 09-target освежена.
|
||||
(б) **Зона платформы — пинг-аддендум в журнал (сама не правится):** `PLATFORM_DIRECTION` §2 и `BACKLOG` П-7 держат «дефолт $5» против закрытого PD-104 (грант 0 на бете) · баннер §3 «ратификация за оркестратором» закрыт ещё D39.132 п.2б (oapi-codegen кандидат при P7 · sqlc привязан к P7) — баннер не обновлён · §4 п.5 «сервер вправе склеивать» сузится батчем (запрет склейки `note`, Б-6в).
|
||||
(в) **Зона фронта — пинг-аддендум в журнал:** `FRONTEND_SESSION_PROMPT` §9 п.1, `FRONTEND_PLAN` §6 п.1 и `STACK_DECISIONS` §8 п.1 учат ПОФАЗНОМУ прогрессу «draft N/M ∥ edit N/M» — устареет батчем (Б-0: один счётчик, знаменатель купленный); `STACK_DECISIONS` §8 протух целиком — все 4 пункта построены (D39.122/131/132); Ф-59 закрывается ответом В-10 «вежливость»; Ф-37 ждала К-10 — отвечен «НЕ строить»; Ф-39 закрыта D39.136 п.4б.
|
||||
|
||||
**3. Не тронуто сознательно:** зонные доки чужих зон (правят сессии зон по пингам); исторические тела под ⚠-баннерами (01–06, FRONTEND_SESSION_PROMPT §исторические — баннеры уже стоят); секция «Полигон» PROGRESS и все файлы живого полигона. (16.08.2026, оркестратор №17) ✅
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
>
|
||||
> Это карта «куда и почему», а не пошаговая спека. Спеки — в хендофф-промтах сессий; контракт — в D-логе.
|
||||
|
||||
> **⟶ СТАТУС СТРОЙКИ (освежён 15.08 оркестратором №17: эмиттер шва ПОСТРОЕН И ПРИНЯТ — `events.jsonl` StreamVersion 1.1, exit 4/5 + полоса отказов 10–19 (D39.131); платформа P6 + дофикс приняты — потребительская половина шва, интейк формы Б, дев-стенд, PD-113/PD-196 закрыты (D39.132); `tmctl migrate` принят — exit 13 финализирован, деадлок деплоя v15 разорван (D39.134); фронт S4 принят — путь «файл → загрузка → запуск → прогресс» в мире моков, контракт **0.2.3** в каноне (D39.135). Ранее 14.08 №16: платформа достроена до интейка книг P5 — `POST /books` с сентинелом хранилища, стоп/резюм с намерением, Prometheus, Go-floor 1.26.6 (D39.130); фронт — S3.5–S3.7 приняты (оболочка · слой данных · i18n; D39.127/129). Ранее 09.08, пост-D39.125: шов движок↔платформа ратифицирован — транзиентный systemd-юнит на прогон + `events.jsonl`-outbox в каталоге книги, платформа НЕ родитель (D39.106); платформа достроена до раннера P4 (D39.109/114/123 — River-очередь, холд-до-спавна, реконсилятор; дефекты — `platform/docs/DEFECT_REGISTER.md`); фронт — слой данных S3, контракт 0.2.0→0.2.1 (D39.115/123); движок отдал блокеры контракта — `tm-manifest-v2`, `unit.id` с тегом разреза, пофазные счётчики на главу, `--ceiling-usd` (D39.122); слой 4 добит фикс-паком банка — семьи термов со-батчатся юнитами, bankdata-плоскость (D39.118). Ранее 04.08, пост-D39.105: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»:
|
||||
> **⟶ СТАТУС СТРОЙКИ (освежён 16.08 оркестратором №17: контракт-ревью ПРИНЯТО (research/28, D39.138) — заказан ломающий батч контракта 0.3.0 отдельной спек-сессией (строка 183: конвейер уходит с провода, машинная модель ошибок, /capabilities, поток на книгу; жанр из продукта ВЫКИНУТ — строка 184). Ранее 15.08: эмиттер шва ПОСТРОЕН И ПРИНЯТ — `events.jsonl` StreamVersion 1.1, exit 4/5 + полоса отказов 10–19 (D39.131); платформа P6 + дофикс приняты — потребительская половина шва, интейк формы Б, дев-стенд, PD-113/PD-196 закрыты (D39.132); `tmctl migrate` принят — exit 13 финализирован, деадлок деплоя v15 разорван (D39.134); фронт S4 принят — путь «файл → загрузка → запуск → прогресс» в мире моков, контракт **0.2.3** в каноне (D39.135). Ранее 14.08 №16: платформа достроена до интейка книг P5 — `POST /books` с сентинелом хранилища, стоп/резюм с намерением, Prometheus, Go-floor 1.26.6 (D39.130); фронт — S3.5–S3.7 приняты (оболочка · слой данных · i18n; D39.127/129). Ранее 09.08, пост-D39.125: шов движок↔платформа ратифицирован — транзиентный systemd-юнит на прогон + `events.jsonl`-outbox в каталоге книги, платформа НЕ родитель (D39.106); платформа достроена до раннера P4 (D39.109/114/123 — River-очередь, холд-до-спавна, реконсилятор; дефекты — `platform/docs/DEFECT_REGISTER.md`); фронт — слой данных S3, контракт 0.2.0→0.2.1 (D39.115/123); движок отдал блокеры контракта — `tm-manifest-v2`, `unit.id` с тегом разреза, пофазные счётчики на главу, `--ceiling-usd` (D39.122); слой 4 добит фикс-паком банка — семьи термов со-батчатся юнитами, bankdata-плоскость (D39.118). Ранее 04.08, пост-D39.105: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»:
|
||||
> | Слой | Статус | Пак / D |
|
||||
> |---|---|---|
|
||||
> | 1 Сегментация | ✅ ПОСТРОЕН: бюджет в выходных токенах снапшот-folded (`chunk.SegBudget`), edit-единицы декаплены; когезия/carryover — НЕ строится (D39.7/8: эффекты под floor 0.126; кнобы `STMDepth`/`OverlapTokens` УДАЛЕНЫ, WS2 §2а), граница `logical` — не рычаг (exp15), greedy остался | пак-11 (D39.13 WS2 · D39.17 волны · D39.18 c-lite) |
|
||||
|
|
|
|||
179
docs/archive/PROGRESS-2026-08-14-15.md
Normal file
179
docs/archive/PROGRESS-2026-08-14-15.md
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
# Архив хроники — закрытые бэкенд-записи эры №16–17: эмиттер шва · tmctl migrate · пере-пин цен DeepSeek (14–15.08.2026)
|
||||
|
||||
> **⚠ АРХИВ (вынесено D39.139, 16.08).** Все три пака ИСПОЛНЕНЫ, ПРИНЯТЫ и залендены (D39.131 · D39.134 · D39.137);
|
||||
> здесь их отчёты-записи и записи приёмок дословно. Остатки строк — в едином бэклоге (172-остаток · 176 · 177 · 180 · 181).
|
||||
> Инструкции отсюда не исполнять.
|
||||
|
||||
### Пак «эмиттер шва» (строки 103 + 135 + 165 + PD-196) — исполнен, дерево на лендинг (14.08)
|
||||
|
||||
Зона `backend/` только; чужого не тронуто (`git status` в начале: чужие `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, `docs/README.md`, `docs/experiments/23-editor-tier.md` — не трогал). Пак $0: ни одного платного вызова, всё на фикстурах и фейках.
|
||||
|
||||
**§0. Комплектность против промта, пункт за пунктом.**
|
||||
|
||||
| Пункт промта | Статус | Где |
|
||||
|---|---|---|
|
||||
| 1. Четыре развилки дизайна, решены ДО кода | сделано | §1 (формат · PD-60 · fsync · формула outbox) |
|
||||
| 2. Эмиттер `events.jsonl` (103): hello/seq/повторимость/словарь/деньги/сброс буфера | сделано | §2, §3 |
|
||||
| 3. Событие потолка + различимые exit-коды (165, PD-113, PD-196) + день-потолок (PD-157) | сделано | §4 |
|
||||
| 4. Гейт потолка пер-вызов (135) | сделано + оспорена посылка дока | §5 |
|
||||
| 5. Внешний trace-контекст (102) — «если ложится единичным касанием» | взято | §6 |
|
||||
| Дифф словаря против `events.go` | сделано, 6 позиций, п.4 — запрос к платформе | §3 |
|
||||
| Сверка с `research/23` §2 (оговорка нормдока §7 п.1) | сделано, расхождений нет | §3а |
|
||||
| Батарея EXIT=0 вкл. `-race`, счётчик тестов вырос, удалённых 0 | сделано | §7 |
|
||||
| Тесты пака, каждый падает на сломанном коде | сделано, 8/8 мутаций CAUGHT | §7 |
|
||||
| Сквозная проба настоящим читателем платформы в КОПИИ зоны | сделано | §7 |
|
||||
| Голден/снапшот-нейтральность | доказана | §7, §7а(2) |
|
||||
| Мандат самопроверки: ревью ИСПОЛНЕНИЕМ | сделано (мутации · крэш-тест · сквозная проба · батарея) | §7 |
|
||||
| Мандат самопроверки: адверсариальное ревью диффа `author≠reviewer` | **ИСПОЛНЕНО НЕ ПО БУКВЕ** — ревьюером был автор, независимого контекста не было | §7 |
|
||||
| Предметные оси D39.120 (общность · деньги/детерминизм · транзакционность) | сделано | §7а |
|
||||
| **Открытые вопросы оркестратору** | 3 | §5 (эскалационный кап; формулировка строки 135/дока), §3 п.4 (фолд `unit_done` у платформы) |
|
||||
|
||||
**§1. Развилки дизайна — решены до кода.**
|
||||
|
||||
1. **Формат журнала — одиночный `events.jsonl`, одна строка = один `write(2)`.** Отвергнуто: пофайловые `events/<seq>.json` и CRC-фрейминг — читатель платформы построен ровно под одиночный файл (`ingest/tail.go:17`, `runs/reconcile.go:237`, `runs/spawn.go:258`), смена формы = согласованная правка ОБЕИХ зон. Возражение research/25 («JSONL слеп к битой записи с валидным `\n`») разобрано и не выжило: строка и её `\n` уходят одним write, поэтому рваный хвост может оставить только МЁРТВЫЙ процесс, а тейлер намеренно не двигает курсор за строку без `\n` — значит обрезка хвоста до последней полной строки не может укоротить файл ниже смещения живого читателя и его алярм «shrank ⇒ not append-only» не сработает. Ремонт хвоста делается один раз, при открытии, до своего hello.
|
||||
2. **PD-60 «журнал не пишется» — ДЕГРАДИРУЕМ ГРОМКО, прогон не останавливаем** (позиция выбрана явно; вторая — блокировать/падать — законна и отвергнута с обоснованием). Оплаченная книга не должна умирать из-за канала свежести: деньги держат холд платформы и потолок движка, ни то ни другое от файла не зависит (D39.106 п.2), а два самых важных факта — стоп по потолку и graceful stop — дублируются РАЗЛИЧИМЫМИ кодами выхода, т.е. переживают ненаписанный журнал. Ничего не теряется: строки лежат в outbox, каждое следующее событие ре-проецирует весь незакрытый префикс, транзиентный ENOSPC/EIO самозалечивается. Не залечился — ратифицированный запасной канал `status --json`. ERROR печатается один раз на переход, не на событие.
|
||||
3. **fsync: файла — НЕТ, каталога — ОДИН РАЗ при создании.** Журнал есть проекция коммитов SQLite при `synchronous(NORMAL)` («survives kill -9; power loss is outside the MVP threat model», `store/store.go`) — проекция не может быть надёжнее источника, поэтому fsync на событие не покупает ничего и стоит одного fsync на юнит книги в 4000 юнитов. Каталог синкается ровно там, где это что-то значит: имя файла не пере-создаётся ни одним последующим append. Закрывает NOTE D39.122.
|
||||
4. **Как «строка события в той же транзакции, что чекпойнт» легла на `internal/store`.** Порядок-инвариант: факт коммитится в SQLite → строка кладётся в outbox → outbox проецируется в файл. Журнал не может утверждать то, чего нет в БД (направление, которое стоило бы денег и врало пользователю). Транзакцию делит ОДНО событие — `spend`, внутри `SettleWithCheckpoint` (номер seq и сумма `committed` читаются в той же транзакции после дебета): это единственное место, где расхождение было бы расхождением о ДЕНЬГАХ. Разбор по событиям: потеря строки безвредна для `spend` (кумулятив) и `progress` (присваивание) и НЕ безвредна для `unit_done` (единственный считающий эффект) — для него сделан отдельный механизм (см. §2). Отвергнуто: тянуть транзакцию в `UpsertChunkStatus` — у юнита черновой волны нет ОДНОЙ строки (члены пишутся разными воркерами), и вычислять «волна закрыла юнит» пришлось бы SQL-запросом внутри store, чей заявленный принцип — «dumb storage».
|
||||
|
||||
**§2. Эмиттер (строка 103).** `hello` первой строкой, `seq` плотный, резюм = новый процесс со своим `engine_run_id` и `seq` с 1 в тот же файл. Строка хранится в outbox БАЙТАМИ и проецируется копией — пере-рендер с новым timestamp дал бы `ErrPayloadConflict` и карантин проекции. Буфера в юзерспейсе НЕТ вовсе — это и есть ответ на PD-61(а): `os.Exit`/`log.Fatal`/паника пропускают defer, а терять нечего, если ничего не удерживается (краш-пути перечислены и покрыты: SIGKILL посреди волны, `os.Exit` без defer, отказ файла, отказ outbox). Счётчики — в ВЫХОДНЫХ ЮНИТАХ, через ту же одну арифметику, что и `status` (`waveShape`, вынесена из `status.go`), иначе поток и ре-синк-канал считали бы в разных шкалах, а платформа складывает их в одну колонку.
|
||||
**`unit_done` — реестр «объявлено однажды» в outbox** (`once_key`, строки переживают свой прогон). Ключ пишется ПОСЛЕ того, как строка легла на файл, и это несущий порядок: реестр запоминает не «строка создана», а «читатель её видел». Крэш-тест поймал реальную дыру: окно между коммитом диспозиции юнита и объявлением — не микросекунды, а миллисекунды (пост-чек, дешёвые гейты, voice, retrieval_state), и SIGKILL посреди волны терял 1–4 объявления на прогон, т.е. главу, которая НИКОГДА больше не досчитается (`chapters.units_done >= units_total` — вход в `ChaptersLeft`). После фикса — 0 потерь на 12 прогонах. Остаточное окно (строка на файле, реестр ещё не записан) даёт ДУБЛЬ, а не потерю: это ратифицированная сторона at-least-once (D39.119 п.3), и её обязан поглощать потребитель — см. дифф ниже.
|
||||
|
||||
**§3. Дифф словаря против `platform/internal/ingest/events.go` (ответ зоны движка, пингом, не молча).**
|
||||
|
||||
| # | Расхождение | Почему |
|
||||
|---|---|---|
|
||||
| 1 | `Progress.eta_seconds` ЭМИТИТСЯ, из темпа ЭТОГО прогона | ⚠ Первая редакция пака его опускала — довод «поле опционально, ре-синк его несёт» **опровергнут независимым ревью и проверен по коду потребителя**: обработчик `progress` присваивает колонку безусловно (`update runs set … eta_seconds = $6` через `etaOrNil`, `pgstore/sink.go:110-113`), поэтому отсутствующее поле декодится в 0 и ОБНУЛЯЕТ оценку, которую только что записал ре-синк, — на каждой строке потока. Опустить поле ≠ оставить его в покое. Считается ин-процесс (время с начала волн ÷ юнитов, решённых этим прогоном, × остаток), без единого запроса; расхождение с книго-пожизненным средним `status.go` намеренно — альтернативой было не «второе мнение», а «оценки нет вовсе». |
|
||||
| 2 | `Ceiling` += `scope: book\|day` | Не деньги, а КАКОЙ потолок остановил прогон. Закрывает диагностическую половину PD-157: дневной потолок платформа не выбирает и не видит, и сегодня не отличает его от своего. |
|
||||
| 3 | `Finished.outcome` += `ceiling`, `stopped` | В предложении clean\|flagged\|bank_stop\|failed. Стоп по потолку не ложится ни в одно: `failed` — ровно то, что контракт запрещает для резюмируемого стопа (PD-113), а поток без терминальной строки делает «остановлен намеренно» неотличимым от «обрублен крэшем». `stopped` — то же для пойманного SIGTERM (PD-152). Сегодня безопасно: `RunSink.effect` на `finished` — no-op. |
|
||||
| 4 | **ЗАПРОС К ПЛАТФОРМЕ: складывать `unit_done` ПРИСВАИВАНИЕМ, а не инкрементом** | `pgstore/sink.go:171-176` делает `units_draft_done + 1`. При at-least-once (ратифицировано D39.119 п.3) считающий эффект обязан быть идемпотентным у ПОТРЕБИТЕЛЯ — со стороны движка граница «файл записан / доставка отмечена» транзакцией не накрывается ничем. Событие несёт стабильную тройку (chapter, unit=leader `first_chunk_idx`, wave) — ровно ключ манифеста, — поэтому присваивание точно при любой доставке. То же снимает пере-счёт при `redrive`/`--resnapshot`/пере-нарезке. |
|
||||
| 5 | `unit_done.unit` = ЛИДЕРНЫЙ индекс чанка | Это `first_chunk_idx` манифеста, «the join key for every progress read» — джойнится напрямую, без догадок. |
|
||||
| 6 | Чёрновая волна считается в ЮНИТАХ, не в чанках | `chapters.units_total` приходит из манифеста в выходных юнитах; счёт чанками разъехался бы со знаменателем. |
|
||||
|
||||
**§3а. Сверка с `research/23` §2 (оговорка нормдока §7 п.1 — «со словарём не сверялся»).** Расхождений НЕТ: один JSON-объект на строку · первая строка всегда version-хендшейк · semver по terraform (минор = игнорируй незнакомое, мажор = отвергай) · дисциплина stdout (машинный канал отдельно от человеческих логов; у нас он вообще файл, а slog как был на stderr) · обязательная пара «поток + реконсиляция», консюмер идемпотентен по `(run_id, seq)`. Единственное уточнение против §2: у нас транспорт не stdout, а файл — это уже ратифицировано D39.106 п.2 поверх D39.85, `research/23` в этой части superseded, не противоречив.
|
||||
|
||||
**§4. Строка 165 + PD-196 — shell-контракт.** Занятые 0/1/2/3 не тронуты. Новое: **4** — стоп по потолку (`*pipeline.CeilingHalt`, типизированная ошибка, обёртывает прежний сентинел, поэтому все `errors.Is`-деградации хопа/репэйра/терминолога работают как были); **5** — graceful stop (в tmctl контекст прогона отменяет ТОЛЬКО `signal.NotifyContext`); **10–19 — ПОЛОСА ОТКАЗОВ**, «отказано до всякой работы»: 10 конфиг невалиден, 11 источник нечитаем, 12 проект занят другим процессом, 19 класс, которому у этой сборки нет номера. Полоса, а не список, — это и есть «расширяемость словарём»: потребитель читает диапазон, и НЕзнакомый класс попадает в него же и читается как «отказ», а не как «упало» (интейк тогда не удаляет файл пользователя). Класс живёт в `pipeline.RefusalClass`, номер — в таблице `cmd/tmctl/main.go`. ⚠ **Граница класса 11 после независимого ревью сдвинута и стала УЗКОЙ:** он выдаётся ТОЛЬКО когда чтение и нарезка прошли, а книги в байтах нет. Всё остальное — 10. Довод ревьюеров принят: 11 — это вердикт, по которому интейк УДАЛЯЕТ загрузку пользователя, а отсутствующий путь, права, I/O-ошибка и даже провал декодирования конфигурационно объяснимы (декодирование ведут объявленные `encoding`/`source_lang`, то есть «байты не текст» и «ты сказал читать их не так» — одна и та же ошибка). Единственное, что движок может утверждать о ТЕКСТЕ без конфига в промежутке, — «прочли, нарезали, переводить нечего». День-потолок: решено дёшево — `scope` внутри `ceiling` (см. дифф п.2).
|
||||
|
||||
**§5. Строка 135 — фактическая граница по коду, «было/стало» числом.** Посылка дока разобрана: **потолки книги/дня были пер-вызовными уже давно** — `Reserve` вызывается на каждый свежий attempt (`stagerun.go`) и сверяет накопленное committed+reserved с потолками (`ledger.go:44,67-72`). То есть `15-money-path.md` §2 п.2 («гейт сегодня на границе юнита работы») по отношению к ПОТОЛКАМ неверен — **пинг оркестратору: поправить формулировку строки 135/дока**. На границе юнита сидел РЕПЭЙР-суб-бюджет: одно решение `spent >= budget` перед циклом кандидатов, после которого юнит покупал до `max_calls_per_unit` свежих вызовов, и каждый параллельный воркер — столько же. Ужесточено до пер-вызовного с ЦЕНОЙ вызова (форма, которая у терминолога была всегда). Измерено на фикстуре, лог прогона: `spent_usd=0.000000 next_call_usd=0.001063 budget_usd=0.0005315` — БЫЛО: вызов покупался, бюджет превышен в 2.0×; СТАЛО: 0 вызовов, дефект остаётся флагнутым (шаг опциональный), уже оплаченный репэйр по-прежнему реплеится бесплатно.
|
||||
**Не сделано осознанно, вопрос оркестратору:** эскалационный кап `escalationBudgetRemains` — уже пер-вызовный (хоп = один вызов), но не ПРИЦЕНИВАЕТ его; допустимый перелёт «до одного хопа» задокументирован в коде и запинен ТРЕМЯ тестами, т.е. это ратифицированная граница, а не недосмотр. Ужесточение сломало бы их (проверено исполнением) — по CLAUDE.md «несогласие с тестом — вопрос, не правка». Ужесточать?
|
||||
|
||||
**§6. Строка 102 — взято.** `TM_TRACE_ID` принимается средой (не argv: argv в этой зоне намеренно свободен от идентичности прогона — PD-99), валидируется (≤64, печатаемый ASCII без пробелов), негодное ЗНАЧЕНИЕ отвергается и чеканится своё. Он же становится `engine_run_id`, т.е. пространство идемпотентности шва делается платформенным по построению — ровно то, что предвидит коммент `events.go:75-78`.
|
||||
|
||||
**§7. Проверки исполнением.** Батарея зоны целиком EXIT=0 (`make battery`: build · vet ×4 · gofmt · golangci-lint 2.12.2 «0 issues» · `go test ./... -race -count=1`), скипы: `TestHelperEventsRun`, `TestHelperKillLoop` (оба — хелпер-процессы by design). Тестов **749 → 784** (+35, удалённых 0; `git grep -c "^func Test"` HEAD против дерева). Голден/снапшот-нейтральность: `TestGoldenDeterminism` зелёный, `testdata/` не тронут (`git status` пуст по каталогу) — snapshotID/request_hash/wire пинятся им бит-в-бит, значит эмиттер наблюдаемость, а не семантика. **Мутации (каждый тест обязан падать на сломанном коде): 8/8 CAUGHT** — репэйр-гейт назад в пер-юнитный · exit-код потолка схлопнут в 1 · счётчики пере-считывают реплей · progress застыл на нуле · `bufio.Writer` вокруг журнала (PD-61а) · ремонт рваного хвоста снят · seq съеден упавшим рендером · `spend` выкинут из транзакции settle. **Сквозная проба с НАСТОЯЩИМ читателем платформы** — в КОПИИ зоны вне рабочего дерева (D22 п.10, `scratchpad/platform-copy`), журнал произведён боевым `tmctl translate` дважды: `ingest.Tail` принял (hello adopted, `seq=15`, materialized `progress:5 unit_done:4 spend:4 finished:1`, регион второго процесса корректно пропущен как чужой run id); повторное чтение за курсором применяет 0 событий; подделка payload на том же seq → `ErrPayloadConflict`; строгий ДЕВ-декодер пайпа принял один регион целиком (14 событий после хендшейка).
|
||||
**⚠ Про `author≠reviewer` — исполнено НЕ по букве, и это пропуск, а не формальность.** Ревью диффа делал АВТОР, в СВОЁМ контексте: отдельного ревьюера/свежего контекста не было, субагенты и воркфлоу не запускались (дефолт харнесса запрещает звать их без явного запроса пользователя, и сессия прочла этот запрет как побеждающий строку промта; санкция механизма в промте названа не была). Значит ровно то, ради чего требование существует — снятие контекстного закрепления и self-preference (D39.120 п.1б) — НЕ получено: свои слепые пятна изнутри не снимаются, сколько бы находок пас ни дал. Первая редакция этой записи подавала пас формулировкой «author≠reviewer», приписывая разделение, которого не было — исправлено здесь. **Независимый пас ПРОВЕДЁН (см. §9), так что дыра ниже закрыта — но закрыта позже отчёта, и запись оставлена как есть.** Ультраревью владельца 14.08 вторым рубежом не стало, и это установлено исполнением: облачный бандл собирает ОТСЛЕЖИВАЕМЫЕ файлы, а весь новый код пака лежит untracked (`??`) — `internal/runevents/`, `pipeline/events.go`, `pipeline/refusal.go`, `store/outbox.go` и все новые тесты. Ревью честно отчиталось «пакет не собирается, символов нет» (его находка bug_001) — против дерева, в котором этих файлов действительно не было; у себя `go build ./...` зелёный, файлы на месте, символы определены (сверено пофайлово). Корреляция точная и в обе стороны: КАЖДЫЙ файл, названный отсутствующим, — untracked; КАЖДЫЙ разобранный — tracked. Следствие для приёмки: **молчание ультраревью о шве не есть свидетельство его корректности — шов оно не читало**; независимый пас по эмиттеру всё ещё не проведён. Чтобы облачное ревью его увидело, файлы должны быть сначала застейджены/залендены (лендит оркестратор — сессия не коммитит). Ниже — записка-план того, что дал пас АВТОРА (5 находок, все закрыты): A1 отказ чтения диспозиций ронял оплаченный прогон вопреки собственной политике §1.2 → деградирует, счётчики просто не публикуются; A2 `openEvents` возвращал ошибку, которую никто не мог вернуть (мёртвая ветка и потенциальный канал «наблюдаемость останавливает прогон») → сигнатура без ошибки; A3 `draftUnitOutcome` перестраивал индекс чанков на КАЖДЫЙ закрытый юнит — квадратично по книге (18M операций на 4276 юнитов) → индекс строится один раз в трекере; A4 `bankCallEstimateUSD` держал вторую копию арифметики оценки вызова → делегирует в `callEstimateUSD` (одно определение — то же основание, что у `attemptRequest`); A5 классификация «источник нечитаем vs конфиг битый» не была запинена → три теста в `internal/config`.
|
||||
|
||||
**§7а. Предметные оси самопроверки (D39.120).** (1) **Общность §0.1** — «заработает ли пара, которой в репо нет, без правки Go?» ДА и для событий: словарь несёт счётчики, порядковые номера, имена волн (`draft`/`edit` — роли движка, не язык), движковые enum-причины флагов и целые micro-USD; ни одной пар-, книго- или письменность-зависимой ветки в `internal/runevents` нет (пакет не импортирует ни `lang`, ни `config`), пара-специфика в поток не попадает вовсе. (2) **Деньги и детерминизм** — события не входят ни в `BriefHash` (канон-структура явная), ни в снапшот, ни в `RequestHash`: доказано зелёным `TestGoldenDeterminism`, который пинит snapshotID/request_hash/wire бит-в-бит, и нетронутым `testdata/`. Суммы едут только внутри `spend`, целыми micro-USD с округлением ВВЕРХ (леджер — нижняя граница), float и строковых форм на шве нет (урок PD-79); `ceiling` несёт факт и `scope`, ни одной цифры (пинится тестом, ищущим `$`/`usd` в payload); в INFO и argv деньги и id книги не добавлены. Строка повторима байт-в-байт по построению (хранится, а не пере-рендерится). (3) **Транзакционная целостность outbox — краш-точки поимённо и чем покрыты:** ① между коммитом факта и вставкой в outbox → `unit_done` объявит следующий процесс (реестр «объявлено», крэш-тест: покрытие всех unit×wave после SIGKILL); `spend` вообще не в окне — он ВНУТРИ транзакции settle (`TestASettleThatRollsBackLeavesNeitherCheckpointNorEvent`); ② между вставкой и попаданием строки на файл → строка остаётся в outbox, ре-проецируется следующим событием байт-в-байт (`TestAStoredLineIsHandedBackByteForByte`), при смерти процесса ключ реестра не выставлен ⇒ следующий процесс объявит заново (`TestAnUndeliveredAnnouncementIsRetriedByTheNextRunAndADeliveredOneIsNot`); ③ между попаданием на файл и записью в реестр → ДУБЛЬ, не потеря; at-least-once сторона, названа в §3 п.4; ④ откат транзакции с уже выданным seq → номер не тратится (`TestARolledBackEventConsumesNoSequenceNumber`), дыра для читателя фатальна; ⑤ смерть посреди `write(2)` → рваный хвост, обрезается при следующем открытии до последней полной строки (`TestATornTailIsCutBackToTheLastCompleteLine`), а тейлер такую строку и так не читает; ⑥ `os.Exit`/`log.Fatal`/паника → терять нечего, буфера нет (`TestTheTerminalEventSurvivesAnExitThatSkipsEveryDefer`, ловит посадку `bufio.Writer`).
|
||||
|
||||
**§9. Независимое адверсариальное ревью (14.08, после отчёта) — и оно оплатилось.** Два пасa со СВОИМ контекстом: панель из 13 агентов (6 осей → по опровергателю на ось → синтез; 25 находок пережили опровержение, 5 опровергнуто) и кросс-семейный ревьюер ДРУГОЙ модели (D39.120 п.1а — в первом заходе я его не запустил, это был мой пропуск). Обе панели независимо назвали одни и те же два несущих дефекта. Записка-план «находка → статус → улика»:
|
||||
|
||||
| ID | Находка | Статус | Улика |
|
||||
|---|---|---|---|
|
||||
| R1 | Переиспользованный `TM_TRACE_ID` продолжает нумерацию прошлого процесса: проекция стартует с курсора 0 и **пере-дописывает весь прошлый поток**, затем ставит hello на seq≠1 → тейлер отвергает хендшейк навсегда | ЗАКРЫТО | воспроизведено мной живым бинарём: 33 строки, 15 байт-в-байт дублей, hello@16. Свежая идентичность потока + ERROR; тест + мутация |
|
||||
| R2 | Частичная запись оставляет префикс строки, а ретрай дописывает ту же строку целиком → склейка, которую не чинит никакой ремонт | ЗАКРЫТО | ретрай досылает ТОЛЬКО остаток; тест на коротком писателе + мутация. Мой доккоммент «транзиентный ENOSPC самозалечивается» был ложью |
|
||||
| R3 | Ремонт рваного хвоста ОБРЕЗАЛ файл ниже смещения, которое платформа сеет из `stat` (`journalSize`) → «journal shrank ⇒ not append-only» → карантин здорового резюма | ЗАКРЫТО | сверено по коду платформы; ремонт теперь ПАДДИТ пробелами (файл монотонен по длине), тест на «не укоротился» + мутация |
|
||||
| R4 | Пропуск `eta_seconds` не «оставляет поле в покое», а ОБНУЛЯЕТ колонку читателя на каждой строке | ЗАКРЫТО | сверено по `pgstore/sink.go:110-113`; поле эмитится, тест + мутация |
|
||||
| R5 | Класс 11 (по которому интейк удаляет загрузку) ловил конфиг-объяснимые отказы: неверный `encoding`, отсутствующий путь, права, I/O | ЗАКРЫТО | граница сужена до «прочли и нарезали — книги нет»; 4 подтеста живым бинарём + 2 мутации |
|
||||
| R6 | Отказ чтения базовой линии счётчиков глушил и `unit_done` — вопреки моему же доккомменту | ЗАКРЫТО | объявление больше не зависит от счётчиков |
|
||||
| R7 | Ключ реестра «объявлено» без измерения КНИГИ: две книги на одном `project_db` — вторая не объявляет ничего | ЗАКРЫТО | ключ книго-скоупнут; тест на две книги + мутация |
|
||||
| R8–R10 | Три ВЫЖИВШИЕ мутации в моих тестах: payload `unit_done` (shipped/flagged/reason) не проверялся · расположение журнала не пинилось · политика PD-60 не проверялась ничем | ЗАКРЫТО | три теста, каждый убивает свою мутацию |
|
||||
| R11 | Отказ писал в поток терминальное `finished{failed}`, хотя код выхода говорил «отказано, ничего не делали» | ЗАКРЫТО | отказ не пишет терминальной строки вовсе |
|
||||
| R12 | При деградации журнала каждое событие пере-читает весь непроецированный хвост (квадратично по длине деградации) | НЕ ЧИНЮ | производительность на аварийном пути; названо |
|
||||
| R13 | Крэш-тест разбирает журнал сам, а не настоящим тейлером | НЕ ЧИНЮ | модуль движка не может импортировать `platform/`; покрыто ручной сквозной пробой в копии зоны (§7) |
|
||||
| R14 | `scope` в `ceiling` не закрывает PD-157: потребитель поле игнорирует | НЕ ЧИНЮ | это ПРЕДЛОЖЕНИЕ платформе, уже в диффе §3 п.2 |
|
||||
| R15 | Два `translate` в одну секунду дают 1 вместо 12 (коллизия имени бэкапа по секундной метке маскирует класс «занято») | НЕ ЧИНЮ | преexisting дефект `backupStamp`, вскрыт ревью; не мой пак — оркестратору |
|
||||
|
||||
Перепроверено после починок: батарея EXIT=0 целиком (`-race`, lint 0 issues), тестов **749 → 792** (+43, удалённых 0), сквозная проба настоящим тейлером/декодером платформы пере-прогнана на НОВОМ потоке и проходит, голден не двинулся.
|
||||
|
||||
**§10. Дофикс до лендинга (записка приёмки 14.08, три пункта).**
|
||||
|
||||
| # | Пункт | Что сделано | Улика исполнением |
|
||||
|---|---|---|---|
|
||||
| 1 | `EnqueueOnce` шёл полным SCAN'ом мимо частичного UNIQUE-индекса | Воспроизведено у себя: `EXPLAIN QUERY PLAN` на `once_key = ?` → **`SCAN events_outbox`**; с предикатом `AND once_key <> ''` → **`SEARCH events_outbox USING COVERING INDEX events_outbox_once (once_key=?)`**. Взята форма «предикат в запросе» — схема не трогается вовсе (v15 остаётся как есть), партиал-индекс начинает работать. Запрос вынесен в константу `onceKeyLookup`, чтобы тест объяснял БОЕВОЙ запрос, а не свою копию | `store.TestTheAnnounceLedgerLookupUsesItsIndex` (гоняет EXPLAIN над константой и требует `USING COVERING INDEX`, запрещая `SCAN`); мутация «снять предикат» — CAUGHT |
|
||||
| 2 | `PendingEvents` при деградации перечитывал весь непроведённый префикс на каждое событие | Добавлен `LIMIT` (батч 256) + `project()` крутит цикл до опустошения. На здоровом прогоне поведение прежнее (один батч), на аварийном пути стоимость события стала константой вместо длины префикса; аллокация под мьютексом ограничена батчем | `store.TestPendingEventsReturnsAtMostOneBatch`; мутация «снять LIMIT» — CAUGHT |
|
||||
| 3 | `StreamVersion` остался `1.0` при добавленном поле и двух значениях исхода | **Бампнут в `1.1`** — решение явное. Правило, которое я сам цитировал, говорит «добавление поля бампает минор», а версия есть факт о БАЙТАХ на проводе, не о том, принят ли дифф словаря: оставить 1.0 значило бы, что два потока с разным содержимым объявляют одну версию. Читатель сверяет только мажор (`ingest.checkVersion`), поэтому бамп безопасен в обе стороны — если `scope` позже отклонят, снятие поля будет ещё одним минором | сквозная проба пере-снята: тейлер принял поток `1.1` (`adopted … version="1.1"`, materialized `progress:5 unit_done:4 spend:4 finished:1`), подделка payload → `ErrPayloadConflict`, строгий дев-декодер принял регион целиком |
|
||||
|
||||
После дофикса: батарея EXIT=0 (`-race`, lint 0 issues), тестов **749 → 794** (+45, удалённых 0), голден не двинулся.
|
||||
|
||||
**§8. Открытое / грабли для приёмки.** (а) Миграция v15 поднимает пол схемы: `OpenReadOnly` громко отказывает БД старее бинаря, а платформа читает `status --json` ПЕРЕД спавном (`bookMeter`) ⇒ на апгрейде движка над старой книгой первый `status` упадёт, пока не отработает write-команда. Свойство преexisting для любой миграции, но у платформы теперь есть путь, который на него наступает — назвать вслух, лечить не в этом паке. (б) `redrive` удаляет строки диспозиций ДО прогона, поэтому базовая линия счётчиков окажется ниже, чем в прошлом прогоне: `progress` честно уедет вниз на число сброшенных юнитов (работа действительно отменена); `unit_done` при этом НЕ пере-объявляется (реестр). (в) Объём: 2 строки на юнит на волну (`unit_done`+`progress`) + `spend` на каждый платный вызов ⇒ ~6 строк на юнит (замерено на пробе: 2 юнита → 15 строк) ⇒ на 4276-юнитной книге ~26k строк (~4 МБ) и столько же мелких SQLite-транзакций; при WAL/NORMAL это единицы секунд, но цифра названа. (г) Пере-нарезка книги минтит новые id юнитов ⇒ новые ключи реестра ⇒ юниты будут объявлены заново; у платформы главы в этот момент и так пере-материализуются — за ней решение, сбрасывать ли счётчики глав.
|
||||
|
||||
### Микро-касание «`tmctl migrate`» (строка 174 — деадлок деплоя v15) — исполнено, дерево на лендинг (14.08)
|
||||
|
||||
Зона `backend/` только (`git status` в начале и в конце; чужие `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, `docs/experiments/23-editor-tier.md`, `eval/*`, `frontend/*`, `platform/*` не трогал — платформенные читал read-only). $0: ни одного платного вызова, ни одной сетевой ручки. Промт закрывает §8(а) собственной приёмки эмиттер-пака.
|
||||
|
||||
**§1. Что построено.**
|
||||
|
||||
1. **`tmctl migrate --config book.yaml`** (`cmd/tmctl/migrate.go`) — write-open проекта БЕЗ прогона через `store.Migrate` (flock → шов `beforeApply` → миграции → `recoverReservations`) → печать `schema vN -> vM` / `already at schema vM` / `created … at schema vM`. Ни LLM, ни сети, ни ключей, ни денег.
|
||||
2. **Конфиг-стек минимальный — только `config.LoadBook`** (прецедент `backup`): `LoadModels` отказывает конфигу с ценами старше 120 дней (строка 146), и $0-миграция поверх полного стека воспроизвела бы ровно тот деадлок, который лечит. Проверено исполнением: с ценами 200-дневной давности `status` = 10, `migrate` = 0; без `models.yaml` вообще — то же.
|
||||
3. **Типизированный отказ схемы**: `store.SchemaMismatchError{Path,Found,Expected}` вместо двух прозаических ошибок `OpenReadOnly` (обе стороны + «файл есть, но не применено ничего» = v0, раньше это был exit 1 «проект сломан»). Класс `pipeline.RefusalSchemaMismatch` → **exit 13** в полосе 10–19; в тексте стабильный машинный токен `schema_mismatch found=N expected=M`. Классификация store-открытий сведена в ОДНУ экспортированную `pipeline.RefuseStoreOpen` (её зовут и `openRunner`, и `migrate`); неопознанный отказ остаётся вне полосы (exit 1) — полоса обещает «ничего не произошло», и по ней потребитель ЖДЁТ, а не чинит.
|
||||
4. **Расширение сверх буквы промта, называю явно**: write-путь тоже ОТКАЗЫВАЕТ БД новее бинаря (`store.migrate`, до `recoverReservations`). Раньше `Open` открывал её молча и писал в неё кодом, который её схемы не знает, — при том что read-only путь ровно это запрещал. Для деплоя это обязательно: иначе `migrate` на такой БД «успешно» врёт и самолечение платформы («поймал 13 → migrate → повтор») уходит в вечный цикл.
|
||||
5. **Restore point — ПОД ЛОКОМ и только когда шаг реально применяется** (шов `beforeApply` в `store.Migrate`), имя `<метка>-pre-migrate.db`. Посылка промта «write-open уже делает бэкап» НЕ подтвердилась: бэкап живёт в `preflightBackup` у translate/redrive.
|
||||
|
||||
**§2. Что нашла адверсариальная панель (4 линзы × 2 опровергателя, субагенты — разрешены промтом) и что с этим сделано.** Три линзы независимо воспроизвели ОДИН major, которого я не увидел: бэкап брался ДО флока и в том же секундном неймспейсе, что и платный путь. Следствия, воспроизведённые исполнением: (а) занятый проект получал полную VACUUM-копию под живым писателем и отказ 12 — и так на КАЖДЫЙ повтор; (б) повтор в ту же секунду падал с exit 1 («backup already exists») вместо 12, то есть вне полосы; (в) хуже всего — `migrate` → спавн прогона в ту же секунду ронял `translate` в его же pre-flight-гарде с exit 1, а это ровно та последовательность, ради которой команда сделана. То есть на строку 173 я наступил, хотя промт прямо просил не наступать. Исправлено швом под локом + отдельным именем; обе половины теперь закрыты тестами, которые ловят мутацию (см. §3). Ещё из панели: exit 1 на БД без `schema_version` (закрыто, п.3), «свойство «бэкап ДО шага» ничем не проверялось» (закрыто), «`RefuseStoreOpen` default-ветка без теста» (закрыто), формулировка деплой-порядка в моём README вела к миграции СТАРЫМ бинарём (исправлено), фикстура теста правит пакетную переменную `migrations` (restore переведён на `defer`). **§2а. ВТОРОЙ адверсариальный заход — по ИСПРАВЛЕННОМУ диффу (38 агентов, 0 ошибок; 3 линзы × 2 опровергателя + критик полноты).** Из 17 находок пережили верификацию 3, и главная — снова моя, в самом шве.
|
||||
|
||||
1. **MAJOR, найдено двумя линзами независимо, воспроизведено на 2.6 ГБ базе: шов сидел внутри общего 10-секундного `opTimeout`.** `open()` заводил ОДИН бюджет на всё открытие и отдавал его и шву, и шагам, и recovery. Бэкап — единственная работа, чья стоимость растёт с книгой; на большой книге он съедал бюджет, и первый же шаг падал `context deadline exceeded` → **exit 1 вне полосы отказов**, после уже оплаченной полной копии, а повтор писал ещё одну копию (метка секундная, имена не совпадают) — деплой не сходился и заливал том. Проверено вживую агентом на бинаре из этого дерева: копия 2.5 ГБ записана, миграции нет, exit 1; повтор — ещё 2.5 ГБ. **Починено:** каждая фаза берёт СВОЙ бюджет (`schemaBaseline` · `applyStep` на шаг · recovery), а шов не бежит ни под каким дедлайном пакета — работа каллера, его и границы. Побочно закрыт латентный дефект: один 10-секундный бюджет на всю 15-шаговую цепочку. Тест `TestTheSeamIsNotChargedToTheStoreOperationBudget` (бюджет ужат до 150 мс вместо десятисекундного сна; `opTimeout` стал `var` ради тестируемости) — мутация «вернуть общий дедлайн» ловится.
|
||||
2. **MINOR: тест на имя restore point проверял константу, а не вызов.** `TestTheMigrationRestorePointNeverCollidesWithThePaidPath` не звал `migrateCmd` вовсе, поэтому пережил бы отказ продакшена от суффикса; связывал их только сквозной тест, зависящий от попадания в одну секунду. **Переписан** — гоняет реальный `migrateCmd`, снимает имя, которое выбрал продакшен, и требует, чтобы «голая» метка осталась свободной под pre-flight платного пути. Мутация «убрать суффикс на вызове» ловится детерминированно (и сквозной тест её ловит 10/10, а не «1 из 15» — измерено).
|
||||
3. Третья находка — дубль первой другой линзой.
|
||||
|
||||
Правки после ревью: `store/store.go`, `store/migrate.go` + два теста; `README.md`, `main.go`, `refusal.go`, `runner.go`, `cmd/tmctl/migrate.go` с досмотра не менялись (сверено по патчу) — в репозиторий ревьюеры не лазили, мутации им были предписаны в копию.
|
||||
|
||||
**§3. Проверки — исполнением, не чтением.** `cd backend && make battery` **EXIT=0** (`-race`, golangci-lint 0 issues), пропущены только `TestHelperEventsRun`, `TestHelperKillLoop` (хелпер-процессы; корпусные — `battery-stand`, стенд-данных нет). Тестов **794 → 810** (+16 функций, изменённых/удалённых tracked-тестовых файлов — 0, проверено `git diff --name-only`). Голден бит-в-бит (`TestGoldenDeterminism` зелёный): промпты, провод и снапшоты не тронуты. **Мутационный прогон своего же кода (8 мутаций, все CAUGHT, дерево после — байт-идентично):** бэкап вне лока → падает locked-подтест; бэкап после шагов → падает шов-тест и money-тест CLI; имя бэкапа как у платного пути → падает сквозной тест; шов на no-op → падают два; `default`-ветка `RefuseStoreOpen` в полосу → падает refusal-тест; снятие гарда «новее бинаря» → падают три; пропуск `recoverReservations` → падают money-тесты; From/To местами → падают пять. **Живая проба на РЕАЛЬНЫХ БД стенда (копии в скрэтчпаде, оригиналы не тронуты):** `coldrun-a` v14 (149 чекпойнтов, $0.126068) — `status --json` = 13 с токеном `found=14 expected=15` → `migrate` v14→v15 → `status` = 0; `acceptance` v7 → v15 (весь ALTER-хвост v8–v14 разом); в обоих `committed` не сдвинулся ни на цент, чекпойнты целы, restore point лежит в ПРЕД-миграционной версии и с зелёным integrity; занятый проект (flock держит чужой процесс) — 12 дважды и каталога `backups/` не появилось вовсе; БД с версией 99 — 13 в обе стороны (`status` и `migrate`), файл не тронут. Транзакционность применения ШАГА проверена тестом (сорванный шаг оставляет версию прежней и не оставляет своих объектов); формулировку уточняю по замечанию критика — закрыт именно шаг, а не весь класс «крэш посреди migrate»: повтор после срыва заново снимает restore point, и эти копии никто не подчищает. Строку 49а не чинил и новых ALTER не вводил. **После правок второго захода** батарея пере-прогнана (EXIT=0, lint 0 issues, голден зелёный), мутаций стало 10 из 10 пойманных (+«вернуть общий дедлайн», +«снять суффикс на вызове»), живая проба на реальных v14/v7 книгах ПЕРЕ-снята новым бинарём: те же переходы, `committed` тот же до цента (0.126068 / 0.408077), restore point в ПРЕД-миграционной версии, `status` после — 0.
|
||||
|
||||
**§4. Деньги и PD-158 (проверено кодом и исполнением, как требовал промт).** `recoverReservations` трогает ТОЛЬКО `reserved_usd` (`store/store.go:226`, `UPDATE spend SET reserved_usd = 0 …`); `committed_usd` не читается и не пишется, чекпойнты не трогаются. Формула потолка PD-158 (аргумент = committed + прирост, БЕЗ reserved) стоит ровно на этом свойстве и НЕ ломается: `migrate` перед спавном делает `status` честнее — leftover-reserved зануляется тем же правилом, что и у `translate`, и только под флоком, то есть живую резервацию идущего прогона занулить невозможно (проект занят ⇒ 12). Settle-инвариант: `committed == SUM(checkpoints)` командой не двигается, поэтому `migrate`, случившийся между выходом процесса и расчётом платформы, расчёта не искажает; `reserved` легитимно ноль в любой момент (advisory, восстановим).
|
||||
|
||||
**§5. Платформе (пинг оркестратора в их журнал — их зона, я только читал).** (а) **Зоны сошлись на 13 независимо друг от друга** (вскрыто критиком второго захода; моя прежняя формулировка «их `exit.go` числа 13 не знает» была неверна уже на момент написания): их живое незакоммиченное дерево P6 держит `ExitSchemaMismatch = 13` (`ingest/exit.go:68`) и отдельную причину `ReasonSchemaMismatch` (`books/parse.go:76,300-304`) — ожидающую, загрузку не удаляющую. Движковый контракт совпал: exit 13 в полосе 10–19, класс `schema_mismatch`, токен `schema_mismatch found=N expected=M` на stderr. Сверять больше нечего — только ратифицировать (см. п. «е»). Это ровно то, чего ждёт их PD-201 (самолечение вместо стоп-мира). (б) **Направление важно**: `found < expected` — чинится `migrate`; `found > expected` — `migrate` тоже вернёт 13 и НЕ соврёт успехом, чинится обновлением бинаря. (в) **`deploy/README.md:134-148` их зоны: шаг 2 гонит `migrate` ДО установки нового бинаря** — старый бинарь уже на своей голове схемы, значит это no-op и деадлок остаётся; порядок обязан быть «дренаж → новый бинарь на место → `migrate` ИМ по книгам из `--migratable` → прогоны». Их гейт `Migratable() = !Live && !Resumable && !Unsettled` (`pgstore/books.go:396`) с движковой стороны подтверждаю: миграция уводит файл выше запиненного бинаря попытки, поэтому сметать можно только книги без открытых попыток — это записано и в шапке `cmd/tmctl/migrate.go`. (г) **Их же деплой-док цитирует мёртвую строку**: `deploy/README.md:127` приводит старый текст ошибки («schema vN … expects vM»), которого движок больше не печатает — теперь `schema_mismatch found=N expected=M`. (д) **Дыра неверного порядка — тихая**: no-op-миграция выходит с 0, поэтому сметание СТАРЫМ бинарём даёт полностью зелёный прогон при сохранившемся деадлоке; числом «мигрировал» и «уже был на голове» не различаются — это честная цена отказа от `--json` (см. §6). (е) **Ратификация**: полоса отказов в `05-decisions-log.md` (D39.131 п.2а), в CURRENT-STATE `PROGRESS.md:233` и в `15-money-path.md` перечислена как 10 · 11 · 12 · 19 — exit 13 сейчас ЕДЕТ НЕРАТИФИЦИРОВАННЫМ в обеих зонах сразу; нужна нота или эррата оркестратора, плюс закрытие строки 174 и ближней половины 175. (ж) **Откат движка после сметания стал ручным**: read-only и write-пути отказывают БД новее бинаря, а `tmctl restore` не существует и restore point никто не подчищает — откат на старую сборку требует ручного `cp` бэкапа по каждой книге. Назвать в рантбуке зоны; чинить — отдельной строкой, если владелец сочтёт нужным.
|
||||
|
||||
**§6. Чего НЕ делал (осознанно).** Строку 49а не чинил (не мой скоуп; применение шага и так атомарно — доказано тестом). Секундную метку `backupStamp` (строка 173) не менял — свою половину вывел из-под неё именем, коллизия `translate`↔`translate` остаётся как была. `--json` у `migrate` не делал: решение платформы читается ЧИСЛОМ (0 / 12 / 13), а человеческая строка уже несёт переход — **но у этого довода есть названная дыра** (критик второго захода): нулём «мигрировал» и «уже был на голове» не различить, а это ровно то, что производит неверный порядок деплоя (сметание старым бинарём даёт зелёный прогон при живом деадлоке). Если платформа захочет различать программно — это машинная поверхность на одну строку, решение владельца/оркестратора. Замороженную usage-строку `invocation.go` не трогал (её пинит тест; `backup`/`seed-lint` в ней тоже нет — вопрос оркестратору, чинить ли разом). `store.SchemaVersion` завёл и УБРАЛ, когда шов сделал его беспотребительским (мёртвую ссылку на него в комментарии теста критик поймал — вычищена). **Унаследованное, назвать и не чинить молча:** `config.LoadBook` по-прежнему статит `source_file`/`glossary_seed`/`mined_*`, поэтому книгу с заархивированным исходником не мигрировать (exit 10), хотя деньги её БД целы — гейт на ТЕКСТ на схемной операции, преexisting; `dbExists` в `migrateCmd` определяется ДО флока (TOCTOU самоограничен: созданная в окне БД уже на голове, шов не выстрелит; удалённая — exit 1 и ничего не применено). Дерево НЕ коммитил.
|
||||
|
||||
**Запись оркестратора №17, 15.08 — ПРИЁМКА ПАКА «tmctl migrate» ПРОВЕДЕНА, ПРИНЯТО, залендено `d55edd4` (решения — D39.134).** Панель 6 линз в изолированных копиях без .git (слепой вердикт по заказу+диффу · охота вне карты · пере-ран клеймов · собственные мутации · инвентарь каналов шва по уроку D39.132 · кросс-модельный текст-аудит Opus). Все 8 пере-раненных клеймов сошлись исполнением; 6/6 мутаций приёмки пойманы; вердикты всех линз — «принять». **Фикс-лист ФМ (носитель состава — эта запись; строки 93/146/176/177 ссылаются):** ФМ-1 комментарий `migrate.go` «Idempotent … no money touched» неверен на no-op (recovery зануляет leftover reserved — сам отчёт §4 это и описывает) · ФМ-2 ретрай migrate в ту же секунду после сорванного шага = exit 1 «backup already exists» вне полосы · ФМ-3 kill -9 посреди шва = рваный restore point под легитимным именем + копии не подчищаются (лечение temp+rename + подчистка) · ФМ-4 SIGINT/SIGTERM в migrate не прерывают (ctx не передан) · ФМ-5 чужой флаг (`--json`) парсится молча и игнорируется · ФМ-6 usage-строка `invocation.go` без migrate/backup/seed-lint (чинить разом касанием 176) · ФМ-7 `redrive --dry-run` мигрирует без restore point (обострение строки 93). **Поправки к отчёту пака (чужой текст не редактирую):** `store.go:226` → фактически `:245` · «PROGRESS.md:233» → `:234`, и перечень принадлежит §4 записи эмиттера, не CURRENT-STATE · `deploy/README.md:127` → `:131` · `parse.go:76,300-304` → ветка на `:315-320` · скипов батареи три, не два (`TestMinerFullBookParity` тоже молчит без стенд-данных) · «зоны сошлись на 13 независимо» — снято (провенанс — D39.134 п.2а) · клейм §5(в) о неверном порядке деплоя платформы был верен на 14.08 и закрыт их дофиксом P6 до приёмки. Расхождение `committed ≠ SUM(checkpoints)` на стендовой книге acceptance (0.40808 против 0.40537) — НЕ дефект пака: направление committed ≥ SUM легитимно после явного `redrive` (исключение D15.3, README бэкенда §Инварианты-1). Флейк `TestKillMinus9LosesAtMostOneCall` под чужой CPU-нагрузкой — известный класс, не касание пака. Живая проба «13 → migrate → 0» на стендовой книге acceptance недемонстрируема целиком из-за протухшего `pipeline-acceptance.yaml` (exit 10 до и после; преexisting, ровно класс строки 146).
|
||||
|
||||
### Вендор-сессия «пере-пин цен DeepSeek» (строка 172; промт `BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md`, D39.136 п.6г) — исполнено, дерево на лендинг (15.08)
|
||||
|
||||
Зона `backend/configs/models.yaml` — ЕДИНСТВЕННЫЙ изменённый файл (`git status --porcelain backend/`). Заход **$0**: ни одного платного вызова. Чужого не тронуто (на входе в дереве чужие `docs/POLYGON_*`, `docs/experiments/23-editor-tier.md`, `eval/*` — не трогал). Не коммичено.
|
||||
|
||||
**§1. Вендор-факт (первоисточник, факт-чек 2026-08-15).** Прогноз строки 172 вендором ПОДТВЕРЖДЁН до цента, расхождений нет. Сноска (1) прайс-страницы, дословно: «*DeepSeek API pricing will be updated to peak / off-peak billing, with off-peak rates at half the peak rates. Peak hours are 01:00 - 04:00 and 06:00 - 10:00 UTC (all other hours are off-peak). The new prices take effect at 16:00 UTC on August 16, 2026*» (`https://api-docs.deepseek.com/quick_start/pricing`, таблица там же). Анонс 13.08 (`https://api-docs.deepseek.com/news/news260813`): «*With the V4 lineup release, we're updating our API pricing and introducing peak and off-peak rates. Off-peak rates are 50% lower than peak, enabling more flexible workload scheduling*»; числа в анонсе лежат КАРТИНКОЙ — скачал её первоисточником (`/img/v4_260813_price_en.png`, HTTP 200, 2450×1350) и сверил с текстом страницы, сошлось.
|
||||
|
||||
| за 1M | flash пик | flash офф-пик | pro пик | pro офф-пик | было flash | было pro |
|
||||
|---|---|---|---|---|---|---|
|
||||
| input (cache miss) | **$0.44** | $0.22 | **$1.32** | $0.66 | $0.14 (×3.14) | $0.435 (×3.03) |
|
||||
| output | **$1.32** | $0.66 | **$3.96** | $1.98 | $0.28 (×4.71) | $0.87 (×4.55) |
|
||||
| input (cache hit) | **$0.014** | $0.007 | **$0.044** | $0.022 | $0.0028 (×5.00) | $0.003625 (**×12.14**) |
|
||||
|
||||
Офф-пик — РОВНО половина пика во всех шести клетках (сверено делением). Пик = 7 часов из 24 (01–04 и 06–10 UTC), офф-пик = 17 часов. **Цены ЗАПИСИ в кэш нет** ни на прайс-странице, ни в `guides/kv_cache` (кэш «*enabled by default for all users*») ⇒ `cache_write_per_m: 0` оставлен верным. Правило вычета у вендора одно и по-прежнему плоское: «*The expense = number of tokens × price*». Слаги не менялись — `deepseek-v4-flash` / `deepseek-v4-pro` те же (см. §5 п.2 про ВЕСА).
|
||||
|
||||
**§2. Что записано.** Пин ПИКОМ по D39.136 (плоская схема time-based не выражает; консервативная сторона = потолок срабатывает раньше, не позже). `prices_checked: "2026-07-10"` → `"2026-08-15"`. Шапка файла несёт дословную цитату сноски, оба URL, обе строки офф-пика (для будущего решения) и пометку о цене записи в кэш. ⚠ До 16:00 UTC 16.08 (≈20 ч от сдачи) таблица ОПЕРЕЖАЕТ вендора — направление консервативное (завысит, не занизит), назвал явно.
|
||||
|
||||
**§3. Самопроверка исполнением — правка данных провод НЕ двигает.** Батарея ДО правки `EXIT=0` (3m01s) и ПОСЛЕ `EXIT=0` (2m43s) — базовая линия снята нарочно, чтобы красноту было к чему отнести. Голден `TestGoldenDeterminism` **PASS без пере-захвата**, ни один голден/снапшот не изменён (`git status backend/` = ровно один файл). Нейтральность доказана не только зеленью, но и кодом: `Request` (`backend/internal/pipeline/render.go:270-284`) поля цены не имеет, `RequestHash` (`render.go:292-317`) хеширует адресацию + провод-параметры + сообщения; `snapshot.go` из каталога моделей берёт ТОЛЬКО `ExtraBody` (`:527`) и `ResolveCapability` (`:534`) — цена в снапшот не сворачивается. Фикстуры тестов чинить не понадобилось: конкретные цены не пинит ни один тест (единственные литералы `0.14/0.28` — синтетический якорь `internal/ledger/pricing_test.go:51,69`, к `models.yaml` не привязан), `models_catalog_test.go` требует лишь `>0`. Шиппинговые конфиги проверены грепом: `budget_usd: 0` везде (`c1:135`, `c2:76`, все три арма) — ни один потолок эскалации ростом цен тихо не обесценен.
|
||||
|
||||
**§4. Замер вместо оценки (что рост стоит на НАШИХ прогонах).** Пере-оценил сохранённые `request_log` трёх реальных прогонов старой и новой таблицами по формуле `ledger.CostUSD`. **Самопроверка:** пере-счёт СТАРОЙ таблицей ≡ сохранённый `cost_usd` с дельтой `0.00000000` на всех трёх — значит моя реализация формулы совпадает с движковой и новым числам можно верить.
|
||||
|
||||
| прогон | вызовов | было | ПИК | ОФФ-ПИК |
|
||||
|---|---|---|---|---|
|
||||
| minirun 25.07 (цепочка c1: flash-черновик + dspro-редактор) | 77 | $0.114291 | $0.476978 (**×4.17**) | $0.238489 (×2.09) |
|
||||
| coldrun-a | 99 | $0.126068 | $0.559374 (**×4.44**) | $0.279687 (×2.22) |
|
||||
| acceptance A (тогда редактор = glm-5) | 293 | $0.408077 | $0.653614 (×1.60) | $0.495661 (×1.21) |
|
||||
|
||||
Третья строка — не шум, а самое содержательное: рост бьёт по счёту ровно в меру доли DeepSeek. У сегодняшней шиппинговой c1 эта доля 100% (черновик `deepseek-v4-flash` + редактор `deepseek-v4-pro`, `configs/pipeline-c1.yaml:38,76`), поэтому множитель счёта — **×4.2–4.4 в пике**, ×2.1–2.2 в долине. Ставку $0.03/глава (строка 166/П-10) НЕ пере-калибровал — не мой скоуп; множитель для неё замерен и лежит здесь.
|
||||
|
||||
**§5. Доклад по time-based схеме (фактура + рекомендация; решение владельца).**
|
||||
|
||||
**Вариант 1 — консервативный пин пиком (что сделано).** Кода — ноль, схема не трогается. Цена варианта названа точнее, чем в заказе: переплачивает **не только резерв**. Резерв транзитен (`stagerun.go:431`), но сеттл считает ТОЙ ЖЕ таблицей (`stagerun.go:613-614`) и кладёт число в чекпойнт `cost_usd` НАВСЕГДА (`:634-638`). Значит офф-пиковый прогон (17 часов из 24) записан в леджер ×2 от реального — и в отчёте пользователю, и в `committed`, на котором стоит потолок: потолок $X остановит прогон, который на деле стоил бы $X/2. Пост-хок починки нет — `RebillConsent` это согласие ПЕРЕ-ПОКУПАТЬ, а не пере-считать.
|
||||
|
||||
**Вариант 2 — scheduler-aware волны в долины (строка 60).** Что понадобится: **(а) схема цен** — `price` перестаёт быть скаляром, окна становятся ДАННЫМИ провайдера/модели (`windows: [{from,to}], tz`), отсутствие окон = плоская цена как сегодня; движок про DeepSeek знать не должен (мандат общности §0: «заработает ли провайдер, которого в репо нет, без правки Go?»). **(б) Код** — `Pricer.PriceFor(model)` → `PriceFor(model, at)`, два места на денежном пути (резерв `stagerun.go:431`, сеттл `stagerun.go:613`); часов на денежном пути сейчас НЕТ, появится инжектируемый clock — иначе денежные тесты и голден станут флейкими по времени суток. **(в) Планировщик** — отдельная ось (сдвиг волн, дедлайны, backpressure). **(г) ⚠ Дыра в вендор-факте:** по какой отметке времени определяется тариф — создание запроса или завершение — **вендором НЕ задокументировано** (на странице только «expense = tokens × price»). При `attempt_s: 240` вызов может пересечь границу окна, и планирование впритык к границе = ставка на незадокументированное поведение. По правилу двух направлений это не догадка сессии, а вопрос к вендору. Снапшот/`request_hash` вариант 2 НЕ двигает (цены в них не входят, §3) — пере-покупки книги не будет.
|
||||
|
||||
**Гибрид (называю, не строю):** резервировать по пику, а сеттлить по окну ФАКТИЧЕСКОГО времени вызова. Возвращает леджеру правду без планировщика (на сеттле время вызова уже известно), потолок остаётся консервативным, снапшот не двигается; цена — та же схема окон + clock в одном месте вместо двух.
|
||||
|
||||
**Рекомендация.** Пин пиком оставить как есть — он верен консервативной стороной и стоил $0. Вариант 2 целиком не начинать, пока нет (а) ответа вендора про отметку времени и (б) замера, сколько прогон реально проводит в пике. Если деньги нужны быстро, первый рычаг дешевле планировщика: **операционное правило «прогоны не стартуют в 01–04 и 06–10 UTC»** — долина и так 17 часов из 24, это даёт почти всё ×2 без единой строки Go, а при пине пиком остаётся консервативным (леджер завысит, не занизит).
|
||||
|
||||
**§6. ToS — дельты НЕТ, доказано ратифицированной формой (усиление 31.07, `00-provider-quirks.md`).** Объявленные даты те же, что в подписанном 25.07 вердикте: Terms of Use «*Last Update: March 27, 2026*», Open Platform ToS «*Release date: April 22, 2026 / Effective date: April 29, 2026*». Но «дельты нет» доказана НЕ датой: построчный дифф живых тел против Wayback-снимков, снятых ПОСЛЕ прошлого ре-чека и ДО релиза 13.08 (ToU `20260801194102`, OPToS `20260807083602`) — **444 строки против 444 и 364 против 364, расхождений 0**. Обе ратифицированные цитаты на месте (сверка по копии с удалёнными пробелами — та самая защита от ложных нулей): ToU §3.4(5) «*is pornographic, obscene, or sexually explicit*» и §3.4(6) «*facilitates, promotes, incites or glorifies violence*». Вердикты D39.29/D39.30 по deepseek (SE = FORBIDDEN, violence = UNCLEAR) не двигаются, интерпретации в доки не абсорбировал.
|
||||
|
||||
**§7. Пинги оркестратору (действий не предпринимал — не мои решения).**
|
||||
1. **`prices_checked` — одно поле на ВСЮ таблицу.** Бампнув его по факт-чеку ОДНОГО вендора (как требовал промт), я сдвинул 120-дневный гейт свежести и остальным семи моделям: их дедлайн уехал с ~07.11 на ~13.12. Сделал по букве промта и называю побочный эффект вслух. Лечения два: ре-чек остальных вендоров отдельным заходом либо пер-модельная дата проверки (правка схемы — не моя зона).
|
||||
2. **Веса поехали под тем же слагом — класс D39.61.** Вендор объявил `MODEL VERSION: DeepSeek-V4-Pro-0813` (flash — `-0731`) при явном «*Model names remain unchanged*» (news260813), плюс новая ручка «*Flexible reasoning effort for V4-Pro & V4-Flash: low … high … max*» — последнее пересекается с квирк-строкой про маппинг эффорта у DeepSeek (`00-provider-quirks.md` — ЧУЖАЯ зона, не правил).
|
||||
3. **Ценовая посылка интерим-редактора D39.22 «dspro ×2 дешевле glm» РУШИТСЯ.** Замер на 129 реальных edit-вызовах acceptance A, одна и та же нагрузка разными прайсами: glm-5 $0.337708 · dspro старый $0.106982 (**в 3.2 раза дешевле**) · dspro ПИК $0.424765 (**в 1.26 раза ДОРОЖЕ glm-5**) · dspro офф-пик $0.212382 (дешевле лишь в 1.59). Оговорка честности: это контрфактика по ОСИ ЦЕНЫ на токенах glm — собственный расход токенов у dspro иной, полной стоимостью это не является. Но направление однозначно: экономический довод, на котором стоял интерим-выбор редактора, в пике перевернулся. Решение — владельца/оркестратора.
|
||||
4. **Вахта поведением (п.5 промта) НЕ ЗАПУЩЕНА, говорю явно.** Сдача в 2026-08-15 19:43 UTC; условие промта «после 16:00 UTC 16.08» наступает через ~20 ч, и `DEEPSEEK_API_KEY` в окружении сессии нет, а `.env` читать запрещено гардрейлом. Риг готов и лежит в моей зоне: `internal/pipeline/live_reprobe_test.go:63` `TestLiveClassifierHarmSet`; конфиги на месте (`~/books/gu-zhenren/coldrun-b/reprobe/{classify6,bank-low}/book.yaml` — оба существуют). Команда для того, кто продолжит: `TM_LIVE=1 TM_CLASSIFY6_N=5 TM_CLASSIFY6_CONFIG=~/books/gu-zhenren/coldrun-b/reprobe/bank-low/book.yaml go test -tags live -run TestLiveClassifierHarmSet -count=1 -v ./internal/pipeline/`. Учесть при чтении результата: цена одного прогона рига выросла тем же множителем, что и всё остальное.
|
||||
|
||||
**§8. Само-ревью вторым проходом (заказ владельца) — что оно добавило.** Клеймы первого прохода пере-проверены ИСПОЛНЕНИЕМ и устояли: цены в yaml сверены с вендор-страницей **машинно, а не глазами** (свежий запрос → разбор таблицы → поклеточное сравнение: идентичны пиковой строке, порядок меток `flash|OFF-PEAK|PEAK|pro|OFF-PEAK|PEAK` подтверждает, что строки не перепутаны, офф-пик ровно половина во всех шести клетках); поля легли в те, что нужно (`config/models.go:168-181` — теги 1:1, значения напечатаны из ЗАГРУЖЕННОГО файла, подмены `input`↔`cached` нет); дифф вне комментариев — ровно три строки (дата + две цены); все 16 ссылок `file:line` этого отчёта проверены печатью самих строк; коэффициенты пересчитаны; даты 07.11→13.12 и окна 7 ч/17 ч подтверждены счётом. Добавлены две проверки, которых в первом проходе НЕ БЫЛО: **`make battery-stand` EXIT=0** (корпусные тесты за `TM_MINER_PARITY=1 TM_CHECKER_LABELS=1`) и **`go vet -tags live ./internal/pipeline/` EXIT=0** — live-теги читают боевой `models.yaml`, компилируются и цен не пинят. Ярлыки замеров §4 пере-проверены разбивкой по СТАДИЯМ, а не по имени прогона: minirun = draft flash 58 + edit dspro 16 + 3 эскалации черновика (цепочка c1 — верно); coldrun-a = draft flash 72 + terminology flash 21 + 2 эскалации, редакторской стадии в нём НЕТ; acceptance A = edit glm-5 129 + draft flash 162. **Но ревью нашло две вещи, которых в первом проходе не было, и обе про деньги:**
|
||||
|
||||
1. **Проекция пере-покупки после 16.08 ЗАНИЖАЕТ — инверсия заявленного самим кодом направления.** `projectRebill` складывает СОХРАНЁННЫЙ исторический `cost_usd` (`internal/pipeline/rebill.go:166`), а гейт согласия сравнивает эту сумму с `--accept-rebill=<usd>` (`:252`) и с порогом `min($0.50, 5% × projected_book)` (`:200-211`, константы `:41-42`). Резерв и сеттл при этом считают по НОВОЙ таблице (`stagerun.go:431`, `:613`). Значит единицы, впервые оплаченные по СТАРЫМ ценам DeepSeek, при пере-покупке стоят до **×4.4** от числа, которое оператору показали и на которое он согласился; собственный комментарий кода — «*Over-estimating is the safe direction for a consent gate*» (`rebill.go:81`) — для таких единиц перевернулся. **Это не дыра в тратах:** `book_usd`/`day_usd` считаются новой таблицей и реальный перерасход по-прежнему останавливают — врёт именно ЧИСЛО СОГЛАСИЯ, плюс `projected_book_usd` у `tmctl status` (экстраполяция остатка книги из средней исторической стоимости юнита, `rebill.go:179-195`). Свойство предсуществующее, материально неверным его делает ровно смена цен 16.08. Кода не касался — не моя зона; кандидат в бэклог.
|
||||
2. **Один стендовый потолок теперь пробит тем же объёмом работы.** Пере-оценил все девять стендовых книг против их `ceilings.book_usd`: восемь влезают, **`coldrun-a` — нет** (`book_usd: 0.25`; работа стоила $0.126068, по пику $0.559374 = **×2.2 потолка**). Поведение правильное — потолок и должен остановить, — но пере-прогон этой книги встретит `CeilingHalt` там, где раньше доходил до конца, и следующий, кто это увидит, должен знать, что причина — цена, а не поломка. Стендовые `book.yaml` лежат в `~/books` (вне git и вне моей зоны) — не трогал.
|
||||
|
||||
**Запись оркестратора №17, 15.08 — ПРИЁМКА вендор-сессии: ПРИНЯТО, залендено `76049bb` (решения — D39.137).** Инлайн исполнением: вендор-страница пере-прочитана НЕЗАВИСИМО (все шесть пиковых клеток, окна и дата — до цента), голден бит-в-бит и ledger/config-тесты — пере-раном, дифф вне комментариев = ровно 3 строки, поиск вне карты: fallback-якорь цены (`default_model: deepseek-v4-flash`) — ссылка, не литерал, переехал автоматически. Поправок к отчёту НЕТ. Пинги §7 диспозиционированы: §7.1 → строка 180 · §7.2 → вахта в остатке 172 · §7.3 → вход ратификации фазы Д (D39.137 п.4) · §7.4 → остаток 172(г); находки §8 → строка 181 и D39.137 п.2г.
|
||||
210
docs/archive/architecture/05-decisions-D39-106-123.md
Normal file
210
docs/archive/architecture/05-decisions-D39-106-123.md
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
# Архив D-лога: D39.107–D39.123 (эры №14–15; живое тело D39.106 «шов» осталось в живом файле)
|
||||
|
||||
> **⚠ АРХИВ (слайс D39.139, 16.08.2026): тела нот вынесены ИЗ `docs/architecture/05-decisions-log.md` ДОСЛОВНО.**
|
||||
> Эра №15: приёмки P1–P4 платформы · S3-серия фронта · эксп-21 · фикс-пак банка · движковые блокеры контракта ·
|
||||
> нормы ревью D39.120/121 (вписаны в ORCHESTRATOR_SESSION_PROMPT) · докс-диета D39.125/126 (07–09.08).
|
||||
> Номера остаются контрактом: карта актуальности и эрраты — в живом D-логе (при конфликте он побеждает);
|
||||
> статус любого номера одним хопом — реестр `05-decisions-index.md`. Инструкции отсюда НЕ исполнять.
|
||||
|
||||
## D39.107 — ЗАКРЫТИЕ СЕССИИ №14 И ПЕРЕДАЧА №15: P0 принят и заленден, по P1 выдан пул доработок (приёмка доработанного дерева — №15), D39.106 ратифицирован пятью верификациями (06.08). ✅
|
||||
|
||||
**1. Итог №14:** приёмка P0 платформы — ПРИНЯТ, заленден `eeeef89`+`954c034` (регистр PD-1..19) · направление платформы ратифицировано (`PLATFORM_DIRECTION.md`, `99c9cb0`) · решения владельца по кредитам записаны (`87be7b9`, `6469479`) · по P1 проведена адверсариальная проверка (43 посадки, 31 поймана; сверка с RFC 9700 · ASVS 5.0 L2 · OIDC Core) — она дала ПУЛ ДОРАБОТОК (регистр до PD-59), сессия платформы взяла его в работу, и **дерево зоны с тех пор сильно изменилось (≈40 файлов, новая миграция 00008) — эта доработка НЕ принята и НЕ залендена: полная приёмка изменённого дерева = №15** · **D39.106 ратифицирован** (шов: журнал в каталоге книги + systemd-юнит-на-прогон, платформа не родитель) после пяти верификаций — 4 чистых панели + кросс-чек GPT; фактура и требования к постройке — `research/25` · промт S3 актуализирован и готов к запуску (`6ac26f3`).
|
||||
|
||||
**2. Дельта норм (уроки №14, оплачены):** проверки ВНУТРИ репозитория ≠ приёмка решения — решения зон сверять с действующим первоисточником нормы (RFC/ASVS/спека) с номером раздела; слабая аргументация ≠ неверная позиция — сильные прецеденты искать САМОМУ до вердикта; свой контраргумент проверять чужими руками; допущения в ПОСТАНОВКЕ — такой же объект проверки, как ответ; изоляция панелей = запрет ФАЙЛОВЫХ тулов + аудит постфактум по journal.jsonl (сеть не запрещать — заземляет); адвокатская постановка покупает риторику за счёт строгости. Также в memory `acceptance-antipatterns`.
|
||||
|
||||
**3. Очередь №15 (PROGRESS CURRENT-STATE не обновлён — занят живым полигоном; обновить при его лендинге):** (1) **приёмка доработанного дерева платформы** после передачи: ВСЕ изменённые файлы, по `ENGINEERING_STANDARDS` §3, со СВОИМИ посадками (готовый тест PD-52 — в журнале зоны; батарею гонять с живым PG — рецепт стенда без root в `platform/docs/STACK_DECISIONS.md`), лендить pathspec-формой · (2) по освобождении PROGRESS.md: строка 103 = эмиттер журнала по `research/25` §эмиттер + 4 денежные строки (реконсилятор · uncertain-эскроу · сверка с провайдером · пер-вызовный гейт) + пиннинг версии; пересчёт очереди скриптом · (3) по команде владельца: промты бэкенду (эмиттер) и платформе (реконсилятор/тейлер/юниты; пайп-`supervisor.go` → дев-режим) — носители: D39.106 + research/25 включая пометки (GPT) · (4) приёмки полигона: экспы 18/19/20 живые · (5) незакоммиченное Приложение А (`14-api-contract/README.md`) — слово владельца · (6) запуск S3 — промт готов · (7) вахта deepseek-v4-pro (триггер прошёл) · (8) мини-проба флора (строка 44) одобрена, промт не выдан. **Грабли:** сессии зон ЖИВЫ, пока владелец не сказал обратного — платформа и полигон работают прямо сейчас; git только pathspec-формой.
|
||||
|
||||
## D39.108 — ПРИЁМКА ЭКСПОВ 18/19/20: приняты и залендены; закрытие D21.4/D21.10; курс на эксп-21 «топология ролей» (06.08). ✅
|
||||
|
||||
**1. Приёмка** (7 верификаторов: слепой вердикт до чтения отчёта · ре-раны «заявление=команда» · деньги из сырья двумя путями · бэкенд-пинги исполнением боевого Go-кода · охота вне карты · свип квирк-цитат; изоляция панелей аудирована по журналам). Экспы 18 (`41cde9f`) · 19 (`0c3b55f`) · 20 (`3d5d5d5`) ПРИНЯТЫ; квирк-отзыв §3б заленден (`bb82876`, §3а в силе). Несущие вердикты чисты ре-раном: закон-блок 21/21 · неверная строка банка 6/6 (вытеснение 5/6, единогласие 6/6) · контроль без блока ломает 5–12/20 · гейт Q4b «диффы откладываются» · фронтир терминолога не оправдан (конвенция 古月 = 18% голда — рычаг данных) · польза второго прохода = свойство пары модель×роль (dspro отрицателен, glm-5 положителен). Поправки приёмки — в ревью-шапках отчётов; главные: §5.2 экспа 20 НЕ персистирован (статус «со слов»; направление держит персистированный судья §5.3) · offblock-числа сняты до-фризовым стемом (черновик 16/41, не 18/41) · цена раунда починки не входила в дифф (lu/ON 0.89→1.08) · «вся сессия $2.1793» включала $0.107335 сырья research/24 — фактическая цена 18+19+20 = **$2.0720** · оба бэкенд-пинга: наблюдения верны, вердикты опровергнуты (микро-утечку ловит санитайзер; банкнота жива ран-локальным конфигом D39.42 п.4 — реальный дефект = декларация против shipping-конфига, строка 140). Фризы предшествуют платным вызовам (46 с · 21 с · 49 мин); amend `4d1d9e5` разобран по reflog — пре-рег-текст не трогал (девиация арма E + premise_review); процесс-нота: девиации оформлять новым коммитом, не amend'ом фриза. Эксп-20 шёл без фриза — принят exploratory по санкции.
|
||||
|
||||
**2. Решения владельца 06.08:** санкции экспов 19/20 и подъёмы потолков — CONFIRM · лендинг и актуализация доков санкционированы · направление эксп-21 подтверждено · норма «гард проклятия знанием» (онбординг-блок проблемы в каждом хендофф-промте) вписана в промт оркестратора п.1а.
|
||||
|
||||
**3. Эксп-21 «топология ролей» — промт выдан** (`docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md`); двойной аудит: слепая панель 3 линз без файловых тулов (изоляция чиста) + полноконтекстный анти-паттерн-агент. Добавки панели, принятые в промт: арм F do-nothing (потерянная норма exp15:486) · MQM-lite/error-span протокол + мощность/MDE и шумовой пол ДО бейк-оффа · guarded+routed арм G · обратная связка E · Палладий-линт транскрипции · мини-проба глоссарий-лока · факторная рамка на замороженных черновиках · декой D39.46(б) и запрет судьи семейства жильца · пере-проба маппинга dspro до Ф1 (вахта 108). Потолки ПРЕДВАРИТЕЛЬНЫЕ (≈$7.3 стадиями с ранним отсевом; пере-сверка сметы после предзамера мощности — обязательна); запуск = слово владельца. Два тезиса разжалованы в гипотезы бейк-оффа (анти-соглашательство): «экономическое оправдание черновика пало» и «черновик = опора верности».
|
||||
|
||||
**4. Закрытия и диспозиции:** **D21.4 (арм minimal-diff с тирингом) и D21.10 (поручение спеки апплая) ЗАКРЫТЫ явно** по букве гейта Q4b (exp15:147): аппликатор построен полигоном и замерен (15/15; комплаенс 0.966 на боевой единице), диффы отложены; реактивация — через строку 106/эксп-21. Строки **135–144** заведены (денежный пакет шва D39.107 п.2: пер-вызовный гейт · uncertain-эскроу · сверка с провайдером · реконсилятор · пиннинг версии; находки приёмки: банкнота-декларация 140 · дыра сносок 141 · механизм починки-по-флагу 142 · норматив судейства 143 · вахта grok-биллинга 144); строки 103/106/134/65/55/12 пере-диспозиционированы. Исполненный промт пробы 18 архивирован. PROGRESS CURRENT-STATE обновлён на №15 (долг D39.107 погашен).
|
||||
|
||||
## D39.109 — ПРИЁМКА ПЛАТФОРМЫ P1+P2: приняты и залендены одним коммитом; регистр до PD-107, одна major; два вопроса владельцу (07.08). ✅
|
||||
|
||||
**1. Вердикт.** Дерево зоны `platform/` (30 изменённых отслеживаемых файлов, 22 новых, миграции 00004–00008) ПРИНЯТО и заленжено. ⚠ **Факт, который доки завышали:** журнал зоны объявлял «P1 ПРИНЯТ и заленден» — в git код P1 не уезжал (`git ls-files platform/internal/login` = 0 до этого коммита), уехали только P0 (`eeeef89`/`954c034`), направление (`99c9cb0`) и решения владельца (`87be7b9`/`6469479`). Формулировка исправлена на месте с пометкой оркестратора; строки регистра ошибки не несли — они честно говорят `fixed(P1, дерево сессии)`. Живой уязвимости приёмка не нашла.
|
||||
|
||||
**2. Метод — исполнением, второй рубеж по своей карте.** Батарея пере-прогнана мной: офлайн зелёная (линтер 0 issues), с живым PostgreSQL 18.4 без root — **скипов ноль** (26 БД-тестов отработали), `make vuln` чист. **Свои 45 мутаций в четыре батча по СВОЕЙ карте несущих свойств (не по таблице пинов зоны): 33 поймано поимённо, 8 выжило, 4 моих посадки оказались негодными и разобраны вслух.** Мутации ставились в КОПИИ зоны вне репозитория — незакоммиченное дерево сессии не тронуто, сверено хешами диффа до и после. Живые пробы на боевом бинаре: PD-2 (10 полу-кормленных POST отпущены на 30.0 с), пять форм CSRF, ПТ-34-заголовки, RFC 9207 (Google действительно шлёт `iss`; сорванный → `issuer_missing`, чужой → `issuer_mismatch`, обмена кода нет). PD-71 пере-проверен своим прогоном на боевых данных: `DownTo(4)` падает на `users_email_key` SQLSTATE 23505, данные целы. Фаззеры: 3.0 и 3.35 млн исполнений, крэшеров нет. **Цитаты норм сверены по первоисточникам, не по пересказу** — RFC 9700 §4.4.2/§4.4.2.2, NIST SP 800-63B-4 §2.1.3, ASVS 5.0 7.1.1/7.1.2/7.1.3/7.6.1/7.6.2 дословны, номера и уровень L2 верны; это несущая проверка, на этих цитатах стоит смена боевого значения 90 → 30 суток. Плюс воркфлоу-панель: семь линз с зажатыми промтами (отчётные доки зоны запрещены) и адверсариальный опровергатель на каждую находку весом minor+ — 20 подтверждено, 2 опровергнуто.
|
||||
|
||||
**3. Ратифицировано (6 из 6):** абсолютный срок сессии **30 суток** (буква NIST AAL1; у прежних 90 обоснования не было) · контрмера mix-up = **`iss` авторизационного ответа (RFC 9207)**, миграция 00008, а не раздельные redirect URI (норма объявляет их фолбэком) · **`STACK_DECISIONS §13`** как документ соответствия ASVS 7.1.1/7.1.2/7.1.3 с прямо названным рассогласованием с федеративной сессией · **ломающие изменения зоны** (`NewServer` без `Timeouts` — устранение класса сильнее теста · `Prober.Ready` · `login.Fail` без `*http.Request`; внешних потребителей нет, фронт говорит по HTTP) · **`MemoryMax=80%` + явный `OOMPolicy=continue`** (сверено с `systemd.resource-control(5)`/`systemd.service(5)`; ⚠ под systemd не исполнялось) · **PD-71 принят риском** в форме зоны: правило append-only дороже доступности отката ниже версии 5, место записи — `deploy/README.md` у оператора.
|
||||
|
||||
**4. Найдено приёмкой: 29 строк PD-79…PD-107, одна major.** **PD-80 (major):** ведро лимитера одно на `/auth/login` и `/auth/callback`, а колбэк стирает login-куку ДО своей проверки лимитера ⇒ анонимный поток ~3 rps закрывает вход всем И добивает начатые входы невосстановимо (воспроизведено мной на бинаре и независимо панелью; фикс — порядок двух строк плюс раздельные ведра). Остальное minor/info, несущие: строковый `"null"` в `committed_usd` читается как НОЛЬ денег (PD-79, закрыть до воркера) · три «закрыто, но не запинено» по собственному правилу зоны — половина PD-3, лимитер PD-29, ветка обновления адреса (PD-83/84/85) · установка по наброску даёт нестартующий юнит и `ProtectHome` против «книги в `~/books`» (PD-91) · админ-CLI, единственный писатель денег, без единого теста (PD-106) · доккоммент `events.go` предлагает то, что PD-59 уже отклонил (PD-95) · дрейф реализованной поверхности `/auth/*`+`X-TM-Client` против контракта 14 (PD-96/остаток) · декодер и норматив зоны расходятся на дубле `seq`, и после PD-12 цена — убитый платный прогон (PD-105: разрешать ратификацией вместе с промтом эмиттера, строка 103) · удаление аккаунта обходит защиту PD-25 через каскад `users → reservations` (PD-107, гейт перед появлением такой операции).
|
||||
|
||||
**5. Опровергнуто приёмкой, включая свои промахи** (дисциплина «заявление=команда» действует и на приёмку): версия панели «удаление аккаунта падает на композитном FK при закрытых резервациях» — мой прогон удаляет · «`money` читает JSON `null` как ноль» — голый `null` даёт nil, дыра в СТРОКЕ `"null"` · «WARN на каждый отбитый вход = неограниченная запись в лог» — `AccessLog` и так пишет INFO на каждый запрос · моя посадка «грант фри-тира не запинен» НЕГОДНА (грант живёт в ветке новой личности; корректная посадка ловится тестом) · моё «падение `FuzzDecoder`» — голод по CPU от параллельных батчей, чистый прогон зелёный · PD-20 — калибровка, а не находка: пин вероятностный по природе дефекта. Отдельно названо, что `TestMigrationsRollBackAndReapply` откатывает ПУСТУЮ базу и для 00005 не доказывает ничего.
|
||||
|
||||
**6. Владельцу — два вопроса:** (а) срок сессии 30 суток означает, что не заходивший месяц человек увидит экран входа — если это против замысла, это одна переменная `TM_PLATFORM_SESSION_MAX_AGE` плюс явная запись отклонения в §13; (б) **новое (PD-104):** фри-тир печатается неаутентифицированным потоком по $5 за каждую новую подтверждённую пару `(provider, subject)`, агрегатного потолка и счётчика аномалий нет нигде — нужен ли суточный лимит грантов до открытия беты.
|
||||
|
||||
**7. Долг лендинга, названный вслух:** PROGRESS CURRENT-STATE **не обновлён** — файл занят живым полигоном (его пинг по эксп-21 лежит незакоммиченным, коммит `d472599` его же). Тот же случай, что D39.107 п.3: обновляет тот, кто лендит полигон. `docs/README.md` обновлён этим же коммитом (норма D39.80), промт P0 платформы получил баннер-исход.
|
||||
|
||||
**D39.109-эррата (07.08, по вопросу владельца — процессом НЕ поймано).** Приёмка №15 при лендинге пропустила, что **D39.106 п.3 снял пайп-транспорт**: «PD-59 superseded; пайп-путь `supervisor.go` P1 = дев-режим; ответ PD-13 переезжает на cgroup юнита прогона». Зонный журнал платформы при этом длинно доказывает обратное («канал остаётся stdout», SIGPIPE-аргумент), и я принял эту секцию как живое решение — классический анти-паттерн «связность вместо истинности»: аргументация убедительна, а голова D-лога её уже перекрыла. Ошибка ушла в мою же строку PD-95, которая ссылалась на снятый PD-59 как на действующий. **Исправлено:** секция журнала помечена SUPERSEDED с дословным перечислением ратифицированной формы (`research/25` §Форма: транзиентный systemd-юнит на прогон · платформа НЕ родитель · `events.jsonl` в каталоге книги как outbox-проекция коммитов SQLite · тейл платформой с курсором `(engine_run_id, seq)` в одной транзакции с эффектом; отвергнуты с нулём голосов: родитель+пайп 0/15, выделенный fd 3 — 0, stdout/journald как источник — 0) · PD-95 переписан на верное основание и поднят в вес (его прочтёт эмиттер-сессия как задание) · **PD-92 понижен до info** (дефект дев-пути: в проде родителя нет, `cmd.StdoutPipe()` не существует) · **PD-105 повышен** (при тейле журнала повторное чтение строк после краша читателя — НОРМА, значит норматив зоны «at-least-once, дубль не ошибка» буквально верен, а фатальный отказ декодера ему противоречит) · **PD-60 пере-диспозиционирован** (постановка про 64 КиБ пайпа устарела; переформулируется вместе со строкой 103 как «что делает движок, когда журнал не пишется»). Вердикт лендинга не меняется: код принят как дев-путь, которым его и объявил D39.107 п.3, — меняются ДОКИ зоны и вес трёх строк. **Носители работы существовали и до эрраты:** строка 103 несёт эмиттер уже в форме D39.106, строки 138/139 — реконсилятор и пиннинг версии, строка 126 — механизм поднятия потолка. **Урок в норму:** при лендинге зоны каждый вывод зонного дока, спорящий с транспортом или швом, грепается по D-логу на supersede ДО ратификации — «решение, живущее только в зонном доке при противоречащем каноне, — дефект синхронизации» (норма D39.99 п.4) действует и в обратную сторону: канон мог снять зонный вывод, а не только наоборот.
|
||||
|
||||
## D39.110 — ПОТОЛОК ПРОГОНА УПРАВЛЯЕМЫЙ: решение владельца 07.08 ратифицировано формой; фри-тир — предложение оркестратора на confirm; строка 145 заведена (07.08). ✅
|
||||
|
||||
**1. Решение владельца 07.08 (дословно по смыслу):** потолок управляется двумя вещами — «выключить потолок» и «выставить вручную с фронта»; форма — шкала в интерфейсе от минимума (ноль выбрать НЕЛЬЗЯ, подсвечен серым) до максимума баланса аккаунта, конкретный виджет на выбор исполнителя. **Ратифицировано формой, и форма сама снимает конфликт с Р7:** максимум = баланс ⇒ движок всегда получает положительное число, состояния «потолка нет» не существует, валидатор `book.go:250-251` («a ledger with no ceiling is forbidden, Р7») не правится и Р7 не амендируется. Носитель — пере-поставленная строка **126**.
|
||||
|
||||
**2. Три следствия, без которых форма неполна (добор оркестратора, каждое проверено кодом).** **(а) Единица шкалы — НЕ доллары, а главы (либо % баланса).** Тогда минимум объясняет себя сам («одна глава», ниже прогон бессмыслен — владелец сам отметил, что непонятно, какое минимальное число ставить), а **D39.84 остаётся цел**: читатель не видит структуру наших расходов, платформа сама переводит главы в доллары по оценке движка. Доллары на ПОЛЬЗОВАТЕЛЬСКОМ экране = осознанный амендмент D39.84, и это отдельное решение владельца, а не побочный эффект виджета (П-5 показывает процент ровно по этой причине). **(б) Это потолок ПРОГОНА, значит он не пишется в `book.yaml`.** Дизайн платформы объявлял её владельцем `book.yaml` и намеревался поднимать `ceilings.book_usd` правкой файла — тогда пользовательское число становится постоянной записью в данных движка, что смешивает зоны против D39.81/D39.85. В коде этого НЕТ (проверено: платформа только ставит `cmd.Dir`), значит форма выбирается бесплатно ⇒ **НОВАЯ строка 145**: движок принимает потолок аргументом прогона; сегодня ни флага, ни ENV не существует (`tmctl` таких флагов не имеет, значение идёт только через `Ceilings.BookUSD`, `stagerun.go:480,505`). Цена нулевая: `Ceilings` в `BriefHash` не входит (`book.go:280-297`) — ни снапшот, ни ре-билл не двигаются. **(в) Максимум шкалы = доступный остаток аккаунта.** ⚠ **ИСПРАВЛЕНО 08.08 приёмкой S3 (D39.115): первая редакция этого подпункта говорила «баланс МИНУС открытые холды» — это ОШИБКА, вычитание дважды.** `Hold` пишет в леджер отрицательную строку и тем же знаком двигает кэш баланса (`credits.go:179` → `appendLedger` `:297-305`), поэтому баланс УЖЕ не содержит открытых холдов; `Reserved` — отдельная справочная сумма. Замерено приёмкой на живом PG: грант $10, холд $1 → `Balance=9.000000`, `Reserved=1.000000`, а «баланс минус Reserved» дало бы $8. Поймала фронт-сессия S3 чтением Go-кода платформы, а не доков — и ради этого нарушила мой же запрет ходить в чужую зону. Платформа берёт холд на сумму потолка ДО спавна, поэтому ползунок в упоре запирает весь баланс на одну книгу и вторую начать нельзя; `ReadAccount` уже отдаёт `Balance` и `Reserved` раздельно, данных хватает.
|
||||
|
||||
**3. Фри-тир — вопрос владельца («а как это обычно делается в бэкендах?»), ответ и ПРЕДЛОЖЕНИЕ, а не ратификация.** Разделяется на две половины, и стандартный ответ есть только у одной. **Где живёт начисление:** учебник — промо-кредит пишется строкой леджера в ТОЙ ЖЕ транзакции, что создание аккаунта, идемпотентно по `(аккаунт, source, source_id)`; код зоны это уже делает верно (`upsertIdentityTx`), менять нечего. **Стреляет ли само:** норма — «автоматически, но с ЯКОРЕМ, который стоит абьюзеру денег» (карта на файле — AWS/GCP; телефон — OpenAI добавил его к своим $5 после фарминга; инвайт), плюс бюджет кампании отдельной суммой и алерт при упоре. `email_verified` от Google якорем НЕ является — аккаунты бесплатны и создаются пачками, признак доказывает существование ящика, а не отдельного человека. У нас нет ни одного из трёх, а деньги — предоплаченные ключи владельца. **Предложение: на бете дефолт в НОЛЬ и начисление руками** (платёжного инструмента нет ⇒ между скриптом и ключами нет ничего; бета-тестеров столько, что одна команда в шелле на человека не работа); при появлении платежей дефолт возвращается к $5 ВМЕСТЕ с суточным агрегатным потолком — якорь и потолок приезжают по одному поводу. Ждёт слова владельца; носитель — PD-104.
|
||||
|
||||
**4. Расхождение док↔код, чинится независимо от п.3:** реестр при закрытии PD-30 утверждает «аккаунт создаётся с нулём, начисление руками из админки», а код создаёт аккаунт С $5 (`config.go:73` дефолт `5 * 1_000_000` → `main.go:99` → `login.go:285`). Один из двух текстов лжёт прямо сейчас; строка PD-104 переписана и несёт оба факта.
|
||||
|
||||
**5. Счёт очереди пере-считан скриптом (норма D39.101):** всего **120** строк · зона бэкенд **62** строго / **79** широко · «скоро» **32** (добавлены 126 и 145).
|
||||
|
||||
## D39.111 — ПРОМТ S3 ДОПИСАН приёмкой платформы (управляемый потолок + запрет кросс-origin); фикс-пак платформы передан запиской (07.08). ✅
|
||||
|
||||
**1. S3 получил два новых пункта списка правок спеки** (`frontend/docs/S3_SESSION_PROMPT.md`, шапка списка пере-атрибутирована №15; промт НЕ запущен, поэтому правка файла легальна без релея). **В-трис — управляемый потолок прогона** по решению владельца 07.08 (D39.110): шкала от минимума до доступного остатка, ноль недоступен, виджет на выбор сессии, и три «делай РОВНО так» — единица ГЛАВЫ (доллары = амендмент D39.84, он не выдан) · максимум = баланс МИНУС открытые холды (иначе шкала в упоре запирает весь баланс на одну книгу) · потолок принадлежит ПРОГОНУ, не книге; пересчёт «главы → деньги» наружу не выходит вовсе. **В-кватер — фронт живёт на том же origin, и это факт, а не выбор:** CORS-слоя в платформе нет, preflight `OPTIONS` с чужим `Origin` получает 401 от гарда сессии (замер приёмки на живом бинаре, PD-96) ⇒ в деве ходить через прокси dev-сервера, кросс-origin не проектировать; `X-TM-Client` обязателен и на same-origin — он не про CORS.
|
||||
|
||||
**2. Фикс-пак платформы передан ЗАПИСКОЙ, а не отдельным промтом** — по прецеденту №14 (восемь пунктов жили разделом зонного журнала и были отработаны) и по норме пропорциональности: это точечные фиксы, а не дизайн. Носитель — раздел «Ратификация приёмкой P2» зонного журнала, фикс-лист там же с порядком. Состав: **PD-80** (единственная major — доступность входа: лимитер прежде очистки login-куки плюс раздельные ведра) · **PD-79** (строковый `"null"` = ноль денег, до появления вызывающего у `Settle`) · **PD-100** (колбэк глотает ошибки стора и discovery — класс PD-5, закрытый в `auth/`, но не в `login/`) · **PD-83/84/85** (три «закрыто, но не запинено» по собственному правилу зоны) · **PD-106** (админ-CLI — единственный писатель денег — без единого теста) · **PD-91** (установка по наброску даёт нестартующий юнит; `ProtectHome` против «книги в `~/books`») · **PD-95** (транспортный доккоммент — ДО промта эмиттера, иначе эмиттер-сессия прочтёт его как задание). **Граница пака названа явно:** PD-92/93/96/99/102/105/107 НЕ трогать — они латентны за воркером и эмиттером, и правка сейчас означала бы угадывание формы, которую задаёт строка 103.
|
||||
|
||||
**3. Условный пункт:** если владелец подтверждает предложение по фри-тиру (D39.110 п.3), в тот же пак заходит дефолт `SignupGrantMicroUSD` в НОЛЬ; расхождение док↔код (PD-104) чинится независимо от ответа.
|
||||
|
||||
## D39.112 — ВЕРИФИКАЦИЯ ЗАПИСЕЙ №15 НЕЗАВИСИМЫМ АГЕНТОМ: восемь фактических правок и восемь пробелов закрыты; поправка к D39.109/D39.110 (07.08). ✅
|
||||
|
||||
**1. Заказ владельца:** один чистый агент читает промт оркестратора и доки «где мы сейчас» и проверяет записи №15 по четырём осям — факты, пробелы, понятность холодной сессии, вода. Вердикт агента: «можно доверять С ПРАВКАМИ». Он пере-считал очередь своим скриптом (120 · 62/79 · «скоро» 32 — сошлось до строки), механически сверил ВСЕ `file:line` новых строк реестра (все существуют и говорят заявленное), пере-проверил номера норм по первоисточникам, прогнал `build`/`vet`/`test`/`golangci-lint` в зоне (0 issues) и подтвердил существование всех пинов ратифицированных решений. Не заверено им (стенд без Postgres): 45 мутаций, 26 БД-тестов, живые пробы на бинаре, `make vuln`, счёт фаззеров — остаются со слов приёмки, и так и помечено.
|
||||
|
||||
**2. Поправки к D39.109 — принять как исправление, буква нот не переписывается (D23.3).** **(а) п.3 пере-формулировал NIST.** Сказано «30 суток — БУКВА NIST AAL1»; по первоисточнику SP 800-63B-4 §2.1.3 буква иная: SHALL — только «установить определённый reauthentication overall timeout», сами 30 суток — **SHOULD**, и это интервал ре-аутентификации, который успешная ре-аутентификация СБРАСЫВАЕТ, а не неснимаемый предел; термин «absolute maximum session lifetime» принадлежит ASVS, не NIST. Верная формулировка: **NIST требует (SHALL) установить определённый overall-таймаут ре-аутентификации и рекомендует (SHOULD) не более 30 суток на AAL1; наш жёсткий абсолютный срок 30 суток этой планке соответствует и трактует её строже.** ⚠ **Поправка к поправке, внесена в тот же день по перепроверке у первоисточника:** первая редакция этого пункта утверждала со слов верификатора, что 30 суток — интервал, который успешная ре-аутентификация СБРАСЫВАЕТ. Проверено у NIST: документ этого НЕ говорит — про сброс там не сказано ничего, поведение оставлено открытым. Значит наше чтение «жёсткий предел, который ничем не продлевается» — НАШ выбор, и он строже нормы, а не вычитан из неё. Подтверждается только вторая половина находки верификатора: термин «absolute maximum session lifetime» в NIST действительно отсутствует, он из ASVS. **Урок сессии: верификатор убедителен, и его собственные подпункты подлежат той же сверке с первоисточником, что и проверяемый текст — иначе приёмка приёмки просто переносит доверие на шаг.** Зонные носителя (`STACK_DECISIONS §13`, `config.go:62-64`) цитируют верно — ошибка была только в ноте, то есть в источнике истины №1. Номера разделов всех трёх норм верны. **Замечание по прицелу:** 7.1.x требуют ДОКУМЕНТА, величину требуют 7.3.1/7.3.2 — если §13 будут судить как соответствие ЗНАЧЕНИЮ, ссылка нужна на 7.3.2, её нет ни в одном доке. **(б) п.4 сохранил снятое основание** «доккоммент предлагает то, что PD-59 уже отклонил»: PD-59 сам superseded (D39.106 п.3), эррата это признала и переписала строку реестра, но текст п.4 остался — читать через эту поправку. **(в) «Живой уязвимости приёмка не нашла»** — термин не определён и гасит единственную major. Верно так: уязвимости с потерей денег, данных или захватом сессии нет; отказ в обслуживании входа ЕСТЬ и воспроизведён (PD-80, класс `vuln`). Формулировка в зонном журнале и CURRENT-STATE исправлена.
|
||||
|
||||
**3. Поправка к D39.110:** п.1 назван «решение владельца (дословно по смыслу)» — оксюморон, запрещённый нормой «цитаты только дословные, овер-атрибуция — типовой провал»; читать как **пересказ** решения. Форма и три следствия не меняются.
|
||||
|
||||
**4. Закрытые пробелы (все — в носителях, а не в нотах, потому что сессии зон читают носители).** PD-100 объявлялся в составе фикс-пака, а в фикс-листе зонного журнала отсутствовал — **добавлен пунктом 7** · граница пака («PD-92/93/96/99/102/105/107 не трогать») жила только в D-логе, а фикс-лист говорил обратное «остальное по весу строк» — **перенесена в журнал пунктом 8, формулировка «по весу» снята** · пункт 6 фикс-листа был одиннадцатью строками истории моей ошибки без задания — **сжат до задания** («переписать доккоммент `events.go:6-12` под форму D39.106 ДО промта эмиттера») · «три строки блокируют деплой и воркер» не называли, какие — **названы поимённо** (PD-91 деплой · PD-79 воркер · PD-95 промт эмиттера) · счёт весов регистра отстал от эрраты — **пере-считан скриптом: 37 открытых, 3 major, 14 minor, 20 info**, исправлен в двух местах · PD-105 нёс `minor` в колонке при «повышен» в теле — **колонка приведена** · словарь классов в шапке реестра не знал `doc`/`standards`, введённых новыми строками — **дописан** · PD-60/PD-61 выпали из списка «разрулить до промта эмиттера» — **возвращены** · пересчёт «главы → деньги» и ручка границ шкалы не были поручены никому — **носитель назван в строке 126** (считает платформа, поверхность объявляется правкой спеки; ручки в контракте сегодня нет) · «CONFIRM владельца на 30 суток» стоял в CURRENT-STATE как полученный, а в ноте и журнале — как открытый вопрос: **confirm получен 07.08, тексты сведены**.
|
||||
|
||||
**5. Два пробела класса «повторил свой же урок».** **(а)** Эррата D39.109 ввела правило «каждый вывод зонного дока, спорящий со швом, грепается на supersede ДО ратификации» — и не применила его к ПОТОЛКУ: раздел П-5 зонного журнала продолжал объявлять платформу владельцем `book.yaml`, хотя D39.110 п.2(б) это отменил в тот же день. Абзац помечен SUPERSEDED. **(б)** Голова CURRENT-STATE отставала — **третий раз в истории проекта** (после D39.81 и D39.83, оба названы в промте оркестратора): нота D39.111 была ратифицирована, а шапка показывала D39.110. Механический чек головы обязателен ПОСЛЕ каждого аппенда, а не после «важных».
|
||||
|
||||
**6. Не минтить номера чужим сессиям.** CURRENT-STATE ввёл «оркестратор №16» для параллельной приёмки полигона — при том что счётчик объявлен каноническим и ОДНИМ, живёт в промте оркестратора и показывает №15, а по D-логу №16 не существует. Номер снят: второй оркестратор назван ролью («параллельный, приёмка полигона»), номер выдаёт тот, кто пишет ему промт.
|
||||
|
||||
**7. Долг, оставленный сознательно:** срез хроники PROGRESS в архивный слайс (живой хвост несёт №11–№13, эра D39.91–105, всё закрытое) — НЕ сделан, потому что файл держит живая полигон-сессия, а срез это перекладывание сотни строк в контендящемся файле. Режет тот, кто лендит полигон. Туда же: архивация отработанного `PLATFORM_SESSION_PROMPT.md` (баннер-исход на нём стоит) — после приёмки фикс-пака, чтобы не ломать ссылку живой сессии.
|
||||
|
||||
## D39.113 — ИНЦИДЕНТ 08.08: агент панели откатил незакоммиченные правки двух параллельных сессий; один файл восстановлен, шесть потеряны; норма изоляции панелей ужесточена (08.08). ✅
|
||||
|
||||
**1. Что произошло.** В 00:13:39 агент воркфлоу-панели, которому я дал шелл, попытался работать в песочнице; его `cd` молча провалился (каталог песочницы исчез между вызовами), и следующая команда той же строки — `git reset -q; git checkout -q -- .` — отработала в РЕАЛЬНОМ рабочем дереве. Подтверждение: `git reflog` — два `reset: moving to HEAD` с этой меткой времени. Откатились незакоммиченные правки СЕМИ отслеживаемых файлов двух чужих сессий (полигон эксп-21 и параллельный оркестратор его приёмки). Коммиты обеих сессий целы; нетрекаемые файлы (`eval/role_topology/phase2b.py`) уцелели — `checkout -- .` их не трогает.
|
||||
|
||||
**2. Корень — МОЯ ошибка проектирования панели, не поведение агента.** Две причины, обе мои: (а) трём агентам панели я выдал ОДИН путь скрэтчпада, и они затирали друг другу подкаталоги — отсюда исчезнувшая песочница; (б) агентам с шеллом не был запрещён `git`, меняющий состояние дерева, при том что промт панели содержал запрет «ничего не редактируй в репозитории» — запрет прозой против команды, которая правит дерево не редактором, а git-ом. Прецедент этого класса в проекте уже был (урок 09.07: перезапись истории оркестратором стёрла незакоммиченные правки полигона) и не был превращён в механизм.
|
||||
|
||||
**3. Восстановлено одно из семи.** `docs/PROGRESS.md` — пинг полигона (26 строк секции «Полигон») восстановлен из моего собственного бэкапа, снятого в 00:08 при тестировании хука, за пять минут до инцидента; сверено, что дельта к HEAD = ровно эти 26 строк и ни одной моей. ⚠ Правки полигона в окне 00:08–00:13:39, если они были, в бэкап не попали. **Потеряно безвозвратно** (git-объектов нет — файлы не стейджились, `git fsck` и полный обход `--batch-all-objects` по маркерам дали пусто): незакоммиченные правки `docs/experiments/21-role-topology.md` · `docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md` · `docs/architecture/14-api-contract/README.md` (заполненное Приложение А от №14 — в HEAD осталась ЗАГОТОВКА с плейсхолдерами) · `eval/role_topology/absjudge.py` · `drift.py` · `verify_report.py`. Инвентарь и уцелевшие материалы — в скрэтчпаде сессии, записка `ИНЦИДЕНТ_08-08_потери.md`; текст Приложения А я держу в контексте и отдаю как РЕКОНСТРУКЦИЮ-черновик, а в дерево сознательно не писал: подменить потерянный файл правдоподобным хуже честной дыры.
|
||||
|
||||
**3-эррата (08.08, по ответу параллельного оркестратора — моя таблица потерь ошиблась в двух местах).** **(а) Неверная атрибуция.** Я записал незакоммиченные правки `docs/POLYGON_ROLE_TOPOLOGY_SESSION_PROMPT.md` как потерю ПАРАЛЛЕЛЬНОГО ОРКЕСТРАТОРА. Он это опровергает и грунтует: после лендинга `73a7e7a` он не держал в этом файле ничего незакоммиченного, HEAD (21838 байт) — его финальная версия. Модифицированное состояние файла до инцидента принадлежало ПОЛИГОНУ, который аннотировал промт (требование ригов, стр. 59); суть той правки уцелела в пинге, а её ратификация — работа приёмки полигона. Атрибуция исправлена здесь; в потерях у параллельного оркестратора не осталось ничего, кроме Приложения А, унаследованного от №14. **(б) Ущерб отчёта я преуменьшил.** Я записал «незакоммиченные правки отчёта»; фактически на HEAD лежит ВТОРАЯ-ТРЕТЬЯ редакция (деньги стр. 49: «$4.85… третья $0.55»; слов «четвёртая/пятая» в файле нет), а пинг описывает ПЯТУЮ ($4.92166, absjudge, агенты-судьи, семейство Холма из семи). Потеряны две ЦЕЛЫЕ редакции, а не правки. **(в) Восстановление полигоном оказалось неточным:** параллельный оркестратор нашёл в восстановленном `eval/role_topology/verify_report.py:237` затенение `med = med(costs)` при функции `med` на строке 53 — `UnboundLocalError` на первой итерации, секция ЭКОНОМИКА и всё после неё не исполняются. Пере-проверено мной по коду: находка верна. Чинит полигон (его зона); для приёмки это значит, что «восстановлено из контекста» ≠ «восстановлено верно», и восстановленное подлежит той же проверке исполнением, что и новое.
|
||||
|
||||
**4. Норма (жёстче прежней, потому что прозой не сработала).** Агенту панели с шеллом: **свой каталог песочницы на КАЖДОГО агента** (общий путь = гонка и исчезающие каталоги) · **запрет на state-changing git явным перечислением** (`reset` · `checkout --` · `restore` · `clean` · `stash` · `add` · `commit`), а не общей фразой «не редактируй» · перед панелью, работающей в дереве с чужими незакоммиченными правками, **снимать бэкап этих правок** (`git diff > файл` вне репозитория) — сегодня спас именно случайный бэкап, а не процедура · формулировка «работай в копии» без выданного пути и без проверки, что копия существует, — приглашение к этому же инциденту. ⚠ Для читающего дальше: три доступных мне механизма изоляции (worktree на агента, запрет тулов, копия репозитория) не были применены ни один.
|
||||
|
||||
## D39.114 — ФИКС-ПАК ПЛАТФОРМЫ (P3) ПРИНЯТ И ЗАЛЕНДЕН: девять строк регистра закрыты, 8/8 моих посадок поймано, PD-80 и PD-91 пере-проверены исполнением (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, заленден `99f049c` (18 файлов, +856/−86). Отработаны все восемь пунктов фикс-листа приёмки P2; закрыты **PD-79 · PD-80 · PD-83 · PD-84 · PD-85 · PD-91 · PD-95 · PD-100 · PD-106**. Приёмка по весу пака — инлайн и своим исполнением, без панели (норма пропорциональности; после инцидента D39.113 панели без слова владельца я не запускаю).
|
||||
|
||||
**2. Метод.** Батарея пере-прогнана мной: офлайн и с живым PostgreSQL 18.4 под `-race` — все десять пакетов зелёные, включая новый `cmd/tmplatformctl`, линтер 0 issues, `make vuln` чист. **Свои посадки — 8 из 8 поймано поимённо**, в копии зоны вне репозитория; посадки ставились В СВОЙСТВО каждой закрытой строки, потому что предмет проверки фикс-пака — именно карта пинов зоны, а не поиск мимо неё. ⚠ Первая редакция моей посадки PD-100 была нацелена мимо (регексп снял соседний лог) и «выжила»; точная посадка ловится `TestInfrastructureFailuresInTheCallbackAreLogged` — записано, потому что «заявление=команда» действует и на приёмку.
|
||||
|
||||
**3. Пере-проверено исполнением, не со слов.** **PD-80** на собранном бинаре: сорок запросов выжигают ведро `/auth/login`, после чего честный колбэк с живым state получает **400, а не 429** — бюджет завершения входа флудом начала больше не тратится (до фикса тот же сценарий давал 429 со стёртой login-кукой; воспроизводилось дважды независимо). **PD-91**: замер зоны воспроизведён моими руками — `systemd-run --user --wait -p ProtectSystem=strict -p ReadWritePaths=<несуществующий>` даёт `226/NAMESPACE`, тот же путь созданным даёт `0/SUCCESS`. Способ проверки БЕЗ sudo зона нашла сама, и это сильнее, чем предполагала строка PD-91: свойства песочницы теперь измерены, а не вычитаны из доки; что не проверено (юнит целиком, `MemoryMax`/`OOMPolicy`) названо на месте. **PD-95**: доккоммент `events.go` несёт ратифицированную форму D39.106 — устранён риск, что эмиттер-сессия прочтёт снятую форму как задание.
|
||||
|
||||
**4. Ратифицировано отдельно: PD-104 оставлен открытым ПРАВИЛЬНО.** Зона починила половину док↔код (ячейка PD-30 больше не обещает нулевой аккаунт при автогранте) и строку не закрыла, потому что продуктовая половина — ноль на бете, суточный агрегатный потолок, счётчик аномалий — ждёт слова владельца. Это правило PD-83 («свойство без пина закрытым не считается»), применённое зоной к себе.
|
||||
|
||||
**5. Оговорка зоны принята как честная:** адверсариального ревью вторым читателем у P3 не было — сессия без права на субагентов. Второй читатель — эта приёмка. **Живой счёт регистра руками больше не переписывается** (норма D39.112): `python3 docs/scripts/counts.py`; исторические числа в CURRENT-STATE помечены историческими, а литерал веса снят с автопроверки, потому что легитимного живого носителя в зоне `docs` у него нет.
|
||||
|
||||
## D39.115 — S3 «СЛОЙ ДАННЫХ» ПРИНЯТ И ЗАЛЕНДЕН: контракт 0.2.0 в каноне, три ошибки ОРКЕСТРАТОРА поймала сама сессия, правило 0.x ратифицировано (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, заленден `60595f6` (46 файлов). Пере-прогнано мной: `npm run check` — 108 тестов, prettier/eslint/stylelint/tsc чисты, spectral по спеке без замечаний; `npm run check:full` — сборка плюс СЕМЬ кадров с axe, включая новый маршрут `/partial` (отказал один рид при рабочих остальных — ветка жила незамеченной именно потому, что её нельзя было открыть по ссылке). Кадр `/scale` прочитан глазами: пер-главный счётчик замечаний на месте, и честно оставленный Ф-30 виден прямо на экране — глава без заголовка показана голым номером «12», а не выдуманной «Главой N».
|
||||
|
||||
**2. Три моих ошибки, найденные сессией. Это главный результат пака.** **(а) «Максимум шкалы = баланс МИНУС открытые холды» (D39.110 п.2(в), строка 126, промт S3 п.17) — НЕВЕРНО, вычитание дважды.** `Hold` пишет отрицательную строку в леджер и тем же знаком двигает кэш баланса (`credits.go:179` → `appendLedger` `:297-305`), значит баланс УЖЕ не содержит открытых холдов, а `Reserved` — справочная сумма. Пере-мерено мной на живом PostgreSQL: грант $10 и холд $1 дают `Balance` 9.000000 при `Reserved` 1.000000, а моя формула дала бы 8 — шкала вдвое короче правды. Исправлено во всех трёх носителях. **(б) Форма `nullable: true`,** которую я вписал в промт для `GET /usage`, в OpenAPI 3.1 невалидна; сессия выразила через `oneOf` с `type: 'null'`, как во всей остальной спеке. **(в) Инструкция ВНУТРИ нормативного дока протухает от исполнения:** я оставил в шапке спеки фразу «version всё ещё `-draft` — S3 бампнет первым действием», и после бампа она стала ложной; сессия заменила её на правду и назвала это отступлением вслух. Тот же класс, что рукописные производные числа (D39.112): предписание, записанное в артефакт, живёт до первого действия.
|
||||
|
||||
**3. Норму «не ходить в чужую зону» АМЕНДИРУЮ, потому что она и была источником (а).** Сессия объявила вслух, что нарушила мой запрет и читала Go платформы (только чтение, ничего не тронуто) — и ровно этим нашла ошибку в моей ратификации. Новая формулировка: **в чужую зону НЕ ПИСАТЬ; ЧИТАТЬ код для сверки несущего утверждения — можно и НУЖНО**, потому что доки врут, и это норма проекта («не верь заголовкам, грунтуй `file:line`»). Запрет читать превращал сессию в заложника моего текста. Отдельно: раскрытие нарушения вслух — правильное поведение, и его надо поощрять, а не наказывать.
|
||||
|
||||
**4. Ратифицировано.** Форма управляемого потолка — `GET /books/{bookId}/run-options` → `CeilingBounds` отдельным ресурсом, а не полем карточки книги (максимум зависит от АККАУНТА и двигается, когда книга не менялась; карточка кэшируется библиотекой и назвала бы протухший максимум ровно в момент выбора) · три числа вместо двух, `max_chapters` приходит уже подрезанным и клиенту подрезать второй раз запрещено, `default_chapters` — продуктовая политика платформы, `max_chapters: 0` легален и означает «прогон начать нельзя» · `ceiling_chapters` обязателен в запросе старта и на `Run` · `409` покрывает «потолок больше не помещается». **Правило версий 0.x:** минорный бамп — законная полоса ломающих правок (semver §4), клиент пинит точную 0.x-версию; с 1.0.0 действует общее правило. Сессия НЕ стала править раздел Versioning своей рукой, а назвала противоречие — это верно, правило версий принадлежит владельцу контракта; вписано мной в обе копии. **Блоки компаньона 2.14 (поверхность входа) · 2.15 (потолок) · 2.16 (тот же origin — факт, CORS-слоя нет)** внесены в канон; патч-файл `S3_CONTRACT_HANDOFF.md` применён и удалён, как он сам себя и объявил.
|
||||
|
||||
**5. Канон и зонная копия снова байт-равны** (`ba7f3745…`), spectral по обеим чист.
|
||||
|
||||
**6. На владельце — три вопроса, сессия их назвала сама.** (а) Метка «остановлена: лимиты» в дереве — сжатие ратифицированной фразы «перевод остановлен: лимиты исчерпаны», сделанное сессией; продуктовые слова по В-3/Ф-21 не её. (б) **К-13 (Ф-31): упереться в СВОЙ потолок прогона и остаться без кредита сегодня неразличимо** — `paused_reason` имеет одно значение `credit_exhausted`, и первому из двух фраза врёт, а следующее действие у него другое. (в) Ф-30: глава без заголовка показана голым порядковым номером, потому что синтез «Глава N» запрещён К-3; это вопрос В-4, уже стоящий владельцу. Плюс три поля, придуманные сессией по её собственному признанию и ратифицированные мной выше: `default_chapters`, `maxLength: 200` у заголовка, `paused_reason` в кадре статуса.
|
||||
|
||||
**7. Открытые хвосты зоны, заведённые честно:** Ф-29 (мок едет в прод-бандл — цена того, что скриншот-цикл гоняет прод-сборку; папка удаляется в день живой платформы) · Ф-32 (замечания читаются пер-книжно, показываются пер-главно: экран починен, память нет — на книге с тысячами замечаний клиент тянет весь список ради трёх строк) · `ceiling_chapters` обязателен сегодня бесплатно, после первого реального прогона это станет ломающей правкой.
|
||||
|
||||
## D39.116 — АКТУАЛИЗАЦИЯ ДОКОВ: 78 находок свипа, отработанные промты в архив, живая ошибка счёта исправлена, три строки заведены (08.08). ✅
|
||||
|
||||
**1. Заказ владельца:** полная актуализация — занести незанесённое, перенести в архив сделанное, убрать воду, снять stale. Метод — read-only фан-аут по четырём осям (активные промты · stale-факты · вода и дубли · незанесённые обязательства) по ВСЕМ 107 живым докам (~25 тыс. строк), правки делал я. **Изоляция панели по норме D39.113:** свой каталог каждому агенту, запрет state-changing git перечислением (плюс тот же запрет теперь в `deny` настроек — проверено, `git stash list` отбивается), бэкап всего чужого незакоммиченного снят ДО запуска. Итог свипа: **78 находок** — 14 по промтам, 29 stale, 19 воды, 16 незанесённых.
|
||||
|
||||
**2. Живая ошибка в МОИХ числах, найденная и исправленная.** Счётчик `docs/scripts/counts.py` читал колонки таблицы СЛЕВА, а строка бэклога 127 законно несёт `seed|ruby|auto` внутри ячейки — разбор принимал за зону слово «ruby». В CURRENT-STATE стояло «зона бэкенд 62 строго / 79 широко» при истине 63/80. Исправлено: колонки читаются С КОНЦА (хвостовые короткие и `|` в них не бывает), **битая форма строки теперь расхождение, а не тихий `IndexError`**, голова берётся по МАКСИМАЛЬНОМУ номеру, а не по последней строке файла (в D-логе уже есть внеочередные аппенды `D39.17`→`D39.19`→`D39.18`), регекспы больше не прибиты к эре `D39`. Все четыре дефекта назвала панель ревью, ни один не был моей находкой.
|
||||
|
||||
**3. Отработанные промты — в архив с баннером-исходом.** `frontend/docs/S3_SESSION_PROMPT.md` (исполнен двумя сессиями, принят D39.115) и `platform/docs/PLATFORM_SESSION_PROMPT.md` (ЧЕТЫРЕ сессии, P3 принят D39.114) → копии в `docs/archive/prompts/`, указатели `docs/README.md` переписаны. Цена отсутствия баннера была названа прямо: следующая фронт-сессия открыла бы S3-промт с императивом «первый шаг — правки спеки» и **откатила бы ратифицированный контракт 0.2.0**. Из платформенного баннера убран рукописный перечень живых PD-строк — он разошёлся с реестром на первом же фиксе, то есть я сам нарушил свою же норму D39.112 «один носитель на факт»; заменён указателем на скрипт и реестр.
|
||||
|
||||
**4. Снятые stale, которые сработали бы на холодной сессии.** Живой бэкенд-промт нёс «в дереве живёт ЧУЖОЕ `platform/*`, ждёт приёмки P0» — платформа принята и залендена, а РЕАЛЬНО живая параллельная работа (полигон) в промте не названа вовсе; заменено на «сверь `git status` в начале сессии» с указанием живой зоны. Тот же промт велел писать пинг в `docs/PROGRESS.md` без протокола — файл держат три сессии, и его секция уже терялась (D39.113); дописан протокол «только append своей секции, CURRENT-STATE не касаться». `POLYGON_PACKAGE4` §1 требовал исполнить сид-обогащение, исполненное D32, указывая на МЁРТВЫЙ `guzhenren-seed.yaml` v1 при живом v2 — помечено исполненным. Компаньон КАНОНА контракта четверо суток называл себя «черновиком фронт-сессии S3 на ратификацию» — тот же класс, что шапка `info` спеки, исправлено. Зонный журнал фронта в «Текущем состоянии» говорил «S3 НЕ сделана, контракта нет» против собственной хроники; журнал платформы — «дерево НЕ закоммичено, ждёт приёмки» после лендинга. Висячие ссылки на удалённый патч `S3_CONTRACT_HANDOFF.md` починены в трёх живых доках (в D-логе оставлены как история — append-only).
|
||||
|
||||
**5. Заведены строки 146 · 147 · 148** (обязательства без носителя): два техдолга движка, жившие только в справочнике якорей (`prices_checked` гейтит $0-путь · `cache_write_per_m` под один TTL) · транспортные частичные research/21 §16–17 (HTTP/1.1-escape как диагностика тихого усечения · assistant-prefill continuation вместо ре-рана) · **восстановление Приложения А контракта после инцидента** — решение владельца. Счёт очереди пере-выставлен скриптом: **123** строки · бэкенд 64 строго / 82 широко · «скоро» 33.
|
||||
|
||||
**6. Норма изоляции панелей перенесена из D-лога в промт оркестратора** — она жила только в ноте, а читают промт. Там же пустой заголовок «Текущее состояние и очередь — НЕ здесь» получил тело: где именно они живут и что числа берутся скриптом.
|
||||
|
||||
**7. Что НЕ сделано и почему.** Срез хроники PROGRESS в архивный слайс (живой хвост несёт №11–№13, эра D39.91–105) — не делал: файл прямо сейчас держит полигон-сессия, а срез это перекладывание сотни строк в контендящемся файле, то есть способ потерять чужую работу второй раз за сутки. Режет тот, кто лендит полигон. Из 78 находок закрыт первый эшелон (промты, статусы, висячие ссылки, незанесённое) — остаток воды (дубли пин-таблиц, историческое тело `API_CONTRACT_DRAFT.md`, §1 «как есть» в `09-target-architecture.md`) в этот проход не тронут: он не вводит сессию в заблуждение, а только удлиняет чтение.
|
||||
|
||||
## D39.117 — ЭКСП-21 ПРИНЯТ; подтверждения владельца по тратам и агент-судейству получены; строка 65 закрыта; курс — эксп-22 «панель жильцов» + Sol-арбитраж (08.08, параллельный оркестратор — приёмка полигона, мандат владельца 08.08). ✅
|
||||
|
||||
**1. Вердикт: ПРИНЯТ.** Проверено исполнением 08.08: `verify_report.py` — 90 проверок, ноль провалов, код 0; `itog.py` пере-снимает каждое число ИТОГа из сырья, код 0. Встречные аудиты полигона (снизу вверх / сверху вниз) приняты; мой краш-репорт `med = med(costs)` (`verify_report.py:237`, неточное восстановление после инцидента D39.113) полигоном починен, линтер зоны заведён. Приёмка по норме пропорциональности — инлайн + исполнение гейтов, без панели. Механика — пинг «Полигон» и §18 отчёта, здесь не дублируется (D39.112).
|
||||
|
||||
**2. Подтверждения владельца 08.08** (в чате этой сессии; пересказ, не цитаты): **(а)** траты 07.08 — устная санкция владельца по ходу сессии БЫЛА и подтверждена («я разрешал тратить»); против буквы промта пробития остаются зафиксированными в отчёте, промт эксп-22 закрывает класс механическим стопом и тестом кассы на свои теги. **(б)** Амендмент «судья пака не покупается за токены» (агент-судейство вместо платного) — подтверждён ⇒ числа §11–§18 легитимны, платный пере-суд не нужен. **(в)** Правка риг-требований («оба порядка» → абсолютная шкала) — это девиация от промта ОРКЕСТРАТОРА, не решение владельца, ратифицирую сам: требование зеркальности писалось под платного ПАР-судью; в абсолютном протоколе позиции пары не существует, а позиционный сдвиг замерен и вычтен (+0.147/шаг метки); все четыре агента независимо свернули парные пакеты в абсолютные оценки — инструмент сам отверг форму. Для ПАРНЫХ предъявлений (Sol-пакеты) оба порядка остаются обязательными.
|
||||
|
||||
**3. Диспозиции гейт-строк (гейт «эксп-21» исполнен).** **142** — точечная починка ОТКЛОНЕНА как замена редактора (`C2/A_law` −3.75 Holm 0.0006; при реальной детекции не лучше черновика, `C2/F3` −0.94; гипотеза эксп-20 «$0.0002 чинит всё» мерилась при идеальных флагах и пала) и ПРИНЯТА формой «механический пре-гейт ПЕРЕД редактором» (брак 5 клеток против 10/23 при половинной цене $0.00298/$0.00602; ремонт ТОЛЬКО с банком — без банка ломает канон 0.917→0.895); стройка — бэкенд-промтом по команде владельца. **65** — ЗАКРЫТА: движки dspro/glm-5 неразличимы (`A/B` +0.06 p=0.95; `A_law/B` −0.69 порога не проходит) ⇒ жилец редактора — вопрос ЦЕНЫ, то есть конфиг; остаток строки (слепое чтение инструментарием D39.8(3)) переезжает в Sol-протокол, строка 150. **106** — НЕ закрывается: эксп-21 дал довод против диффов (полный regen выигрывает у ремонта), но с оговоркой полигона — чинил дешёвый фиксер по предложению, а не сильный редактор узким мандатом; гейт «перепроверить до стройки» в силе, приоритет понижен. **55** — частично закрыта (направление главного вывода воспроизведено на чистом en-материале, узнавание 1/5); остаток «неконтаминированный zh-срез» — заказ ПОВТОРЁН эксп-22 Ф0 жёстко: эксп-21 его не исполнил (главный zh-замер на книге 4/5, без пинга).
|
||||
|
||||
**4. Опровергнута продуктовая строка D39.108 «второй проход на dspro отрицателен по слепому суду»** — она стояла на непersisted замере §5.2 эксп-20 и была помечена «со слов»; эксп-21 честным ригом дал обратное (`A/F3` +2.50 Holm 0.0004 · `A_law/F3` +2.81 Holm 0.0098 · нога 2×2: работает топология, не жилец). Стек-баннер CURRENT-STATE поправлен, supersede-указатель добавлен в карту. Пометка «со слов» отработала как задумано — величина не успела стать основанием стройки.
|
||||
|
||||
**5. Курс владельца 08.08:** **(а)** эксп-22 «панель жильцов» — промт выдан (`docs/POLYGON_TENANT_PANEL_SESSION_PROMPT.md`): профиль-скрин с pass/fail порогами, записанными ДО замера → панель черновиков (слот несёт ~70% эффекта финала — §16.2; за всю историю проекта черновиком была одна модель) → панель редакторов поверх замороженных черновиков (обязательный кандидат `gemini-3.1-pro` — аутлаер-гипотеза эксп-04, современным ригом не мерена) + шумовой пол (§8 п.1) + прямой `D_/A` (§8 п.2) довесками. **(б)** Слепое чтение владельца ЗАМЕНЕНО Sol-арбитражем (владелец черновики читать не хочет; ChatGPT Sol high-reasoning руками владельца через подписку = внешний контур третьего семейства): пере-суживаются расходящиеся контрасты эксп-21 (`A/F`: luna +0.84 против gemini +3.03 — расхождение 2.19 балла = 14 стандартных отклонений шума судьи-замены, собственным шумом не объясняется) и слепые пары эксп-22. **Правило ничьей эксп-22 ратифицировано:** при перевесе ниже порога различимости рекомендация отчёта — самый дешёвый жилец. Оговорка записана честно: Sol — LLM, «издательское качество для человека» им не доказывается; человеческий контур остаётся за пилотом Ф2.5. **(в)** Агент-судейство — под явным капом (агенты не бесплатны — слово владельца 08.08; кап ≤60 запусков в промте эксп-22).
|
||||
|
||||
**6. Хвосты в трекер:** строки **149–153** заведены (эксп-22 · Sol-арбитраж · отказной режим связки · слипание абзацев · чистый контраст мандата); строки **12 и 82** получили $0-прототипы эксп-21 (`battery.check_numbers` — синтетика 16/16 · `battery.check_gender` по карточкам сида, 86–112 сверок/арм) — указатели внесены в их тела, сами строки живы (движковые гейты не построены); кредиты xAI — в лист владельца; три провод-факта эксп-21 §8 внесены в quirks 00 (Gemini fail-closed приходит БЕЗ объекта `message` · `gpt-5.6-luna` без ручки эффорта — пустой оплаченный выход · `glm-5` гасится `extra_body`).
|
||||
|
||||
**7. Поправка к D39.113:** строка таблицы потерь «незакоммиченные правки промта — параллельный оркестратор» — ошибочная атрибуция: HEAD `73a7e7a` и был финальной версией промта параллельного оркестратора, его правки не терялись. Чьи модификации были в дереве — достоверно неизвестно; вероятно, полигона (его пинг предлагает правку требования стр.59 того же файла), и тогда их суть уцелела в пинге. Буква D39.113 не переписывается (D23.3) — читать через эту поправку.
|
||||
|
||||
## D39.118 — ФИКС-ПАК БАНКА (строки 128+129+130-минимум) ПРИНЯТ И ЗАЛЕНДЕН: семьи термов со-батчатся юнитами, наблюдаемость подписи построена, дофикс-раунд закрыл major приёмки (08.08). ✅
|
||||
|
||||
**1. Вердикт:** ПРИНЯТ, код заленден **`bccf2d8`** (27 файлов, +2935/−201; деньги пака $0). Метод — четырёхконтурный воркфлоу приёмки: слепой дифф-ревьюер с мнением ДО чтения отчёта · пере-ран всех заявлений исполнением · 8 своих посадок в копии зоны вне репозитория (6 CAUGHT сразу, 2 выжившие) · охота вне карты отчёта; затем дофикс-раунд сессии и ре-чек (battery целиком EXIT=0 · `-race` EXIT=0 · счёт тестов 685→717 подтверждён независимо · пере-посадки 3/3 CAUGHT, выживших 0). Механика и полный фикс-лист — ревью-шапка `archive/reports/BANK_CLUSTER_FIXPACK_2026-08-08.md` и пинг «Бэкенд» PROGRESS; здесь не дублируются (D39.112).
|
||||
|
||||
**2. Находки приёмки, закрытые дофиксом:** клейм «батарея зелёная» первой редакции был ложным — lint не гонялся и был красным (3× errcheck), исправлено с честным признанием в отчёте · MAJOR вне карты: WARN строки 130 структурно мёртв в проде — `ownerHandled` на сыром seed само-исключал строки движка со второго прогона; закрыт `unsignedEngineSurfaces(seed)` + e2e-тест двумя реальными прогонами через стор · две дыры пинов на space-run-форме (conf-хвост и ре-джойн банкноты отключались незаметно) · `bankParseVersion` не потреблялся ничем — теперь логируется на стопе, v2.1/v2.2-артефакты различимы · три тихих отказа канала семей: script-колонка валидируется по реестру диапазонов, пол-таблица отвергается, словарь типов синхронизирован (`CandidateTypes` с `nickname` + правило пары + пин покрытия каждого типа).
|
||||
|
||||
**3. Ратифицировано:** **сдвиг edit-волны bank-only ПРИНЯТ** (слово владельца 08.08 «не против реснапшота»; сдвиг громкий `--resnapshot`, `moveBankOnly` даёт $0-репин юнитам без терма; уточнение приёмки: двигается и при выключенном гейте терминолога, classify-чекпойнты перекупаются тем же центовым разом) · **bankdata-плоскость** — отдельный `//go:embed` вне волнового фолда со своей `BankDataVersion` (вместо колонки `script-series.txt` — та фолдится в `EmbeddedVersion` и перекупила бы драфт-волну без права $0-репина; девиация ратифицирована как правильный шов) · **инверсия ранжирования семей** (размер прежде длины якоря; спековый порядок ломал критерий линейки 转) — принята, девиация дописана в §4 отчёта по требованию приёмки · **имена эвиктнутых — лог, миграция НЕ заводится** (гейт: доказанная потребность; строка 159, вместе с 49а) · **«двойной пробел» закрыт замером:** 0 внутренних прогонов на 585 строк эталона (пере-ран приёмкой; наивный grep без rstrip даёт 55 хвостовых — парсер их триммит).
|
||||
|
||||
**4. Строки трекера:** **128 и 129 ЗАКРЫТЫ** · **130 пере-скоуплена** (минимум исполнен; остаток = накопительный мердж/слоты — СТОП-решение владельца, материал даст WARN со второго прогона) · **заведены 154–159** (одноруновая голова семьи · скрипт-слепой резолв к ja→ru · `banknote_truncated`-пол за гейтом канала · пере-подтверждение `family_max_members=24` · conf без гейта данных пары · durable-имена эвиктнутых) · дописаны 37 (вынос Aho-Corasick = рефакторинг слоя, «чисто не ложится») · 38 (ординальная механика подтверждена кодом: G1 двигает состав юнитов — на первом прогоне после пака перекупаются все бэнк-батчи, центы) · 57 (ссылка на фикс-пак закрыта). Остаточный принятый риск: пин покрытия типов работает по зеркальной фикстуре `zhFamily` — рассинхрон зеркала со shipped-строками пином не ловится.
|
||||
|
||||
**5. Верификация эффекта** — §6 отчёта (10 конкретных проверок по артефактам, $0); гейт — первый холодный прогон: `families=`/`families_held=` · химера 古月/转 в стоп-таблице · `self_conflicts=` · колонка `confidence` при не выросшем `bad_lines` · WARN диффа авто-банка со второго прогона. Активного промта бэкенда после этого лендинга НЕТ — следующий (эмиттер строки 103 + денежные строки шва) по слову владельца (D39.107 п.3). *(⚠ поправка курса тем же днём: следующим выдан пак «блокеры контракта», эмиттер — за ним; слово владельца — D39.119 п.1.)*
|
||||
|
||||
## D39.119 — КУРС ВЛАДЕЛЬЦА 08.08: эмиттер отложен, выданы ДВА промта (бэкенд «блокеры контракта» · платформа «раннер»); S4 гейчен качеством оболочки; PD-105 ратифицирован (08.08). ✅
|
||||
|
||||
**1. Слово владельца 08.08 (пересказ):** с эмиттером jsonl подождать — вокруг него техдолг бэклога; но платформу и фронт пора разблокировать. Разбор оркестратора, подтверждённый владельцем формой «пиши»: настоящие разблокираторы фронта/платформы — движковые строки контракта **99/100/101/125/145** (строка 49 annot-v1 — следующим паком) и платформенный раннер с ручками; эмиттер нужен СВЕЖЕСТИ статуса и деньгам шва, не первым экранам — резерв на это время = периодический `status --json`-резюнк (построен в P1). Поправка к D39.118 п.5: эмиттер идёт бэкенд-промтом ПОСЛЕ пака блокеров.
|
||||
|
||||
**2. Выданы два промта** (оба аудированы перед выдачей: два холодных читателя + фактчекер, 35 опор подтверждено, поправки внесены): **бэкенд** — `docs/BACKEND_CONTRACT_BLOCKERS_SESSION_PROMPT.md` (строки 99+100+101+125+145; $0; сетевых поверхностей в движке не появляется — D39.81) · **платформа** — `platform/docs/PLATFORM_RUNNER_SESSION_PROMPT.md` (транзиентные юниты D39.106 · River+воркер+холд-до-спавна · реконсилятор 138 · тейлер наготове · первые ручки /v0 по контракту 0.2.0 (П-1/П-5) · PD-99; координация с бэкенд-паком — узкие интерфейсы с дев-стабами, форма только из HEAD). Запуск сессий — владелец.
|
||||
|
||||
**3. Ратификация PD-105:** доставка событий шва = at-least-once; ДУБЛЬ `seq` — норма повторного чтения, декодер обязан принимать идемпотентно без фатала; тот же `seq` с ДРУГИМ payload = карантин прогона (research/25). Девиация от буквы реестра («ратифицировать вместе с промтом эмиттера») осознанная — тейлер-сторона строится сейчас; строку реестра обновляет платформа-сессия паком.
|
||||
|
||||
**4. Слово владельца о КАЧЕСТВЕ ФРОНТА — гейт на S4.** Владельцу не нравится «логика спама вкладками»: вкладки обязаны работать как в VS Code (preview-вкладка от одиночного клика, замещение её следующим, пин по двойному клику/взаимодействию). Полный список претензий владелец сформулирует отдельным входом. Диспозиция: **S4 не стартует до списка**; форма — «S3.5 фикс-пак оболочки» (VS Code-вкладки + Ф-19 + список владельца) → S4 на починенной оболочке. Носитель — запись оркестратора в `frontend/docs/frontend-PROGRESS.md` 08.08; ПТ-строка в продуктовый реестр — при полном списке. Бэкенд/платформа фронт не ждут.
|
||||
|
||||
## D39.120 — КРОСС-МОДЕЛЬНЫЕ КОНТУРЫ РЕВЬЮ И ПРЕДМЕТНЫЕ ОСИ САМОПРОВЕРКИ — нормой-направлением (владелец 08.08). ✅
|
||||
|
||||
**1. Ратифицировано словом владельца 08.08 (пересказ; финал — «да, нормально» с оговоркой свободы):** (а) в приёмочных панелях ≥1 опровергатель ДРУГОЙ моделью семейства на текстовых/оценочных линзах (глушит контекстное закрепление и self-preference; механические линзы от смены модели не выигрывают); (б) тяжёлые ратификации класса D39.106 и периодический аудит записей оркестратора — параллельная сессия-ревьюер другой моделью с СОБСТВЕННЫМ онбордингом (снимает фрейминг оркестратора; промт — оркестратор, старт — владелец, мнение — владельцу ДО ратификации; прецеденты D39.106/D39.112); (в) семейный слепой участок кросс-моделью внутри Anthropic не снимается — оценочные вердикты по-прежнему калибруются внешним семейством, первичны пере-ран и исполнение; (г) каждый кодовый промт несёт 1–3 ПРЕДМЕТНЫЕ оси самопроверки по характеру работы (бэкенд — общность §0.1; платформа — индустриальный первоисточник/stdlib прежде велосипеда; фронт — контракт/доступность), дисциплина ревьюера (шесть антипаттернов) в сессионные промты не грузится.
|
||||
|
||||
**2. Оговорка владельца — часть нормы:** всё выше — НАПРАВЛЕНИЕ, не буква; сессиям и оркестратору оставлена свобода суждения, разумное отступление с аргументом легитимно и приветствуется; упарывание в букву стандарта и соглашательство с нормой ради нормы — сами по себе антипаттерн. Носитель — промт оркестратора (два новых буллета «Методологии»).
|
||||
|
||||
## D39.121 — ЗАПИСКА-ПЛАН ПОСЛЕ ТЯЖЁЛОГО РЕВЬЮ + ОФИЦИАЛЬНЫЕ ПРАКТИКИ ANTHROPIC абсорбированы нормой-направлением (владелец 09.08). ✅
|
||||
|
||||
**1. Слово владельца 09.08 (пересказ):** сессии должны решать свои проблемы максимально самостоятельно — после сложного ревью с верифицированными находками сессия составляет МИНИ-ПРОМТ САМОЙ СЕБЕ (записанный план) и движется по нему, а не по памяти; плюс заказ: разобрать официальные гайды Anthropic и перетянуть применимое. Исполнено веб-ресёрчем (3 агента, 86 рекомендаций с URL-грунтовкой) — выжимка и карта применимости: **`docs/research/26-anthropic-guidance-digest.md`**.
|
||||
|
||||
**2. Ратифицировано (направление, не буква — оговорка D39.120 п.2 действует):** (а) **записка-план**: после тяжёлого ревью — структурированный файл «ID находки → статус → улика» (не проза: инцидент диспозиций 08.08 случился в прозе, и Anthropic это же говорит о Markdown против JSON), движение по записке, сдача гейтится сверкой «все ID имеют диспозицию»; (б) «заявление=команда» распространяется на клеймы ревью о себе; (в) комплектность против заказа — механически (пункт промта → исполнено/отказ), для паков среднего+ веса; (г) числовой гейт сторожит присутствие, не истинность — сравнительные/пороговые утверждения приёмка читает списком; (д) стандартный блок будущих кодовых хендоффов из официальных сниппетов (ground-progress-claims · «проверь последний абзац» · запрет подгонки тестов · интервальная самоверификация против явных критериев); (е) панелям — obstacle reporting обязательным полем схемы и анти-оверфлаг-рамки ревьюеру. Носители: промт оркестратора (два буллета) + CLAUDE.md (компакция-инструкция и запрет подгонки тестов — механизм-уровень, читается каждой сессией).
|
||||
|
||||
**3. Конвергенция зафиксирована** (research/26 §2): половина канона проекта совпала с официальными рекомендациями независимо («заявление=команда» = show-evidence · author≠reviewer = fresh-context verifiers · execute-first приёмка = grade-final-state · онбординг-диета = lean CLAUDE.md · «один носитель на факт» = JIT-указатели). Не перенимается: promptfoo · lock-файлы (нужны только при двух сессиях в одной зоне) · метапромпт как прод-механизм (§5 research/26). Вопрос владельца о «сайте prompts md» закрыт указателем — research/26 §4.
|
||||
|
||||
## D39.122 — ПАК «ДВИЖКОВЫЕ БЛОКЕРЫ КОНТРАКТА» ПРИНЯТ И ЗАЛЕНДЕН; ратификации приёмки; строки 99·100·101·125·145 закрыты; research/27 (главы) принят фактурой (09.08). ✅
|
||||
|
||||
**1. Приёмка (оркестратор №15, полный аппарат + новые нормы).** Три раунда: (а) 7-агентный воркфлоу — слепой дифф-ревьюер · **кросс-модельный опровергатель отчёта на Opus (первое применение D39.120)** · пере-ран заявлений (battery целиком, 717→738, формы артефактов на стенде, cmp проекций) · 7/7 посадок CAUGHT в копии зоны · два охотника вне карты · перф-замер на независимом стенде с бинарём «до» из `06f0342` (status 1.40–1.46→0.05–0.07 c — таблица §2.4 воспроизведена); (б) фикс-лист F1–F6 (несущее: **F1 MAJOR от опровергателя — `unit.id` первого юнита главы переживал любой разрез**, «граница инвалидации» отчёта была ложной; закрыт ТЕГОМ РАЗРЕЗА в id) + ре-чек с пере-мутациями (поймано: V2-1 не исполнен и не задекларирован · клейм покрытия F6 ложен · зазор МОЕЙ спеки cutTag без langpack/embedded/norm · manifestVersion не бампнут); (в) микро-раунд V2-1..4 исполнен, и сессия СВЕРХ заказа провела третий слепой аудит своих клеймов — нашла 4 непокрытых тестами оси (худшая: быстрый путь манифеста удалялся при зелёной батарее — тест сравнения проекций вырождался в «медленный против медленного»; проводка `--ceiling-usd` в CLI не пинилась) и запинила; призналась в холостых прогонах двух мутаций (`go test -run` без совпадений = ok) и добавила сторож. Итог: тестов **717→749** (+32/−0), battery EXIT=0 целиком, голден/снапшот/подпись банка нетронуты. (г) Финальный ре-чек V2+аудита (по слову владельца) — ВСЁ CONFIRMED исполнением: состав V2-диффа точен (5 файлов, ничего сверх), каждая V2-ось и все три §11б-теста перебиты мутациями заново (слепое пятно «ServesTheReadModelsIdentically зелёный при мёртвом быстром пути» воспроизведено буквально), счёт 749 поимённо, стенд `tm-manifest-v2` 2283/4276/5071 c единым cutTag, cmp-проекции IDENTICAL (0.08–0.16 c против 1.42–1.43 c). Одна MINOR-находка ре-чека принята БЕЗ дофикса: тест границы `manifestMaxChunks` пинит механизм, но не значение константы (absurd выводится из неё же — поднятие до 1<<62 тест переживает); диспозиция — значение константы сторожится ревью, NOTE в ревью-шапке отчёта.
|
||||
|
||||
**2. Ратификации приёмки.** (а) **Граница `report`/`export --pairs`/ре-билла на пере-нарезке — ГРАНИЦА, не долг**: `QualityReport` по построению требует исходный текст юнита (residual-скан), манифест текст не несёт намеренно. (б) **`done` пофазных счётчиков = «разрешено волной»** (ok/flagged/skipped); следствие `edit.done ≥ done` — честное, с оговоркой draft-only в доккоменте. (в) **`--ceiling-usd` = КНИЖНЫЙ потолок в силе, не бюджет прогона**: леджер сравнивает с накопленным committed+reserved книги; пересчёт «пользовательский прирост → абсолют» — обязанность ПЛАТФОРМЫ, данные уже отдаются (`committed_usd`/`reserved_usd` в `status --json`); вторая денежная ось НЕ заводится. (г) Все 8 девиаций §8 отчёта приняты (`tmctl manifest` · `--ceiling-usd` в redrive · счётчики на главу · `draftOnly` · ленивый провайдер · `BankStopVariant` · асимметрия таблиц · length-prefix ключа id). (д) **`heading` манифеста = ВРЕМЕННЫЙ рендер движка (решение владельца 09.08)**: противоречие с закрытым К-3 признано, настоящие заголовки — строка 160 (titleRaw, Этап 0 структуры глав). (е) **Форма артефактов для потребителей**: `unit.id = <chapterID>:<cutTag>:<firstChunkIdx>`, манифест `tm-manifest-v2` — платформе читать как новую форму (пинг в зонный журнал). (ж) `.gitignore` дополнен паттернами сайдкаров.
|
||||
|
||||
**3. Бэклог.** Строки 99·100·101·125·145 ЗАКРЫТЫ (удалены из таблицы). Новые: **163** — версии модулей x/text|x/net меняют нарезку, не двигая ни ключ/снапшот/чекпойнты (класс всей чекпойнт-плоскости, унаследован манифестом); **164** — rebill-проекция `status` с nil baseMemory может завышать `RebillUSD` против translate (преexisting, консервативная сторона). NOTE без строк: провести `--ceiling-usd` в `status` — по желанию платформы (в пинге зоны); fsync каталога; U+001F закрыт V2-1. Строки 160–162 (структура глав по research/27) заведены до лендинга тем же днём.
|
||||
|
||||
**4. research/27 «Определение глав» принят ФАКТУРОЙ** (веб-ресёрч · панель двух моделей · карта по коду · жизненный цикл дерева §3а · развилка парсинг-стадии закрыта словом владельца: оригинальные названия, платный перевод со старта прогона; мини-сессия названий §5а — редакторский слот · инъекция банка · двухфазность вокруг подписи). **Дизайн стройки НЕ ратифицирован** — отдельное решение при постановке строк 160–162 в очередь.
|
||||
|
||||
**5. Очередь дальше:** приёмка платформы-раннера (сессия жива) · лендинг эксп-22 (8 CONFIRM/DENY владельца) · промт эмиттера (103 + деньги шва) — эмиттер-сессии ПЕРЕД стартом прочесть PD-95/105/79/99/107/60/61 и D39.106 (09.08.2026, оркестратор №15). ✅
|
||||
|
||||
## D39.123 — ПАК ПЛАТФОРМЫ P4 «РАННЕР» ПРИНЯТ И ЗАЛЕНДЕН (`d29e30c`); ратификации приёмки вкл. поправку формулы потолка (PD-158); строки 138·139 закрыты (09.08). ✅
|
||||
|
||||
**1. Приёмка (оркестратор №15, три раунда, 13 агентов).** (а) 7-агентный воркфлоу: слепой дифф · опровергатель-Opus (D39.120) · пере-ран батареи · 10 посадок (8 CAUGHT) · контракт-сверка 47 wire-проверок · охотник-деньги · охотник-systemd с РЕАЛЬНЫМ tmctl из HEAD (argv/поля status/exit-контракт/маркер — совпали; четыре systemd-клейма пере-мерены). Пять MAJOR: **F1 — аргумент `--ceiling-usd` = чистый прирост против кумулятивной семантики движка** (двустороннее исполнение; сквозная проба сессии прошла на фейке без кумулятива — сессия строила параллельно лендингу 145 и честно это записала) · **F2 — PD-129 закрыт ложным клеймом**, дедлок books↔run_attempts 258/300 через реальные API + транзиентный 40P01 карантинил проекцию навсегда · F3/F4 — два незапиненных денежных свойства (мутации пережили полную батарею) · **F5 — settle по устаревшему снапшоту свипа возвращал холд целиком потратившему прогону** (исполнением). (б) Дофикс F1–F8 + селф-ревью сессии нашло **PD-159** (отложенный расчёт прогона N оплачивал работу N+1, и N+1 платил снова — $2.10 за прогон ценой $0.10; закрыт `SpendBound` = min базовых линий последующих попыток; воспроизведён приёмкой на до-фиксном дереве, 4 края границы точны). Ре-чек дельты нашёл V2-1 (классификация транзиентности неполна: 57P0x/08/net reset карантинили навсегда) и V2-2 (ретрай спавна передавал потолок от сдвинутого счётчика — PD-161 наполовину). (в) V2 исполнен; финальный ре-чек: 5/5 пере-мутаций убиты поимённо, правка комментов миграций 00009/00011 правомерна (тела SQL байт-равны, обе рождены паком, причина в шапке sha256). Итог: тестов **105→261** (+156/−0), батарея EXIT=0 с живым PG 18.4 под -race, скипов 0, регистр 171 строка (открыт 1 major — PD-113). Сессия поймала и мою ошибку: PD-167 = коммент 00009, не 00011.
|
||||
|
||||
**2. Ратификации приёмки.** (а) **Privilege-модель: linger-пользователь, не polkit** — по свойству (polkit авторизует глагол; транзиентный системный юнит без `User=` идёт от root; до v257 в запросе нет имени юнита), разбор — STACK_DECISIONS §15; уточнение верификатора (шаблонный системный юнит с фикс-`User=` не рассматривался) приложено, выбора не меняет. (б) **ПОПРАВКА к D39.122(в)/пингу: формула аргумента потолка = `committed + прирост×ставка`, БЕЗ reserved (PD-158)** — `store.Open` движка зануляет утёкший reserved до первой судимой резервации, read-only `status` этого не делает ⇒ reserved из status всегда leftover; исполнение обеих формул против гейта: ратифицированная переплачивала запасом ровно на leftover сверх холда, консервативная точна и не недодаёт (flock исключает второго писателя). Формула моего пинга в зонном журнале была неверна в этом нюансе — прав оказался «громкий» отказ зоны исполнять её молча. (в) **PD-105-реализация: карантин ПРОЕКЦИИ (попытки), не прогона** — уточнение D39.119; деньги прогона сеттлятся ремонт-каналом. (г) **Ставка $0.03/глава конфиг-константой платформы** (провенанс exp08 v2 $0.0219 → D30.4 +15–25% → вверх; сверен). (д) Формы: MaxAttempts:1 · холд+прогон+попытка+очередь в одной транзакции · ExecStopPost-маркер вместо D-Bus · ceiling-шаблон из конфига. (е) **Решения по вопросам зоны (владелец делегировал 09.08)**: `default_chapters` = верх шкалы ОСТАЁТСЯ (дробный дефолт непонятен; компромисс «весь баланс под одну книгу» принят осознанно) · **503 внесён в контракт** (0.2.0→0.2.1, зеркало фронта синхронно; PD-112 закрыт ратификацией) · PD-114: env-only остаётся, строка переформулирована в «печать эффективной конфигурации на старте» · PD-115: направление «внешний версионированный эталон на каждую ось» ратифицировано. (ж) PD-113 остаётся ЕДИНСТВЕННЫМ открытым major до эмиттера; после PD-158 его цена выросла — консервативный потолок останавливает ровно на исчерпании холда, и «деньги кончились» неотличимо от «инфраструктура упала».
|
||||
|
||||
**3. Бэклог.** Строки 138·139 ЗАКРЫТЫ (реконсилятор со свипом+бутом построен; пиннинг бинаря исполняется и резюмом — PD-143/134 закрыты с пинами). Новые строки движку: **165** — различимые exit-коды tmctl для потолочной остановки и graceful-stop (сегодня оба = 1: платформа отдаёт «failed» на штатный стоп и на исчерпание потолка; вскрыто реальным tmctl — фейк пробы умирал ОТ сигнала; приоритет поднят PD-158) · **166** — движковая поверхность оценки $/глава (П-10 зоны; ставка-константа — временная мера беты). `.gitignore` += `.check.log`; `counts.py` научен статусу `open (…)` (аннотированные строки регистра считались «иное»).
|
||||
|
||||
**4. Очередь дальше:** лендинг эксп-22 (8 CONFIRM/DENY владельца; у полигона в дереве уже виден незаявленный эксп-23 editor_tier — при лендинге спросить) · промт эмиттера (103 + деньги шва; читать PD-95/105/79/99/107/60/61 + D39.106 + новые 165) · следующий платформенный промт по слову владельца (кандидаты: стоп/резюм-ручки + эскроу 136) (09.08.2026, оркестратор №15). ✅
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
> ⚠ **АРХИВ — ОТРАБОТАН.** Исполнен вендор-сессией 15.08.2026, принят приёмкой оркестратора №17 (D39.137, лендинг `76049bb`): пик запинен, потолки снова защищают, ToS-дельты нет. Отчёт — PROGRESS «Бэкенд» 15.08; остаток строки 172 (схемное решение time-based · ставка $0.03 · вахта весов Pro-0813) — в её теле. Инструкции отсюда не исполнять.
|
||||
> ⚠ **АРХИВ — ОТРАБОТАН.** Исполнен вендор-сессией 15.08.2026, принят приёмкой оркестратора №17 (D39.137, лендинг `76049bb`): пик запинен, потолки снова защищают, ToS-дельты нет. Отчёт — архив-слайс `docs/archive/PROGRESS-2026-08-14-15.md` (вынесен D39.139); остаток строки 172 (схемное решение time-based · ставка $0.03 · вахта весов Pro-0813) — в её теле. Инструкции отсюда не исполнять.
|
||||
|
||||
# Промт: бэкенд, вендор-сессия — пере-пин цен DeepSeek (строка 172; цены меняются 16.08 16:00 UTC)
|
||||
|
||||
|
|
|
|||
|
|
@ -43,23 +43,23 @@
|
|||
|
||||
| ID | Требование (источник) | Статус | Носитель / доказательство |
|
||||
|---|---|---|---|
|
||||
| ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа); статус отказа в API — открытый К-9 контракта 14 (D39.99) |
|
||||
| ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа); форма отказа в API РЕШЕНА владельцем 16.08 (К-9 закрыт, D39.138 п.2б: `rejected` + ОДИН грубый код на модельный класс, без вариации между попытками — оракула подбора не давать; батч 183) |
|
||||
| ПТ-17 | Лимит размера входа настройкой (V2-п.3, H7) | ⭕ | строка 94 |
|
||||
| ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; статус отказа прескрина — открытый К-9) |
|
||||
| ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; отказ прескрина — К-9 закрыт D39.138 п.2б) |
|
||||
| ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазные счётчики draft/edit НА ГЛАВУ построены движком (D39.122 — строка 99 ЗАКРЫТА); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), `eta_seconds` в спеке (0.2.0+, D39.115); оценка $/глава движком = строка 166 |
|
||||
|
||||
## Фронт (Ф3)
|
||||
|
||||
| ID | Требование (источник) | Статус | Носитель / доказательство |
|
||||
|---|---|---|---|
|
||||
| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0–S2 + контракт исполнены); контракт API ратифицирован (D39.99, живой **0.2.2** — D39.129); платформа построена до интейка книг P5: вход/кредиты/квоты (P0–P3) + раннер P4 (River-очередь · транзиентные systemd-юниты · холд-до-спавна · реконсилятор, D39.123) + `POST /books` со стоп/резюмом и Prometheus (D39.130); фронт — S3.5–S3.7 приняты (оболочка · слой данных · i18n, D39.127/129); **гейт S4 ПАЛ (D39.130)** — S4-промт по слову владельца |
|
||||
| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках; контракт API ратифицирован (D39.99, живой **0.2.3** — D39.135; целостное ревью ПРИНЯТО D39.138 — заказан ломающий батч **0.3.0**, строка 183); платформа построена до потребительской половины шва: вход/кредиты/квоты (P0–P3) + раннер P4 (D39.123) + интейк `POST /books` со стоп/резюмом (D39.130) + exit-словарь/фолд юнитов/дев-стенд (P6, D39.132); фронт — S3.5–S4 приняты (оболочка · слой данных · i18n · путь «файл→прогресс», D39.127/129/135), **зона ЗАМОРОЖЕНА до P7 (D39.136 п.2)** |
|
||||
| ПТ-21 | Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21); выравнивание грубое, по единицам экспорта — принято владельцем 02.08, спаны внутри текста не строятся | 🔶 | механизм готов: `tmctl export --pairs` выравнивает пары побайтно по единицам редактуры (`internal/pipeline/export.go:89-93`); якорь = **edit-unit**, НЕ чанк (переформулировано D39.84 — финальный текст существует только на уровне юнита, ~1.9 юнита/главу, местами глава = один блок; читалка обязана это выдерживать); UI-читалка = Ф3 (этап S6) |
|
||||
| ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels/жанр) данными; UI = Ф3 |
|
||||
| ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels) данными; UI = Ф3. ⚠ ЖАНР из продукта ВЫКИНУТ словом владельца 16.08 (D39.138 п.2в, строка 184: ни на чём не ветвится, влияние не измерено; снимается из промптов/брифа/контракта/формы) |
|
||||
| ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = **SaaS**, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) | ⭕ | строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA `app.<домен>` целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), `frontend/docs/STACK_DECISIONS.md` §4; SSR-вопрос закрыт этим решением |
|
||||
| ПТ-24 | Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) | 🔶 | подписной цикл терминолога в бэкенде есть; UI = Ф3 |
|
||||
| ПТ-33 | Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии — пользователь видит «загрузка → разбор → перевод → подпись банка → финал → готово» (решение владельца 02.08) | ⭕ | инвариант D39.81; контракт API v0 РАТИФИЦИРОВАН (D39.99, `architecture/14-api-contract/`): словарь десяти статусов принят владельцем 04.08 (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона, слова заполняет владелец (В-3); ревью-вопрос «сменится стадия — править ли фронт?» отвечен таблицей §5 компаньона |
|
||||
| ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `frontend/docs/STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (`architecture/14-api-contract/`, D39.99) + платформенный бэклог П-1 |
|
||||
| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | 🔶 | контракт К-8 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); статус `paused` по потолку ЧЕСТЕН с P6 (D39.132: exit 4/событие → `paused`, не `failed`; дневной потолок оператора различим и из платформенного шаблона убран — решение владельца 15.08); остаток: страница лимитов и оповещение на фронте (после P7) · точное продуктовое слово — В-3 на владельце · К-13 (`paused_reason` не различает свой потолок и нет кредита, D39.115 п.6б) |
|
||||
| ПТ-33 | Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии (решение владельца 02.08; граница пере-читана 15.08 — охранять АЛГОРИТМЫ, не минорную механику, D39.136 п.4а). ⚠ «Лестница» фаз «загрузка → … → финал → готово» — устная фраза владельца, НЕ норма продукта (его слово 16.08, D39.138: `finalizing` сворачивается) | 🔶 | инвариант D39.81; словарь статусов принят (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона (В-3), после D39.138 пишется по словарю машинных кодов Б-1. ⚠ Ревью 28 (Б-0) ОПРОВЕРГЛО исполнением ответ §5 компаньона «сменится стадия — фронт не правится»: волны draft/edit утекали в `Progress` до React-компонента; снимается батчем 183, там же заводится ГЕЙТ на утечку конвейера |
|
||||
| ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `frontend/docs/STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (`architecture/14-api-contract/`, D39.99) + платформенный бэклог П-1; правило доступа к экспорт-ссылке (срок/подпись) — батч 183 (research/28 Б-4) |
|
||||
| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | 🔶 | контракт К-8 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); статус `paused` по потолку ЧЕСТЕН с P6 (D39.132: exit 4/событие → `paused`, не `failed`; дневной потолок оператора различим и из платформенного шаблона убран — решение владельца 15.08); остаток: страница лимитов и оповещение на фронте (после P7) · точное продуктовое слово — В-3 на владельце · ~~К-13~~ ЗАКРЫТ (D39.132 п.2а: `null` на проводе; пере-суждён ревью 28 §4 №9 и НЕ опрокинут — с уходом дневной оси различие перестало быть продуктовым) |
|
||||
| ПТ-36 | Интерфейс МУЛЬТИЯЗЫЧНЫЙ, русский не хардкодится в разметке (слово владельца 10.08; язык интерфейса — отдельная ось от языков перевода). ⚠ До 10.08 требование в реестре отсутствовало — пропуск поймал владелец (D39.127 п.2г) | 🔶 | ПОСТРОЕНО S3.7 (принят D39.129): каталог `frontend/src/i18n/ru.ts` (157 ключей) · механизм `@internationalized/string` · ESLint-гейт «текст местом» · стор языка с персистом · `<html lang>` следует выбору; содержимое — только ru; продуктовый список языков — 🔒 владелец (В-9 зоны фронта) |
|
||||
|
||||
## Качество процесса и самоулучшение
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue