Skip to content

fix(bench): измерять полный handoff в каждом sample - #298

Closed
lemone112 wants to merge 8 commits into
mainfrom
fix/benchmark-handoff-samples-20260905
Closed

fix(bench): измерять полный handoff в каждом sample#298
lemone112 wants to merge 8 commits into
mainfrom
fix/benchmark-handoff-samples-20260905

Conversation

@lemone112

@lemone112 lemone112 commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Пользовательский результат

Handoff-бенчмарк больше не измеряет повторно использованный live-controller как быстрый no-op и не принимает формально похожие, но неверные donor-планы.

Контракт

Каждый sample получает нового владельца. Setup, timed handoff, проверка и cleanup разделены. Вне тайминга проверяются реальные animate/cancel/requestFrame и чтения часов, а значение/скорость live сверяются с независимым снимком замороженного фактически переданного donor-плана на 16 мс.

Поддерживаются две конечные формы локального emitter: CSS linear() и explicit linear keyframes. Это проверка сохранения фактической позиции/скорости при передаче, не повторная проверка физического ОДУ.

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

  • RED для повторного использования controller, no-op/неполного handoff, неверных конечных значения/скорости и переноса timed effects в setup.
  • RED для частично упавшего start и ошибок observer, которые мешали cleanup.
  • RED для execution modifiers, не соответствующих профилю.
  • Последние четыре контрпримера: конечные stops с бесконечной производной; inherited timeline; NBSP; hex CSS tokens. Целевой sabotage каждого исправления возвращает RED.
  • Точный a13f214: focused48/48, static/typecheck/node syntax/build/size/pack:smoke PASS.
  • Полный suite с maxWorkers=4: 4018 PASS / 21 платформенный skip. Стандартный локальный parallel suite: 4016 PASS / 21 skip / 2 watchdog timeout существующих Git/build fixtures. Не скрыто и вынесено в test: интеграционные Git/build fixtures зависят от конкуренции на Windows #304; assertions и их таймауты не менялись.
  • После свежего build исполнено 200 samples настоящего CompositorSpring; lifecycle guard PASS. Печатные времена этого smoke не являются сравнительным baseline.

Архитектура

Production src/exports/dependencies не меняются. Эталон принадлежит стенду и читает фактический donor-план, не импортирует production-reader как определение правильности. Cleanup выполняется и при сбоях observer/частичного setup.

Производительность

Прежние 100/100/100 нс no-op не являются доказательством производительности. Этот PR чинит валидность измерения, не заявляет speedup, tail latency или отсутствие регрессий во всех средах.

Риски и не-цели

Не общий CSS-парсер и не proof произвольного browser rendering. Accessor/Proxy adversaries и будущие WebIDL fields не покрыты. Browser residency/paint и физическая плавность требуют отдельных проверок #300/#301.

Документация и выпуск

Динамические результаты находятся в PR, версия/CHANGELOG не меняются. Merge/release/deploy НЕ БЫЛО. Откат после возможного merge: revert этого PR.

Гейты

  • Опубликован a13f214, чистое дерево.
  • Финальное независимое donor-contract review: PASS, оба поддерживаемых real-controller формата приняты, prior counterexamples отвергнуты, cleanup observer проверен.
  • Exact-head CI и browser: SUCCESS в стандартной удалённой конфигурации.
  • CodeRabbit: содержательное ревью есть только старого 0dac03c; запрос на финальный a13f214 получил rate limit. Это НЕ финальное ревью и не одобрение.
  • pnpm mutation НЕ БЫЛО; runtime не меняется, targeted sabotage выполнен.

Связано с #295; стек поверх #295. Не включает #296/#297.

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Team

Run ID: 2b9d4fed-18c2-4c15-8d50-d37084ae6bbd

📥 Commits

Reviewing files that changed from the base of the PR and between 867254c and 0dac03c.

📒 Files selected for processing (3)
  • scripts/bench-latency-support.mjs
  • scripts/bench-latency.mjs
  • test/bench-latency-lifecycle.test.ts

Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.


📝 Walkthrough

Walkthrough

Добавлена фабрика lifecycle-sample для проверки compositor-to-live handoff. Benchmark создаёт отдельный контроллер для каждой итерации. Тесты проверяют counts, уничтожение live-контроллера и отказ при повторном использовании.

Changes

Жизненный цикл handoff

Layer / File(s) Summary
Фабрика sample и проверка lifecycle
scripts/bench-latency-support.mjs
Фабрика создаёт и запускает CompositorSpring, считает вызовы animate, cancel и requestFrame. Метод verify проверяет live-значения, destroy и одноразовое использование.
Интеграция handoff в benchmark
scripts/bench-latency.mjs
teardown получает аргумент из setup. Benchmark создаёт новый sample для каждой итерации, выполняет handoffToLive(), проверяет результат и уничтожает live-контроллер.
Тесты независимости и повторного использования
test/bench-latency-lifecycle.test.ts
Тесты проверяют два независимых sample, counts { animations: 1, cancels: 1, frameRequests: 1 }, уничтожение live-контроллера и ошибку при повторном handoff.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 0dac0

This change makes each compositor-to-live handoff benchmark sample use a fresh controller and verifies the expected lifecycle effects. No merge-blocking risk remains.

Sequence Diagram(s)

sequenceDiagram
  participant Benchmark
  participant CompositorSpring
  participant LiveMotionValue
  participant LifecycleSample
  Benchmark->>LifecycleSample: create independent sample
  LifecycleSample->>CompositorSpring: create and start controller
  Benchmark->>CompositorSpring: handoffToLive()
  CompositorSpring->>LiveMotionValue: return live controller
  Benchmark->>LifecycleSample: verify(live)
  LifecycleSample->>LifecycleSample: validate counts and final values
  Benchmark->>LiveMotionValue: destroy()
Loading

Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (1 error)

Check name Status Explanation Resolution
тесты ❌ Error Тесты не доказывают целевое исправление стенда. test/bench-latency-lifecycle.test.ts импортирует только createCompositorHandoffLatencySample и вручную вызывает два sample. Он не вызывает `measureL… Добавьте тест, который проходит через фактическую оркестрацию benchmark: setup должен создавать sample, op должен выполнять handoffToLive, а teardown должен получать тот же sample и вызывать verify и destroy. Тест должен падать …
✅ Passed checks (8 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
краткие русские документации ✅ Passed Проверка пройдена. Добавленный JSDoc и комментарии в изменённом коде написаны по-русски и кратко описывают назначение sample, необратимость handoff и проверяемые эффекты. Описание соответствует фактич…
Diataxis ✅ Passed PASS: pull request не изменяет документацию. Фактический diff содержит только scripts/bench-latency-support.mjs, scripts/bench-latency.mjs и test/bench-latency-lifecycle.test.ts; изменений в `RE…
архитектура ✅ Passed Архитектурное нарушение не выявлено. Новый модуль находится на границе benchmark/test и не изменяет src или dist. Он владеет счётчиками sample и предоставляет явный контракт controller/verify.…
промежуточные документы (напр. планы) ✅ Passed Проверка пройдена. В коммите изменены только scripts/bench-latency-support.mjs, scripts/bench-latency.mjs и test/bench-latency-lifecycle.test.ts. Документные файлы и файлы с планами, ревью, иссл…
Title check ✅ Passed Заголовок на русском языке. Он кратко и точно описывает основное изменение: измерение полного handoff для каждого sample.
Description check ✅ Passed Описание содержит все обязательные разделы шаблона. Оно описывает пользовательский результат, контракт, доказательства, архитектуру, производительность, риски, документацию и гейты. Невыполненные пров…
Full details: тесты

Explanation

Тесты не доказывают целевое исправление стенда. test/bench-latency-lifecycle.test.ts импортирует только createCompositorHandoffLatencySample и вручную вызывает два sample. Он не вызывает measureLatency и не выполняет блок D из scripts/bench-latency.mjs. Поэтому восстановление прежнего кода с одним переиспользуемым cs в setup/op/teardown оставляет все новые тесты проходящими. Это доказанный контрпример целевому дефекту: тест не падает при повторном появлении no-op handoff. Второй тест проверяет только защиту sample.verify от второго вызова, а не подключение этой защиты к реальному циклу benchmark. Изменённая передача arg в teardown также не покрыта.

Resolution

Добавьте тест, который проходит через фактическую оркестрацию benchmark: setup должен создавать sample, op должен выполнять handoffToLive, а teardown должен получать тот же sample и вызывать verify и destroy. Тест должен падать после deliberate sabotage, возвращающего общий controller для всех итераций. Отдельно проверьте передачу аргумента setup в teardown для warmup и измерительных итераций. Для этого изолируйте и экспортируйте тестируемую orchestration-функцию либо вынесите её в support-модуль без запуска всего стенда.

  • Fix all pre-merge checks with AI
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/benchmark-handoff-samples-20260905

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

@lemone112

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@lemone112

Copy link
Copy Markdown
Contributor Author

Новые guards на30a851444f5bdb8614f15ea8a866d58df40e2832: независимо сверяются serialized donor position/velocity, реальные clock/currentTime reads, phase-specific effects; неподдерживаемые keyframe/timing modifiers отклоняются, cleanup выполняется даже при исключении phase observer. Фактические counterexamples steps(1)/неверные конечные числа/пропущенное чтение/частичный start/observer failure превращены в RED-регрессии. Focused44PASS; static/full suite4014PASS/21skip. Собранный controller прошёл200 lifecycle samples, не performance admission. Новый exact-head CI/browser и свежий независимый donor-contract reviewer запущены; прежний PASS не перенесён на новый SHA.

@lemone112

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@lemone112 lemone112 left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Автоматизация из ChatGPT от агента GPT-5.6 Sol

Вердикт: merge-blocker не доказан на exact head a13f214c.

Validity envelope: base 867254c9; changed surface — benchmark/test only; production src/exports/dependencies не затронуты. Exact-head GitHub Actions: browser Chromium/Firefox/WebKit и consumer/CI checks завершены SUCCESS. CodeRabbit содержательно покрывал старый 0dac03c; его прежний pre-merge finding про отсутствие orchestration-теста на финальном head SUPERSEDED: текущий diff экспортирует общий measureLatency, вводит createCompositorHandoffLatencyScenario/measureCompositorHandoffLatency и тестирует передачу setup→op→verify→teardown, включая failure/cleanup paths.

Proof obligations:

  • BENCH-298-01 fresh owner per sample / отсутствие старого no-op пути — NO COUNTEREXAMPLE FOUND. CHECK=YES для exact-head remote suite; source inspection подтверждает, что CLI и lifecycle tests используют один runner/scenario. Это эмпирическое доказательство, не формальная теорема.
  • BENCH-298-02 cleanup при op/observer/setup failure — NO COUNTEREXAMPLE FOUND. CHECK=YES: в diff есть адресные failure-path tests; exact-head CI зелёный.
  • BENCH-298-03 donor oracle не должен импортировать production-reader как истину — FACT, CHECK=YES по diff: donor execution разбирается в benchmark support самостоятельно.

Evidence ledger: FACT — production runtime не изменён; FACT — exact-head remote gates зелёные; FACT — старый CodeRabbit test-theater finding устранён на более новом snapshot. ASSUMPTION — GitHub-hosted CI достаточно репрезентативен для заявленного benchmark-contract; PR не заявляет абсолютные performance numbers, поэтому это допущение не расширяет контракт.

Независимый контрпример, переживший текущие tests/gates, не найден. Autofix: НЕ БЫЛО.

Base automatically changed from fix/restore-corrupted-workflows to main September 7, 2026 02:53

Copy link
Copy Markdown
Contributor Author

Steward disposition: SUPERSEDED / close, не merge candidate.

FACT: current main@7d09c6dc5a496a24efa3682c8cbb8c827b9f2ba7; этот head a13f214c… diverged (ahead=8, behind=13, merge-base 19102c9b…) и тащит старый pre-#295 CI/dependency слой. Current authority agents-config/main:plans/lab-motion-production/r10.md не называет #298 current candidate: для PROFILE-01 владелец текущего paired lifecycle benchmark = #302, для независимого lifecycle/handoff contract = #300, compositor oracle = #301. #300 уже содержит explicit native→JS→native continuity, inherited velocity, stale callback/timer ownership и cleanup checks, то есть живой semantic contract из #298 не теряется.

Поэтому исторические receipts #298 остаются evidence, но старую 8-commit ветку не rebasing и не переносим в main. Если в #302/#300 при current-main пересборке обнаружится конкретное уникальное свойство #298, переносится только этот bounded counterexample, а не carrier целиком. Invalidation trigger: новый current plan снова назначит #298/его exact benchmark отдельным owner.

@lemone112 lemone112 closed this Sep 12, 2026
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