Re-derive the contract companion's build-status table against the code: six surfaces it called unbuilt have shipped, and one it called pending was cancelled

This commit is contained in:
Claude (backend session) 2026-08-22 18:53:14 +03:00
parent d5e507c0a1
commit d5097cb36f
3 changed files with 11 additions and 9 deletions

File diff suppressed because one or more lines are too long

View file

@ -664,16 +664,18 @@ the original request was never applied». Каждый `POST /books` созда
| `POST /runs/{id}/stop` | реконсилятор | ПОСТРОЕНО (кнопки на экране нет) | зона фронта |
| `POST /runs/{id}/resume` | реконсилятор | ПОСТРОЕНО, но **0.3.0 сменил поведение на паузе по потолку, а 0.4.0 — на ИСЧЕРПАННОМ прогоне**. Пауза: платформа уже отвечает `409` `ceiling_reached` (`runs/reconcile.go`, ветка `case "paused"` в `Resume`) — совпало. Исчерпанность: платформа отвечает `202` и возвращает прогон в то же состояние (`reconcile.go`, оба выхода `exhausted` из `reopen` → ветка `exhausted` в `Resume``httpapi/v0.go`, хендлер `resumeRun`), а контракт теперь требует `409` `run_not_resumable` · `cause.code: ceiling_reached`. Молчаливый `202` на действие, которое ничего не сделало, — ровно то, от чего предупреждает собственный комментарий платформы; клиенту нечем отличить успех от no-op, а на `awaiting_bank` это ещё и не вызывает `ReleaseBankStop`. Полная таблица по статусам — в описании `resumeRun` | **вход P7** (правка построенного пути, не только читающей поверхности) |
| `GET /usage` | кредиты | ПОСТРОЕНО, **не читается ни одним экраном** | зона фронта |
| `GET /capabilities` | конфигурация деплоя | НЕ ПОСТРОЕНО (заведено 0.3.0) | вход P7 |
> ⚠ **ТАБЛИЦА ПЕРЕ-СНЯТА ПРОТИВ КОДА 22.08 (оркестратор №18, аудит доков): шесть строк объявляли НЕ ПОСТРОЕННЫМ то, что пак P7 построил, а P8 сохранил.** Правило §Б-21 требует вести здесь статус построенного — оно нарушалось пятый раз подряд, потому что носитель «вход P7» никто не гасил при лендинге. Носитель израсходован: пак P7 принят D39.153, пак P8-FIX — D39.154.
| `GET /capabilities` | конфигурация деплоя | **ПОСТРОЕНО P7** — маршрут смонтирован безусловно (`platform/internal/httpapi/v0.go`, таблица `contractSurface`), хендлер `capabilities.go`; версия контракта запинена ГЕЙТОМ против ЭТОГО канона (`platform/internal/gates/contract_test.go`) | закрыто D39.153 |
| `PATCH`/`DELETE /books/{id}`, `GET /runs/{id}` | колонки есть | НЕ ПОСТРОЕНО (заведено 0.3.0) | вход P7 |
| `GET /books/{id}/chapters`, `/units` | материализация манифеста | НЕ ПОСТРОЕНО | вход P7 |
| `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 |
| `GET /books/{id}/bank` | движок пишет сайдкар всего банка (`pipeline/bankexport.go:16-33,72`, D39.122) | движковая половина ПОСТРОЕНА; не хватает проекции платформы | строка 169 · вход P7 |
| `POST /bank/decisions` | стоп-механика майнера | НЕ ПОСТРОЕНО | вход P7 |
| `GET /books/{id}/events` (SSE) | эмиттер шва построен (D39.131) | на платформе SSE нет ни строкой | вход P7 |
| ~~`POST /bank/decisions`~~ | стоп-механика майнера | ⚠ **НЕ «не построено», а ОТМЕНЕНО**: было построено P7 и СНЯТО 22.08 вместе с пер-термной моделью подписи (D39.144, слово владельца). Канон путь ещё держит — это `PD-370` и строка бэклога **206**, ломающий минор 0.5.0 | отменено D39.144 |
| `GET /books/{id}/events` (SSE) | эмиттер шва построен (D39.131) | **ПОСТРОЕНО P7**`httpapi/stream.go`, поток регистрируется ВНЕ слоя сжатия (сжатие буферизует поток — единственное, что канон запрещает этому маршруту) | закрыто D39.153 |
| `POST`/`GET /exports` | у движка только stdout-JSON и `--plaintext` (`cmd/tmctl/invocation.go:107`) | НЕ ПОСТРОЕНО с обеих сторон | строка 49 / D29.1 «tmctl export-контракт» |
| Условные чтения (`ETag`/304), сжатие | — | НЕ ПОСТРОЕНО | строка 186 |
| `Idempotency-Key` | — | НЕ ПОСТРОЕНО (семантика задана 0.3.0) | вход P7 |
| Условные чтения (`ETag`/304), сжатие | — | **ПОСТРОЕНО P7**`httpapi/conditional.go`; валидатор считается от БАЙТ ответа. Остаток строки 186 — шаги 35 (скоуп кадра, дельта-чтение, `staleTime`) | шаги 12 закрыты D39.153 |
| `Idempotency-Key` | — | **ПОСТРОЕНО P7**`httpapi/idempotency.go` + `pgstore/idempotency.go`, на двух создающих вызовах; ⚠ живой дефект под конкуренцией — `PD-369` | закрыто D39.153 |
| `bearerToken` — чем ВЫДАЁТСЯ токен | вход только ставит HttpOnly-куку (`login.go:338`) | сервер токен ПРИНИМАЕТ, выдать его нечем | носитель: research/28 §2 (Б-15); строки нет |
| `Problem.localized` | — | объявлено, ни одним кодом не используется | носитель: research/28 §8 п.4 |
| `Note.code` как enum спеки | карта приложения А | не enum, пока не написаны фразы | строка 148 (фразы владельца) |

View file

@ -39,7 +39,7 @@
## 2. Зона и git
Пишешь только в `platform/`. Отчёт и вопросы — `platform/docs/platform-PROGRESS.md`; строки находок — `platform/docs/DEFECT_REGISTER.md` (это твой файл). **Ты не коммитишь** — лендит оркестратор (канон — `CLAUDE.md`, таблица зон). Чужие зоны read-only; живой полигон (`eval/`, `docs/experiments/`) не трогать; `.env` не читать; git не трогать вовсе — ни `add`, ни `commit`, ни `reset`/`checkout`/`restore`/`clean`/`stash`/`rebase`/`push`/`merge`/`switch`/`rm`/`mv`; файлы застейдженными не оставлять. ⚠ В дереве живёт незакоммиченная и частично ЗАСТЕЙДЖЕННАЯ работа полигона — не трогать и не «прибирать».
Пишешь только в `platform/`. Отчёт и вопросы — `platform/docs/platform-PROGRESS.md`; строки находок — `platform/docs/DEFECT_REGISTER.md` (это твой файл). **Ты не коммитишь** — лендит оркестратор (канон — `CLAUDE.md`, таблица зон). Чужие зоны read-only; живой полигон (`eval/`, `docs/experiments/`) не трогать; `.env` не читать; git не трогать вовсе — ни `add`, ни `commit`, ни `reset`/`checkout`/`restore`/`clean`/`stash`/`rebase`/`push`/`merge`/`switch`/`rm`/`mv`; файлы застейдженными не оставлять. ⚠ В дереве живёт НЕЗАКОММИЧЕННАЯ работа полигона (13 изменённых файлов и 6 новых под `eval/`) — не трогать и не «прибирать». Индекс на 22.08 чист (прежняя редакция писала «частично застейдженная» — испр.), но полигон-сессия жива и стейдж может появиться в любой момент.
**⚠ РОВНО: кода не менять.** Ни одной правки `.go`, ни «заодно поправил очевидное». Причина не бюрократическая: правка, внесённая тем же, кто нашёл, лишает следующий пак независимой проверки, а тебя — чистого измерения «сколько тут дефектов». Исключение одно — временные правки в КОПИИ дерева ради посадки мутаций (см. §5), в репозиторий они не возвращаются.