Skip to content

feat(ir): INV-06 — candidate-корпус в opt-in субпат ./ir/candidates - #85

Merged
lemone112 merged 3 commits into
masterfrom
feat/inv06-runtime-projection
Aug 23, 2026
Merged

feat(ir): INV-06 — candidate-корпус в opt-in субпат ./ir/candidates#85
lemone112 merged 3 commits into
masterfrom
feat/inv06-runtime-projection

Conversation

@lemone112

Copy link
Copy Markdown
Contributor

Что

Закрывает INV-06-невязку GATE-1 (план product-lab-icons r2, Unknowns): candidate-декларации (53 глифа, ~78KB координат) больше не входят в default ./ir — каждый потребитель платил за opt-in режим.

  • Default ./ir → runtime-проекция: 32 декларации accepted-моделей + транзитивные mirror-источники (semantics/anatomy.runtime.json, 49KB вместо 304KB).
  • Новый субпат @labpics/icons/ir/candidates: явный registerCandidates() включает allow-candidate; bare-импорт запрещён как паттерн (sideEffects:false).
  • Fail-closed гейт по состоянию модели, не по наличию декларации: mixed-иконки (candidate-вариант при runtime-декларации через accepted-соседа) падают так же, как pure-candidate.
  • registerCandidateAnatomy@internal + stripInternal: не входит в публичный d.ts; реестр first-write-wins.
  • Бонус-класс: vitest exclude .claude/** — worktree субагентов больше не глобятся в verify.

Числа (точное измерение, не потолки)

Артефакт было стало
dist/ir/index.js 1 064 174 B / 144 005 gzip 805 401 B / 125 302 gzip
dist/ir/index.d.ts 11 027 B 9 594 B (stripInternal)
dist/ir/candidates.js 259 809 B / 19 330 gzip (opt-in)

Доказательства

  • CI=true pnpm verify: 68 files / 793 tests, exit 0 (локально; авторитет — CI этого PR).
  • Изолированное ревью корректности: разбиение сверено с catalog.json (32/53/85, missing/extra/overlap/lost = []), 0/53 candidate-глифов в ./ir-бандле при чувствительности пробы 29/32 runtime, tarball/attw/publint OK.
  • Изолированное ревью второго порядка: Хайрам-риски реестра закрыты (internal-канал, first-write-wins, candidateGlyphCount удалён как YAGNI); альтернативы (glyph(name,{candidates}), ./ir/full) рассмотрены и отклонены с обоснованием.
  • test/ir-candidates-gate.test.ts: способность упасть доказана саботажем гейта (глушение → 2 failed).

Контекст плана

Узел: закрытие INV-06-невязки GATE-1 до CONTRACT-01 (после снапшотов это стало бы breaking). SIZE-01-отчёт готов отдельно и ляжет следующим срезом после мержа (baseline B пересчитается).

…idates

Default ./ir несёт только runtime-проекцию (32 декларации accepted-моделей
+ транзитивные mirror-источники, 49KB вместо 304KB anatomy.json); candidate-
корпус (53 глифа) подключается явным registerCandidates() из нового субпата.

- build-anatomy-projection.mjs: детерминированное разбиение anatomy.json
  на runtime/candidates в составе build:ir
- гейт по состоянию модели, не по декларации: mixed-иконки (candidate-вариант
  при runtime-декларации) без регистрации падают fail-closed, как pure
- registerCandidateAnatomy @internal + stripInternal (не входит в публичный
  d.ts), реестр first-write-wins — публичной точки мутации нет
- test/ir-candidates-gate.test.ts: fail-closed доказан для обоих классов,
  способность упасть проверена саботажем гейта
- vitest exclude .claude/** — worktree субагентов не попадают в verify
- ratchet: dist/ir/index.js 1064174->805401 B (gzip 144005->125302),
  index.d.ts 11027->9594 B после stripInternal; числа = точное измерение

Ревью: изолированная корректность (разбиение сверено с catalog, 0 утечек
candidate-координат в ./ir, tarball/attw/publint OK) + второй порядок
(Хайрам-риски реестра закрыты, candidateGlyphCount удалён как YAGNI).
CI=true pnpm verify: 68 files / 793 tests, exit 0.
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your current included review allowance is based on your included PR review attempts over the past 7 days.

Next review available in: 7 minutes

Limit details: You’ve used the included review currently available. Your 104 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

Wait for the limit to reset, then comment @coderabbitai review or push new commits to the PR.

An organization admin can change what happens after included review limits in Billing.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8bcb772c-4a5f-439d-b6d1-3093d54e836b

📥 Commits

Reviewing files that changed from the base of the PR and between 423506d and 97d92fe.

📒 Files selected for processing (20)
  • README.md
  • package.json
  • release/contract.json
  • release/package-size-ratchet.json
  • scripts/build-anatomy-projection.mjs
  • scripts/build-ir.mjs
  • scripts/check-package-artifact.js
  • scripts/lib/release-contract.js
  • semantics/anatomy.candidates.json
  • semantics/anatomy.runtime.json
  • semantics/census.json
  • src/ir/candidates.ts
  • src/ir/index.ts
  • test/docs-drift.test.js
  • test/ir-candidates-gate.test.ts
  • test/ir-runtime.test.ts
  • test/package-artifact.test.js
  • test/release-contract.test.js
  • tsconfig.build.json
  • vitest.config.js

Comment @coderabbitai help to get the list of available commands.

…tes в offline-consumer гейте

Находки финального изолированного ревью PR #85 (exact head 3014cb1):

- registerCandidateAnatomy({}) ставил candidatesRegistered до проверки
  содержимого — mixed-модели строились без корпуса (обход INV-06 через
  runtime-экспорт, невидимый в d.ts, но живой по Хайраму). Гейт теперь
  открывается только непустым корпусом; регресс закрыт тестом (sabotage:
  удаление гвардии -> 1 failed).
- check-package-artifact: offline-consumer smoke импортирует ./ir/candidates,
  вызывает registerCandidates() и строит все 476 вариантов в allow-candidate —
  заявление 'проверяет все ESM entrypoints' снова точно.
…и пустой регистрации

Корневая причина красного CI 90e006a: 3-строчная гвардия
registerCandidateAnatomy добавила +48 B min / +12 B gzip, а ratchet
сверяет baseline точно (drift в обе стороны). Числа = измерение
check-package-size на пересобранном dist; census перегенерирован
штатным генератором. Моя ошибка исполнения: коммитил фикс гвардии
без пересборки dist перед push.
@lemone112
lemone112 merged commit cc4bd1f into master Aug 23, 2026
7 checks passed
@lemone112
lemone112 deleted the feat/inv06-runtime-projection branch August 23, 2026 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant