Prove the OpenAPI codegen verdict by execution: generator handles the ratified 3.1 contract, but ignores conditional requirements, so the database constraint is the sole enforcer

This commit is contained in:
heaven 2026-08-05 00:18:13 +03:00
parent 99c9cb0ad5
commit f6eda8b473

View file

@ -99,10 +99,24 @@ merchant-of-record, шорт-лист **Paddle vs Stripe Managed Payments** —
| Добавление | Пин | Статус |
|---|---|---|
| OIDC-вход | x/oauth2 v0.36.0 + go-oidc/v3 v3.20.0 | ратифицировано (§1) |
| Кодоген сервера из ратифицированной спеки OpenAPI 3.1 | `oapi-codegen/v2` v2.8.0 (17.07.2026) | **ратифицирован ПОРЯДОК, не выбор**: его поддержка 3.1 свежая ⇒ сперва доказательство ИСПОЛНЕНИЕМ на нашем файле 983 строк, вердикт после. Фолбэк — overlay 3.1→3.0, НЕ ogen (тянет otel-подграф) |
| Кодоген сервера из ратифицированной спеки OpenAPI 3.1 | `oapi-codegen/v2` v2.8.0 (17.07.2026) | **ВЗЯТЬ — доказано исполнением 05.08** (ниже); фолбэк overlay 3.1→3.0 не понадобился |
| `sqlc` для денежных/квотных таблиц | v1.31.1 | взять ДО того, как эти таблицы появятся: компиляционная проверка SQL на денежных путях, рантайм-зависимостей ноль |
| `golang.org/x/time/rate` | v0.15.0 | лимиты в процессе; долговечные пер-пользовательские — в Postgres |
**Доказательство исполнением по кодогену (05.08, $0, вне репозитория):** `oapi-codegen` v2.8.0 в
режиме `std-http-server` + `strict-server` на ратифицированной копии `openapi.yaml` (983 строки,
`openapi: 3.1.0`) — **exit 0, 2981 строка, `go build` чистый**; рантайм-граф прирастает одним
модулем (`oapi-codegen/runtime`, транзитивно uuid + go-jsonmerge), роутер не тянется — совместимо с
пином stdlib. Две проверки конструкций 3.1, на которых спотыкался генератор типов фронта:
✅ нулевой `kind` сгенерирован ПРАВИЛЬНО — `Kind *TermKind \`json:"kind"\`` без `omitempty`, то есть
«поле присутствует всегда, значение может быть `null`», ровно правило контракта §2.8;
**условие `if action=promote → dst` НЕ исполняется генерированным кодом** (`Dst *string
\`json:"dst,omitempty"\``) — та же слепота к 3.1-условиям, что у `openapi-typescript` (К-11).
Следствие, которое обязана знать каждая следующая сессия: **констрейнт БД
`bank_decisions_promote_has_dst` — ЕДИНСТВЕННЫЙ исполнитель этого правила на сервере**, не
подстраховка; удалять или ослаблять его нельзя, а любое новое условное требование спеки обязано
получить носителя в схеме или явную проверку в хендлере.
**Оставляем как есть:** stdlib-роутинг (1.22+ закрыл разрыв; `Request.Pattern`с 1.23),
pgx без ORM, goose библиотекой, River (в `go.mod` не заводить, пока не подключён), «никакого Redis»,
опаковые серверные сессии (OIDC их НЕ заменяет), stdlib-CSRF, slog, свой RFC 9457 problem+json,