[Fable 5][P3] objective_sync_config.get_config: голый except Exception: pass на seed-INSERT — запрещённый паттерн, сессия остаётся в aborted-состоянии #1226

Closed
opened 2026-06-13 04:49:46 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (correctness), confidence 0.7.

Файл

backend/app/services/objective_sync_config.py:102

Evidence (цитата кода)

try:
            db.execute(
                text("INSERT INTO objective_sync_config (id) VALUES (1) ON CONFLICT DO NOTHING")
            )
            db.commit()
        except Exception:
            pass

Why bug

Прямое нарушение backend.md («except Exception: pass без re-raise/logger.exception = баг»): сбой посева конфиг-строки немой. Хуже: при ошибке INSERT/commit нет db.rollback() — сессия остаётся в «current transaction is aborted», и вызывающий код (admin GET/PUT config, Celery sync_all_groups), продолжающий работать с той же сессией, получит InFailedSqlTransaction на любом следующем запросе вместо исходной причины.

Suggested fix

except Exception as e: logger.warning("seed objective_sync_config failed: %s", e); db.rollback() перед возвратом _defaults_from_settings().

Verify notes

  • [real/P3] Стр.97-103: литеральный except Exception: pass без logger/re-raise в backend/app — по backend.md это баг. Сценарий: строки id=1 нет + INSERT падает (read-only реплика/нет привилегии/обрыв) → сбой посева вечно нем, в отличие от соседнего except (стр.91-92, logger.warning). Эскалация InFailedSqlTransaction опровергнута трассировкой: все 3 вызывающих места (admin_scrape:575, scrape_objective:443-447, get_cron_schedule_safe) закрывают сессию сразу после get_config, запросов после нет. P3 честно.
  • [real/P3] Голый except Exception: pass реально есть (стр. 102-103) — прямой запрет backend.md, сосед-except в той же функции логирует. Но эскалация опровергнута: все 3 вызывающих места не переиспользуют сессию после get_config (admin GET сразу return; sync_all_groups — одноразовый SessionLocal, close в finally; get_cron_schedule_safe — своя сессия), InFailedSqlTransaction не наступает; миграция 72 сеет id=1, ветка почти мертва на проде. Остаётся немой сбой посева = P3.

Provenance

  • Finders: services-misc
  • Confidence: 0.7
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (correctness), confidence 0.7. ## Файл [`backend/app/services/objective_sync_config.py:102`](backend/app/services/objective_sync_config.py:102) ## Evidence (цитата кода) ``` try: db.execute( text("INSERT INTO objective_sync_config (id) VALUES (1) ON CONFLICT DO NOTHING") ) db.commit() except Exception: pass ``` ## Why bug Прямое нарушение backend.md («except Exception: pass без re-raise/logger.exception = баг»): сбой посева конфиг-строки немой. Хуже: при ошибке INSERT/commit нет db.rollback() — сессия остаётся в «current transaction is aborted», и вызывающий код (admin GET/PUT config, Celery sync_all_groups), продолжающий работать с той же сессией, получит InFailedSqlTransaction на любом следующем запросе вместо исходной причины. ## Suggested fix except Exception as e: logger.warning("seed objective_sync_config failed: %s", e); db.rollback() перед возвратом _defaults_from_settings(). ## Verify notes - [real/P3] Стр.97-103: литеральный except Exception: pass без logger/re-raise в backend/app — по backend.md это баг. Сценарий: строки id=1 нет + INSERT падает (read-only реплика/нет привилегии/обрыв) → сбой посева вечно нем, в отличие от соседнего except (стр.91-92, logger.warning). Эскалация InFailedSqlTransaction опровергнута трассировкой: все 3 вызывающих места (admin_scrape:575, scrape_objective:443-447, get_cron_schedule_safe) закрывают сессию сразу после get_config, запросов после нет. P3 честно. - [real/P3] Голый except Exception: pass реально есть (стр. 102-103) — прямой запрет backend.md, сосед-except в той же функции логирует. Но эскалация опровергнута: все 3 вызывающих места не переиспользуют сессию после get_config (admin GET сразу return; sync_all_groups — одноразовый SessionLocal, close в finally; get_cron_schedule_safe — своя сессия), InFailedSqlTransaction не наступает; миграция 72 сеет id=1, ветка почти мертва на проде. Остаётся немой сбой посева = P3. ## Provenance - Finders: `services-misc` - Confidence: 0.7 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:46 +00:00
Sign in to join this conversation.
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#1226
No description provided.