fix(site-finder): метка источника весов выводится из результата резолва, а не из входа (#2811) #2817
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2817
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2811-weights-source-honesty"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
/analyzeставилweights_profile.source = "profile"по условиюprofile_id is not None— по факту прихода параметра, а не по факту нахождения профиля.resolve_weightsпри промахе молча уходил вниз по лестнице приоритетов, единственный след —logger.debug, которого на проде нет. Ответ утверждал, что оценка посчитана по профилю, хотя веса были другие; опровергнуть по ответу нечем.Воспроизведено живым запросом на проде (
docker exec gendesign-backend-1 curl, участок66:41:0204016:10), все три способа промаха:sourcetram_stopприменённый?profile_id=1(owner не передан)profile-0.5?profile_id=1&profile_user_id=__system__(чужой профиль, 1 принадлежитadmin)profile-0.5?profile_id=999999&profile_user_id=admin(нет такого id)profile-0.4У профиля 1
tram_stop = -0.4, у системных —-0.5; остальные 10 категорий совпадают.В истории прода дефект тоже есть: из 3 ранов с меткой
profileодин (analysis_runs.id=4000, 2026-08-07,profile_id=1,profile_user_id=NULL) посчитан системными весами.Что сделано
resolve_weightsвозвращаетResolvedWeights(weights, source)(NamedTuple) — вызывающий не может взять веса и не взять источник; старый вызовw["school"]падает громко.logger.warningсprofile_id/user_id/ фактическим источником. Покрывает и случай «owner не передан», где первая ветка вообще не выполнялась./analyzeполучилweights_profile.requested_profile_applied:True/False/None(не запрашивали).sourceне схлопывается в"system"— «что просили» и «что получилось» остаются разными величинами. То же поле пишется вanalysis_runs.params.profile_idдля/analyze— необязательный модификатор, а не адресуемый ресурс: 404 на/parcels/{cad}/analyzeуже занят «нет геометрии», а 422 превратил бы гонку «профиль удалили между показом списка и анализом» в отказ вместо честно помеченного ответа. Дефектом была метка, а не сам fallback.Тесты
Новый
test_analyze_missing_profile_is_not_labelled_profileкрасный наorigin/main:Плюс: обратный случай (профиль найден →
source='profile', флагTrue), unit-тест на сценарий «profile_id без owner» (проверяет warning), unit-тест на «промах → user_default, а не profile» (там веса не системные, по значениям подмена не видна вовсе).Кто читает метку
Полный grep:
weights_profile.sourceнигде не строит видимый пользователю текст. Фронт её не рендерит (три упоминания — комментарии-предупреждения «врёт», #2782/#2810), в §19-allowlist чата её нет, PDF/DOCX/экспортёры не читают. Единственные потребители — сырой ответ API иanalysis_runs.params.weights_source. Видимых изменений в UI не будет; после этого PR фронтовые комментарии становятся неактуальны (отдельный follow-up, фронт не трогал).Test plan
pytest tests/test_weight_profiles.py— 16 passedpytest tests/api/v1/test_analyze_inline_weights.py— 8 passedpytest tests/api/v1/test_run_history_and_response_contract.py— 10 passedorigin/mainsource=system/system/user_default,requested_profile_applied=false, warning вdocker logsRefs #2811
weights_profile.source = "profile"ставится по факту параметра, а не по факту найденного профиля #2811