remove duplicate vent question + AI must propose charcoal filter on recirc hood

USER REPORT: 'после прогона всей техники, перед запросом опять вопрос про фильтр для вытяжки в конце'

ROOT CAUSE: Infra-шаг спрашивает 'Вытяжка → вентшахта?', хотя у hood-категории уже есть шаг 'Подключение' с вариантами Отвод/Рециркуляция/Универсальная. Это дубликат.

FIX:
- renderInfra: убран блок vent. Шаг показывается только если выбрана варочная.
- Auto-skip infra если нет hob (раньше требовался hob ИЛИ hood, теперь только hob)
- renderSummary: убрана строка 'Вентиляция'
- summaryBack: 'infra' только если cats.includes('hob')

AI PROMPT:
- Новый блок: режим вытяжки читать из per_cat.hood.answers.mode
- exhaust → обычная установка
- recirc → ОБЯЗАТЕЛЬНО упомянуть 'Угольный фильтр в комплекте/докупаем' в pros
  + в первой строке pros указать 'для квартир без вентшахты'
- combi → упомянуть универсальность
- 'Если recirc и фильтр не предложен — это ОШИБКА'

Cache: v=20260512b
This commit is contained in:
wasrusgen 2026-05-12 17:22:59 +03:00
parent c4f3016b56
commit 43c43af795
3 changed files with 32 additions and 48 deletions

View File

@ -103,8 +103,14 @@ SYSTEM_PROMPT_PICKER = (
" - 'cheap' → надёжный минимум по цене\n"
" - 'tech' → топ функционал (Wi-Fi, инвертор, пар, авто-программы)\n"
" - 'style' → согласованный дизайн всей техники\n"
"4. **Инфраструктура**:\n"
" - газ исключает индукцию; нет вентиляции → только рециркуляция (угольный фильтр)\n"
"4. **Инфраструктура и режим вытяжки**:\n"
" - `checklist.infra.stove` (газ/электро/индукция) — газ исключает индукцию\n"
" - У ВЫТЯЖКИ режим живёт в `per_cat.hood.answers.mode`:\n"
" • `exhaust` (Отвод в вентшахту) → стандартная установка, без фильтра\n"
" • `recirc` (Рециркуляция) → **ОБЯЗАТЕЛЬНО в pros модели вытяжки укажи 'Угольный фильтр в комплекте/докупаем'**\n"
" и в первой строке pros указать что комплект подходит для квартир без вентшахты\n"
" • `combi` (Универсальная) → упомяни что подходит для обоих режимов\n"
" - Если у hood режим recirc и AI не предлагает угольный фильтр — это ОШИБКА\n"
"5. **Фичи современной техники** (NoFrost, Inverter, Wi-Fi, AquaStop, Booster и т.п.):\n"
" - Пользователь НЕ выбирает фичи — у современной техники они в основном одинаковые (95% моделей имеют base set)\n"
" - Ты УПОМИНАЕШЬ важные фичи каждой модели в `highlights` и в `pros` БЕЗ акцента на них\n"

View File

@ -1115,11 +1115,11 @@ const Podbor = (function () {
function renderInfra() {
const cats = state.categories || [];
const askStove = cats.includes("hob");
const askVent = cats.includes("hood");
// Вытяжка НЕ спрашиваем здесь — у hood-категории уже есть шаг "Подключение"
// (Отвод в вентшахту / Рециркуляция / Универсальная) — это дубль.
// Если ни одна из релевантных категорий не выбрана — пропускаем шаг
if (!askStove && !askVent) {
// Автопереход на summary через микропаузу (чтобы пользователь увидел)
// Если варочная не выбрана — пропускаем шаг полностью
if (!askStove) {
setTimeout(() => { go("summary"); }, 50);
return el(`
<section class="podbor-step">
@ -1130,7 +1130,10 @@ const Podbor = (function () {
`);
}
const stoveBlock = askStove ? `
const node = el(`
<section class="podbor-step">
<h2 class="display-title">Инфраструктура<br><span class="accent">кухни</span></h2>
<p class="lede">Газ или электрика определит тип варочной (индукция требует 380В, обычная электро 220В).</p>
<div class="block">
<div class="block-head">Подключение варочной</div>
<div class="opt-list">
@ -1139,32 +1142,6 @@ const Podbor = (function () {
`).join("")}
</div>
</div>
` : "";
const ventBlock = askVent ? `
<div class="block">
<div class="block-head">Вытяжка внутридомовая вентиляция?</div>
<div class="opt-list">
${PODBOR_INFRA.vent.map(o => `
<button class="opt${state.infra.vent === o.key ? " on" : ""}" data-infra="vent" data-val="${o.key}">${o.label}</button>
`).join("")}
</div>
<div class="hint">Если «Нет» менеджер закладывает угольный фильтр. Если «Да» заранее планируем выводы.</div>
</div>
` : "";
const lede = (askStove && askVent)
? "Газ или электрика — определит тип варочной. Подключение вытяжки — нужны ли выводы или угольный фильтр."
: askStove
? "Газ или электрика — определит тип варочной (индукция / стеклокерамика / газ)."
: "Подключение вытяжки — нужны ли выводы в вентшахту или угольный фильтр.";
const node = el(`
<section class="podbor-step">
<h2 class="display-title">Инфраструктура<br><span class="accent">кухни</span></h2>
<p class="lede">${lede}</p>
${stoveBlock}
${ventBlock}
<div class="podbor-cta-row">
<button class="btn-secondary" data-go="strategy">Назад</button>
<button class="btn-primary" data-go="summary">Дальше</button>
@ -1228,7 +1205,6 @@ const Podbor = (function () {
<div class="kv"><span>Бюджет</span><strong>${budgetLabel}</strong></div>
<div class="kv"><span>Стратегия</span><strong>${strategyLabels || ""}</strong></div>
${state.categories.includes("hob") ? `<div class="kv"><span>Подключение</span><strong>${PODBOR_INFRA.stove.find(f => f.key === state.infra.stove)?.label || "—"}</strong></div>` : ""}
${state.categories.includes("hood") ? `<div class="kv"><span>Вентиляция</span><strong>${PODBOR_INFRA.vent.find(f => f.key === state.infra.vent)?.label || "—"}</strong></div>` : ""}
</div>
<label class="field">
@ -1249,7 +1225,9 @@ const Podbor = (function () {
// Кнопка "Назад" — обходим infra если она авто-пропускается
node.querySelector("#summaryBack").addEventListener("click", () => {
const cats = state.categories || [];
const goTo = (cats.includes("hob") || cats.includes("hood")) ? "infra" : "strategy";
// Infra-шаг показывается только если выбрана варочная (для электро/газ).
// Вытяжка задаёт свою вентиляцию в hood-step "Подключение".
const goTo = cats.includes("hob") ? "infra" : "strategy";
go(goTo);
});
node.querySelector("#submitBtn").addEventListener("click", () => onSubmit(node));

View File

@ -12,8 +12,8 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Geist:wght@400;500;600&family=Newsreader:ital,wght@0,400..600;1,400..600&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500&display=swap">
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link rel="stylesheet" href="assets/styles.css?v=20260512a">
<link rel="stylesheet" href="assets/podbor.css?v=20260512a">
<link rel="stylesheet" href="assets/styles.css?v=20260512b">
<link rel="stylesheet" href="assets/podbor.css?v=20260512b">
</head>
<body>
<main id="app">
@ -21,11 +21,11 @@
<div class="spinner"></div>
</div>
</main>
<script src="assets/icons.js?v=20260512a"></script>
<script src="assets/podbor.config.js?v=20260512a"></script>
<script src="assets/podbor.picts.js?v=20260512a"></script>
<script src="assets/podbor.js?v=20260512a"></script>
<script src="assets/clients.js?v=20260512a"></script>
<script src="assets/app.js?v=20260512a"></script>
<script src="assets/icons.js?v=20260512b"></script>
<script src="assets/podbor.config.js?v=20260512b"></script>
<script src="assets/podbor.picts.js?v=20260512b"></script>
<script src="assets/podbor.js?v=20260512b"></script>
<script src="assets/clients.js?v=20260512b"></script>
<script src="assets/app.js?v=20260512b"></script>
</body>
</html>