Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
All reported issues were addressed across 6 files
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
Size Report
Startup median (7 runs, lower is better):
|
|
There was a problem hiding this comment.
All reported issues were addressed across 17 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 12 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 12 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 2 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
|
Changes needed: the new re-press route has no live run yet, and the deadline now also gates the first press. CI is green (21 checks, none failing). I did not run tests locally, so I have not confirmed that each regression test fails on the prior head. I read the diff for the main re-press test only. This review is of 101a8ce. The changed route is: the accept fails with MAIN_THREAD_TIMEOUT, the verify read sees the same confirmation, the confirmation is pressed again, and the second press is accepted (launch-confirmation.ts:151). No live run reaches it. The only live run (iOS 27, 0de6310) accepted on the first press, and I have no log for it. The earlier pass at 097bead asked for this --debug run, and the head does not include it. Nothing shows that the verify read gets through RUNNER_BUSY (the runner client resends read-only commands up to 8 times) in time to leave the 22 s for another press, or that the second press lands. This is the failure #3861 reports. Please run Is the deadline plumbing needed beyond the re-press gate? The gate at launch-confirmation.ts:150-151 already checks for a whole press plus its read (22 s) before it presses again, and the 30 s envelope margin absorbs a preflight overrun. Could you keep the result-deadline plumbing (timeout-policy, the two admission sites, request-cancel, the contract field) and use it only in that gate? Then RunnerCommand.deadline, bindRunnerCommandDeadline, RUNNER_COMMAND_DEADLINE_SPENT_REASON, the port's beforeDeadline wrapper, the alert.ts deadline spread and the URL-owner lookup cap could go. That removes the runner-contract, runner-exchange, alert.ts and interactor-types changes and their tests (about half the production lines). It also removes the behavior change for the first press described next, and #4023 is filed for the per-phase runner bounds. The first-press change: the deadline in alert.ts:61 now governs the first press too. For accept, minTimeoutMs is the full 10 s watchdog, and bindRunnerCommandDeadline (runner-exchange.ts:287) refuses the command unsent when less than 10 s of the 60 s open budget is left. On main the first press was always sent. The prompt can sit behind openurl (up to 20 s), failed target discovery (15 s), cold runner startup (about 10 s or more on iOS 17.5), the 3 s presentation wait and the URL-owner lookup (up to 10 s). If those spend more than about 49 s, the open now fails with launch_confirmation_unanswered without pressing, although the client envelope still has 30 s or more. This timeline comes from the declared step bounds and the ~10 s cold start in #3861, not from a measurement. The rule should be that the deadline decides only whether to press again, applied at the one re-press gate. The first press and its verify read keep main's bounds. If the plumbing stays, give the first press a deadline at the client envelope (the result deadline plus REQUEST_TIMEOUT_BUDGET_MARGIN_MS), and add a test that a first press with 5 s left is still sent. Not blocking, take or leave: launch-confirmation.test.ts:790 hand-writes the deadline-spent AppError instead of throwing runnerCommandDeadlineSpentError() from runner-contract.ts, so a changed reason string would keep the test green while production misclassifies the refusal; and in commands.md:114 the re-press and timeout-cap sentences sit before 'Answer it with Before merge, please post the live iOS 17.5 run where the first accept hits the watchdog and the second press returns 'accepted', and decide whether the deadline should only gate the re-press. |
…ch-URL accept On a freshly started runner, the launch confirmation's Open press can time out on the runner's main-thread watchdog (MAIN_THREAD_TIMEOUT) while the "Open in" prompt stays up, and open then failed with launch_confirmation_unanswered with budget to spare. The answer now presses Open again while the same confirmation is still up, within a 25-second accept budget that holds a whole press. Any other accept failure, or a prompt that is gone, ends the answer as before. Fixes #3861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a later alert Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s deadline The re-press after a watchdog-abandoned accept used a fresh 25 s budget from the first press, which ignored the time open had already spent, and reserved only the press watchdog. The daemon now hands the open its request deadline: the enforced daemon deadline when the request has one, otherwise the transport admission time plus what the client envelope leaves the daemon. Another press starts only while that deadline covers the press and its verification read, each with a readiness preflight, and every runner alert command and the URL owner lookup are capped at the time left. A request without a deadline is not re-pressed. Refs #3861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p alert failures typed A request's result deadline is now recorded by the transport that admitted it, from the top-level command's client envelope, and an attempt registered under a parent inherits the parent's. A replay test attempt under an unbounded `test` request therefore has no deadline, instead of one counted from its own registration with the nested open's budget. An accept whose deadline already passed floored its retry window to 1 ms and could skip the loop and throw undefined; the first attempt now always runs. Refs #3861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…me the deadline tests exactly Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… hold The deadline only shrank the alert payload's timeout before the readiness preflight, and a spent deadline still dispatched with a 1 ms floor. An alert runner command now carries a host-side deadline that the exchange turns into the runner timeout right before the payload, after the preflight; a press left less than its whole watchdog, or any command left no time, is refused unsent with the typed `runner_command_deadline_spent`. Once the deadline has passed, the launch confirmation sends nothing, and a press refused unsent leaves the confirmation unanswered. Runner startup and transport overhead stay outside this bound. Refs #3861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…closure Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ine doc Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…line Review of 101a8ce: the per-command deadline also governed the first press, so a first press with less than 10 s of the open budget left was refused unsent where main pressed it. The request deadline now decides only whether to press again, at the one re-press gate (a whole press and its read, 22 s); the first press and every read keep their own runner bounds. This removes the opt-in runner command deadline, its exchange binding and typed refusal, the alert-leg deadline option and the URL-owner lookup cap. A new suite drives the answer through the real alert legs and runner client against a fake runner: an abandoned press is verified through two RUNNER_BUSY resends and pressed again with 49.4 s of a 60 s open left, and a first press with 5 s left is still sent with its full watchdog (refused on 101a8ce). Refs #3861 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the runner package index Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46dea77 to
e3fe452
Compare
|
Both points are addressed at e3fe452 (rebased on main after #3938; the 1. Live re-press route. iOS 17.5 is not installed on this host, and installing runtimes is out of scope, so I induced the watchdog on iPhone 17e (iOS 27.0) instead. The iOS 27 runtime has no shell to spawn a CPU loop inside the simulator. So for each attempt, a watcher
Attempt 4, The request log has After the second press the app was not yet observable. The existing settle then handed the URL over again ( The test that pins the route is the new 2. First press. Taken as you proposed. The request deadline now decides only whether to press again, at the one re-press gate ( The take-or-leave notes are taken. The hand-written deadline-spent error test went with the refusal. In Gate: |
|
The code looks good at e3fe452. The earlier evidence request from the 101a8ce review is now met, and CI is green with 21 checks and none failing. There are no conflicts. Not blocking, take or leave: the added parenthetical in the Of the open inline threads, these are fixed at this commit and can be resolved: the accept-budget wording in commands.md (#4017 (comment)), the retry loop in alert.ts (#4017 (comment)), the runner-mock reset in launch-confirmation.test.ts (#4017 (comment)), the result-deadline doc in request-cancel.ts (#4017 (comment), #4017 (comment)), the real-sleep test in alert.test.ts (#4017 (comment)), the test name in http-server-rpc-lifetime.test.ts (#4017 (comment)), the capped-timeout help sentence (#4017 (comment)), the deleted runner-exchange-deadline test (#4017 (comment)), and the deadlineAtMs option doc (#4017 (comment)). No open thread still applies. One limit on the evidence: the live run used iOS 27.0 with an induced SpringBoard stall, not iOS 17.5 as #3861 reports. The route and markers match, but the cold runner start and RUNNER_BUSY drain timing on 17.5 is still unmeasured. I read the live log excerpts only as quoted in the author comment, and I did not run the tests locally. The remaining step is for a maintainer to accept the iOS 27 induced-watchdog run in place of an iOS 17.5 run. |
Summary
A freshly started runner can fail the "Open in" accept with
MAIN_THREAD_TIMEOUT(typeddetails.runnerErrorCode) while the prompt stays up.openthen failed withlaunch_confirmation_unanswered. Now it pressesOpenagain, but only when the request's remaining time covers a whole press and its read: 2 × (1 s preflight + 10 s watchdog).testnothing is re-pressed.Follow-ups: #4023 (runner-wide deadline), #4024 (bounded test-attempt deadline).
Fixes #3861
Validation
101a8cef38and sent now.index-launch-confirmation.test.ts: real alert legs and runner client; the verify read passes twoRUNNER_BUSYresends, then the second press lands.RUNNER_BUSYresends, drain, re-press (remainingMs36822/36533/33523), second pressok=1,launchConfirmation: "accepted", no alert left. Logs are in the review reply. iOS 17.5 not measured.pnpm check:affected --run --head e3fe452aed: all runnable checks passed (exactCommit).🤖 Generated with Claude Code