fix(root): count a transition's delay toward the settle allowance - #825
Conversation
The parser read every number in a drop-zone transition separately, so `height .1s ease .05s` reported 100 and 50 and both cleared a 120ms allowance while the geometry kept moving for 150ms. Each entry is now summed as duration plus delay.
|
Warning Review limit reached
Next review available in: 46 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThe canvas geometry test now measures transition and animation timing from rendered drop zones in the canvas frame. It validates pinned geometry states and settle coverage. Canvas iframe discovery is shared through the exported ChangesCanvas geometry timing
Estimated code review effort: 4 (Complex) | ~45 minutes Merge Risk: 🔵 Low · up to This test-infrastructure change accounts for transition delays, but the current head can leave temporary state behind or treat unreadable animation times as zero, potentially contaminating later checks or allowing edge-case motion to appear settled. The bounded risk is mergeable with explicit owner awareness and follow-up. Sequence Diagram(s)sequenceDiagram
participant GeometryTest
participant canvasFrameOf
participant geometrySpanMs
participant CanvasDropZones
GeometryTest->>canvasFrameOf: Resolve canvas frame
GeometryTest->>geometrySpanMs: Measure geometry state
geometrySpanMs->>CanvasDropZones: Read computed styles
CanvasDropZones-->>geometrySpanMs: Return transition and animation timing
geometrySpanMs-->>GeometryTest: Return measured geometry span
GeometryTest->>GeometryTest: Compare span with POC_GEOMETRY_SETTLE_MS
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6c25e77a43
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
|
@nextly-bot review |
Two more defects in one parser: an unconditional comma split tore `cubic-bezier(.1,.7,1,.1)` into pieces and separated a delay from its duration, and an unsigned matcher read `-.05s` as its magnitude -- which would REJECT a transition the allowance already covers, the direction that gets a guard disabled. Entries now split at top level only, and the delay is signed: a negative delay starts the transition partway through, so it finishes earlier. The parser is exported and exercised directly on the shapes that broke it. Reading it off the real stylesheet cannot cover them -- the canvas does not currently use a timing function or a negative delay, and the guard is worth having for the day it does.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6c25e77a43
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
@nextlyhq/adapter-drizzle
@nextlyhq/adapter-mysql
@nextlyhq/adapter-postgres
@nextlyhq/adapter-sqlite
@nextlyhq/admin
@nextlyhq/admin-css
@nextlyhq/blocks-engine
@nextlyhq/blocks-react
@nextlyhq/builder
create-nextly-app
nextly
@nextlyhq/plugin-form-builder
@nextlyhq/plugin-page-builder
@nextlyhq/plugin-sdk
@nextlyhq/plugin-seo
@nextlyhq/storage-s3
@nextlyhq/storage-uploadthing
@nextlyhq/storage-vercel-blob
@nextlyhq/ui
commit: |
|
Claude finished @mobeenabdullah's task in 9m 36s —— View job Review run superseded — no review postedStatus: This run was invoked for head SHA What I verified before stopping
No findings were posted, no files were changed, and nothing was pushed. |
|
@codex please review this PR |
Nine defects in one regex over CSS, and every one was a silent wrong NUMBER rather than a refusal: a hardcoded allowance, an unsummed delay, commas inside a timing function, an unsigned delay, a unit-bearing identifier read as a time, a second declaration on one line never seen, calc() summed as separate numbers, and a colour's timing charged to the geometry budget. A regex cannot represent CSS, so the reader now reports what it could not evaluate instead of guessing, and the caller turns that into a failure naming the declaration. It also reads EVERY declaration on a line rather than the first, and charges only geometry properties to the allowance -- a background transition moves no edge the probe measures. Refusing is safe here because a refusal fails the test, which is the opposite of the direction all nine previous defects failed in.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a3ed9d0eda
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The reader that computed a transition's span from CSS source was wrong fourteen times: a hardcoded allowance, an unsummed delay, commas inside cubic-bezier(), an unsigned delay, a unit-bearing identifier mined for a duration, a second declaration never seen, calc() summed as separate numbers, a colour charged to the geometry budget, a property-last shorthand, an implicit-all shorthand, a non-exhaustive geometry list, longhand overrides, and a leading plus. Each fix was correct and each earned the next finding, because a regex over CSS source does not determine the answer asked of it. This asserts the declaration is UNCHANGED and makes no semantic claim, so it is complete by construction: every one of the fourteen changes the text and therefore trips it, and none needs the test to understand what changed. A cosmetic edit trips it too, which is the right direction -- whoever edits that line is who should re-check the allowance.
|
The parser is gone. Five of these six are the same finding for the tenth through fourteenth time, and that is the answer rather than five more fixes. Your five are all correct and I am not disputing any of them: a property-last shorthand (
So the test no longer parses CSS. It PINS the declaration and asserts it is unchanged. It makes no semantic claim, which is what makes it complete by construction: every one of the fourteen cases changes the text, so every one trips it, and none requires the test to understand what it changed to. The failure says the timing moved and to re-derive the allowance, rather than guessing by how much. The cost is real and I would rather state it than hide it: a cosmetic edit to that line trips it too. That is the right direction — whoever edits it is exactly who should re-check Proved by changing the real CSS to On the P1 — you are right and the cause is worth stating. The diagnostic pointed at |
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 373668e4dc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Pinning the stylesheet text alone passes while the driver's allowance is lowered underneath it, which lets the probe resume measuring an edge that is still travelling. The span that declaration produces now travels with the pin, and a second assertion requires the allowance to cover it. Either check alone is satisfiable while the pair is wrong: pinning misses a lowered allowance, and checking the allowance misses a lengthened transition.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 941feb29b3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
They were separate constants, and separate constants invite the half-edit: paste the new declaration, leave the number, and both assertions pass while the probe tolerates less than the canvas takes. One structure puts the span under the reader's cursor at the moment they change the text.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b6799848c3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The span was a hand-derived number sitting beside the declaration it came from. Grouping them did not make either derive from the other, so a maintainer updating the text and leaving the number widened what the probe tolerates with both assertions still passing. The rule is now injected into a real document and the transition-* longhands are read back. Those are already resolved: the shorthand is expanded, each property paired with its own duration and delay, times normalised, and calc(), var() and signed values evaluated. Nothing interprets CSS syntax any more. Computing this from source meant reimplementing CSS, and the only implementation guaranteed to agree with the canvas is the one the canvas runs in.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3af2088103
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
CSS repeats a timing list shorter than transition-property rather than padding it: one duration across three properties applies to all three. Treating a missing index as zero read a geometry transition as instant, so it passed any allowance. The file comment still described a hand-maintained span inside a structure that no longer exists -- the span is computed in a browser now. A comment describing absent code is worse than none.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 88f8367014
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A zero-iteration animation still contributed its delay, so animation .2s .4s 0 reported 400ms. Under the default fill mode nothing is applied before the first iteration and there is no first iteration, so the entry contributes nothing at all - delay included. The probe applied data-drag to every zone, but DropZone renders it only on the between-item zone; the empty placeholder carries data-active alone. A rule keyed on [data-drag] for an empty zone can never fire, so measuring it pinned a span for movement the canvas cannot produce. States are now synthesized per variant.
The fixture renders no empty zones - measured 7 .nx-pb-dropzone and 0 .nx-pb-dropzone-empty - so the control passed because its subject did not exist rather than because the fix worked; reverting the fix left it green. It now creates the element, asserts that population before the verdict, and fails when the per-variant filter is removed.
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a75ca032d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Every guard in this file booted a flat-list fixture, which renders no empty placeholder - measured 7 .nx-pb-dropzone and 0 .nx-pb-dropzone-empty. The driver waits on both shapes, so the pin and the allowance read as covering the canvas while measuring half of it, and nothing in their result showed that. Adds a fixture carrying both, and a population guard asserting both are present before the guards that depend on them run.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 86d06c0cd7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a647ff9b2e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1296a8eb62
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dc618721a0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9b23165b74
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ed8d6225c9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex please review this PR |
|
Codex Review: Didn't find any major issues. Can't wait for the next one! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Recovers a commit stranded by #806's merge.
#806 merged at
71b809f0f.ac43e99e7landed on the branch after GitHubcomputed that merge, so it never reached
main— the classic lost-tailshape from
.claude/rules/verifying-merged-work.md, found by screening<mergedHead>..<branch tip>after another lane's worktree audit reported#806 as merged while my local branch sat one commit ahead of it.
What is on main right now
The settle guard's parser reads every time token in a drop-zone
transitionseparately, soheight .1s ease .05sreports 100 and 50 andboth clear a 120ms allowance while the geometry keeps moving for 150ms.
The guard stays green while
dragToInsetInZonemay re-bracket a movingedge — a check that certifies the thing it was written to catch.
Confirmed by content rather than by ancestry, with the control both ways:
The fix
Each comma-separated
transitionentry is parsed on its own and summed asduration PLUS delay. It takes the FIRST time as the duration and the
SECOND as the delay, which is the shorthand's rule wherever the easing
keyword sits — summing every number in the entry would inflate the total
instead, failing in the safe direction for a false reason.
Proved by giving the real CSS a delay:
transition:height .1s ease .05sfails with
a drop-zone transition lasting 150ms is not covered by the driver's 120ms geometrySettleMs.No changeset: test-infrastructure only.
Summary by CodeRabbit