fix(ptica): honest isReal flags — placeholder stubs no longer marked real (audit #1871 P1.3) #1875

Merged
bot-backend merged 2 commits from audit/1871-p1-3-isreal-stubs into main 2026-06-23 06:28:00 +00:00
Collaborator

Summary

Audit-issue #1871 пункт P1.3 — ptica-adapt помечает заглушки isReal:true.

Адаптер — единственный источник истины real-vs-placeholder. Стаб с isReal:true рисуется обычной типографикой («—» как живое измерение, неотличимо от данных). Хелперы real()/placeholder()/notReal() корректны — баг в misuse на 5 местах (recon нашёл 3, code-review нашёл ещё 2 drawer-зеркала).

Изменения (3 файла, +130/-16)

ptica-adapt.ts — 5 honesty-фиксов:

  • :163 encumbrances (passport-card) → notReal("источник ЕГРН")
  • :272 buySignalFromForecast при deficit_index==nullnotReal("прогноз недоступен (Сценарии §22)") (отличает «прогноза нет» от «прогноз говорит наблюдать»; di-present advisory-ветка не тронута)
  • :1942 adaptBuySignalGauge при di==null → убран synthetic gaugeValue=50 как real, ранний if(di==null) зеркалит no-report ветку (value:null, isReal:false, available:false)
  • :681 adaptPassportDrawer.registry + :1048 adaptLegalDrawer.registry — те же «Обременения» стабы → notReal (drawer-зеркала card-фикса, найдены adversarial code-review)

ptica.module.css.kvPlaceholder += opacity:0.7 (усиленный визуальный mute).

Не тронуто (recon-verified корректно)

market demand-label (условный real/placeholder), engineering utilities, InvestScore potential.

Honesty contract

Числа не выдумываются — только корректные isReal:false + honest caption + визуальный mute. Genuine measured data (di-present buy signal) не понижается.

Test plan

  • +5 unit (ptica-adapt.honesty.test.ts): encumbrances stub, buy-signal di=null→false, buy-signal real di→true (anti over-downgrade), gauge di=null→false, оба drawer-обременения→false
  • grep: 0 остаточных стабов value:DASH/PLACEHOLDER + isReal:true
  • tsc clean, vitest 5/5 passed, lint clean
  • code-reviewer (после добавления 2 drawer-фиксов по его находке)
  • post-deploy: ptica-кокпит «Обременения» рендерится muted «—» + caption, не как live

Refs #1871

🤖 Generated with Claude Code

## Summary Audit-issue #1871 пункт **P1.3 — ptica-adapt помечает заглушки `isReal:true`**. Адаптер — единственный источник истины real-vs-placeholder. Стаб с `isReal:true` рисуется обычной типографикой («—» как живое измерение, неотличимо от данных). Хелперы `real()`/`placeholder()`/`notReal()` корректны — баг в misuse на **5 местах** (recon нашёл 3, code-review нашёл ещё 2 drawer-зеркала). ## Изменения (3 файла, +130/-16) **`ptica-adapt.ts`** — 5 honesty-фиксов: - `:163` encumbrances (passport-card) → `notReal("источник ЕГРН")` - `:272` `buySignalFromForecast` при `deficit_index==null` → `notReal("прогноз недоступен (Сценарии §22)")` (отличает «прогноза нет» от «прогноз говорит наблюдать»; di-present advisory-ветка не тронута) - `:1942` `adaptBuySignalGauge` при `di==null` → убран synthetic `gaugeValue=50` как real, ранний `if(di==null)` зеркалит no-report ветку (`value:null, isReal:false, available:false`) - `:681` `adaptPassportDrawer.registry` + `:1048` `adaptLegalDrawer.registry` — те же «Обременения» стабы → `notReal` (drawer-зеркала card-фикса, найдены adversarial code-review) **`ptica.module.css`** — `.kvPlaceholder += opacity:0.7` (усиленный визуальный mute). ## Не тронуто (recon-verified корректно) market demand-label (условный real/placeholder), engineering utilities, InvestScore potential. ## Honesty contract Числа не выдумываются — только корректные `isReal:false` + honest caption + визуальный mute. Genuine measured data (di-present buy signal) не понижается. ## Test plan - [x] +5 unit (ptica-adapt.honesty.test.ts): encumbrances stub, buy-signal di=null→false, buy-signal real di→true (anti over-downgrade), gauge di=null→false, оба drawer-обременения→false - [x] grep: 0 остаточных стабов `value:DASH/PLACEHOLDER + isReal:true` - [x] tsc clean, vitest 5/5 passed, lint clean - [x] code-reviewer ✅ (после добавления 2 drawer-фиксов по его находке) - [ ] post-deploy: ptica-кокпит «Обременения» рендерится muted «—» + caption, не как live Refs #1871 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-06-23 06:21:10 +00:00
fix(ptica): honest isReal flags — placeholder stubs no longer marked real (audit #1871 P1.3)
Some checks failed
CI / frontend-tests (pull_request) Failing after 53s
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m52s
2303207629
Adapter — единственный источник истины real-vs-placeholder; стаб с isReal:true
рисуется как живое измерение (обычная типографика «—», неотличимо от данных).
Helpers real()/placeholder()/notReal() корректны — баг в их misuse на 5 местах.

ptica-adapt.ts:
- :163 encumbrances (passport-card): {value:PLACEHOLDER, isReal:true} → notReal("источник ЕГРН")
- :272 buySignalFromForecast при deficit_index==null: {value:"наблюдать", isReal:true}
  → notReal("прогноз недоступен (Сценарии §22)") — отличает «прогноза нет» от
  «прогноз говорит наблюдать». di-present advisory-ветка (real) не тронута.
- :1942 adaptBuySignalGauge при di==null: убран synthetic gaugeValue=50 как real;
  ранний if(di==null) зеркалит no-report ветку (value:null, isReal:false, available:false).
- :681 adaptPassportDrawer registry, :1048 adaptLegalDrawer registry: те же
  «Обременения» стабы {value:DASH, isReal:true} → notReal (найдены code-review,
  recon их пропустил — drawer-зеркала card-фикса).

ptica.module.css: .kvPlaceholder += opacity:0.7 — усиленный визуальный mute стаба.

Корректные места НЕ тронуты (recon-verified): market demand-label (условный
real/placeholder), engineering utilities, InvestScore potential.

+5 unit-тестов (ptica-adapt.honesty.test.ts): encumbrances stub, buy-signal di=null,
buy-signal real di (защита от over-downgrade), gauge di=null, оба drawer-обременения.

Refs #1871
Light1YT added 1 commit 2026-06-23 06:25:37 +00:00
test(ptica): use tracked mock fixtures instead of git-excluded __preview (CI fix)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Successful in 54s
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m54s
389bdd3306
CI frontend-tests упал: honesty-тест импортировал фикстуры из
src/app/%5F%5Fpreview/ptica/__fixtures__/ — эта dev-only директория в
.git/info/exclude, поэтому отсутствует в Linux CI checkout (vite:import-analysis
'Failed to resolve import'). Локально (macOS) резолвилось т.к. файлы на диске.

Переключил импорт на tracked src/lib/mocks/parcel-{forecast,analyze}.json
(NEXT_PUBLIC_USE_MOCKS source, в git) — report.exec_summary.key_numbers.
deficit_index присутствует, shape совместим. 138/138 vitest passed.

Refs #1871
bot-backend merged commit 85d91375dc into main 2026-06-23 06:28:00 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#1875
No description provided.