PR-B (follow-up к unify-concept). Закрывает «вписать пятно» из round-3:
- BuildingProgramItem получает опциональные footprint_w_m/footprint_d_m
(float|None, ge=4 le=120, default None → каталог; ADDITIVE, byte-for-byte
backward-compat). place_program кладёт ручное пятно когда заданы ОБА габарита,
иначе каталожное. api-types.ts регенерирован под новую схему.
- ConceptProgramForm: пятно секции теперь редактируемое (ширина × глубина);
пусто → возврат к каталогу; Σ пятно и ориентир КСИТ считаются от эффективного
габарита. building_program несёт footprint в Section7Concept.
- ConceptVariantsResult: грамматика «корпус» (1 корпус / 2–4 корпуса / 5+
корпусов) в headline / подписи карты / partial-fit; program-вариант получает
свой хинт вместо STRATEGY_HINTS[balanced].
- Тесты place_program: footprint-override и partial-footprint fallback.