diff --git a/docs/architecture/14-api-contract/README.md b/docs/architecture/14-api-contract/README.md index 6a85cdc8..c14e9313 100644 --- a/docs/architecture/14-api-contract/README.md +++ b/docs/architecture/14-api-contract/README.md @@ -357,7 +357,7 @@ drop юнит несёт причину ПЕРВОГО выпавшего чле ### 2.9. Подпись — набор решений — ✓ выведено -Конвейер заменяет банк целиком (`store/migrate.go:169-170`), поэтому `PATCH /term/{id}` молча не +Конвейер заменяет банк целиком (`store/migrate.go:169-170`=`aggregation/classification live in the pipeline`), поэтому `PATCH /term/{id}` молча не работает. Механика дословно: «for EACH term either promote it into the mined-delta file OR decline it in the mined-rejects file, then resume» (`backend/internal/pipeline/mining.go:58`=`func (r *Runner) runBankMiningStop` — ⚠ испр. 16.09: было :81,243; ⚠ фраза «the stop clears once every proposed term is promoted or rejected» ОПРОКИНУТА D39.144 — движок авто-продолжает с @@ -1087,7 +1087,7 @@ $1.6, спишем по факту», и закрытие после прого | `DELETE /books/{id}`, `GET /runs/{id}` | колонки есть | НЕ ПОСТРОЕНО (заведено 0.3.0) — роутер монтирует **19 операций из 21** ⚠ (испр. 05.09: `PATCH /books/{id}` СМОНТИРОВАН платформенным паком `7e2226a`, акт D39.201; счёт 18→19) (испр. 05.09: дверь выдачи построена `adf5e53`, прежнее «15 из 20» протухло) | ⚠ носитель «вход P7» ИЗРАСХОДОВАН (пак P7 принят D39.153); живой носитель — `platform/BACKLOG.md` П-17 и очередь CURRENT-STATE | | `GET /books/{id}/chapters`, `/units` | материализация манифеста | **ПОСТРОЕНО P7** — `httpapi/reading.go`, материализатор `internal/readmodel` | закрыто D39.153 | | `GET /books/{id}/notes` | `unit_done` несёт флаг и причину (`runevents.go:126-135`), платформа хранит (`sink.go:227-233`), колонка `notes.reason` заведена под это | канал ЕСТЬ; не хватает карты «причина → код → фраза» (приложение А) и проекции | приложение А + ⚠ носитель «вход P7» ИЗРАСХОДОВАН (D39.153) | -| `GET /books/{id}/bank` | движок пишет сайдкар всего банка (`pipeline/bankexport.go:16-33,72`, D39.122) | ⚠ пере-снято 0.5.0: проекция платформы ПОСТРОЕНА (P7 — маршрут в `contractSurface`, `wireBankPage` в `httpapi/reading.go`, `SaveBank` в `pgstore`); форма синхронна канону с лендингом P9: счётчики `pending_decisions`/`complete` сняты с проекции (`PD-399`) | закрыто D39.162 | +| `GET /books/{id}/bank` | движок пишет сайдкар всего банка (`pipeline/bankexport.go:16-33,72`=`the bank lives in the engine`, D39.122) | ⚠ пере-снято 0.5.0: проекция платформы ПОСТРОЕНА (P7 — маршрут в `contractSurface`, `wireBankPage` в `httpapi/reading.go`, `SaveBank` в `pgstore`); форма синхронна канону с лендингом P9: счётчики `pending_decisions`/`complete` сняты с проекции (`PD-399`) | закрыто D39.162 | | ~~`POST /bank/decisions`~~ | стоп-механика майнера | ⚠ **НЕ «не построено», а ОТМЕНЕНО**: было построено P7 и СНЯТО 22.08 вместе с пер-термной моделью подписи (D39.144, слово владельца). **0.5.0 снёс и канон-половину — `PD-370` закрыт этим минором**; преемник — строка `POST …/bank/corrections` ниже | отменено D39.144; снесено 0.5.0 | | `POST /books/{bookId}/bank/corrections` | `tmctl bank-apply` — движковая половина ПОСТРОЕНА (D39.158, лендинг `d1eb8a9`) | **ПОСТРОЕНО пакетом P9**: перевод словаря (`platform/internal/ingest/bankdecisions.go`), спавн глагола (`runner/bankapply.go`), раскладка отказов и пер-книжная сериализация (`runs/bank.go`), дверь синхронная. Флаг `bank_corrections_enabled` следует включённости прогонов (`cmd/tmplatformd/runner.go:195`) — дверь спавнит тот же глагол | закрыто D39.162 | | `GET /books/{id}/events` (SSE) | эмиттер шва построен (D39.131) | **ПОСТРОЕНО P7** — `httpapi/stream.go`, поток регистрируется ВНЕ слоя сжатия (сжатие буферизует поток — единственное, что канон запрещает этому маршруту) | закрыто D39.153 | @@ -1335,7 +1335,7 @@ focus»), то есть цена платится на горячем пути код платформы: настройка живёт в артефакте деплоя, и вернуться она может без единой правки Go. 2. **Предложенная форма неверна по СМЫСЛУ, даже если бы случай был.** «Лечится покупкой / не лечится» — булево, а суточный потолок это ОКНО: он снимается сам в полночь UTC - (`store/ledger.go:60-72`, `todayUTC()`). Клиент, прочитавший «не лечится», спрячет кнопку + (`backend/internal/store/ledger.go:60-72`=`ReserveDeniedBook`, `todayUTC()`). Клиент, прочитавший «не лечится», спрячет кнопку навсегда там, где честный ответ — «не сейчас». Булево, у которого один из двух исходов врёт, хуже, чем отсутствие поля. 3. **Второе значение enum — та же проблема плюс своя:** оно называет настройку чужого файла на @@ -1361,8 +1361,8 @@ focus»), то есть цена платится на горячем пути ### G. Draft-only конвейер (PD-202) — ОТВЕЧАЮ: ДА, начерновленная глава «сделана»; правлю канон Проверено чтением обеих зон, и цена выше заявленной. У движка деплой без второго прохода — не -экзотика: разбиение выводится из РОЛЕЙ стадий (`pipeline/waverun.go:43-53`), конфиг требует лишь -«хотя бы одна стадия» (`config/pipeline.go:841`), ветка живая и покрыта тестом +экзотика: разбиение выводится из РОЛЕЙ стадий (`pipeline/waverun.go:43-53`=`non-translator (editor/other) stage`), конфиг требует лишь +«хотя бы одна стадия» (`backend/internal/config/pipeline.go:926`=`at least one stage is required` — ⚠ испр. 16.09: было :841), ветка живая и покрыта тестом (`contractblockers_test.go:115-136`); в репозитории такого конфига пока нет, но выбирает его оператор, и платформа шаблон не читает. У платформы `units_done` — жёстко второй проход (`pgstore/sink.go:252-263`, `readmodel.go:200-208`). @@ -1390,7 +1390,7 @@ focus»), то есть цена платится на горячем пути ### H. Снятие замечания (PD-298) — СВЕРЕНО С ДВИЖКОМ ПЕРВЫМ, как просила зона; механизма НЕ строим Порядок соблюдён: сначала чтение движка. Результат — **переход достижим у драйвера и НЕ достижим на -проводе**. `flagged` вычисляется на каждой эмиссии, а не хранится (`pipeline/events.go:351,377-379`, +проводе**. `flagged` вычисляется на каждой эмиссии, а не хранится (`backend/internal/pipeline/events.go:382`=`func (e *emitter) unitResolved` — ⚠ испр. 16.09: было :351,377-379, `waverun.go:139-140,205-206`), и `redrive`/`--resnapshot`/правка исходника пере-атакуют юнит, так что второе разрешение законно может выйти `flagged=false`. Но эмиссия идёт через announce-once-леджер: ключ `unit::::` не несёт ни снапшота, ни прогона