Repository navigation
🤖 refactor: split createUnderTaskTreeLifecycleLock, part 2: launch failure - #7703
Conversation
…ilure Moves the failLaunch closure of TaskService.createUnderTaskTreeLifecycleLock into failTaskLaunch and its steps: isLiveUnderLaunchAttempt (the liveUnderLaunchAttempt closure), endPublishedTaskLaunchFailure, stopFailedTaskLaunch, settleFailedTaskLaunch and finishTaskLaunchFailure. The launch locals materializedCheckout, attemptId, launchAttempt and launchSendAdmitted become one mutable TaskLaunchState record, so the failure path reads the values the launch wrote. The CAS outcome travels in a TaskLaunchFailureMark. After the CAS await the steps chain in the same tick, so no collaborator call runs later. The three call sites still `await` the failure while the method holds the global mutex; no step takes the mutex.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep it up! 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". |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
🟢 e2e stories (Haiku): 14 passed22 agent steps · 7 replayed from cache · 15 model calls · 46.2k tokens (28% cached) All 14 tests in 9 files
e2e 0.20.0 · 1m 13s · web · run artifacts 🟢 e2e Electron stories (Haiku): 3 passed3 agent steps · 3 model calls · 8.0k tokens (32% cached) All 3 tests in 3 files
e2e 0.20.0 · 18.6s · electron · run artifacts 🟢 e2e agent repros (Haiku): no tests selectedSpend: $0.00 of the $1.00 cap (proxy ledger) e2e 0.20.0 · 5.3s · 2 targets (web, phone) · run artifacts |
|
@codex review |
|
Codex Review: Didn't find any major issues. Nice work! 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". |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
@codex review |
|
Codex Review: Didn't find any major issues. 🎉 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". |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
Summary
Part 2 of 5: splits the launch-failure path (the
failLaunchclosure) ofTaskService.createUnderTaskTreeLifecycleLockin place, with no behaviour change. The method drops from CC 113 to CC 88. On top of part 1. 442 changed lines.Steps in this part
failTaskLaunchtakes the rollback options as an argument, because its three call sites pass different options.isLiveUnderLaunchAttemptchecks whether anything still runs under the launch attempt.endPublishedTaskLaunchFailurewrites the row marker as a CAS. When it fails, it logs and returns, with no settlement.stopFailedTaskLaunch,settleFailedTaskLaunchandfinishTaskLaunchFailurehandle the rest of the failure.TaskLaunchStaterecord holdsmaterializedCheckout,attemptId,launchAttemptandsendAdmitted. Those values are written after the record exists, andfailTaskLaunchreads them.failTaskLaunchreadslaunchAttemptonce when it starts, and nothing writes it during the failure path.Rules every part keeps
await using _lock = await this.mutex.acquire(). Inside that scope, a barereturn promisereleases the global mutex before the promise settles. So every call from the method to a step isawaitorreturn await, and no step acquires the mutex, which is not reentrant.make crap-checkagainst the parent commit reports 0 violations, with and without coverage. Every new function scores CC 8 or less.bun teston the taskService, ledger, workspaceTurnManager, workflows, tools and workspaceService suites: 4,968 pass, 0 fail. These suites include the 27 tests from 🤖 tests: cover createUnderTaskTreeLifecycleLock paths before the split #7701.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:high• Cost:$182.90