Ratify what the platform landing changed in the canon: the created book answers four ways now, and three rows leave the tracker
This commit is contained in:
parent
fda0679839
commit
3d90943421
8 changed files with 399 additions and 34 deletions
File diff suppressed because one or more lines are too long
|
|
@ -1,6 +1,6 @@
|
|||
# Журнал прогресса
|
||||
|
||||
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-07, голова D39.220 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 106 (major 3), всего рядов 458 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном).
|
||||
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-07, голова D39.221 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 112 (major 3), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном).
|
||||
> ⛔ **ЧЕТЫРЕ ПОТОКА РАБОТЫ И ИХ ЗАВИСИМОСТИ (заведено 06.09; до этого жило только в переписке с владельцем).**
|
||||
> **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143):
|
||||
> блокирующая линза слепого чтения меряет верность ЧЕРНОВИКУ, а судимой руке предписано отходить от него по исходнику
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
|
||||
### Пак «ЗАКОН БАНКА — ЧЕСТНО» (06.09, промт `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md`, вход HEAD `e4097cb`). НЕ КОММИЧУ — ждёт лендинга
|
||||
|
||||
**Итог: закон банка описан тем, что код делает, и найдена дыра ШИРЕ заказанной — стадия схлопывания не сверяла свою выработку со строкой банка на тот же ключ ни при какой подписи.** Закрыто в двух местах (схлопывание + страховка на слиянии), репортом, без смены поведения платного прогона. Круги самопроверки нашли **31 находку В МОЕЙ ЖЕ работе** (18 + 8 + 5), из них пять — ложные утверждения в моих же комментариях (тот самый класс, который пак чинил) и одна — РЕГРЕСС, внесённый лечением предыдущего круга. Все разобраны, списки ниже.
|
||||
**Итог: закон банка описан тем, что код делает, и найдена дыра ШИРЕ заказанной — стадия схлопывания не сверяла свою выработку со строкой банка на тот же ключ ни при какой подписи.** Закрыто в двух местах (схлопывание + страховка на слиянии), репортом, без смены поведения платного прогона. **ШЕСТЬ кругов самопроверки нашли 43 находки В МОЕЙ ЖЕ работе** (18 + 8 + 5 + 6 + 4 + 2); круг 6 сказал «сошлись» — новых находок в коде пака нет. Шесть находок — ложные утверждения в моих же комментариях, то есть ровно тот класс, который пак чинил; две внесены лечением предыдущего круга; один и тот же шов «писатель ↔ читатель» ловился ТРИ круга подряд, после чего был убран целиком, а не подпёрт четвёртой заплатой. Все разобраны, списки ниже.
|
||||
|
||||
⚠ **Комментарии этой смены написаны под рекомендацию владельца 06.09** («только важные детали или обоснования, без прозы, воды, истории и странных гарантий»; носитель — `docs/architecture/12-go-style-notes.md` §1, статус РЕКОМЕНДАЦИЯ). Применена только к СВОИМ комментариям пака: сплошного приведения корпуса рекомендация не заказывает. Единственный комментарий вне пака, который я тронула, — `internal/pipeline/export.go` (`TextModified`): моя правка `chunkstatus.go` сделала бы его утверждение рассогласованным, и оставить два живых противоречащих описания одного факта было нельзя. ⚠ **Второй круг самопроверки исполнен ДОБРОВОЛЬНО:** владельцем эта половина не подтверждена, каноном не стала, и как на решение владельца я на неё не ссылаюсь.
|
||||
|
||||
|
|
@ -203,13 +203,13 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
|
||||
**(в) Находка доезжает до листа подписи** (П3): `BankStopRow.BankHolds` + маркер `THE BANK ALREADY HOLDS:` — отдельное поле и отдельный маркер от `Contradicts`/`CONTRADICTS this run's own`.
|
||||
|
||||
**(г) §4.3 — комментарий постчека приведён к поведению + пин `TestWrongDstObeyedIsNotAMiss`.** Промах = форма ОТСУТСТВУЕТ, и только это; послушанный неверный dst присутствует, `if present { continue }` берётся, промаха нет. Ноль confirmed-промахов говорит про ИСПОЛНЕНИЕ ПОДПИСАННОЙ половины банка — про неподписанную не говорит ничего (её промахи уходят в `Unverified` и не считаются). **Те же ложные утверждения найдены грепом и сняты ещё в двух местах, которых в промте не было:** `pipeline/disposition.go:92` и `cmd/tmctl/render.go:362`.
|
||||
**(г) §4.3 — комментарий постчека приведён к поведению + пин `TestWrongDstObeyedIsNotAMiss`.** Промах = форма ОТСУТСТВУЕТ, и только это; послушанный неверный dst присутствует, `if present { continue }` берётся, промаха нет. Ноль confirmed-промахов говорит про ИСПОЛНЕНИЕ ПОДПИСАННОЙ половины банка — про неподписанную не говорит ничего (её промахи уходят в `Unverified` и не считаются). **Те же ложные утверждения найдены грепом и сняты ещё в двух местах, которых в промте не было:** `pipeline/disposition.go:90` и `cmd/tmctl/render.go:366`.
|
||||
|
||||
**(д) §4.2 — совет «or mark one status: auto» снят.** Установлено исполнением: при `status: auto` на второй строке инжектятся ОБЕ (approved→2, draft→2, auto→2; КОНТРОЛЬ «src отсутствует в чанке» → 0). Под `D39.104` п.2 провод не ветвится по статусу ⇒ статус-слепота гварда ВЕРНА, а совет — осколок до-`D39.104` эпохи. Выход №2 («научить гвард смотреть статус») отвергнут по существу: он вернул бы закрытую доктриной развилку.
|
||||
|
||||
**(е) §4.4 — два ложных комментария сняты.** `waverun.go`: оправдание `nil`-переноса sticky заменено фактом — `assignEditUnits` закрывает единицу внутри главы, sticky сбрасывается на границе ГЛАВЫ, 1962 из 2283 глав многоединичны (замер строки 321, не мой, атрибутирован); перенос НЕ строю. `chunkstatus.go`: см. §5, там моя формулировка была неверна дважды.
|
||||
|
||||
**(ж) Попутно исправлена собственная ложь, созданная расширением:** `seeding.go:75` говорил «an UNSIGNED row contradicts an APPROVED term» — неправда для новой половины. ⚠ На старый текст не стоял ни один тест (`grep` в `*.go` = 0): сообщение, по которому оператор действует, было без пина.
|
||||
**(ж) Попутно исправлена собственная ложь, созданная расширением:** `seeding.go:73` говорил «an UNSIGNED row contradicts an APPROVED term» — неправда для новой половины. ⚠ На старый текст не стоял ни один тест (`grep` в `*.go` = 0): сообщение, по которому оператор действует, было без пина.
|
||||
|
||||
#### 4. Что нашли ДВА круга самопроверки в моей же работе
|
||||
|
||||
|
|
@ -221,7 +221,7 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
4. **Мой собственный комментарий повторял чужой misnomer:** «dropped where a SIGNED row holds the key» — `loadAutoBank` роняет предложение по ЛЮБОЙ ранее собранной строке любого статуса. Исправлено и названо ценой пропуска.
|
||||
5. **`consolidatedRows` не пиннился ничем:** мутации «убрать `SinceCh`» и «убрать алиасы» переживали весь пакет `pipeline`. Добавлен `TestConsolidatedRowsCarryTheWindowAndTheAliases`; обе мутации теперь ловятся с верным текстом.
|
||||
6. **Три дефекта в моём корпусном приборе:** классификация пары по подстроке `: approved "` ловила только случай, когда approved-строка печатается первой; `booksSeen` был тождествен `booksWithRows` по построению (мёртвая «контрольная» величина); подсадка строилась от `g[0]`, у которой может не быть огневого ключа или dst ⇒ ложный ОТКАЗ прибора. Все три закрыты, числа после починки те же.
|
||||
7. **Двойной репорт в ОДНОМ прогоне — подтверждён моим прогоном:** авто-режим после `writeAutoBank` пере-сидит, и `UnverifiedKeyConflicts` называет ту же пару через 2 мс после стадии схлопывания (collapse=1, merge=1, КОНТРОЛЬ: всего 3 строки WARN). НЕ подавлял: это разные состояния одного термина («роль расходится с банком» до того, как строка легла, и «банк держит обе» после), и только второе означает две строки на проводе. Названо в доке; если оркестратор сочтёт это шумом — резать надо слияние.
|
||||
7. **Двойной репорт в ОДНОМ прогоне — подтверждён моим прогоном на ДЕЛЬТА-фикстуре** (`test-book.mined-delta.yaml` с неподписанной строкой `方源→Странник`): авто-режим после `writeAutoBank` пере-сидит, и `UnverifiedKeyConflicts` называет ту же пару через 2 мс после стадии схлопывания — collapse=1, merge=1, КОНТРОЛЬ всего 3 строки WARN. ⚠ **Фикстура названа по находке круга 5:** на СИД-фикстуре моего же e2e выходит collapse=1, merge=0, потому что эмиссия роняет предложение по сид-поверхности, и без имени фикстуры число читалось бы как общее. НЕ подавлял: это разные состояния одного термина («роль расходится с банком» до того, как строка легла, и «банк держит обе» после), и только второе означает две строки на проводе. Названо в доке; если оркестратор сочтёт это шумом — резать надо слияние.
|
||||
8. **Линтер нашёл два настоящих дефекта в приборе:** непроверенный `rows.Err()` в обоих запросах. Для измерительного прибора это ровно та неисправность, ради которой он написан: усечённая итерация вернула бы меньший банк как чистый. Разведено на две функции с `defer rows.Close()` и возвратом `rows.Err()`.
|
||||
|
||||
Мелкие, тоже закрыты: перебор в «zero says the bank was EXECUTED»; `render.go` — строка detail несёт и ambiguous-промахи, поэтому «an approved rendering» верно для гейта, не для строки; ассерт «one fault, not two: []» давал верный вердикт при нуле с неверным текстом.
|
||||
|
|
@ -253,6 +253,32 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
|
||||
⇒ **Урок круга 3, который дороже самой находки:** правка, сделанная ПО находке ревью, — такой же новый код, как всякий другой, и требует своего пина. Мой фикс круга 2 был верен по существу и сломал доставку на этаж выше, потому что я запинила изменённую функцию, а не путь до потребителя.
|
||||
|
||||
#### 4-квинтус. КРУГ 4 — зеркало того же шва плюс асимметрия доставки
|
||||
|
||||
Круг 4 подтвердил все пять пунктов круга 3 закрытыми и нашёл четыре новых. Главная — того же класса, что регресс круга 3, но с другой стороны шва:
|
||||
|
||||
1. ⛔ **Сторона ЗАПИСИ карты `BankHolds` не была запинена вовсе.** Мутации ключа записи на `cf.Key` (firing-ключ, может быть АЛИАСОМ) и на `cf.BankSrc` (поверхность строки банка) **переживали весь пакет `pipeline`**. Причина названа точно: мой юнит-пин строил карту СВОЕЙ копией продакшн-цикла, а не звал продакшн-писателя, а e2e-пин стоит на `方源`, где ключ кандидата, сырая поверхность, firing-ключ и поверхность строки банка — одна и та же строка, так что любой из четырёх ключей проходил. **Вылечено выделением одного писателя** `bankHoldsByCandidate`, которого зовут и продакшн, и пин; фикстура подобрана так, что все четыре строки различаются. Обе мутации красны с верным текстом.
|
||||
2. **Стдаут-таблица стопа печатала `⚠ contradicts:` и НЕ печатала маркер банка** (`cmd/tmctl/render.go`) — оператор на первом экране видел одно разногласие и не видел второго, при том что пак сам обосновал их равенство. Добавлена строка `⚠ bank holds:` рядом с братом.
|
||||
3. **Абзац «WHO RESOLVES A SKIPPED PAIR» смешивал две популяции** и утверждал «nothing reporting it». По коду: для СИД-поверхности резолвер — фильтр эмиссии (`reverseSectionTerms`), а не `loadAutoBank`; для ДЕЛЬТА-строки — `loadAutoBank`, и дроп ЛОГИРУЕТСЯ, но текстом «held by a **signed** term» при любом статусе держателя, то есть оператору говорят НЕВЕРНОЕ, а не ничего. Абзац разведён, §5а №1 отчёта приведён к этому же.
|
||||
4. **Дока поля `BankHolds` говорила «per candidate src», а комментарий писателя — «keyed by the KEY»**: два комментария к одному полю расходились ровно в том слове, на котором сломался круг 3. Сведены.
|
||||
|
||||
Плюс два числа отчёта не воспроизводились и были пере-сняты: счётчик ссылок на `BankHolds` устарел после продления пина, а контрольная формулировка «`Contradicts` дальше листа и лога не идёт» оказалась **ложной** — он печатается в стдаут, и именно эта находка привела к п.2.
|
||||
|
||||
⇒ **Урок круга 4:** тест, который ВОСПРОИЗВОДИТ продакшн-логику копией вместо вызова, пинит собственный цикл, а не код. Два круга подряд дыра сидела на одном шве «писатель ↔ читатель», и оба раза её прятала фикстура, где все кандидаты на ключ совпадают.
|
||||
|
||||
#### 4-секстус. КРУГ 5 — сошлись по ПОВЕДЕНИЮ; остаток был в пинах и тексте, и шов убран целиком
|
||||
|
||||
Круг 5 подтвердил: регресса в лечении круга 4 нет, все пять пунктов закрыты и воспроизведены исполнением (включая замер, которого я не сделала сама на круге 1 — дроп дельта-строки действительно логируется словом «signed» при держателе `status=draft`). Остаточных находок четыре, все в пинах и тексте:
|
||||
|
||||
1. ⛔ **Шов «писатель ↔ читатель» бил ТРИ круга подряд, поэтому убран, а не подпёрт четвёртой заплатой.** Круг 5 показал, что даже после выделения общего писателя мутация «продакшн обходит писателя и вписывает свой ключ» переживает весь пакет: e2e стоит на `方源`, где ключ кандидата, сырая поверхность, firing-ключ и поверхность строки банка — одна строка. **Решение по `D39.216`: карты больше нет.** `terminologyResult.BankHoldRows` несёт находки НЕГРУППИРОВАННЫМИ, сопоставляет их с рядом одна функция `bankHoldLabels` в том файле, который их потребляет, — то есть ключ выбирается в ОДНОМ месте, а не по разу с каждой стороны. Три мутации ключа сопоставления (`cf.Key == c.Key`, `cf.Src == c.Src`, `cf.BankSrc == c.Key`) теперь красны на одном пине с текстом про сломанное.
|
||||
2. **Строка `⚠ bank holds:` в стдауте была без пина — и её брат `⚠ contradicts:` тоже.** Добавлен `TestRenderSignatureStopShowsBothDisagreements`; обе мутации (удалить любой из двух блоков) красны, контроль — ряд без маркеров не печатает ни одного.
|
||||
3. **Абзац доки обобщал дельту:** до `loadAutoBank` доходит только НЕПОДПИСАННАЯ дельта-строка, потому что approved-дельта остаётся сид-поверхностью для эмиссии (`unsignedEngineSurfaces`). Уточнено одним словом.
|
||||
4. **Корпусный прибор проходил на пустом обходе** (`TM_CORPUS=/nonexistent` → PASS при `walked=0` — ровно тот класс, ради которого он написан), и `trimTo` резал байты, а не руны, на ханьских и кириллических сообщениях. Оба закрыты: пустой обход теперь `t.Fatalf`, срез рун-безопасен.
|
||||
|
||||
Плюс пере-сняты шесть устаревших `file:line` отчёта (сдвинулись моими же правками) и названа фикстура у числа «collapse=1, merge=1»: оно ДЕЛЬТА-фикстуры, а на сид-фикстуре выходит 1 и 0, потому что эмиссия роняет предложение.
|
||||
|
||||
⇒ **Урок круга 5, и он про архитектуру, а не про внимательность:** если одна и та же дыра ловится три круга подряд в разных её точках, чинить надо не точку, а шов. Карта, ключ которой выбирается дважды, — это два места для одной мысли; после перестройки мест стало одно, и все три мутации ключа ловит один пин.
|
||||
|
||||
#### 4-тер. Находки кругов → что сделано → чем предъявлено
|
||||
|
||||
| находка (круг) | что сделано | чем предъявлено |
|
||||
|
|
@ -276,6 +302,27 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
| нумерация §5а 1..7, 9, 8 (3) | выправлена | `grep -oE '^[0-9]+\.'` → 1 2 3 4 5 6 7 8 9 |
|
||||
| два абзаца доки под одним заголовком (3) | разведены на «WHAT THE SKIP HIDES» и «WHO RESOLVES A SKIPPED PAIR» | оба факта проверены по коду |
|
||||
| варнинг `glossaryRows` обещал больше, чем делает (3) | сужен до «whatever this call feeds», повторяемость названа | зовётся и из `scoreOpts`, где затрагивается только якорь |
|
||||
| **сторона ЗАПИСИ карты не запинена (4)** | выделен один писатель `bankHoldsByCandidate`, продакшн и пин зовут его; фикстура различает все четыре кандидата на ключ | обе мутации (`cf.Key`, `cf.BankSrc`) красны: «the mark must reach the sheet for a candidate whose key differs from its surface» |
|
||||
| стдаут стопа показывал брата и прятал маркер банка (4) | добавлена строка `⚠ bank holds:` рядом с `⚠ contradicts:` | `cmd/tmctl/render.go`; пакет `tmctl` зелёный |
|
||||
| абзац доки смешивал две популяции и врал про молчание (4) | разведён: сид роняет эмиссия, дельту роняет `loadAutoBank` и ЛОГИРУЕТ, но словом «signed» | §5а №1 приведён к тому же |
|
||||
| дока поля и комментарий писателя расходились в слове (4) | сведены на «keyed by the candidate KEY» | греп по обоим местам |
|
||||
| два числа отчёта не воспроизводились (4) | пере-сняты командой; ложный контроль про `Contradicts` снят | он печатается в стдаут — эта же находка дала строку выше |
|
||||
| **шов «писатель↔читатель» пережил и общего писателя (5)** | шов УБРАН: находки едут негруппированными, сопоставляет одна функция в файле-потребителе | три мутации ключа сопоставления + «продакшн обходит хелпер» — все красны на одном пине |
|
||||
| `⚠ bank holds:` в стдауте без пина, и брат тоже (5) | `TestRenderSignatureStopShowsBothDisagreements` с контролем | удаление любого из двух блоков красно с текстом про свой маркер |
|
||||
| абзац обобщал дельту: до `loadAutoBank` доходит лишь НЕПОДПИСАННАЯ (5) | уточнено одним словом | `unsignedEngineSurfaces` оставляет approved-дельту сид-поверхностью |
|
||||
| прибор проходил на пустом обходе, `trimTo` резал байты (5) | пустой обход — `t.Fatalf`; срез рун-безопасен | `TM_CORPUS=/nonexistent` → FAIL «a walk that found nothing reports the same zeros as a clean corpus» |
|
||||
| шесть `file:line` отчёта протухли (5) | пере-сняты грепом, каждый проверен | 23 адреса резолвятся на заявленное (круг 6) |
|
||||
| два счётчика отчёта протухли снова (6) | ВСЕ числа сняты ОДНИМ проходом после последней правки | круги 4, 5, 6 ловили это трижды — причина была в порядке, а не в счёте |
|
||||
|
||||
#### 4-септимус. КРУГ 6 — СОШЛИСЬ
|
||||
|
||||
Круг 6 прогнал четыре мутации по перестроенному шву (три ключа сопоставления плюс «продакшн обходит сопоставитель инлайном») — **все четыре красны на одном пине**, e2e не ловит ни одной, что совпадает с заявленным разделением ролей пинов. Проверил и то, что перестройка ничего не потеряла: порядок находок тот же (предложение → firing-ключ → индекс банка), дублей нет по построению, детерминизм 200 прогонов — 1 различный вывод при 5 и 9 находках, КОНТРОЛЬ map-упорядоченной склейки — 189 различных.
|
||||
|
||||
**Новых находок в коде пака нет.** Осталось два:
|
||||
1. **Шов-БЛИЗНЕЦ в коде, который пак не трогал:** `Contradictions` и `Conf` пересекают ту же границу тем же способом, стороны согласованы, но ни одна фикстура не имеет кандидата с `Key != Src` — мутация любого из трёх ключей переживает полные пакеты `pipeline`, `terminology` и `tmctl`. Не регресс и не мой код; вынесен §5а №10.
|
||||
2. **Два счётчика отчёта снова протухли** — третий раз подряд, и причина не в счёте, а в порядке: я снимала числа до правок. Закрыто иначе, чем прежде: **все числа отчёта пере-сняты ОДНИМ проходом после последней правки кода**, и это записано рядом с ними.
|
||||
|
||||
⚠ Круг 6 сам поймал у себя ошибку до сдачи: прочёл чужой лог батареи как свой и объявил красноту. Назвал это в отчёте — то же требование, что канон предъявляет к сессии.
|
||||
|
||||
#### 5. Таблица мутаций — правая колонка это ТЕКСТ падения, а не факт красноты
|
||||
|
||||
|
|
@ -314,11 +361,11 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
#### 6. Чем предъявлено — команды и вывод
|
||||
|
||||
- **Батарея после последней правки:** `make battery` → **`MAKE_EXIT=0`**, `ok` пакетов **19** (+4 без тестов), строк `FAIL` **0**, линтер **`0 issues.`**; скипов **4**, все названы батареей: `TestMinerFullBookParity`, `TestCorpusBankKeyConflicts` (мой opt-in прибор — батарея его видит и называет), `TestHelperEventsRun`, `TestHelperKillLoop`.
|
||||
- **Дифф тестов исполнением** (`git diff -- 'backend/*_test.go' | grep '^[-+]func Test'`): в отслеживаемых файлах добавлено **6**, удалено **0**; `func Fuzz` 0/0. Плюс по **1** в двух новых файлах (`bankconflict_corpus_test.go`, `resume_updatedat_test.go`) → итого **+8 / −0**.
|
||||
- **Детерминизм:** 200 прогонов на одном входе — различных выводов `UnverifiedKeyConflicts` **1**, `ConsolidationKeyConflicts` **1**; КОНТРОЛЬ — заведомо map-упорядоченная склейка на тех же данных даёт **8**. Плюс `-count=5 -race` по новым тестам.
|
||||
- **Дифф тестов исполнением** (`git diff -- 'backend/*_test.go' | grep '^[-+]func Test'`): в отслеживаемых файлах добавлено **7**, удалено **0**; `func Fuzz` 0/0. Плюс по **1** в двух новых файлах (`bankconflict_corpus_test.go`, `resume_updatedat_test.go`) → итого **+9 / −0**.
|
||||
- **Детерминизм:** 200 прогонов на одном входе — различных выводов `UnverifiedKeyConflicts` **1**, `ConsolidationKeyConflicts` **1**; КОНТРОЛЬ — заведомо map-упорядоченная склейка на тех же данных даёт **8** различных (само число зависит от фикстуры; значимо только «больше одного»). Плюс `-count=5 -race` по новым тестам.
|
||||
- **Корпус** (`TM_CORPUS=<репо>/books go test ./internal/pipeline/ -run TestCorpusBankKeyConflicts -v`): `.db walked=162, with a glossary table=161, without one=1, read-failed=0; books with a glossary=142, rows read=13350; ПОПУЛЯЦИЯ: книг хотя бы с одной неподписанной строкой=142, approved=1093 draft=11399 auto=858; книг с ЛЮБЫМ конфликтом=0; только approved×unsigned=0; с парой unsigned×unsigned=0; КОНТРОЛЬ: подсадка ловится на 142 из 142.`
|
||||
⇒ **0 книг из 142, и это «не встречается», а не «не смотрели»:** 12 257 из 13 350 строк корпуса неподписанные, а форма столкновения не возникает потому, что все существующие двери роняют дубль по ПОЛНОМУ ключу `(src,sense,since_ch,until_ch)`, а разные окна через них проходят. ⚠ **Старое правило на корпусе тоже даёт 0** — S14 живёт в дереве без единого наблюдённого срабатывания; без этого числа «0» прочтётся как «новая половина бесполезна».
|
||||
- **§5.3, греп по каждой отозванной формулировке** (включая отозванные по находкам обоих кругов) — **22 из 22 дают 0**, у каждой рядом контрольная фраза из того же файла с ненулевым счётом.
|
||||
- **§5.3, греп по каждой отозванной формулировке** (включая отозванные по находкам кругов 2, 3 и 4) — **25 из 25 дают 0**, у каждой рядом контрольная фраза из того же файла с ненулевым счётом.
|
||||
|
||||
#### 7. Двигает ли что-нибудь снапшот, хеш запроса, ключ манифеста, версию встроенных данных
|
||||
|
||||
|
|
@ -326,21 +373,22 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
- Изменены только `.go`: **16** позиций `git status` по `backend/` (14 M + 2 новых `_test.go`); `configs/` и `internal/lang/data/` — **0**.
|
||||
- `git status` по всем четырём `testdata/` — пусто; КОНТРОЛЬ: голден-файлов в `internal/pipeline/testdata/golden/` — **6**. Ни один голден не пере-снимался; сайдкар листа подписи голденом не накрыт (`grep -rl 'BANK VERIFICATION TABLE' testdata/` → 0), его стерегут пять живых тестов, все зелёные.
|
||||
- Пины движения прогнаны поимённо ПОСЛЕ последней правки и зелены: `go test ./internal/pipeline/ -run 'TestGoldenDeterminism|TestCutTagFollowsTheLangpack|TestManifest' -v` → **14 PASS, 0 FAIL**; `go test ./internal/membank/ -run 'TestMemoryVersion|TestMaterializeMemoryVersion' -v` → **5 PASS, 0 FAIL**.
|
||||
- Новое поле листа подписи дальше сайдкара не течёт: ссылок на `BankHolds` — **12** в **3** файлах (проверка, проводка+рендер, тест); КОНТРОЛЬ — у соседнего `Contradicts`, про которое известно, что дальше листа и лога оно не идёт, тоже **12**.
|
||||
- Новое поле листа подписи доходит ровно до ДВУХ человеческих поверхностей — сайдкара и стдаут-таблицы стопа: не-тестовых читателей `BankHolds` **2** (`mining.go` → `renderBankStopTable`, `cmd/tmctl/render.go`). Ссылок всего: `BankHolds` **12** в **4** файлах, `BankHoldRows` (носитель через границу) **5** в **3**; КОНТРОЛЬ — у соседнего `Contradicts` **11** в **4**. ⚠ **Прежняя формулировка этого контроля («`Contradicts` дальше листа и лога не идёт») была НЕВЕРНА и снята по находке круга 4:** он печатается в стдаут, и из-за той же находки мой маркер теперь стоит там же. ⚠ Числа пере-сняты одним проходом ПОСЛЕ последней правки: круги 4, 5 и 6 подряд ловили в отчёте протухшие счётчики, потому что я снимала их до правок, а не после.
|
||||
- Отдельным пином: диагностика НЕ входит в подписной документ (в `signature map` нет ни маркера, ни ярлыка строки банка; КОНТРОЛЬ — тот же файл содержит `青茅山` и `terms:`).
|
||||
- Обе проверки — только `WarnContext`; ни одна не возвращает ошибку и не меняет содержимого банка. Отказ (drop/stop) НЕ построен (П2).
|
||||
|
||||
#### 8. §5а — «задумано против сделано». НЕ чинил, выношу списком
|
||||
|
||||
1. **`mining.go:643`** `loadAutoBank(signed []store.GlossaryEntry)`, зовётся как `r.loadAutoBank(in.entries)` (`bankmaterialize.go:125`). Обещано именем параметра, докой (`:637`) и сообщением оператору (`:680` «key held by the signed %q→%q»), что предложение движка отбрасывает ПОДПИСЬ. Исполняется: популяция — сид+ruby+дельта любого статуса; неподписанная строка отбрасывает предложение и печатается оператору как «the signed». ⚠ Цену назвал опровергатель круга 1 прогоном (рукописная `draft`-строка на ТОМ ЖЕ кортеже молча съедает выработку движка, и ни одна из трёх проверок не говорит ни слова). **Атрибутирую, а не присваиваю: своим прогоном я этот случай не воспроизвёл** — моя фикстура на `since_ch: 0` дала РАЗНЫЕ кортежи (обе строки легли, обе проверки сработали: `BankConflicts=1`, collapse=1, merge=1), а вторая итерация упёрлась в гейт пере-оплаты, потому что переиспользовала тот же проект. Проверено мной только по коду: `held` в `loadAutoBank` строится из параметра, которым передаётся `in.entries` (`bankmaterialize.go:125`), то есть из строк ЛЮБОГО статуса.
|
||||
1. **`mining.go:654`** `loadAutoBank(signed []store.GlossaryEntry)`, зовётся как `r.loadAutoBank(in.entries)` (`bankmaterialize.go:125`). Обещано именем параметра, докой (`:648`) и сообщением оператору (`:691` «key held by the signed %q→%q»), что предложение движка отбрасывает ПОДПИСЬ. Исполняется: популяция — сид+ruby+дельта любого статуса; неподписанная строка отбрасывает предложение и печатается оператору как «the signed». ⚠ **Формулировка круга 1 «ни одна проверка не говорит ни слова» ОПРОВЕРГНУТА кругом 4 и снята:** дроп ЛОГИРУЕТСЯ (`gatherBankInputs` → `seeding.go`), но текстом «held by a **signed** term» каким бы ни был статус держателя, — то есть оператору говорят НЕВЕРНОЕ, а не ничего, и это ровно предмет позиции. ⚠ **Атрибутирую, а не присваиваю: своим прогоном исходный случай я не воспроизвела** — моя фикстура на `since_ch: 0` дала РАЗНЫЕ кортежи (обе строки легли, обе проверки сработали: `BankConflicts=1`, collapse=1, merge=1), а вторая итерация упёрлась в гейт пере-оплаты, потому что переиспользовала тот же проект. Проверено мной только по коду: `held` в `loadAutoBank` строится из параметра, которым передаётся `in.entries` (`bankmaterialize.go:125`), то есть из строк ЛЮБОГО статуса.
|
||||
2. **`terminology.go:873` и `:941`** — обе канон-проверки пропускают пару с РАВНЫМИ источниками. Проверочную половину закрыл сегодня; **якорная осталась: роль не показывают, как книга уже зовёт поверхность, которую её просят перевести.** Это меняет содержимое запроса ⇒ хеш ⇒ деньги, в пак не входит.
|
||||
3. **`terminologist.go:260` против `mining.go:549`** — фильтр «поверхность уже в банке» стоит только на ЭМИССИИ. Роль и классификатор ОПЛАЧИВАЮТСЯ за поверхности, которые банк уже несёт.
|
||||
3. **`terminologist.go:257` против `mining.go:553`** — фильтр «поверхность уже в банке» стоит только на ЭМИССИИ. Роль и классификатор ОПЛАЧИВАЮТСЯ за поверхности, которые банк уже несёт.
|
||||
4. **`bankmaterialize.go:139-141`** — комментарий на вызове говорит «two DIFFERENT approved terms», тогда как `ApprovedSharedKeyCollisions` собственной докой заявляет, что same-src пары не пропускает.
|
||||
5. **`mempostcheck.go:91` против `:122`/`:130`** — дока `Shown` говорит «how many unsigned rows were actually PUT IN FRONT of the model here», а sticky-перенос `continue`-ится ДО счётчика. Имя метрики шире её смысла.
|
||||
6. **`internal/pipeline/bankmaterialize.go:127`** — remark оператору «auto-bank rows dropped: their key is already held by a **signed** term (the signed term wins)». Та же ложь, что в `loadAutoBank`: держателем ключа может быть неподписанная строка, и оператор увидит её названной подписанной.
|
||||
5. **`mempostcheck.go:91` против `:122` и `:130`** — дока `Shown` говорит «how many unsigned rows were actually PUT IN FRONT of the model here», а sticky-перенос `continue`-ится ДО счётчика. Имя метрики шире её смысла.
|
||||
6. **`internal/pipeline/bankmaterialize.go:132`** — remark оператору «auto-bank rows dropped: their key is already held by a **signed** term (the signed term wins)». Та же ложь, что в `loadAutoBank`: держателем ключа может быть неподписанная строка, и оператор увидит её названной подписанной.
|
||||
7. **`internal/membank/memseed.go`, пропуск по UNIQUE-кортежу** — сид-строка с окном ПО УМОЛЧАНИЮ и без sense делит кортеж с banknote-предложением (у обоих `since_ch 0`), поэтому самая частая форма рукописной сид-строки против выработки роли **молчит**, каким бы ни был её статус. Замер круга 2: та же фикстура без `until_ch: 20` → `BankConflicts=0` и при `draft`, и при `approved`; с `until_ch: 20` → 1. На провод это не влияет (предложение отбрасывается, двух форм там нет) — теряется строка на ЛИСТЕ ПОДПИСИ. Закрытие требует правила «заменённая строка движка против отброшенного предложения», а колонка `Source` его не даёт: дельта владельца и авто-банк движка обе читаются `mined`.
|
||||
8. **Сообщения без пинов** — конкретный носитель `internal/pipeline/seeding.go:75` (текст варнинга S14). Ни один тест его не закрывал (`grep` по прежнему тексту в `*.go` = 0), поэтому расширение правила сделало операторское сообщение ложным при полностью зелёной батарее. Класс шире одного места: пины на ТЕКСТЫ операторских сообщений в зоне не ставятся системно.
|
||||
9. **`internal/store/chunkstatus.go` вместе с `internal/pipeline/waverun.go` — ПУТЬ ЗАПИСИ СТАТУСА НЕ ЧИТАЕТСЯ ПО КОДУ, и это свойство места, а не невнимательность автора.** Писателей скипнутой строки ДВА, и какой сработает, решает раскладка волны: `recordSkippedStages` (`waverun.go`) — для флагнутой РЕДАКТОРСКОЙ единицы, флагнутая ветка `runStageSequence` (там же) — когда в ОДНОЙ волне две и более стадии. Читающий `chunkstatus.go` не видит ни того, ни другого. Замер: три формулировки механизма подряд оказались неверными (в дереве до пака, в моей первой правке, в моей второй), и каждую поймала только мутация — прочитанная по тексту, а не по цвету.
|
||||
8. **Сообщения без пинов** — конкретный носитель `internal/pipeline/seeding.go:73` (текст варнинга S14). Ни один тест его не закрывал (`grep` по прежнему тексту в `*.go` = 0), поэтому расширение правила сделало операторское сообщение ложным при полностью зелёной батарее. Класс шире одного места: пины на ТЕКСТЫ операторских сообщений в зоне не ставятся системно.
|
||||
9. **`internal/terminology/terminology.go:993` и `internal/pipeline/mining.go:451` — ШОВ-БЛИЗНЕЦ того, что бил меня три круга, живёт рядом и НЕ ЗАПИНЕН.** Поля `Contradictions` и `Conf` пересекают границу файла тем же способом: ключ выбирается по разу с каждой стороны (`Contradictions` — по `c.Src` у писателя и читателя, `Conf` — по `c.Key` у обоих). Сегодня стороны согласованы, но ни одна фикстура не имеет кандидата с `Key != Src`, поэтому мутация любого из трёх ключей переживает ПОЛНЫЕ пакеты `pipeline`, `terminology` и `tmctl` (замер круга 6). На проводе не меняется ничего — теряются метка `⚠ contradicts` и порядок «least sure first» на листе подписи у banknote-кандидатов с традиционным/кана-написанием. ⚠ **Строки паком не тронуты, это не регресс**; свой шов я убрала целиком (§4-секстус п.1), а этот выношу, потому что он того же класса и чинится десятью строками рядом с существующим тестом.
|
||||
10. **`internal/store/chunkstatus.go` вместе с `internal/pipeline/waverun.go` — ПУТЬ ЗАПИСИ СТАТУСА НЕ ЧИТАЕТСЯ ПО КОДУ, и это свойство места, а не невнимательность автора.** Писателей скипнутой строки ДВА, и какой сработает, решает раскладка волны: `recordSkippedStages` (`waverun.go`) — для флагнутой РЕДАКТОРСКОЙ единицы, флагнутая ветка `runStageSequence` (там же) — когда в ОДНОЙ волне две и более стадии. Читающий `chunkstatus.go` не видит ни того, ни другого. Замер: три формулировки механизма подряд оказались неверными (в дереве до пака, в моей первой правке, в моей второй), и каждую поймала только мутация — прочитанная по тексту, а не по цвету.
|
||||
|
||||
#### 9. Правки существующих тестов, вызванные ЗАКАЗАННОЙ сменой поведения (`D39.183`)
|
||||
|
||||
|
|
@ -365,7 +413,7 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
|
||||
#### 11. Что я сам считаю слабым местом
|
||||
|
||||
1. **Два круга самопроверки нашли 18+ находок В МОЕЙ РАБОТЕ, и три из них — ложные утверждения в комментариях, то есть ровно тот дефект, который пак чинил.** Одно (`chunkstatus.go`) я написал неверно ДВАЖДЫ: сначала «резюм не пишет», потом верное «пишет» с НЕВЕРНЫМ механизмом. Второе поймала только мутация. Вывод для приёмки: мои утверждения о поведении надо проверять исполнением так же, как чужие.
|
||||
1. **Три круга самопроверки нашли 31 находку В МОЕЙ РАБОТЕ.** Пять — ложные утверждения в комментариях, то есть ровно тот дефект, который пак чинил; `chunkstatus.go` я написала неверно ТРИЖДЫ подряд (сначала «резюм не пишет», потом верное «пишет» с неверным механизмом, потом со вторым неверным), и каждый раз ловила только мутация, прочитанная по ТЕКСТУ. Вывод для приёмки: мои утверждения о поведении надо проверять исполнением так же, как чужие. ⛔ **И отдельно самое неприятное: одну находку внесла МОЯ ЖЕ ПРАВКА ПО НАХОДКЕ** — фикс круга 2 был верен в функции и сломал доставку этажом выше, потому что я запинила изменённую функцию, а не путь до потребителя. Правка по ревью — такой же новый код, как всякий другой.
|
||||
2. **`ConsolidationKeyConflicts` и расширенная `UnverifiedKeyConflicts` частично перекрываются**, и это теперь ИЗМЕРЕНО (§4 п.7), а не предположено. Довод в пользу двух мест реальный (разные популяции), но «одно знание — один носитель» соблюдено не идеально.
|
||||
3. ⛔ **Мой довод про UNIQUE был ЛОЖЕН, и выяснилось это только на круге 2 — прогоном, которого я на круге 1 не сделала.** Я сослалась на схему вместо того, чтобы её спросить; схема ответила иначе (ключ сырой, трад/упрощённая пара — две законные строки, обе инжектятся). Урок шире места: формула «доказано схемой» стояла в моём отчёте там, где честно было «не мерено».
|
||||
4. **Мой e2e-тест обходил дыру подобранным значением:** `until_ch: 20` уводит сид-строку с кортежа предложения, без него проверка молчит (§5а №7). Это тот же класс, что «тест утверждает не то, что думает», и вынести подобранное окно должна была я, а вынес круг 2. Плюс маркер предъявлен на кандидате, которого в подписном документе НЕТ (`方源` — сид-поверхность): адрес верный (стоп-таблица содержит всех кандидатов), но случай «противоречие у термина, который владелец реально подписывает» отдельным тестом не покрыт.
|
||||
|
|
@ -374,10 +422,11 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
|
||||
#### 11-бис. Дерево на момент сдачи
|
||||
|
||||
`git status --short -- backend/ docs/PROGRESS.md`:
|
||||
`git status --short -- backend/ docs/PROGRESS.md` (позиций по `backend/` — **17**: 15 M + 2 новых):
|
||||
|
||||
```
|
||||
M backend/cmd/tmctl/render.go
|
||||
M backend/cmd/tmctl/render_test.go
|
||||
M backend/internal/membank/mempostcheck.go
|
||||
M backend/internal/membank/mempostcheck_test.go
|
||||
M backend/internal/membank/memseed.go
|
||||
|
|
@ -400,13 +449,26 @@ $0, мои руки, выброшенные пробы. Каждый ноль с
|
|||
|
||||
Батарея снята ПОСЛЕ последней правки, и это предъявлено, а не заявлено: `find backend -name '*.go' -newer <лог батареи>` → **0**; КОНТРОЛЬ `find … -newer <маркер часовой давности>` → **5**.
|
||||
|
||||
#### 11-тер. Заявление о завершённости
|
||||
|
||||
**Работа завершена, править больше не планирую.** Критерий проверяется механически:
|
||||
|
||||
1. **Исход у каждого пункта заказа** — таблица §0, пунктов без исхода нет.
|
||||
2. **Круги сошлись** — круг 6 дал «сошлись», новых находок в коде пака нет; всё найденное кругами 1–6 закрыто поимённо таблицей §4-тер. Два остатка круга 6 не в коде пака: пред-существующий шов-близнец вынесен §5а №10, счётчики пере-сняты.
|
||||
3. **Числа сняты после последней правки, каждое командой.** Батарея `MAKE_EXIT=0` (19 пакетов `ok`, 0 красных, линтер `0 issues.`, 4 названных скипа); что она позже последнего касания кода — предъявлено: `find backend -name '*.go' -newer <лог>` → **0** при контроле **7**, и с тех пор изменён только `docs/PROGRESS.md`.
|
||||
4. **Мутации** — таблица §5 полна (**23** строк), выжившие названы отдельной таблицей «зелено ДО → красно ПОСЛЕ», отброшенная названа с причиной.
|
||||
5. **Обещаний в отчёте нет** — всё, что «надо бы», стоит секцией предложений ниже и решается оркестратором.
|
||||
6. **Всё живое в дереве** — отчёт, таблицы, замеры, ограничения; письма носителем не считаю.
|
||||
7. **Дерево в безопасной точке** — только моя зона, индекс пуст, не закоммичено, статус приложен выше.
|
||||
|
||||
#### 12. Предложения (решает оркестратор, в паке НЕ сделано)
|
||||
|
||||
1. Подавлять ли повторный репорт пары на ре-сиде в авто-режиме (§4 п.7). Резать надо слияние, не схлопывание.
|
||||
2. Показывать роли существующую форму поверхности (§5а №2, якорная половина) — меняет запрос и деньги.
|
||||
3. Фильтровать кандидатов роли по банк-поверхностям (§5а №3) — снимает оплату за уже банкованные термины.
|
||||
4. Ставить пины на ТЕКСТЫ операторских сообщений (§5а №8) — сегодня их нет системно, и расширение правила сделало один из них ложным при полностью зелёной батарее.
|
||||
5. Довести разногласие до листа подписи и на форме сид-строки по умолчанию (§5а №7). Требует правила «заменённая строка движка против отброшенного предложения»; колонка `Source` его не даёт, потому что дельта владельца и авто-банк движка обе читаются `mined`. Это самая частая форма сид-строки, так что цена молчания не маргинальна.
|
||||
5. Запинить шов-близнец `Contradictions`/`Conf` (§5а №10) — десять строк рядом с существующим тестом, фикстура с кандидатом `Key != Src`. Мой собственный такой же шов ловился ТРИ круга подряд, и это единственная причина, по которой я его называю: цена дыры измерена на себе.
|
||||
6. Довести разногласие до листа подписи и на форме сид-строки по умолчанию (§5а №7). Требует правила «заменённая строка движка против отброшенного предложения»; колонка `Source` его не даёт, потому что дельта владельца и авто-банк движка обе читаются `mined`. Это самая частая форма сид-строки, так что цена молчания не маргинальна.
|
||||
|
||||
⚠ **ПИНГ ОРКЕСТРАТОРА 06.09 — мелочь, у которой не было носителя, и потому она здесь.** `backend/internal/bookfile/model.go:59` разросся до **183 знаков** — единственная строка длиннее 120 в файле; удлинил её текст комментария, заландженный `f1e9226`. Правка на строку, линтер молчит, срочности нет. **Записано потому, что моё решение «поправит зона при следующем касании» само носителя не имело, а следующего касания может не быть годами** — и это ровно тот класс, который смена 06.09 ловила пять раз (находка, живущая только в письме). Возьми при любом касании файла; отдельного захода не стоит.
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
| Бэкенд · СТРУКТУРА ГЛАВ | активного НЕТ | пак 1 «форматы и честный словарь» ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ и ЗАЛЕНДЕН 06.09 — акт **D39.210**, `2f65d1d`; промт в `archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md` с баннером исхода. ⚠ **ПАК 2 (лексиконы не-CJK, корпус, замер оракулом, валидаторы) — НЕ НАПИСАН и ждёт файлов владельца** (страта скрейпов); промта под него нет, брать нечего. Открытые следствия пака 1 — строки бэклога **302** (резка по якорям) и **303** (безъюнитная грамматика) |
|
||||
| Бэкенд · отозванный | активного НЕТ | пак КАЧЕСТВО написан и ОТОЗВАН до выдачи 05.09 (`archive/prompts/…_WITHDRAWN.md`): предмет дешевле пака — точность чекера уже измерена, пере-снять её стоит одной команды. Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), пишется |
|
||||
| Бэкенд · прежний | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) |
|
||||
| **Платформа · ДЕНЬГИ И ПРАВДА** | [PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md](PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md) | первая половина критерия впуска ДЕЛОМ: три мажора регистра (леджер — нижняя граница `PD-441` · окно гонки при освобождении заклинившего прогона `PD-424` — ⚠ ручка построена 04.09, остаток узкий · остаток видимости по `PD-438`) + вход не шире выдачи (325) вместе с решением владельца о fail fast (285) + свой прибор приёмки (305); пункт 0 — ТРИАЖ зонного журнала перед выносом. ⛔ **Строка 282 из пака СНЯТА 06.09** — платформенная половина построена (`character_count_exact`), остаток фронтовой, зона заморожена |
|
||||
| Платформа · ДЕНЬГИ И ПРАВДА | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.221**, контрактный минор **0.13.0**; промт в `archive/prompts/` с баннером исхода. ⚠ **Синхронный разрез приёма остановлен правилом остановки и заландён построенным, но НЕ готовым** — десять пунктов несёт строка бэклога **332**, и она же заказ следующему паку зоны; ложный инвариант бюджета заландён осознанно (окно 8 с при дефолте в 16 минутах) |
|
||||
| Платформа · ФОРМА ЗАКАЗА | активного НЕТ | пак ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ и ЗАЛЕНДЕН 06.09 — акт **D39.208**, код + канон **0.11.0**; промт уведён в `archive/prompts/ORDER_FORM_SESSION_PROMPT_2026-09-05.md` с баннером исхода. ⚠ **НЕ построено, хотя заказывалось:** денежный ползунок на проводе объявлен, а отправить его нечем, и оценки под ВЫБРАННЫЙ заказ нет; «упрощение резюма» не сделано — обе позиции живут строками бэклога, брать их как новый пак СЛЕДУЮЩЕЙ сессии, не читать промт как задание |
|
||||
| Платформа · прежний | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **294** (зеркало словаря под минор потока) ⚠ (строка 293 — зона ОРКЕСТРАТОРА, не платформы: правило игнора общее для всех рабочих деревьев клона) |
|
||||
| **Полигон · РЕМОНТ ПРИБОРА** | [POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md](POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md) | ⚠ **ИДЁТ ПЕРЕД любым следующим платным замером, включая продолжение фазы Д**: три эрраты носителей БАННЕРАМИ · гигиена стенда (300, 265) · линза против ИСХОДНИКА + порог различимости (319, 143). Санкции на платный замер НЕ несёт |
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Реестр D-нот — карта актуальности v2 (D1–D39.220; титул — носитель головы, бампать при каждом аппенде)
|
||||
# Реестр D-нот — карта актуальности v2 (D1–D39.221; титул — носитель головы, бампать при каждом аппенде)
|
||||
|
||||
> ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не
|
||||
> место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы,
|
||||
|
|
@ -279,3 +279,4 @@
|
|||
| D39.218 | 06.09 | **ЕДИНЫЙ БЭКЛОГ ВЫНЕСЕН В `docs/BACKLOG.md`** (решение владельца): таблица и бюллетень счёта перенесены побайтно, ID строк прежние, на месте — заголовок-указатель; `counts.py` и зонный хук переведены тем же коммитом. Замер формы: из 250 коммитов PROGRESS с 25.08 «только бэклог» 48 из 148 ⇒ ловушка «уношу чужое» снимается на 32 %, с бюллетенем 58 %; остаток — зонные секции, строка **328** | жив | ЖИВОЕ: строка 328 (зонные журналы бэкенда и полигона — на владельце); мутация «снять заголовок» гейтом НЕ ловится — п.5 | доки трекер гейт процесс |
|
||||
| D39.219 | 06.09 | **ТРЕКЕР ОСТАЁТСЯ ЕДИНЫМ** (решение владельца: «бэклог держим единый, так проще будет») — дробление по зонам отклонено; строка бэклога 328 (зонные журналы бэкенду и полигону) закрыта и снята. ⚠ Владелец отвечал про ТРЕКЕР, распространение довода на ОТЧЁТЫ сессий сделал оркестратор и сказал ему об этом | жив | ЖИВОЕ: ловушка «чужой отчёт в моём файле» остаётся на 42 % коммитов, лечение только процедурное | трекер доки процесс владелец |
|
||||
| D39.220 | 07.09 | **РОЛЬ ОРКЕСТРАТОРА = ТИМ-ЛИД** (слово владельца): направление · доки · лендинг · контроль сессий; инструменты — Fable, воркфлоу-ревью, панели. ⛔ Правило пары `D39.217` п.6а СМЯГЧЕНО с «окей на каждое изменение» до «обращаешься в ТРУДНЫЕ МОМЕНТЫ» — калибровка по цене; контролёр по-прежнему ОДИН и с контекстом | жив | ЖИВОЕ: признак подмены роли — очередь не сдвинулась за смену | роль процесс пара владелец |
|
||||
| D39.221 | 07.09 | **АКТ: платформенный пак «деньги и правда» ПРИНЯТ С ДОФИКСОМ** + минор **0.13.0** (четыре исхода `POST /v0/books`). Правило остановки сработало: 9 major из 11 в одном механизме, синхронный разрез заландён построенным, но НЕ готовым — десять пунктов, строка **332**. Дофикс: базис расчёта был ВЫВЕРНУТ на чистом завершении (предъявлено строкой леджера) · гейдж не запинен на экспозиции · гейт 305 пинил таргет, а не использование · рунбук против кода · комментарий объявлял полноту при трёх способах. Строки 285 · 305 · 325 закрыты | жив | ЖИВОЕ: строка 332; ложный инвариант бюджета заландён осознанно (окно 8 с, дефолт в 16 минутах) | лендинг платформа контракт минор приёмка |
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Журнал решений оркестратора — контракт D1–D39.220 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||||
# Журнал решений оркестратора — контракт D1–D39.221 (живой файл: карта · эрраты · живые тела · голова 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 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+).
|
||||
|
|
@ -2675,7 +2675,7 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО
|
|||
|
||||
**3. ⭐⭐ ГЛАВНОЕ ЗА СМЕНУ: ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО.** Первая редакция правки цитировала `httpapi.TestABooksCutProvenanceIsTheEnginesOwnWordOrAnExplicitNull` и иллюстрировала `null` книгой в статусе `not_started` — «fully uploaded, no manifest». Но `BookStatus` В ТОМ ЖЕ ДОКУМЕНТЕ говорит «`not_started` **cut**, never run». Пин при этом верен: он доказывает, что пустая колонка едет на провод как явный `null`. ⇒ **доказано ОТОБРАЖЕНИЕ, а сказано про ЖИЗНЬ; фикстура прочитана как продуктовое состояние.** ⚠ **Класс ловится НЕ тем вопросом, что предыдущие:** «чем это подпёрто?» здесь даёт честный ответ «пином», и проверяющий проходит мимо. **Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ».** Формулировка зоны, ратифицирую.
|
||||
|
||||
**4. Ответ пином, и ложной оказалась ИЛЛЮСТРАЦИЯ, а не словарь.** `FinishParse` переводит книгу `parsing → not_started` **и в той же транзакции взводит долг на дерево** (`platform/internal/pgstore/books.go:314`=`FinishParse records a parsed book`): провенанс приходит ПОЗЖЕ, когда материализатор долг оплатит, и окно «разрезана, провенанса нет» — устройство, а не гонка. Пин уровня ХРАНИЛИЩА заведён под этот вопрос: `pgstore.TestAParsedBookIsNotStartedBeforeItHasAnyProvenance` — прогоняет интейк и получает пару «`not_started` + пустой `structure`» от самой базы. ⇒ `not_started` говорит, что разрезан ИСХОДНИК, а не что прочитан манифест; обе строки канона верны. ⚠ К `null` ведут ещё две дороги, ни одна не про книгу в полёте: манифест СТАРШЕ поля и книга, заведённая из файла, уже лежащего на диске (`books.go:88`=`AddBook registers a book`). Канон держит два предмета раздельно: пин хранилища — про жизнь, пин провода — про отображение.
|
||||
**4. Ответ пином, и ложной оказалась ИЛЛЮСТРАЦИЯ, а не словарь.** `FinishParse` переводит книгу `parsing → not_started` **и в той же транзакции взводит долг на дерево** (`platform/internal/pgstore/books.go:343`=`FinishParse records a parsed book`): провенанс приходит ПОЗЖЕ, когда материализатор долг оплатит, и окно «разрезана, провенанса нет» — устройство, а не гонка. Пин уровня ХРАНИЛИЩА заведён под этот вопрос: `pgstore.TestAParsedBookIsNotStartedBeforeItHasAnyProvenance` — прогоняет интейк и получает пару «`not_started` + пустой `structure`» от самой базы. ⇒ `not_started` говорит, что разрезан ИСХОДНИК, а не что прочитан манифест; обе строки канона верны. ⚠ К `null` ведут ещё две дороги, ни одна не про книгу в полёте: манифест СТАРШЕ поля и книга, заведённая из файла, уже лежащего на диске (`books.go:88`=`AddBook registers a book`). Канон держит два предмета раздельно: пин хранилища — про жизнь, пин провода — про отображение.
|
||||
|
||||
**5. Базовая линия гейта алармов поднята 12 → 14, и это ЗАКОННО — проверено устройством, а не словом.** База есть ДЛИНА объявленного списка: гейт краснеет и на необъявленный новый ряд («add its id here in the same change and say why»), и на объявление, пережившее свою причину. ⇒ поднять её молча нельзя; зона назвала оба ряда с доводом там, где гейт этого требует. **Это исполнение инструкции гейта, а не его обезвреживание** — различение, без которого `D39.121` читается как запрет любой правки базовой линии.
|
||||
|
||||
|
|
@ -2811,3 +2811,42 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО
|
|||
|
||||
**4. Носитель.** Ролевой промт `docs/ORCHESTRATOR_SESSION_PROMPT.md` §«Кто ты» — там же признак подмены роли:
|
||||
смена прошла в правках якорей и ответах на письма, а очередь работ не сдвинулась.
|
||||
|
||||
## D39.221 — АКТ: ПЛАТФОРМЕННЫЙ ПАК «ДЕНЬГИ И ПРАВДА НА ЭКРАНЕ» ПРИНЯТ С ДОФИКСОМ; КОНТРАКТНЫЙ МИНОР 0.13.0 (07.09) ✅
|
||||
|
||||
**1. Принято.** Операторская половина `PD-441` (сеттлмент несёт базис, поверхности печатают `≥` там, где
|
||||
число — нижняя граница) · транзакционный арбитр `PD-424` (доказательство парой, миграция `00034`) ·
|
||||
видимость парковки `PD-438` · прибор приёмки зоны (строка 305) · протухший комментарий о собственной
|
||||
невозможности · триаж зонного журнала 5029 → 491 строк при `carriers.py` 0. Строки бэклога **285**, **305**,
|
||||
**325** закрыты и сняты. Ряды `PD-459`…`PD-465` заведены зоной.
|
||||
|
||||
**2. ⛔ ПРАВИЛО ОСТАНОВКИ СРАБОТАЛО, И ЭТО ИСХОД, А НЕ НЕЗАВЕРШЁННОСТЬ.** Девять major из одиннадцати легли
|
||||
в ОДИН механизм — синхронный разрез на приёме, — и каждая починка открывала новую площадь. Зона прекратила
|
||||
его чинить по решению оркестратора и вынесла **десять** незакрытых пунктов поимённо. Механизм ЗАЛЕНДЁН
|
||||
построенным, но не готовым; носитель — строка бэклога **332**, форма первого пункта: граница бюджета хвоста
|
||||
обязана ВЫВОДИТЬСЯ ИЗ кода пути, а не перечисляться руками (счёт выводили трижды и трижды неверно).
|
||||
|
||||
**3. Ложный инвариант заландён ОСОЗНАННО, с замеренной ценой.** Окно лжи — восемь секунд ширины (дедлайн
|
||||
`26m21s`–`26m29s`) при дефолте `10m0s`; попасть можно только выставив переменную вплотную к потолку гейта.
|
||||
Последствие — теряется ИДЕМПОТЕНТНОСТЬ (повтор «висящей» загрузки даёт вторую книгу), а не целостность.
|
||||
Достижимость худшего пути на реальном разрезе — **не измерено**, гейт живого движка на хосте не закрыт.
|
||||
|
||||
**4. Дофикс приёмки — пять пунктов, все закрыты.** Тяжелейший: **базис расчёта был ВЫВЕРНУТ на самом частом
|
||||
окончании** — `finish()` считал исход в локальную переменную и звал `settle` с до-финишным снапшотом, поэтому
|
||||
чисто завершённый прогон уезжал в леджер как оборванный. Предъявлено ИСПОЛНЕНИЕМ: строка леджера при
|
||||
`status="ready"` несла `note` «cut off mid-work». Пин утверждает на строке ЛЕДЖЕРА, а не на классификаторе.
|
||||
Плюс: гейдж парковки не был запинен на экспозиции · гейт 305 пинил ТАРГЕТ, а не его использование (откат к
|
||||
дефекту оставлял батарею зелёной) · рунбук оператора противоречил коду · комментарий `PD-424` объявлял
|
||||
исчерпывающие «два способа» при трёх (третий назван, ловля — `PD-465`, требует новой способности).
|
||||
|
||||
**5. Контрактный минор `0.12.0` → `0.13.0`.** Проза `201` у `createBook` описывает четыре исхода
|
||||
`POST /v0/books` после синхронного разреза: ≥2 глав → `201 not_started` с `character_count_exact: false` и
|
||||
без `structure` (интейк НЕ материализует читательскую поверхность) · 0 глав → `400 no_book` · 1 глава →
|
||||
`400 no_chapter_structure` (временно, снимается структурой глав для выдачи) · деплойный класс или таймаут →
|
||||
`201 parsing`, прежнее поведение. Новых `ErrorCode` нет: словарь `errors[].code` открыт. ⚠ Первая редакция
|
||||
дельты была ЛОЖНА (обещала поля при удавшейся материализации) и отозвана зоной С ПОМЕТКОЙ, а не заменена молча.
|
||||
|
||||
**6. Чем приёмка отличалась от чтения отчёта.** Три линзы: мнение по заказу и диффу БЕЗ чтения отчёта ·
|
||||
поиск дефектов ВНЕ карты отчёта · исполнение. Воспроизведены дословно пин денег (7 строк / 4919187 micro),
|
||||
обратимость `00034`, батарея 20/8/`EXIT=0`. Из девяти major три подтверждены исполнением, шесть — выводом по
|
||||
коду и помечены так; сквозные прогоны с Postgres лензам были недоступны, и это названо в их препятствиях.
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@
|
|||
батч 0.3.0 — D39.138, 16.08.2026, оркестратор №17;
|
||||
синк с платформой 0.4.0 — 20.08.2026, контрактная сессия; РАТИФИЦИРОВАН D39.152, 20.08.2026, оркестратор №18)
|
||||
|
||||
СТАТУС: РАТИФИЦИРОВАН как контракт API v0 по 0.10.0 включительно (D39.194; перечень миноров и их
|
||||
СТАТУС: РАТИФИЦИРОВАН как контракт API v0 по 0.13.0 включительно (0.11.0 — D39.208 · 0.12.0 — D39.211 · **0.13.0 — D39.221: четыре исхода `POST /v0/books` после синхронного разреза на приёме**; перечень миноров и их
|
||||
провенанс — ниже по файлу, здесь НЕ дублируется). Нормативная поверхность — openapi.yaml РЯДОМ.
|
||||
⚠ Зонная копия frontend/docs/api-contract/ ВРЕМЕННО ОТСТАЁТ (0.2.3 при каноне
|
||||
0.10.0 — ВОСЕМЬ миноров) — ратифицировано D39.142 п.5 на время фриза фронта; синк байт-в-байт + перегенерация типов =
|
||||
0.13.0 — ОДИННАДЦАТЬ миноров) — ратифицировано D39.142 п.5 на время фриза фронта; синк байт-в-байт + перегенерация типов =
|
||||
первое касание зоны при разморозке; после него правило прежнее: расхождение = дефект лендинга.
|
||||
Генерация типов фронта после этой ратификации идёт из ЭТОЙ копии.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ openapi: 3.1.0
|
|||
|
||||
info:
|
||||
title: TextMachine API
|
||||
version: 0.12.0
|
||||
version: 0.13.0
|
||||
summary: Ratified contract between the frontend and the TextMachine platform.
|
||||
description: |
|
||||
**RATIFIED contract.** Canonical copy: `docs/architecture/14-api-contract/`;
|
||||
|
|
@ -212,7 +212,25 @@ paths:
|
|||
**A part sent after the file is refused, never ignored**: `400`, `code: invalid_request`, with
|
||||
an `errors[]` entry naming it.
|
||||
|
||||
**The `201` carries `parsing`, not `uploading`** — it is written after the last byte lands.
|
||||
**The `201` is written after the last byte lands, and what it carries depends on whether the
|
||||
engine could cut the book inside the request** (0.13.0). Four outcomes:
|
||||
|
||||
- the engine cut **2 or more chapters** — `201` with `status: not_started`, `chapter_count`
|
||||
from the engine, `character_count` from the intake with `character_count_exact: false`.
|
||||
`structure` and an exact count arrive with a later revision of the library row: the intake
|
||||
does NOT materialize the reader surface, which costs two engine passes and would hold the
|
||||
uploader's request open;
|
||||
- the engine read the file and cut **0 chapters** — `400`, `code: invalid_request`, one
|
||||
`errors[]` entry with `pointer: /file` and `code: no_book`. Nothing is admitted: no library
|
||||
row, no directory;
|
||||
- the engine cut **exactly 1 chapter** — `400` the same way with `code: no_chapter_structure`.
|
||||
The delivery would hand the reader one undivided canvas, so the intake refuses what the
|
||||
export cannot serve. ⚠ Temporary: it lifts when chapter structure for delivery is built;
|
||||
- **the deployment cannot answer** (engine not configured, storage unmounted, project schema
|
||||
mismatched, parser unstartable) **or the in-request attempt runs out of budget** — `201`
|
||||
with `status: parsing`, the route's previous behaviour: the queue and the sweep finish it.
|
||||
A deployment fault never refuses the user's file.
|
||||
|
||||
`uploading` is observable only by a second read of the library while the upload is on the
|
||||
wire. `Location` names the book card. Parsing has no numeric progress; its END arrives on the
|
||||
book's event stream as an ordinary status change.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,247 @@
|
|||
> ⚠ **ОТРАБОТАН И ЗАКРЫТ. ИНСТРУКЦИИ ОТСЮДА НЕ ИСПОЛНЯТЬ.** Пак принят с дофиксом 07.09, акт — `D39.221`,
|
||||
> контрактный минор `0.13.0`. Исход: пять предметов приняты; **синхронный разрез (§4.3) остановлен правилом
|
||||
> остановки и заландён построенным, но НЕ готовым** — десять незакрытых пунктов живут строкой бэклога **332**
|
||||
> и зонным журналом. §4.2 (строка 282) был снят ДО выдачи: платформенная половина уже была построена.
|
||||
|
||||
# Промт: платформенная сессия «ДЕНЬГИ И ПРАВДА НА ЭКРАНЕ» — первая половина критерия впуска
|
||||
|
||||
## 1. Какая проблема и что решит твой результат
|
||||
|
||||
Проект готовится впустить **первого платящего чужого человека**. Критерия впуска в репозитории нет
|
||||
вовсе (строка бэклога **326**) — и этот пак пишет его первую половину **делом**, а не формулировкой.
|
||||
|
||||
Сегодня платформа врёт человеку деньгами и молчанием — три живых предмета (четвёртый снят проверкой промта, см. ниже):
|
||||
- **деньги считаются по нижней границе**: отменённые вызовы, УЖЕ ушедшие к провайдеру, не записываются
|
||||
никуда (`PD-441`, замер: три отменённых вызова прожили по две минуты с ценой `0`, соседние
|
||||
завершённые стоили $0.017 и $0.063);
|
||||
- **освобождение заклинившего прогона доказывается один раз и не транзакционно** (`PD-424`). ⚠ **Ряд
|
||||
длиной 6192 знака и правился трижды; ОБЕ прежние его беды закрыты** — «невидим» вылечен паком P12,
|
||||
**ручка `tmplatformctl run abandon` ПОСТРОЕНА 04.09** пакетом «закрыть цикл» (пины
|
||||
`platform/internal/runs/abandon_orphan_test.go`). ⛔ Первая редакция этого пака заказывала строить
|
||||
ручку — **заказ снят проверкой промта 06.09**. Остаток, ради которого ряд открыт, — **окно гонки**:
|
||||
отсутствие процесса доказывается ОДИН раз, в момент команды, а между этим ответом и коммитом
|
||||
транзакции юнит может подняться заново; закрыть это может только фактически транзакционная проба —
|
||||
**арбитр в хранилище, а не ещё одна проверка в CLI** (формулировка самого ряда). Окно узкое, цена
|
||||
названа в ряду. **Предмет — это окно; берёшь ли ты его в этот пак, решаешь сам и аргументируешь**;
|
||||
- **чужие события ложились на оплаченную попытку** — чужой потолок ставил `paused` живому оплаченному
|
||||
прогону, чужой `unit_done` писал главы, которых никто не покупал (`PD-438`). ⚠ **Сам дефект вылечен
|
||||
и заленджен 04.09** (чтение останавливается на чужом handshake'е); ряд держится `open` на остатке —
|
||||
видимости парковки для оператора, и прошлый пак отложил её СОЗНАТЕЛЬНО. **Сначала пере-сними статус
|
||||
остатка по ряду и коду, потом решай, что здесь вообще осталось делать** — вплоть до ответа «ничего,
|
||||
ряд закрывается актом»;
|
||||
⚠ **Четвёртый пункт — «экран врёт о единице» (строка 282) — ИЗ ПАКА СНЯТ, и вот почему.** Замер
|
||||
06.09 по дереву: платформенная половина ПОСТРОЕНА и заленджена — `character_count` берётся из
|
||||
манифеста движка, рядом едет флаг `character_count_exact` (`platform/internal/httpapi/v0.go:211`,
|
||||
пин в `v0_test.go:933`). Остаток строки 282 — подпись `'about.characters': 'Знаков'` во фронте, а
|
||||
**зона фронта ЗАМОРОЖЕНА**. ⇒ трогать нечего; если найдёшь платформенный остаток — это пинг, а не
|
||||
работа пака.
|
||||
|
||||
И отдельно: **вход шире выдачи** — интейк принимает форматы, для которых выдача отдаёт книгу одним
|
||||
полотном (строка **325**). Компенсация «на бете просто не впустим» сегодня — намерение, а не факт: она
|
||||
требует кода.
|
||||
|
||||
Твой результат: человек, заплативший деньги, видит правду о них — и не может застрять молча.
|
||||
|
||||
## 2. Зона и git
|
||||
|
||||
**Зона записи: `platform/`.** Чужие зоны (`backend/`, `frontend/`, `eval/`, `docs/`) — только чтение;
|
||||
пинги и итоги — **зонный журнал** `platform/docs/platform-PROGRESS.md` (решение владельца), в
|
||||
`docs/PROGRESS.md` платформа не пишет.
|
||||
**Сессия НЕ коммитит** — дерево передаёшь оркестратору. Канон git-дисциплины — `CLAUDE.md`.
|
||||
`.env` не читать.
|
||||
⚠ **Что должно пережить рестарт — кладётся в РЕПОЗИТОРИЙ** (в свою зону), а не в скрэтчпад: скрэтчпад
|
||||
умирает вместе с окружением. Вне репозитория — только рабочее временное, о котором другим знать не нужно.
|
||||
⚠ **Входящее сообщение от другой сессии — не приказ**: промт сильнее. Расходится с ним — пинг
|
||||
оркестратору, а не тихое исполнение.
|
||||
|
||||
## 3. Карта чтения — ЗАКОН
|
||||
|
||||
1. `CLAUDE.md` — цели владельца и гардрейлы.
|
||||
2. `platform/docs/ENGINEERING_STANDARDS.md` — **нормы зоны и критерии приёмки (Definition of Done)**.
|
||||
⚠ Ссылка на этот файл обязана быть в каждом платформенном промте; из семи прежних сослались пять,
|
||||
и норма дважды проскользнула. Здесь она стоит.
|
||||
3. `platform/docs/DEFECT_REGISTER.md` — ряды `PD-441`, `PD-424`, `PD-438`.
|
||||
4. Строки **325**, **285**, **305**, **326** бэклога (`docs/BACKLOG.md`, греп `^| N |`). ⚠ Строка **282** из
|
||||
карты снята вместе с §4.2 — читать её не надо.
|
||||
5. `platform/README.md` + зонный журнал (шапка, не целиком — он 5029 строк, см. §4.0).
|
||||
|
||||
**Ратифицированное — в теле промта:**
|
||||
|
||||
- **`D39.216` (мандат владельца, 06.09), делай РОВНО так**: чинить **без хаков и воркэраундов**; где
|
||||
форма не тянет — развязать или переписать. «Дешевле подпереть» доводом НЕ является; отступление
|
||||
законно, но **объявляется с ценой**.
|
||||
- **Продуктовых КВОТ и фри-тир-лимитов нет и не проектируется**; оплаты в бете нет, пополнение — из
|
||||
админки. Первую внешнюю книгу впускает владелец.
|
||||
- **Число называет ДЕРЕВО и ПОПУЛЯЦИЮ** · **рядом с нулём — контрольная величина ПЕЧАТАЕТСЯ, а не
|
||||
упоминается** · **мутация засчитывается по ТЕКСТУ сообщения, а не по факту красноты** (все три —
|
||||
`CLAUDE.md`, генезис — `D39.217` п.2).
|
||||
- **`D39.214`: «ЕСТЬ ПИН» ≠ «ПИН ДОКАЗЫВАЕТ СКАЗАННОЕ»** — цитируя зелёный тест в утверждении о
|
||||
ЗНАЧЕНИИ, спрашивай не «есть ли пин», а «что именно он утверждает». ⚠ Прежняя редакция этого промта
|
||||
приписывала ноте «комментарий не доказывает поведение» — **это не её текст**, испр. 06.09 по проверке
|
||||
промта.
|
||||
- **Тесты и гейты не подгонять под зелень** (`D39.121`, решает мотив).
|
||||
|
||||
## 4. Состав и разметка свободы
|
||||
|
||||
### 4.0 Триаж зонного журнала — **делай РОВНО так**, первым, до кода
|
||||
|
||||
Журнал вырос до **5029 строк / 42 секций**, и две новейшие занимают 40 %. ⭐ Конвенция слайсов у зоны **своя и уже
|
||||
работает**: в `platform/docs/archive/` лежат `platform-PROGRESS-P0-P3`, `-P4-P6`, `-P7`, `-P8`. Она остановилась.
|
||||
|
||||
⛔ **НО РЕЗАТЬ СРАЗУ НЕЛЬЗЯ, и вот замер, купленный 06.09.** Оркестратор проделал ту же операцию над
|
||||
`STACK_DECISIONS.md` и едва не уничтожил свод: секции «Что решено сессией P…» выглядят хроникой по заголовку, а
|
||||
внутри — **реестр из 36 сплошно нумерованных живых решений**. Ошибка была в том, что судили по ЗАГОЛОВКУ, не
|
||||
прочитав содержимое. ⇒ **в журнале сделай тот же тест ПРЕЖДЕ выноса.**
|
||||
|
||||
**Прибор — `docs/scripts/carriers.py`** (написан 06.09 ровно под этот заказ; в дереве, не в чьём-то скрэтчпаде):
|
||||
`python3 docs/scripts/carriers.py platform/docs/platform-PROGRESS.md --from N --to M`. Он находит ⛔/⚠⚠-утверждения,
|
||||
не ссылающиеся ни на ряд регистра, ни на строку бэклога, ни на D-ноту, ни на эрратту, и печатает рядом с числом
|
||||
**сколько строк осмотрено** — иначе ноль неотличим от «искал не там».
|
||||
|
||||
⚠ **Число называй ПРИБОРОМ, а не памятью.** На двух новейших секциях (3–2007) он даёт **55**; ручной проход
|
||||
контролёра давал **69**. Расхождение — в определении носителя, не в дереве: это ровно тот случай, из-за которого
|
||||
норма требует называть популяцию. Считай ЭТИМ скриптом и скажи, какой диапазон брал.
|
||||
|
||||
⛔ **И помни, что прибор отвечает на свой вопрос:** он не отличает правило от хроники и не судит о важности.
|
||||
Ноль означает «всё сослалось», а не «выносить безопасно» — читать всё равно надо.
|
||||
|
||||
**Приёмка §4.0:** проход печатает **ноль** утверждений без носителя · вынесено только то, что при чтении оказалось
|
||||
настоящей хроникой · всё, что оказалось правилом или незакрытой находкой, получило ряд регистра или строку бэклога
|
||||
ПЕРЕД выносом.
|
||||
|
||||
### 4.1 Три мажора — **делай РОВНО так** в предмете, **реши сам** в форме
|
||||
|
||||
`PD-441` · `PD-424` · `PD-438`. Все три — про **честность денег и чужого прогона**, но ⚠ **у двух из
|
||||
трёх заказанная беда УЖЕ вылечена, и открыт узкий остаток** (см. §1): у `PD-424` — окно гонки между
|
||||
пробой живости и коммитом, у `PD-438` — видимость парковки для оператора. ⛔ **Первым действием по
|
||||
каждому ряду пере-сними СТАТУС по ряду ЦЕЛИКОМ и по коду** — ряды длиной в тысячи знаков, и промт писан
|
||||
по ним же. Законный исход по любому из трёх: «здесь делать нечего, ряд закрывается актом». Форму
|
||||
лечения выбираешь ты; предмет не двигаешь.
|
||||
|
||||
⚠ **По `PD-441` выбор НЕ равносильный, и это надо знать до начала.** «Полная запись цены отменённого
|
||||
вызова» требует правки движка (`backend/internal/pipeline/stagerun.go` — сеттл оценки при отмене уже
|
||||
ушедшего вызова); это **ЧУЖАЯ зона**, ряд сам это и пишет. ⇒ из `platform/` достижима вторая половина:
|
||||
**объявить маржу и показать её пользователю**, чтобы леджер перестал молча притворяться точным. Движковую
|
||||
половину назови ПОИМЁННО в отчёте (что именно должен сделать движок) — это заказ следующему паку, и без
|
||||
твоей формулировки его придётся выводить заново.
|
||||
|
||||
### 4.2 СНЯТО ДО ВЫДАЧИ — строка 282 (экран о единице) — **не делай**
|
||||
|
||||
Пункт стоял в первой редакции пака и снят проверкой промта по дереву: платформенная половина уже
|
||||
построена (см. §1). Оставлен здесь НАМЕРЕННО, а не вычищен: снятый пункт с причиной дешевле, чем
|
||||
пункт, всплывший заново через неделю.
|
||||
|
||||
### 4.3 Вход не шире выдачи (строка 325) — **реши сам, аргументируй**
|
||||
|
||||
Пока структура глав для выдачи не построена (строка 283, чужая зона), интейк обязан **отказывать**
|
||||
форматам, чью выдачу мы не умеем, — с честной причиной человеку, а не молча. Границу и формулировку
|
||||
отказа выбираешь ты; **согласуй с тем, что выдача действительно умеет сегодня**, а не с планом.
|
||||
|
||||
⭐ **Та же дверь несёт РЕШЕНИЕ ВЛАДЕЛЬЦА 05.09, и брать его надо здесь же — строка 285.** Сегодня при
|
||||
загрузке проверяется только размер (`platform/internal/httpapi/middleware.go`, греп `LimitBody`), а
|
||||
понять, есть ли в файле книга, умеет лишь движок и лишь при разборе — то есть ПОСЛЕ приёма и записи, и
|
||||
на классе «источник нечитаем» интейк УДАЛЯЕТ загрузку. Владелец: «почему просто не fail fast, как это
|
||||
обычно принято». Механизм для этого есть и он $0 — `tmctl manifest` режет книгу и возвращает число
|
||||
юнитов без ключей и без единого платного вызова. **Предмет — делай РОВНО так; форму (где именно звать,
|
||||
что показывать человеку) решаешь сам.**
|
||||
|
||||
### 4.4 Два малых дока — **не трогай, это работа оркестратора**
|
||||
|
||||
`ENGINEERING_STANDARDS.md` и `PLATFORM_DIRECTION.md` прочитаны оркестратором 06.09 целиком: **оба живые, резать
|
||||
нечего**. `STACK_DECISIONS.md` тоже остаётся — ему добавлен указатель решений ПО ПРЕДМЕТУ (`8a9a9f4`), потому что
|
||||
ось «по сессии» заставляла искать правило перебором семи секций. ⚠ Если по ходу работы найдёшь в них утверждение,
|
||||
разошедшееся с кодом, — **пинг, не правка**: это зона оркестратора.
|
||||
|
||||
### 4.4а Твой собственный прибор приёмки врёт при таймауте (строка 305) — **делай РОВНО так**
|
||||
|
||||
`make check` зоны при таймауте пакета печатает заголовок `--- FAILURES ---` и НИЧЕГО под ним: оператор
|
||||
получает «check упал» без единого имени. Ты этим прибором будешь предъявлять свою же работу, поэтому
|
||||
чинится он здесь, а не «когда-нибудь». Проверь исполнением: искусственный таймаут обязан назвать пакет.
|
||||
|
||||
### 4.4б Протухший комментарий о собственной невозможности — **делай РОВНО так**
|
||||
|
||||
`platform/internal/books/books.go` (греп `THE FIX IS NOT IN THIS PACKAGE`) объясняет, почему число не
|
||||
берётся из манифеста: «нужен по-юнитный счёт знаков, которого манифест ещё не несёт (строка 278)».
|
||||
**Оба довода протухли:** строка 278 закрыта, число из манифеста уже берётся
|
||||
(`platform/internal/httpapi/project.go:38`). Комментарий, объясняющий отсутствие того, что построено, —
|
||||
ровно тот класс, ради которого этот пак и написан. Привести к поведению; проверить грепом по снятой
|
||||
формулировке.
|
||||
|
||||
### 4.5 Чего в паке НЕТ — **не делай**
|
||||
|
||||
Не строить структуру глав для выдачи (чужая зона) · не трогать движок · не менять контракт без пинга
|
||||
оркестратору · не заводить квоты и фри-тир · не открывать бету.
|
||||
|
||||
## 5. Мандат самопроверки ИСПОЛНЕНИЕМ — «перечитал сам» не считается
|
||||
|
||||
1. **Мутационная проверка каждого пина, который заводишь или трогаешь**: сломай охраняемое свойство,
|
||||
прогони, **прочитай ТЕКСТ падения** — говорит ли он про сломанное тобой; восстанови и **сверь
|
||||
sha256**. Артефакт: таблица «мутация → текст падения → хеш восстановлен».
|
||||
2. **Деньги — из СЫРОГО леджера ДВУМЯ независимыми путями** (норма приёмки проекта). Для `PD-441` это
|
||||
не формальность, а предмет: покажи расхождение до и после починки на реальных строках.
|
||||
3. **Опровергатель твоей готовой работы отдельным субагентом.** ⚠ Харнесс по умолчанию субагентов не
|
||||
спавнит — **тебе разрешено и требуется**. Модель задай ЯВНО (`fable`), одного-двух хватит. Мандат:
|
||||
«найди отсутствующее и противоречащее».
|
||||
4. **Греп по отозванной формулировке перед словом «исправлено»** — ноль либо только внутри пометки.
|
||||
5. **Интервальная самопроверка в длинной сессии**: примерно на середине работы — субагент против ЯВНЫХ
|
||||
критериев («вот заказ, вот сделанное — что расходится»), не «посмотри, всё ли хорошо».
|
||||
6. **Дифф тестов — ИСПОЛНЕНИЕМ, не памятью**: `git diff -- '*_test.go' | grep '^[-+]func Test'` (и то же
|
||||
по `func Fuzz`), число до и после. Удалённый тест объявляется отдельно и с причиной.
|
||||
7. **Перед отчётом сверь КАЖДЫЙ свой клейм с результатом инструмента ЭТОЙ сессии** — не с памятью о том,
|
||||
что ты делал час назад.
|
||||
|
||||
## 6. Оси ревью — характер «Код» и «Доки»
|
||||
|
||||
- **Код:** ⚠ «тест утверждает не то, что думает» — каждый пин обязан падать ИМЕННО от того, что он
|
||||
охраняет (§5.1).
|
||||
- **Доки:** сверка утверждений против кода и живых носителей — §4.0 и §4.4 ровно об этом.
|
||||
- **Деньги в любой приёмке — из сырого леджера двумя путями** (§5.2).
|
||||
|
||||
## 7. Записка-план ДО работы
|
||||
|
||||
≤15 строк оркестратору: что берёшь по каждому пункту · что считаешь спорным в самом заказе · как
|
||||
именно собираешься лечить `PD-441` (полная запись против объявленной маржи).
|
||||
|
||||
## 8. Заявление = команда
|
||||
|
||||
Числа и категорика — с командой и её выводом. `MAKE-EXIT` цитируй из лога, а не из кода возврата
|
||||
составной команды: смена 06.09 попалась на этом.
|
||||
|
||||
## 9. Эхо-протокол старта
|
||||
|
||||
≤10 строк ДО первой правки: **скоуп** (что берёшь) · **инварианты** (что обязано уцелеть) · **не-делать**
|
||||
(что в паке запрещено). ⛔ **Отправь их ПЕРВЫМ действием оркестратору** по адресу из
|
||||
`/tmp/textmachine-channel` (`SendMessage`) — эхо в собственный блокнот не эхо: разойтись с заказом ему
|
||||
негде. Канала нет — эхо идёт первой секцией отчёта, и это законно.
|
||||
|
||||
## 10. Что НЕ удалось — обязательная секция
|
||||
|
||||
Не проверено · не воспроизвелось · где данных не хватило. **«Не измерено» вместо догадки.**
|
||||
|
||||
## 11. Канал вопросов и право отказаться
|
||||
|
||||
Конфликт промта с кодом — **пинг, не правка**. **Право сказать «этого делать не надо»** с аргументом:
|
||||
если по коду окажется, что предмет описан мимо, это самый ценный ответ.
|
||||
|
||||
## 12. Прямой канал
|
||||
|
||||
`CLAUDE.md` §«Связь между сессиями»: `/tmp/textmachine-channel`, свой блок первым делом, живость —
|
||||
`ListAgents`. ⚠ Роли нет или файла нет — **нормальный случай**: вопрос секцией в отчёт, сессии подряд
|
||||
не опрашивать.
|
||||
|
||||
## Деньги
|
||||
|
||||
Пак — **$0 по платным вызовам к моделям**: всё лечится на стенде и фикстурах. ⛔ Если упрёшься в «это
|
||||
предъявляется только платным прогоном» — **пинг оркестратору за санкцией, не твоё решение**. Стенд
|
||||
поднимается по рецепту в `STACK_DECISIONS.md`.
|
||||
|
||||
## Отчёт
|
||||
|
||||
Зонный журнал + сообщение оркестратору: что построено · чем предъявлено (команда и вывод) · таблица
|
||||
мутаций §5.1 · два независимых пути по деньгам §5.2 · **проход §4.0 с нулём находок без носителя** ·
|
||||
что сказал опровергатель и что ты с этим сделал · секция §10 · **что ты сам считаешь слабым местом
|
||||
своей работы**.
|
||||
|
||||
⚠ Числа снимай **после последней правки**, не до. Правки якорей объявляй наравне с содержательными.
|
||||
⛔ **Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.** Отчёт
|
||||
описывает СДЕЛАННОЕ; «дальше надо бы…» живёт отдельной секцией «предложения», и оркестратор решает сам.
|
||||
Loading…
Add table
Reference in a new issue