ЕЭСК: бинд-параметр в SQL-комментарии молча ронял все 71 UPDATE две недели #3317

Merged
lekss361 merged 2 commits from fix/eesk-bind-in-comment into main 2026-09-09 22:05:39 +00:00
Collaborator

Из армейского аудита 01-02.09, линза ptica-workers. Скептик воспроизвёл на проде.

Дефект — идеальный шторм из трёх наших же паттернов

Комментарий #2464-B, объясняющий, почему из UPDATE убрали :load_pct, сам содержал CAST(:load_pct AS text). SQLAlchemy text() парсит бинд-параметры и внутри SQL-комментариев — снятый параметр стал обязательным, params его не содержит, каждая строка батча падала на компиляции.

Дальше сработала цепочка:

  • per-row SAVEPOINT-except (наш же правильный паттерн!) глотал падение как «битую строку»;
  • задача завершалась doneрезервы ПС 35-220 не обновлялись с 18.08, все 71 строки каждого прогона;
  • freshness этого не видел: задача-то зелёная. Классика «провал пишет тот же признак».

Правка

Комментарий переписан без упоминания параметра в живом синтаксисе бинда + предупреждение будущему редактору, почему здесь так нельзя.

Сторож — на механизм, не на случай

Тест достаёт text()-стейтмент из исходника и сверяет его бинд-имена с ключами params. БД не нужна: дефект живёт на этапе компиляции.

Фальсификация: возврат :load_pct в комментарий → красное по значению («стейтмент требует биндов ['load_pct']»).

После деплоя

Ближайший прогон лоадера должен дать updated > 0 (последние две недели — стабильный ноль при зелёном статусе). Проверю по факту.

Из армейского аудита 01-02.09, линза ptica-workers. Скептик воспроизвёл на проде. ## Дефект — идеальный шторм из трёх наших же паттернов Комментарий #2464-B, объясняющий, **почему из UPDATE убрали** `:load_pct`, сам содержал `CAST(:load_pct AS text)`. SQLAlchemy `text()` парсит бинд-параметры **и внутри SQL-комментариев** — снятый параметр стал обязательным, `params` его не содержит, каждая строка батча падала на компиляции. Дальше сработала цепочка: - per-row `SAVEPOINT`-except (наш же правильный паттерн!) глотал падение как «битую строку»; - задача завершалась `done` — **резервы ПС 35-220 не обновлялись с 18.08**, все 71 строки каждого прогона; - freshness этого не видел: задача-то зелёная. Классика «провал пишет тот же признак». ## Правка Комментарий переписан без упоминания параметра в живом синтаксисе бинда + предупреждение будущему редактору, почему здесь так нельзя. ## Сторож — на механизм, не на случай Тест достаёт `text()`-стейтмент из исходника и сверяет его бинд-имена с ключами `params`. БД не нужна: дефект живёт на этапе компиляции. Фальсификация: возврат `:load_pct` в комментарий → красное по значению («стейтмент требует биндов ['load_pct']»). ## После деплоя Ближайший прогон лоадера должен дать `updated > 0` (последние две недели — стабильный ноль при зелёном статусе). Проверю по факту.
bot-backend added 1 commit 2026-09-02 06:53:34 +00:00
ЕЭСК-лоадер: бинд-параметр в SQL-комментарии ронял все 71 UPDATE с 18.08
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m1s
CI / backend-tests (pull_request) Successful in 17m30s
a9de9bedf6
Комментарий #2464-B, объясняющий, почему из UPDATE убрали :load_pct, сам
содержал «CAST(:load_pct AS text)» — а SQLAlchemy text() парсит бинды и
внутри SQL-комментариев. Параметр стал обязательным, params его не содержит,
КАЖДАЯ строка батча падала на компиляции, per-row SAVEPOINT-except глотал
это как «битую строку», задача оставалась зелёной. Резервы ПС 35-220 не
обновлялись две недели, и никакой сторож этого не видел.

Найдено армейским аудитом 01-02.09 (линза ptica-workers), подтверждено
скептиком воспроизведением на проде.

Правка — переписан комментарий БЕЗ упоминания снятого параметра в живом
синтаксисе бинда, с предупреждением, почему это запрещено.

Сторож на МЕХАНИЗМ: тест собирает text()-стейтмент из исходника и сверяет
его бинд-имена с ключами params. БД не нужна — дефект живёт на компиляции.
Фальсификация: возврат «:load_pct» в комментарий даёт красное по значению
(«стейтмент требует биндов ['load_pct']»).
bot-backend added 1 commit 2026-09-09 21:47:09 +00:00
Merge branch 'main' into fix/eesk-bind-in-comment
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 11s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 14s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m24s
CI / backend-tests (pull_request) Successful in 17m40s
6eb1441508
lekss361 merged commit 455766dcc4 into main 2026-09-09 22:05:39 +00:00
lekss361 deleted branch fix/eesk-bind-in-comment 2026-09-09 22:05:40 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3317
No description provided.