Skip to content

fix(nevermore-cli): Per-endpoint rate limits, and test scripts return their results - #837

Merged
Quenty merged 3 commits into
mainfrom
users/quenty/rate-limit-per-endpoint
Oct 20, 2026
Merged

Quenty merged 3 commits into
mainfrom
users/quenty/rate-limit-per-endpoint

Conversation

@Quenty

@Quenty Quenty commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

Cloud test and deploy runs no longer stall on unrelated requests when Roblox's Luau task-creation quota (5 per minute) runs out, because the Open Cloud rate limiter now tracks each endpoint's quota separately, and the spinner shows the wait ("Scheduling (rate limited 47s)") instead of looking hung. Every package test script and the nevermore init templates now return the test runner's results, so a single nevermore test --cloud reports exact counts instead of scraping them from truncatable logs. The scraping fallback warning is down to one line.

…w waits in the spinner

Open Cloud meters each endpoint separately (Luau task creation is 5/min,
task polling 200/min), but the rate limiter kept a single remaining/reset
pair for every request. When task creation spent its quota, the next poll
waited out the full window even though polling had plenty left.

The limiter now keys quota state by method and endpoint path, and reports
every wait it takes. Cloud test and deploy runs show the wait as the
package's progress label ("Scheduling (rate limited 47s)"), so a
package sitting on "Scheduling" no longer looks hung. --verbose prints
each response's quota headers as [rate-limit] lines.
@Quenty
Quenty deployed to integration October 19, 2026 21:16 — with GitHub Actions Active
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Deploy Results

Package Status Try it
@quenty/integration ✅ Deployed (v231) (2.6s) Open | Play

1 package deployed, 1 passed, 0 failed in 3.7s · View logs

Test Results

Package Status Try it
@quenty/access ⚠️ Passed (311/311) - logs lost (4.2s) Open | Play
@quenty/adorneeboundingbox ⚠️ Passed (49/49) - logs lost (2.0s) Open | Play
@quenty/adorneeutils ⚠️ Passed (95/95) - logs lost (952ms) Open | Play
@quenty/brine ⚠️ Passed (88/90) - logs lost (1.2s) Open | Play
@quenty/weldconstraintutils ⚠️ Passed (12/12) - logs lost (1.0s) Open | Play
@quenty/animations ⚠️ Passed (8/8) - logs lost (900ms) Open | Play
@quenty/attributeutils ⚠️ Passed (75/75) - logs lost (1.6s) Open | Play
@quenty/ragdoll ⚠️ Passed (12/12) - logs lost (1.9s) Open | Play
@quenty/ik ⚠️ Passed (3/3) - logs lost (1.2s) Open | Play
@quenty/rogue-humanoid ⚠️ Passed (0/0) - logs lost, ran 0 tests (1.3s) Open | Play
@quenty/rogue-properties ⚠️ Passed (153/153) - logs lost (2.5s) Open | Play
@quenty/soundgroup ⚠️ Passed (8/8) - logs lost (1.1s) Open | Play
@quenty/saveslot ⚠️ Passed (249/249) - logs lost (9.4s) Open | Play
@quenty/chatproviderservice ⚠️ Passed (9/9) - logs lost (1.7s) Open | Play
@quenty/conditions ⚠️ Passed (0/0) - logs lost, ran 0 tests (968ms) Open | Play
@quenty/gameconfig ⚠️ Passed (12/12) - logs lost (1.8s) Open | Play
@quenty/gameproductservice ⚠️ Passed (92/92) - logs lost (2.3s) Open | Play
@quenty/settings ⚠️ Passed (14/14) - logs lost (1.6s) Open | Play
@quenty/settings-inputkeymap ⚠️ Passed (1/1) - logs lost (1.5s) Open | Play
@quenty/tie ⚠️ Passed (72/72) - logs lost (1.7s) Open | Play
@quenty/clienttranslator ⚠️ Passed (186/186) - logs lost (2.5s) Open | Play
@quenty/inputkeymaputils ⚠️ Passed (6/6) - logs lost (1.4s) Open | Play
@quenty/scoredactionservice ⚠️ Passed (107/107) - logs lost (2.6s) Open | Play
@quenty/time ⚠️ Passed (191/191) - logs lost (2.2s) Open | Play
@quenty/countdowntext ⚠️ Passed (8/8) - logs lost (1.2s) Open | Play
@quenty/cmdrservice ⚠️ Passed (10/10) - logs lost (1.7s) Open | Play
@quenty/datastore ⚠️ Passed (386/386) - logs lost (39.1s) Open | Play
@quenty/secrets ⚠️ Passed (2/2) - logs lost (1.4s) Open | Play
@quenty/deathreport ✅ Passed (106/106) (2.6s) Open | Play
@quenty/templateprovider ✅ Passed (60/60) (1.4s) Open | Play
@quenty/playermock ✅ Passed (407/407) (2.9s) Open | Play
@quenty/camera ✅ Passed (56/56) (1.6s) Open | Play
@quenty/characterutils ✅ Passed (52/52) (1.6s) Open | Play
@quenty/clipcharacters ✅ Passed (1/1) (1.0s) Open | Play
@quenty/coreguienabler ✅ Passed (5/5) (1.3s) Open | Play
@quenty/playerutils ✅ Passed (36/36) (1.1s) Open | Play
@quenty/permissionprovider ✅ Passed (68/68) (1.7s) Open | Play
@quenty/resetservice ✅ Passed (17/17) (1.3s) Open | Play
@quenty/friendutils ✅ Passed (13/13) (1.1s) Open | Play
@quenty/grouputils ✅ Passed (15/15) (635ms) Open | Play
@quenty/humanoidkillerutils ✅ Passed (28/28) (2.6s) Open | Play
@quenty/humanoidtracker ✅ Passed (22/22) (1.0s) Open | Play
@quenty/playerhumanoidbinder ✅ Passed (25/25) (1.7s) Open | Play
@quenty/marketplaceutils ✅ Passed (20/20) (1.1s) Open | Play
@quenty/playerbinder ✅ Passed (8/8) (1.1s) Open | Play
@quenty/playersservicepromises ✅ Passed (3/3) (635ms) Open | Play
@quenty/playerthumbnailutils ✅ Passed (4/4) (734ms) Open | Play
@quenty/blend ✅ Passed (3/3) (834ms) Open | Play
@quenty/snackbar ✅ Passed (3/3) (1.1s) Open | Play
@quenty/fakeskybox ✅ Passed (3/3) (952ms) Open | Play
@quenty/elo ✅ Passed (5/5) (1.1s) Open | Play
@quenty/genericscreenguiprovider ✅ Passed (8/8) (1.1s) Open | Play
@quenty/observablecollection ✅ Passed (244/244) (2.2s) Open | Play
@quenty/lipsum ✅ Passed (4/4) (1.0s) Open | Play
@quenty/timedtween ✅ Passed (28/28) (1.9s) Open | Play
@quenty/transitionmodel ✅ Passed (121/121) (3.5s) Open | Play
@quenty/receiptprocessing ✅ Passed (4/4) (917ms) Open | Play
@quenty/remoting ✅ Passed (70/70) (1.1s) Open | Play
@quenty/roblox-api-dump ✅ Passed (32/33) (1.4s) Open | Play
@quenty/streamingutils ✅ Passed (6/6) (1.2s) Open | Play
@quenty/teleportserviceutils ✅ Passed (144/144) (6.8s) Open | Play
@quenty/teamutils ✅ Passed (24/24) (901ms) Open | Play
@quenty/userserviceutils ✅ Passed (6/6) (1.2s) Open | Play
@quenty/binder ✅ Passed (95/95) (1.6s) Open | Play
@quenty/boundlinkutils ✅ Passed (14/14) (1.3s) Open | Play
@quenty/rxbinderutils ✅ Passed (45/45) (1.2s) Open | Play
@quenty/brio ✅ Passed (35/35) (885ms) Open | Play
@quenty/instanceutils ✅ Passed (15/15) (885ms) Open | Play
@quenty/humanoidutils ✅ Passed (31/31) (1.1s) Open | Play
@quenty/screenshothudservice ⚠️ Passed (0/0) - ran 0 tests (844ms) Open | Play
@quenty/influxdbclient ✅ Passed (163/163) (1.9s) Open | Play
@quenty/ellipticcurvecryptography ✅ Passed (3/3) (20.9s) Open | Play
@quenty/experiencecalculator ✅ Passed (2/2) (651ms) Open | Play
@quenty/fzy ✅ Passed (31/31) (751ms) Open | Play
@quenty/instance-path ✅ Passed (51/51) (668ms) Open | Play
@quenty/jestutils ✅ Passed (11/11) (635ms) Open | Play
@quenty/steputils ✅ Passed (44/44) (1.4s) Open | Play
@quenty/maid ✅ Passed (5/5) (584ms) Open | Play
@quenty/servicebag ✅ Passed (13/13) (768ms) Open | Play
@quenty/rx ✅ Passed (3/3) (868ms) Open | Play
@quenty/nevermoreclimanifest ✅ Passed (12/12) (667ms) Open | Play
@quenty/physicsutils ✅ Passed (26/26) (951ms) Open | Play
@quenty/octree ✅ Passed (66/66) (969ms) Open | Play
@quenty/promise ✅ Passed (127/127) (2.3s) Open | Play
@quenty/pagesutils ✅ Passed (8/8) (584ms) Open | Play
@quenty/promisemaid ✅ Passed (7/7) (618ms) Open | Play
@quenty/nevermore-test-runner ✅ Passed (14/14) (468ms) Open | Play
@quenty/randomutils ✅ Passed (5/5) (601ms) Open | Play
@quenty/string ✅ Passed (48/48) (634ms) Open | Play
@quenty/throttle ✅ Passed (5/5) (517ms) Open | Play
@quenty/vector3utils ✅ Passed (42/42) (1.7s) Open | Play

91 packages tested, 91 passed, 0 failed in 4m3s
⚠️ 28 package(s) lost their log output — their counts came back in the run's summary, but nothing could be checked for tracebacks
⚠️ 3 package(s) ran 0 tests — check test discovery · View logs

…act counts

A single package run reads its counts from what the test script returns,
but almost every test script discarded the guard's results, so single runs
scraped counts out of Open Cloud's truncatable log text and warned about it
on every run. Every package test script and the nevermore init templates now
return the guard's results.

The scraping fallback warning is also cut to one line; the log volume detail
moves to --verbose.
@Quenty Quenty changed the title fix(nevermore-cli): Track Open Cloud rate limits per endpoint and show waits in the spinner fix(nevermore-cli): Per-endpoint rate limits, and test scripts return their results Oct 19, 2026
@Quenty
Quenty deployed to integration October 19, 2026 21:49 — with GitHub Actions Active
The batch test runner script is now a set of BatchTestRunnerUtils helpers
(isolate a package, reset its results mailbox, run its script, build its
result) instead of one long loop. Behavior is unchanged: the same markers,
failure text, and order of isolation, yields, and cleanup.
@Quenty
Quenty deployed to integration October 19, 2026 23:53 — with GitHub Actions Active
@Quenty
Quenty merged commit 588c2d2 into main Oct 20, 2026
11 checks passed
@Quenty
Quenty deleted the users/quenty/rate-limit-per-endpoint branch October 20, 2026 03:14
@Quenty

Quenty commented Oct 20, 2026

Copy link
Copy Markdown
Owner Author

🚀 PR was released in @quenty/access@1.12.1, @quenty/actionmanager@13.42.1, @quenty/adorneeboundingbox@8.54.1, @quenty/adorneedata@7.44.1, @quenty/adorneeutils@3.6.3, @quenty/adorneevalue@10.52.1, @quenty/aggregator@1.23.1, @quenty/animationgroup@10.17.3, @quenty/animationprovider@11.55.1, @quenty/animations@8.41.1, @quenty/applytagtotaggedchildren@10.16.3, @quenty/assetserviceutils@5.42.1, @quenty/attributeutils@14.39.1, @quenty/avatareditorutils@7.55.1, @quenty/badgeutils@10.25.1, @quenty/baseobject@10.16.3, @quenty/basicpane@13.39.1, @quenty/bindable-utils@1.1.3, @quenty/binder@14.48.1, @quenty/bindtocloseservice@8.46.1, @quenty/blend@12.51.1, @quenty/bodycolorsutils@7.51.1, @quenty/boundlinkutils@14.49.1, @quenty/brine@1.22.1, @quenty/brio@14.38.1, @quenty/buttondragmodel@1.43.1, @quenty/buttonhighlightmodel@14.51.1, @quenty/camera@14.58.1, @quenty/camerastoryutils@10.36.1, @quenty/canceltoken@11.26.1, @quenty/characterutils@12.46.1, @quenty/chatproviderservice@9.75.1, @quenty/clienttranslator@14.54.1, @quenty/clipcharacters@12.56.1, @quenty/cmdrservice@13.64.1, @quenty/collectionserviceutils@8.39.1, @quenty/color3utils@11.51.1, @quenty/colorpalette@10.55.1, @quenty/colorpicker@10.52.1, @quenty/conditions@10.52.1, @quenty/contentproviderutils@12.40.1, @quenty/convexhull@4.19.3, @quenty/cooldown@11.54.1, @quenty/coreguienabler@12.47.1, @quenty/coreguiutils@10.28.1, @quenty/countdowntext@4.13.1, @quenty/counter@7.39.1, @quenty/datastore@13.59.1, @quenty/deathreport@10.62.1, @quenty/depthoffield@11.53.1, @quenty/draw@7.17.3, @quenty/ellipticcurvecryptography@1.15.3, @quenty/elo@7.52.1, @quenty/enabledmixin@11.35.1, @quenty/equippedtracker@13.48.1, @quenty/experiencecalculator@2.14.3, @quenty/fakeskybox@11.33.1, @quenty/firstpersoncharactertransparency@14.48.1, @quenty/flipbook@9.46.1, @quenty/friendutils@12.44.1, @quenty/funnels@1.41.1, @quenty/fzy@5.18.3, @quenty/gameconfig@12.71.1, @quenty/gameproductservice@14.75.1, @quenty/gamescalingutils@13.51.1, @quenty/gameversionutils@3.10.1, @quenty/generatewithmixin@11.14.3, @quenty/genericscreenguiprovider@13.54.1, @quenty/geometryutils@6.17.3, @quenty/getpercentexposedutils@10.12.3, @quenty/grouputils@10.33.1, @quenty/guivisiblemanager@12.31.1, @quenty/hide@11.51.1, @quenty/highlight@10.56.1, @quenty/hintscoringutils@14.59.1, @quenty/httppromise@10.26.1, @quenty/humanoiddescriptionutils@10.31.1, @quenty/humanoidkillerutils@2.5.1, @quenty/humanoidspeed@12.68.1, @quenty/humanoidtracker@13.44.1, @quenty/humanoidutils@2.21.1, @quenty/idleservice@13.73.1, @quenty/ik@15.74.1, @quenty/immediateutils@1.9.1, @quenty/influxdbclient@7.46.1, @quenty/inputkeymaputils@14.60.1, @quenty/inputmode@13.43.1, @quenty/inputobjectutils@4.43.1, @quenty/insertserviceutils@10.25.1, @quenty/instance-path@1.2.3, @quenty/instanceutils@13.38.1, @quenty/iris@1.8.1, @quenty/jecs@1.10.2, @quenty/jestutils@1.1.3, @quenty/jsonutils@10.25.1, @quenty/linkutils@13.39.1, @quenty/lipsum@14.51.1, @quenty/localizedtextutils@12.40.1, @quenty/maid@3.12.3, @quenty/marketplaceutils@11.35.1, @quenty/memorystoreutils@6.25.1, @quenty/messagingserviceutils@7.30.1, @quenty/modeltransparencyeffect@11.30.1, @quenty/motor6d@7.58.1, @quenty/mouseovermixin@10.17.3, @quenty/mouseshiftlockservice@11.26.1, @quenty/multipleclickutils@13.35.1, @quenty/networkownerservice@5.12.3, @quenty/networkropeutils@10.16.3, @quenty/nevermore-cli@4.47.1, @quenty/nevermore-test-runner@1.6.3, @quenty/nevermoreclimanifest@1.11.1, @quenty/nocollisionconstraintutils@10.16.3, @quenty/observablecollection@12.54.1, @quenty/octree@11.17.3, @quenty/overriddenproperty@10.18.3, @quenty/pagesutils@5.26.1, @quenty/particleengine@13.48.1, @quenty/particles@5.18.3, @quenty/parttouchingcalculator@14.57.1, @quenty/pathfindingutils@10.26.1, @quenty/performanceutils@4.13.3, @quenty/permissionprovider@14.54.1, @quenty/physicsutils@8.36.1, @quenty/playerbinder@14.52.1, @quenty/playerhumanoidbinder@14.53.1, @quenty/playerinputmode@9.54.1, @quenty/playermock@1.11.1, @quenty/playersservicepromises@10.31.1, @quenty/playerthumbnailutils@10.31.1, @quenty/playerutils@8.46.1, @quenty/policyserviceutils@6.25.1, @quenty/promise@10.25.1, @quenty/promisemaid@5.25.1, @quenty/promptqueue@1.52.1, @quenty/propertyvalue@7.38.1, @quenty/qframe@10.37.1, @quenty/r15utils@13.39.1, @quenty/racketingropeconstraint@12.57.1, @quenty/radial-image@9.52.1, @quenty/ragdoll@15.73.1, @quenty/randomutils@6.20.3, @quenty/receiptprocessing@7.47.1, @quenty/remotefunctionutils@10.25.1, @quenty/remoting@12.46.1, @quenty/resetservice@11.52.1, @quenty/rigbuilderutils@10.49.1, @quenty/roblox-api-dump@8.37.1, @quenty/rogue-humanoid@10.68.1, @quenty/rogue-properties@11.64.1, @quenty/rx@13.35.1, @quenty/rxbinderutils@14.48.1, @quenty/rxsignal@7.35.1, @quenty/saveslot@2.15.1, @quenty/scoredactionservice@16.61.1, @quenty/screenshothudservice@7.43.1, @quenty/scrollingframe@12.22.3, @quenty/seatutils@7.48.1, @quenty/secrets@7.72.1, @quenty/selectionutils@8.39.1, @quenty/servicebag@11.21.3, @quenty/settings-inputkeymap@10.78.1, @quenty/settings@11.75.1, @quenty/singleton@6.17.3, @quenty/snackbar@11.57.1, @quenty/socialserviceutils@10.25.1, @quenty/softshutdown@10.11.1, @quenty/soundgroup@1.59.1, @quenty/soundplayer@7.60.1, @quenty/sounds@10.29.1, @quenty/spawning@10.66.1, @quenty/sprites@13.43.1, @quenty/statestack@14.40.1, @quenty/steputils@3.9.3, @quenty/streamingutils@10.33.1, @quenty/string@3.5.3, @quenty/sunpositionutils@2.22.1, @quenty/teamtracker@13.39.1, @quenty/teamutils@10.40.1, @quenty/teleportserviceutils@10.8.1, @quenty/templateprovider@11.55.1, @quenty/textboxutils@7.35.1, @quenty/textfilterservice@13.46.1, @quenty/textfilterutils@10.25.1, @quenty/textserviceutils@13.51.1, @quenty/throttle@10.15.3, @quenty/tie@10.52.1, @quenty/time@2.7.1, @quenty/timedtween@7.51.1, @quenty/timesyncservice@13.47.1, @quenty/toolutils@1.30.1, @quenty/trajectory@2.18.3, @quenty/transitionmodel@7.53.1, @quenty/ugcsanitize@1.25.1, @quenty/uiobjectutils@6.42.1, @quenty/undostack@7.39.1, @quenty/userserviceutils@9.45.1, @quenty/valuebaseutils@13.38.1, @quenty/valueobject@13.39.1, @quenty/vector3utils@10.12.3, @quenty/viewport@11.59.1, @quenty/voicechat@5.25.1, @quenty/weldconstraintutils@3.2.3 🚀

@Quenty Quenty added the released This issue/pull request has been released. label Oct 20, 2026

This branch was successfully deployed

1 active deployment
integration — 5128efb7 Deployed Oct 19, 2026 by Quenty via integration #676
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released This issue/pull request has been released.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant