Skip to content

fix(issue): clearLock leaves dead workers row at status='active' (crash-recovery.js:168)#6201

Merged
jeremymcs merged 1 commit into
mainfrom
issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171
May 16, 2026
Merged

fix(issue): clearLock leaves dead workers row at status='active' (crash-recovery.js:168)#6201
jeremymcs merged 1 commit into
mainfrom
issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171

Conversation

@jeremymcs
Copy link
Copy Markdown
Collaborator

@jeremymcs jeremymcs commented May 16, 2026

Summary

  • Added dead-PID worker status cleanup (activestopping) in clear-lock/session-lock/remote-check paths and verified with focused GSD DB/lock tests (22/22 passing).

Verification

  • Completed in the repository worktree before push.

Related Issue

Repo

  • gsd-build/gsd-2

Branch

  • issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Improved cleanup of stale worker processes by implementing PID-based worker lifecycle tracking.
    • Enhanced crash recovery coordination to better handle dead worker detection and mark them appropriately.
    • Strengthened session lock management with better preflight checks and orphaned process handling.
  • Tests

    • Added test coverage for worker lifecycle management during crash recovery scenarios.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

📝 Walkthrough

Walkthrough

This PR adds a new database helper function markWorkerStoppingByPid to mark auto-workers as stopping based on process ID and project root, then integrates this helper into session-lock acquisition, crash-recovery cleanup, and auto-session checking to prevent dead-PID workers from remaining in active state.

Changes

Stale Worker PID-Based Cleanup

Layer / File(s) Summary
markWorkerStoppingByPid DB helper and unit test
src/resources/extensions/gsd/db/auto-workers.ts, src/resources/extensions/gsd/tests/auto-workers.test.ts
New exported function markWorkerStoppingByPid(projectRootRealpath, pid) updates active worker rows to stopping status within a transaction, with unit test verifying the status transition.
Session lock preflight and stale-lock recovery
src/resources/extensions/gsd/session-lock.ts, src/resources/extensions/gsd/tests/session-lock-regression.test.ts
acquireSessionLock now performs preflight checks on existing lock PIDs, marks dead PIDs as stopping before acquisition, refactors stale-lock cleanup to compute dead PIDs explicitly, and adds regression test covering dead-PID recovery with worker status validation.
Crash recovery legacy-lock cleanup
src/resources/extensions/gsd/crash-recovery.ts
clearLock refactored to read legacy lock PID and call markWorkerStoppingByPid instead of prior worker-ID lookup pattern.
Auto-session stale-lock detection
src/resources/extensions/gsd/auto.ts
checkRemoteAutoSession marks worker as stopping when remote lock PID is detected as dead, adding coordination bookkeeping before returning stale status.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • gsd-build/gsd-2#6057: Modifies clearLock() in crash-recovery.ts to transition stale DB workers; this PR replaces that pattern with the new PID-based markWorkerStoppingByPid flow.
  • gsd-build/gsd-2#5720: Updates session-lock.ts and dead-PID handling in stale-worker detection; this PR adds DB coordination via markWorkerStoppingByPid to that flow.

Poem

🐰 A worker goes still, its PID now dust,
But the database kept its pulse—a trust gone bust.
Now mark it stopping, by number true,
And let the session lock fly clean and new!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly identifies the main issue (clearLock leaving dead workers at active status) and references the specific location (crash-recovery.js:168), accurately describing the primary fix.
Linked Issues check ✅ Passed All requirements from issue #5667 are met: markWorkerStoppingByPid helper added to db/auto-workers.ts, called from crash-recovery.ts, auto.ts, and session-lock.ts as specified, with tests validating the behavior.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the issue: introducing markWorkerStoppingByPid and integrating it into the three specified code paths plus tests, with no extraneous modifications.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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.

❤️ Share

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

@github-actions
Copy link
Copy Markdown
Contributor

🔴 PR Risk Report — CRITICAL

Files changed 6
Systems affected 1
Overall risk 🔴 CRITICAL

Affected Systems

Risk System
🔴 critical Auto Engine
File Breakdown
Risk File Systems
🔴 src/resources/extensions/gsd/auto.ts Auto Engine
src/resources/extensions/gsd/crash-recovery.ts (unclassified)
src/resources/extensions/gsd/db/auto-workers.ts (unclassified)
src/resources/extensions/gsd/session-lock.ts (unclassified)
src/resources/extensions/gsd/tests/auto-workers.test.ts (unclassified)
src/resources/extensions/gsd/tests/session-lock-regression.test.ts (unclassified)

⚠️ 🔴 Critical risk — the following systems require verification before merge:

  • 🔴 Auto Engine: validate auto-mode trigger conditions and loop termination

⛔ This PR should not be merged without executing this follow-up prompt.

Ask your coding agent to verify before submitting:

Review this PR for risks in: Auto Engine. Verify:

1. validate auto-mode trigger conditions and loop termination

Before modifying any code, assess the scope of this fix:

- Identify the root cause, not just the reported symptom.
- Search the codebase for other call sites, similar patterns, or duplicated logic that may share the same bug.
- List affected tests, documentation, and any downstream consumers that depend on the current behavior.
- Flag any changes that extend beyond the immediate file or function.

Report findings first. Then propose a fix scoped to the actual root cause, and wait for confirmation before applying changes outside the originally reported location.

💡 Have a Codex subscription? Get an independent second opinion: codex review --adversarial

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/resources/extensions/gsd/crash-recovery.ts (1)

226-226: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Read legacy lock metadata before deleting the file.

Line 226 deletes the legacy lock first, then Line 238 reads it. That makes lock?.pid unreachable, so markWorkerStoppingByPid never runs.

💡 Proposed fix
 export function clearLock(basePath: string): void {
-  clearLegacyLockFile(basePath);
+  const legacyLock = readLegacyLock(basePath);
+  clearLegacyLockFile(basePath);
@@
-    const lock = readLegacyLock(basePath);
-    if (lock?.pid) markWorkerStoppingByPid(projectRoot, lock.pid);
+    if (legacyLock?.pid) markWorkerStoppingByPid(projectRoot, legacyLock.pid);

Also applies to: 238-239

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/resources/extensions/gsd/crash-recovery.ts` at line 226, The code deletes
the legacy lock file via clearLegacyLockFile(basePath) before reading its
metadata, which prevents accessing lock?.pid and stops markWorkerStoppingByPid
from running; fix by first reading the legacy lock into a local variable (the
code that currently accesses lock?.pid), call markWorkerStoppingByPid(lock.pid)
if present, and only then call clearLegacyLockFile(basePath) so the lock
metadata is available when markWorkerStoppingByPid is invoked.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/resources/extensions/gsd/db/auto-workers.ts`:
- Around line 173-181: The UPDATE that marks a worker as 'stopping' should also
write the stopped_at timestamp; modify the SQL in
src/resources/extensions/gsd/db/auto-workers.ts so the statement sets stopped_at
= CURRENT_TIMESTAMP (or the DB's equivalent) along with status = 'stopping',
keeping the same WHERE conditions that use :pid and :project_root and the
existing run call that passes pid and projectRootRealpath; ensure the column
name stopped_at is included in the SET clause next to status so downstream
diagnostics/cleanup see the stop time.

In `@src/resources/extensions/gsd/session-lock.ts`:
- Around line 288-290: The cleanup path can incorrectly mark the current process
as stopping because isPidAlive(pid) returns false for pid === process.pid;
update the guards around existingPreflight usage (the checks that call
isPidAlive and then markWorkerStoppingByPid) to explicitly skip cleanup when
existingPreflight.pid === process.pid (or equals process.pid), e.g. add a
condition that verifies existingPreflight.pid !== process.pid before calling
markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
ensure the same change is applied to the other occurrences of this pattern (the
checks around lines referencing existingPreflight, isPidAlive,
markWorkerStoppingByPid).

In `@src/resources/extensions/gsd/tests/session-lock-regression.test.ts`:
- Line 110: The test uses a non-deterministic "deadPid" value (const deadPid =
99999) which may be a real PID on some systems; replace that literal with a
guaranteed-invalid PID such as Number.MAX_SAFE_INTEGER (or another very large
constant) to ensure deterministically-dead behavior. Update the const deadPid
declaration in the session-lock-regression.test (the const deadPid variable) to
use Number.MAX_SAFE_INTEGER (or a helper like getDeterministicDeadPid() that
returns a very large/invalid PID) so the test cannot accidentally target a live
process.

---

Outside diff comments:
In `@src/resources/extensions/gsd/crash-recovery.ts`:
- Line 226: The code deletes the legacy lock file via
clearLegacyLockFile(basePath) before reading its metadata, which prevents
accessing lock?.pid and stops markWorkerStoppingByPid from running; fix by first
reading the legacy lock into a local variable (the code that currently accesses
lock?.pid), call markWorkerStoppingByPid(lock.pid) if present, and only then
call clearLegacyLockFile(basePath) so the lock metadata is available when
markWorkerStoppingByPid is invoked.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ed2ef72a-ef5b-41f8-a6ed-be2ab7db5716

📥 Commits

Reviewing files that changed from the base of the PR and between 74bba52 and 31f076e.

📒 Files selected for processing (6)
  • src/resources/extensions/gsd/auto.ts
  • src/resources/extensions/gsd/crash-recovery.ts
  • src/resources/extensions/gsd/db/auto-workers.ts
  • src/resources/extensions/gsd/session-lock.ts
  • src/resources/extensions/gsd/tests/auto-workers.test.ts
  • src/resources/extensions/gsd/tests/session-lock-regression.test.ts

Comment thread src/resources/extensions/gsd/db/auto-workers.ts
Comment thread src/resources/extensions/gsd/session-lock.ts
Comment thread src/resources/extensions/gsd/tests/session-lock-regression.test.ts
@jeremymcs
Copy link
Copy Markdown
Collaborator Author

🤖 Dispatched codex with the following prompt:

Agent prompt (click to expand)
You are acting as an autonomous PR babysitter for gsd-build/gsd-2 PR #6201.
PR URL: https://github.com/gsd-build/gsd-2/pull/6201
Base repository: gsd-build/gsd-2
Head repository: gsd-build/gsd-2
Head branch: issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171
Head remote: origin
You are running inside an isolated app-owned worktree under ~/.patchdeck.
Make only targeted changes that resolve the approved tasks.
Do not wait for user input, confirmation, or approval at any point.
Do not rewrite unrelated files.
Use the available git tooling for inspection and verification only.
If dependencies are missing, install them using the repository's lockfile/package manager as needed inside this isolated worktree.
Leave file edits uncommitted; the babysitter app will handle Git finalization after your run.
GitHub follow-up replies and review-thread resolution will be handled by the babysitter after your run.
If a task is invalid after inspection, explain it in your final response and include the exact audit token.

Approved review-comment tasks:
1. [general_comment] coderabbitai[bot]
   file=n/a line=n/a
   sourceId=4465611709 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#issuecomment-4465611709
   replyKind=general_comment threadId=n/a threadResolved=n/a
   auditToken=codefactory-feedback:gh-issue-comment-4465611709
   <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough

This PR adds a new database helper function `markWorkerStoppingByPid` to mark auto-workers as stopping based on process ID and project root, then integrates this helper into session-lock acquisition, crash-recovery cleanup, and auto-session checking to prevent dead-PID workers from remaining in active state.

## Changes

**Stale Worker PID-Based Cleanup**

|Layer / File(s)|Summary|
|---|---|
|**markWorkerStoppingByPid DB helper and unit test** <br> `src/resources/extensions/gsd/db/auto-workers.ts`, `src/resources/extensions/gsd/tests/auto-workers.test.ts`|New exported function `markWorkerStoppingByPid(projectRootRealpath, pid)` updates active worker rows to `stopping` status within a transaction, with unit test verifying the status transition.|
|**Session lock preflight and stale-lock recovery** <br> `src/resources/extensions/gsd/session-lock.ts`, `src/resources/extensions/gsd/tests/session-lock-regression.test.ts`|`acquireSessionLock` now performs preflight checks on existing lock PIDs, marks dead PIDs as stopping before acquisition, refactors stale-lock cleanup to compute dead PIDs explicitly, and adds regression test covering dead-PID recovery with worker status validation.|
|**Crash recovery legacy-lock cleanup** <br> `src/resources/extensions/gsd/crash-recovery.ts`|`clearLock` refactored to read legacy lock PID and call `markWorkerStoppingByPid` instead of prior worker-ID lookup pattern.|
|**Auto-session stale-lock detection** <br> `src/resources/extensions/gsd/auto.ts`|`checkRemoteAutoSession` marks worker as stopping when remote lock PID is detected as dead, adding coordination bookkeeping before returning stale status.|

## Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

## Possibly related PRs

- [gsd-build/gsd-2#6057](https://github.com/gsd-build/gsd-2/pull/6057): Modifies `clearLock()` in `crash-recovery.ts` to transition stale DB workers; this PR replaces that pattern with the new PID-based `markWorkerStoppingByPid` flow.
- [gsd-build/gsd-2#5720](https://github.com/gsd-build/gsd-2/pull/5720): Updates `session-lock.ts` and dead-PID handling in stale-worker detection; this PR adds DB coordination via `markWorkerStoppingByPid` to that flow.

## Poem

> 🐰 *A worker goes still, its PID now dust,*  
> *But the database kept its pulse—a trust gone bust.*  
> *Now mark it stopping, by number true,*  
> *And let the session lock fly clean and new!* ✨

</details>

<!-- walkthrough_end -->
<!-- pre_merge_checks_walkthrough_start -->

<details>
<summary>🚥 Pre-merge checks | ✅ 5</summary>

<details>
<summary>✅ Passed checks (5 passed)</summary>

|         Check name         | Status   | Explanation                                                                                                                                                                                                          |
| :------------------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                          |
|         Title check        | ✅ Passed | The PR title clearly identifies the main issue (clearLock leaving dead workers at active status) and references the specific location (crash-recovery.js:168), accurately describing the primary fix.                |
|     Linked Issues check    | ✅ Passed | All requirements from issue `#5667` are met: markWorkerStoppingByPid helper added to db/auto-workers.ts, called from crash-recovery.ts, auto.ts, and session-lock.ts as specified, with tests validating the behavior. |
| Out of Scope Changes check | ✅ Passed | All changes are directly scoped to the issue: introducing markWorkerStoppingByPid and integrating it into the three specified code paths plus tests, with no extraneous modifications.                               |
|     Docstring Coverage     | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                                                                 |

</details>

<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>

</details>

<!-- pre_merge_checks_walkthrough_end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

<details>
<summary>📝 Generate docstrings</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> Create stacked PR
- [ ] <!-- {"checkboxId": "3e1879ae-f29b-4d0d-8e06-d12b7ba33d98"} --> Commit on current branch

</details>
<details>
<summary>🧪 Generate unit tests (beta)</summary>

- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Create PR with unit tests
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Commit unit tests in branch `issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171`

</details>

</details>

<!-- finishing_touch_checkbox_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> ESLint skipped: no ESLint configuration detected in root package.json. To enable, add `eslint` to devDependencies.
> 
> 
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- tips_start -->

---

Thanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=gsd-build/gsd-2&utm_content=6201)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>


<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>

<!-- tips_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
2. [general_comment] github-actions[bot]
   file=n/a line=n/a
   sourceId=4465612135 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#issuecomment-4465612135
   replyKind=general_comment threadId=n/a threadResolved=n/a
   auditToken=codefactory-feedback:gh-issue-comment-4465612135
   ## 🔴 PR Risk Report — CRITICAL

| | |
|---|---|
| **Files changed** | 6 |
| **Systems affected** | 1 |
| **Overall risk** | 🔴 CRITICAL |

### Affected Systems

| Risk | System |
|------|--------|
| 🔴 critical | Auto Engine |

<details>
<summary>File Breakdown</summary>

| Risk | File | Systems |
|------|------|---------|
| 🔴 | `src/resources/extensions/gsd/auto.ts` | Auto Engine |
| ⚪ | `src/resources/extensions/gsd/crash-recovery.ts` | *(unclassified)* |
| ⚪ | `src/resources/extensions/gsd/db/auto-workers.ts` | *(unclassified)* |
| ⚪ | `src/resources/extensions/gsd/session-lock.ts` | *(unclassified)* |
| ⚪ | `src/resources/extensions/gsd/tests/auto-workers.test.ts` | *(unclassified)* |
| ⚪ | `src/resources/extensions/gsd/tests/session-lock-regression.test.ts` | *(unclassified)* |

</details>

> ⚠️ **🔴 Critical risk** — the following systems require verification before merge:
>
> - 🔴 **Auto Engine**: validate auto-mode trigger conditions and loop termination
>
> **⛔ This PR should not be merged without executing this follow-up prompt.**
>
> **Ask your coding agent to verify before submitting:**
>
> ```
> Review this PR for risks in: Auto Engine. Verify:
>
> 1. validate auto-mode trigger conditions and loop termination
>
> Before modifying any code, assess the scope of this fix:
>
> - Identify the root cause, not just the reported symptom.
> - Search the codebase for other call sites, similar patterns, or duplicated logic that may share the same bug.
> - List affected tests, documentation, and any downstream consumers that depend on the current behavior.
> - Flag any changes that extend beyond the immediate file or function.
>
> Report findings first. Then propose a fix scoped to the actual root cause, and wait for confirmation before applying changes outside the originally reported location.
> ```
>
> 💡 **Have a Codex subscription?** Get an independent second opinion: `codex review --adversarial`
3. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/db/auto-workers.ts line=181
   sourceId=3252108090 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252108090
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chutf threadResolved=false
   auditToken=codefactory-feedback:gh-review-comment-3252108090
   _⚠️ Potential issue_ | _🟠 Major_ | _⚡ Quick win_

**Include `stopped_at` when marking a worker as stopping by PID.**

On Line 174, the update only changes `status`. The dead-worker cleanup contract for this PR includes stamping `stopped_at`; leaving it unset can break downstream diagnostics/cleanup semantics.

 

<details>
<summary>💡 Proposed fix</summary>

```diff
 export function markWorkerStoppingByPid(
   projectRootRealpath: string,
   pid: number,
 ): void {
   if (!isDbAvailable()) return;
   if (!Number.isInteger(pid) || pid <= 0) return;
   const db = _getAdapter()!;
+  const stoppedAt = new Date().toISOString();
   transaction(() => {
     db.prepare(
       `UPDATE workers
-       SET status = 'stopping'
+       SET status = 'stopping',
+           stopped_at = :stopped_at
        WHERE pid = :pid
          AND project_root_realpath = :project_root
          AND status = 'active'`,
     ).run({
       ":pid": pid,
       ":project_root": projectRootRealpath,
+      ":stopped_at": stoppedAt,
     });
   });
 }
```
</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
export function markWorkerStoppingByPid(
  projectRootRealpath: string,
  pid: number,
): void {
  if (!isDbAvailable()) return;
  if (!Number.isInteger(pid) || pid <= 0) return;
  const db = _getAdapter()!;
  const stoppedAt = new Date().toISOString();
  transaction(() => {
    db.prepare(
      `UPDATE workers
       SET status = 'stopping',
           stopped_at = :stopped_at
       WHERE pid = :pid
         AND project_root_realpath = :project_root
         AND status = 'active'`,
    ).run({
      ":pid": pid,
      ":project_root": projectRootRealpath,
      ":stopped_at": stoppedAt,
    });
  });
}
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/resources/extensions/gsd/db/auto-workers.ts` around lines 173 - 181, The
UPDATE that marks a worker as 'stopping' should also write the stopped_at
timestamp; modify the SQL in src/resources/extensions/gsd/db/auto-workers.ts so
the statement sets stopped_at = CURRENT_TIMESTAMP (or the DB's equivalent) along
with status = 'stopping', keeping the same WHERE conditions that use :pid and
:project_root and the existing run call that passes pid and projectRootRealpath;
ensure the column name stopped_at is included in the SET clause next to status
so downstream diagnostics/cleanup see the stop time.
```

</details>

<!-- fingerprinting:phantom:poseidon:hawk -->

<!-- This is an auto-generated comment by CodeRabbit -->
4. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/session-lock.ts line=290
   sourceId=3252108105 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252108105
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chutw threadResolved=false
   auditToken=codefactory-feedback:gh-review-comment-3252108105
   _⚠️ Potential issue_ | _🟠 Major_ | _⚡ Quick win_

**Guard dead-PID cleanup from matching the current process PID.**

Line 288 (and the same pattern on Lines 319 and 357) uses `isPidAlive`, but that helper intentionally returns `false` for `pid === process.pid`. That can incorrectly mark the current live worker row as `stopping` in re-entrant/recovery flows.

 

<details>
<summary>💡 Proposed fix</summary>

```diff
-  if (existingPreflight?.pid && !isPidAlive(existingPreflight.pid)) {
+  if (
+    existingPreflight?.pid
+    && existingPreflight.pid !== process.pid
+    && !isPidAlive(existingPreflight.pid)
+  ) {
     markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
   }
@@
-    const deadPid = existingData?.pid && !isPidAlive(existingData.pid) ? existingData.pid : null;
+    const deadPid = (
+      existingData?.pid
+      && existingData.pid !== process.pid
+      && !isPidAlive(existingData.pid)
+    ) ? existingData.pid : null;
@@
-    if (existingPid && !isPidAlive(existingPid)) {
+    if (existingPid && existingPid !== process.pid && !isPidAlive(existingPid)) {
       markWorkerStoppingByPid(normalizeRealPath(basePath), existingPid);
     }
```
</details>


Also applies to: 319-321, 357-359

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/resources/extensions/gsd/session-lock.ts` around lines 288 - 290, The
cleanup path can incorrectly mark the current process as stopping because
isPidAlive(pid) returns false for pid === process.pid; update the guards around
existingPreflight usage (the checks that call isPidAlive and then
markWorkerStoppingByPid) to explicitly skip cleanup when existingPreflight.pid
=== process.pid (or equals process.pid), e.g. add a condition that verifies
existingPreflight.pid !== process.pid before calling
markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
ensure the same change is applied to the other occurrences of this pattern (the
checks around lines referencing existingPreflight, isPidAlive,
markWorkerStoppingByPid).
```

</details>

<!-- fingerprinting:phantom:poseidon:hawk -->

<!-- This is an auto-generated comment by CodeRabbit -->
5. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/tests/session-lock-regression.test.ts line=110
   sourceId=3252108110 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252108110
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chut0 threadResolved=false
   auditToken=codefactory-feedback:gh-review-comment-3252108110
   _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**Use a deterministic-dead PID in this regression test.**

Line 110 uses `99999`, which can be a live process on some systems and make this test flaky.

 

<details>
<summary>💡 Proposed fix</summary>

```diff
-      const deadPid = 99999;
+      const deadPid = 2_147_483_647;
```
</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
      const deadPid = 2_147_483_647;
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/resources/extensions/gsd/tests/session-lock-regression.test.ts` at line
110, The test uses a non-deterministic "deadPid" value (const deadPid = 99999)
which may be a real PID on some systems; replace that literal with a
guaranteed-invalid PID such as Number.MAX_SAFE_INTEGER (or another very large
constant) to ensure deterministically-dead behavior. Update the const deadPid
declaration in the session-lock-regression.test (the const deadPid variable) to
use Number.MAX_SAFE_INTEGER (or a helper like getDeterministicDeadPid() that
returns a very large/invalid PID) so the test cannot accidentally target a live
process.
```

</details>

<!-- fingerprinting:phantom:poseidon:hawk -->

<!-- This is an auto-generated comment by CodeRabbit -->
6. [review] coderabbitai[bot]
   file=n/a line=n/a
   sourceId=4302818722 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#pullrequestreview-4302818722
   replyKind=review threadId=n/a threadResolved=n/a
   auditToken=codefactory-feedback:gh-review-4302818722
   **Actionable comments posted: 3**

> [!CAUTION]
> Some comments are outside the diff and can’t be posted inline due to platform limitations.
> 
> 
> 
> <details>
> <summary>⚠️ Outside diff range comments (1)</summary><blockquote>
> 
> <details>
> <summary>src/resources/extensions/gsd/crash-recovery.ts (1)</summary><blockquote>
> 
> `226-226`: _⚠️ Potential issue_ | _🔴 Critical_ | _⚡ Quick win_
> 
> **Read legacy lock metadata before deleting the file.**
> 
> Line 226 deletes the legacy lock first, then Line 238 reads it. That makes `lock?.pid` unreachable, so `markWorkerStoppingByPid` never runs.
> 
>  
> 
> <details>
> <summary>💡 Proposed fix</summary>
> 
> ```diff
>  export function clearLock(basePath: string): void {
> -  clearLegacyLockFile(basePath);
> +  const legacyLock = readLegacyLock(basePath);
> +  clearLegacyLockFile(basePath);
> @@
> -    const lock = readLegacyLock(basePath);
> -    if (lock?.pid) markWorkerStoppingByPid(projectRoot, lock.pid);
> +    if (legacyLock?.pid) markWorkerStoppingByPid(projectRoot, legacyLock.pid);
> ```
> </details>
> 
> 
> Also applies to: 238-239
> 
> <details>
> <summary>🤖 Prompt for AI Agents</summary>
> 
> ```
> Verify each finding against current code. Fix only still-valid issues, skip the
> rest with a brief reason, keep changes minimal, and validate.
> 
> In `@src/resources/extensions/gsd/crash-recovery.ts` at line 226, The code deletes
> the legacy lock file via clearLegacyLockFile(basePath) before reading its
> metadata, which prevents accessing lock?.pid and stops markWorkerStoppingByPid
> from running; fix by first reading the legacy lock into a local variable (the
> code that currently accesses lock?.pid), call markWorkerStoppingByPid(lock.pid)
> if present, and only then call clearLegacyLockFile(basePath) so the lock
> metadata is available when markWorkerStoppingByPid is invoked.
> ```
> 
> </details>
> 
> </blockquote></details>
> 
> </blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

```
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/resources/extensions/gsd/db/auto-workers.ts`:
- Around line 173-181: The UPDATE that marks a worker as 'stopping' should also
write the stopped_at timestamp; modify the SQL in
src/resources/extensions/gsd/db/auto-workers.ts so the statement sets stopped_at
= CURRENT_TIMESTAMP (or the DB's equivalent) along with status = 'stopping',
keeping the same WHERE conditions that use :pid and :project_root and the
existing run call that passes pid and projectRootRealpath; ensure the column
name stopped_at is included in the SET clause next to status so downstream
diagnostics/cleanup see the stop time.

In `@src/resources/extensions/gsd/session-lock.ts`:
- Around line 288-290: The cleanup path can incorrectly mark the current process
as stopping because isPidAlive(pid) returns false for pid === process.pid;
update the guards around existingPreflight usage (the checks that call
isPidAlive and then markWorkerStoppingByPid) to explicitly skip cleanup when
existingPreflight.pid === process.pid (or equals process.pid), e.g. add a
condition that verifies existingPreflight.pid !== process.pid before calling
markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
ensure the same change is applied to the other occurrences of this pattern (the
checks around lines referencing existingPreflight, isPidAlive,
markWorkerStoppingByPid).

In `@src/resources/extensions/gsd/tests/session-lock-regression.test.ts`:
- Line 110: The test uses a non-deterministic "deadPid" value (const deadPid =
99999) which may be a real PID on some systems; replace that literal with a
guaranteed-invalid PID such as Number.MAX_SAFE_INTEGER (or another very large
constant) to ensure deterministically-dead behavior. Update the const deadPid
declaration in the session-lock-regression.test (the const deadPid variable) to
use Number.MAX_SAFE_INTEGER (or a helper like getDeterministicDeadPid() that
returns a very large/invalid PID) so the test cannot accidentally target a live
process.

---

Outside diff comments:
In `@src/resources/extensions/gsd/crash-recovery.ts`:
- Line 226: The code deletes the legacy lock file via
clearLegacyLockFile(basePath) before reading its metadata, which prevents
accessing lock?.pid and stops markWorkerStoppingByPid from running; fix by first
reading the legacy lock into a local variable (the code that currently accesses
lock?.pid), call markWorkerStoppingByPid(lock.pid) if present, and only then
call clearLegacyLockFile(basePath) so the lock metadata is available when
markWorkerStoppingByPid is invoked.
```

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: defaults

**Review profile**: CHILL

**Plan**: Pro Plus

**Run ID**: `ed2ef72a-ef5b-41f8-a6ed-be2ab7db5716`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 74bba52ac2af5960d7caf8c8720ed0249d4ee6b5 and 31f076e3aeac7bb9695b114344a12bda80d1b9a3.

</details>

<details>
<summary>📒 Files selected for processing (6)</summary>

* `src/resources/extensions/gsd/auto.ts`
* `src/resources/extensions/gsd/crash-recovery.ts`
* `src/resources/extensions/gsd/db/auto-workers.ts`
* `src/resources/extensions/gsd/session-lock.ts`
* `src/resources/extensions/gsd/tests/auto-workers.test.ts`
* `src/resources/extensions/gsd/tests/session-lock-regression.test.ts`

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Approved status-check tasks:
None

Approved documentation tasks:
None

When done:
1) Run the relevant verification for your changes.
2) Leave any changed files in the worktree for the babysitter app to finalize.
3) For each feedback item you addressed or were blocked on, emit a summary block in the following format:
   FEEDBACK_SUMMARY_START <auditToken>
   <A concise 1-2 sentence summary of what you did or why you were blocked>
   FEEDBACK_SUMMARY_END
   Include one block per audit token. These summaries will be posted as follow-up comments on the PR.
4) If documentation tasks were assigned, emit exactly one docs summary block in the following format:
   DOCS_SUMMARY_START <changed|no_change>
   <A concise 1-2 sentence summary of the docs you updated, or why no docs changes were necessary after inspection>
   DOCS_SUMMARY_END

@jeremymcs
Copy link
Copy Markdown
Collaborator Author

🤖 Dispatched codex with the following prompt:

Agent prompt (click to expand)
You are acting as an autonomous PR babysitter for gsd-build/gsd-2 PR #6201.
PR URL: https://github.com/gsd-build/gsd-2/pull/6201
Base repository: gsd-build/gsd-2
Head repository: gsd-build/gsd-2
Head branch: issue/5667-clearlock-leaves-dead-workers-row-at-sta-1778906171
Head remote: origin
You are running inside an isolated app-owned worktree under ~/.patchdeck.
Make only targeted changes that resolve the approved tasks.
Do not wait for user input, confirmation, or approval at any point.
Do not rewrite unrelated files.
Use the available git tooling for inspection and verification only.
If dependencies are missing, install them using the repository's lockfile/package manager as needed inside this isolated worktree.
Leave file edits uncommitted; the babysitter app will handle Git finalization after your run.
GitHub follow-up replies and review-thread resolution will be handled by the babysitter after your run.
If a task is invalid after inspection, explain it in your final response and include the exact audit token.

Approved review-comment tasks:
1. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/db/auto-workers.ts line=181
   sourceId=3252570465 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252570465
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chutf threadResolved=true
   auditToken=codefactory-feedback:gh-review-comment-3252570465
   <details>
<summary>🧩 Analysis chain</summary>

🏁 Script executed:
```
#!/bin/bash
# Check current state of markWorkerStoppingByPid for stopped_at
rg -n "stopped_at" src/resources/extensions/gsd/db/auto-workers.ts

# Also check the git log around the function to confirm the fix
git log --oneline -5
git show 31f076e --stat 2>/dev/null || echo "Commit not found or not in range"
```

Length of output: 1207

---



</details>

`@jeremymcs` — after checking the branch, `stopped_at` is still not present in `markWorkerStoppingByPid` in `src/resources/extensions/gsd/db/auto-workers.ts`. The commit `31f076e` is the PR's own initial commit that introduced the function; it doesn't include the `stopped_at` column in the SET clause.

Could you double-check whether the babysitter's follow-up commit landed? The fix should look like:

```typescript
export function markWorkerStoppingByPid(
  projectRootRealpath: string,
  pid: number,
): void {
  if (!isDbAvailable()) return;
  if (!Number.isInteger(pid) || pid <= 0) return;
  const db = _getAdapter()!;
  const stoppedAt = new Date().toISOString();
  transaction(() => {
    db.prepare(
      `UPDATE workers
       SET status = 'stopping',
           stopped_at = :stopped_at
       WHERE pid = :pid
         AND project_root_realpath = :project_root
         AND status = 'active'`,
    ).run({
      ":pid": pid,
      ":project_root": projectRootRealpath,
      ":stopped_at": stoppedAt,
    });
  });
}
```

<!-- This is an auto-generated reply by CodeRabbit -->
2. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/tests/session-lock-regression.test.ts line=110
   sourceId=3252640804 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252640804
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chut0 threadResolved=true
   auditToken=codefactory-feedback:gh-review-comment-3252640804
   `@jeremymcs`, thanks for the update! Confirmed — the deterministic dead PID fix in commit `31f076e` resolves the flakiness concern. 🎉

<!-- <review_comment_addressed> -->

---

<!-- This is an auto-generated comment: tweet message by coderabbit.ai -->

If you found this review helpful, would you consider giving us a shout-out on [X](https://twitter.com/intent/tweet?related=CodeRabbitAI&text=Use%20deterministic-dead%20PID%20in%20tests%3A%20replaced%20risky%2099999%20with%202_147_483_647%20to%20avoid%20flaky%20hits%20on%20live%20processes.%20Reliable%20regression%20tests%20matter%20%E2%80%94%20try%20%40coderabbitai%20%F0%9F%9B%A0%EF%B8%8F%E2%9C%85&url=https%3A%2F%2Fgithub.com%2Fgsd-build%2Fgsd-2%2Fpull%2F6201%23discussion_r3252108110)?

Thank you for using CodeRabbit!

<!-- end of auto-generated comment: tweet message by coderabbit.ai -->



<!-- This is an auto-generated reply by CodeRabbit -->
3. [review_comment] coderabbitai[bot]
   file=src/resources/extensions/gsd/session-lock.ts line=290
   sourceId=3252641270 sourceUrl=https://github.com/gsd-build/gsd-2/pull/6201#discussion_r3252641270
   replyKind=review_thread threadId=PRRT_kwDORj5hb86Chutw threadResolved=true
   auditToken=codefactory-feedback:gh-review-comment-3252641270
   <details>
<summary>🧩 Analysis chain</summary>

🏁 Script executed:
```
#!/bin/bash
# Verify the fix was applied in the referenced commit
git show 31f076e --stat
git show 31f076e -- src/resources/extensions/gsd/session-lock.ts
```

Length of output: 3655

---



</details>

`@jeremymcs` — I checked commit `31f076e` and unfortunately the `pid !== process.pid` guards from the proposed fix were **not** applied. The commit adds the `markWorkerStoppingByPid` calls at all three sites, but none of the three guards exclude `process.pid`:

```ts
// Line 288 — no pid !== process.pid guard
if (existingPreflight?.pid && !isPidAlive(existingPreflight.pid)) { … }

// Line ~319 — no pid !== process.pid guard
const deadPid = existingData?.pid && !isPidAlive(existingData.pid) ? existingData.pid : null;

// Line ~357 — no pid !== process.pid guard
if (existingPid && !isPidAlive(existingPid)) { … }
```

Because `isPidAlive` explicitly short-circuits to `false` for `pid === process.pid`:

```ts
function isPidAlive(pid: number): boolean {
  if (!Number.isInteger(pid) || pid <= 0) return false;
  if (pid === process.pid) return false;   // ← makes !isPidAlive(process.pid) === true
  …
}
```

…all three guards will fire and call `markWorkerStoppingByPid` with the current process's own PID in a re-entrant `acquireSessionLock` flow (where the lock file still contains `process.pid` after the OS lock is released at the top of the function). The fix still needs the explicit `!== process.pid` exclusion at all three sites:

```diff
-  if (existingPreflight?.pid && !isPidAlive(existingPreflight.pid)) {
+  if (
+    existingPreflight?.pid
+    && existingPreflight.pid !== process.pid
+    && !isPidAlive(existingPreflight.pid)
+  ) {
     markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
   }
```

```diff
-    const deadPid = existingData?.pid && !isPidAlive(existingData.pid) ? existingData.pid : null;
+    const deadPid = (
+      existingData?.pid
+      && existingData.pid !== process.pid
+      && !isPidAlive(existingData.pid)
+    ) ? existingData.pid : null;
```

```diff
-    if (existingPid && !isPidAlive(existingPid)) {
+    if (existingPid && existingPid !== process.pid && !isPidAlive(existingPid)) {
       markWorkerStoppingByPid(normalizeRealPath(basePath), existingPid);
     }
```

<!-- This is an auto-generated reply by CodeRabbit -->

Approved status-check tasks:
None

Approved documentation tasks:
None

When done:
1) Run the relevant verification for your changes.
2) Leave any changed files in the worktree for the babysitter app to finalize.
3) For each feedback item you addressed or were blocked on, emit a summary block in the following format:
   FEEDBACK_SUMMARY_START <auditToken>
   <A concise 1-2 sentence summary of what you did or why you were blocked>
   FEEDBACK_SUMMARY_END
   Include one block per audit token. These summaries will be posted as follow-up comments on the PR.
4) If documentation tasks were assigned, emit exactly one docs summary block in the following format:
   DOCS_SUMMARY_START <changed|no_change>
   <A concise 1-2 sentence summary of the docs you updated, or why no docs changes were necessary after inspection>
   DOCS_SUMMARY_END

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.

clearLock leaves dead workers row at status='active' (crash-recovery.js:168)

1 participant