для бизнеса: убраны обещания, которых нет в контуре; гейт чисел накрыл подстраницы
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 10s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 10s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
Снимает два замечания ревью. 1. КОПИЯ ОБЕЩАЛА НЕСУЩЕСТВУЮЩЕЕ. «Расчёты по потоку адресов», «не для одной сделки, а потоком», «по вашему потоку адресов» — всё это подразумевает массовую загрузку, которой в контуре нет: ни CSV, ни импорта, ни пакетной ручки. Проверено grep-ом по src/app/v2. Что там ЕСТЬ на самом деле и теперь названо: учётные записи команды (app/api/v1/team.py), история своих расчётов (useEstimateHistory, оверлей «Предыдущие оценки»), месячный лимит на аккаунт (account_quota_overrides, monthly_limit/unlimited), выдача доступа вручную. Это ровно тот дефект, который на этом лендинге выкорчёвывали весь день: величина или возможность, которой никто не мерил и не делал, в продуктовом голосе. Новая страница не имеет права начинать заново. 2. ГЕЙТ ЧИСЕЛ НЕ ВИДЕЛ НОВУЮ СТРАНИЦУ. Сканер знал два места: корневой page.tsx и каталог _components/v3. Публичная /business под него не попадала — правило держалось на памяти автора. Теперь подстраницы находятся ОБХОДОМ каталога, а не списком: список — снимок, следующую страницу в него снова забудут вписать. Юридические страницы (оферта, политика, возврат, документы) исключены явно и с обоснованием: они состоят из ссылок на законы («Закон РФ от 07.02.1992 № 2300-1», «152-ФЗ», «ст. 18.1»), а по форме это те же числа, что и замеры. Отличить регулярным выражением нельзя, и правило гейта к ним не относится — там числа цитируются из нормативных актов, а не утверждаются о рынке. Расширение проверено: включение этих страниц давало 4 ложных срабатывания. Фальсификация: вписанные в /business «42 700 квартир» роняют гейт по значению с указанием файла. 150 passed, tsc и eslint чисто.
This commit is contained in:
parent
4d51d19f7c
commit
c4beee29ff
2 changed files with 58 additions and 8 deletions
|
|
@ -79,8 +79,57 @@ const V3_DIR = "_components/v3";
|
|||
const GENERATED = ["ekb-districts.ts"];
|
||||
const GENERATED_MARK = "СГЕНЕРИРОВАН";
|
||||
|
||||
/**
|
||||
* ПОДСТРАНИЦЫ ПЕРИМЕТРА тоже под гейтом, а не только корень и v3-секции.
|
||||
*
|
||||
* 31.08.2026 завели `/business`, и ревьюер заметил, что новая ПУБЛИЧНАЯ
|
||||
* страница чисел ничем не сторожится: сканер знал ровно два места — корневой
|
||||
* `page.tsx` и каталог `_components/v3`. Чисел там тогда не было, но правило
|
||||
* держалось на том, что автор о нём помнил.
|
||||
*
|
||||
* Каталоги перечисляются ОБХОДОМ, а не списком: список — снимок, и следующую
|
||||
* страницу в него снова забудут вписать. Обход находит её сам.
|
||||
*/
|
||||
/**
|
||||
* ЮРИДИЧЕСКИЕ СТРАНИЦЫ ПОД ЭТОТ ГЕЙТ НЕ ПОПАДАЮТ — и это не послабление.
|
||||
*
|
||||
* Гейт ищет ФОРМУ величины: «14,5 %», «42 700», «150 ₽». Тексты оферты,
|
||||
* политики и возврата состоят из ссылок на законы, и по форме они те же самые:
|
||||
*
|
||||
* Закон РФ от 07.02.1992 № 2300-1 «О защите прав потребителей»
|
||||
* Федеральный закон от 27.07.2006 № 152-ФЗ
|
||||
* ст. 18.1 152-ФЗ
|
||||
*
|
||||
* Отличить номер закона от замера рынка регулярным выражением нельзя, а
|
||||
* подгонять под них исключения по одному значило бы дырявить сам сканер.
|
||||
* Правило, которое гейт защищает, к этим страницам и не относится: там числа
|
||||
* ЦИТИРУЮТСЯ из нормативных актов, а не утверждаются о рынке.
|
||||
*
|
||||
* Список ЯВНЫЙ и короткий: молчаливое расширение (например «все страницы с
|
||||
* длинным текстом») однажды укроет и маркетинговую.
|
||||
*/
|
||||
const LEGAL_PAGES = new Set(["oferta", "privacy", "refund", "docs"]);
|
||||
|
||||
const PAGE_DIRS = readdirSync(ROOT, { withFileTypes: true })
|
||||
.filter(
|
||||
(e) =>
|
||||
e.isDirectory() &&
|
||||
e.name !== "__tests__" &&
|
||||
e.name !== "_components" &&
|
||||
!LEGAL_PAGES.has(e.name),
|
||||
)
|
||||
.map((e) => e.name)
|
||||
.sort();
|
||||
|
||||
const SUBPAGES = PAGE_DIRS.flatMap((dir) =>
|
||||
readdirSync(join(ROOT, dir))
|
||||
.filter((name) => /^page\.tsx?$/u.test(name))
|
||||
.map((name) => `${dir}/${name}`),
|
||||
);
|
||||
|
||||
const V3_SOURCES = [
|
||||
LANDING_ROOT,
|
||||
...SUBPAGES,
|
||||
...readdirSync(join(ROOT, V3_DIR))
|
||||
.filter((name) => /\.tsx?$/u.test(name) && !GENERATED.includes(name))
|
||||
.sort()
|
||||
|
|
|
|||
|
|
@ -61,9 +61,9 @@ export default function BusinessPage() {
|
|||
<div className={styles.repEyebrow}>ДЛЯ БИЗНЕСА</div>
|
||||
<h1 className={styles.artPageTitle}>МЕРА для бизнеса</h1>
|
||||
<p className={styles.artPageLead}>
|
||||
Оценка квартиры по живым объявлениям — не для одной сделки, а
|
||||
потоком: для агентства, застройщика или компании, которая принимает
|
||||
квартиры в зачёт.
|
||||
Оценка квартир по живым объявлениям под своей учётной записью —
|
||||
для агентства, застройщика или компании, которая принимает квартиры
|
||||
в зачёт.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
|
|
@ -75,8 +75,8 @@ export default function BusinessPage() {
|
|||
Тем, кто считает не одну квартиру, а много и регулярно: агентствам
|
||||
недвижимости, отделам продаж застройщиков, компаниям с программами
|
||||
трейд-ин. Расчёт идёт по тем же источникам, что и бесплатная
|
||||
проверка на сайте, — но по вашему потоку адресов и под вашими
|
||||
учётными записями.
|
||||
проверка на сайте, — но под учётными записями вашей команды, с
|
||||
сохранением истории и месячным лимитом на аккаунт.
|
||||
</p>
|
||||
<p className={styles.artP}>
|
||||
Если задача разовая — квартира одна, и нужно понять цену, — идти
|
||||
|
|
@ -101,9 +101,10 @@ export default function BusinessPage() {
|
|||
<span className={styles.docsLinkCard}>
|
||||
<span className={styles.docsLinkTitle}>Бизнес-контур</span>
|
||||
<span className={styles.docsLinkNote}>
|
||||
Закрытый контур с доступом по учётной записи: расчёты по потоку
|
||||
адресов и история по ним. Доступ выдаётся вручную, после
|
||||
разговора, — самостоятельной регистрации в нём нет
|
||||
Закрытый контур с доступом по учётной записи: история своих
|
||||
расчётов, учётные записи команды, месячный лимит на аккаунт.
|
||||
Доступ выдаётся вручную, после разговора, — самостоятельной
|
||||
регистрации в нём нет
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue