Skip to content

fix(ci): raise shard watchdog floor to 15min to stop Full Suite false-kills - #1695

Merged
gsxdsm merged 6 commits into
mainfrom
fix/full-suite-engine-core-hang
Jun 21, 2026
Merged

fix(ci): raise shard watchdog floor to 15min to stop Full Suite false-kills#1695
gsxdsm merged 6 commits into
mainfrom
fix/full-suite-engine-core-hang

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

What & why

The Full Suite (non-blocking) workflow has been red on main for 30+ consecutive runs. The failure is not a test assertion — every test that reports a result passes. Three sharded vitest groups never finish within their wall-clock watchdog budget and get SIGKILLed:

Shard Group Old budget Outcome
1/4 @fusion/engine [1/2] 405s killed at budget
2/4 @fusion/engine [2/2] 405s killed at budget
4/4 @fusion/core [2/2] 338s killed at budget
3/4 @fusion/core [1/2] 338s passes

It is not a hang. Both failing groups run to completion and exit cleanly when measured locally:

  • @fusion/engine [2/2]145s, Test Files 309 passed, exit 0
  • @fusion/core [2/2]283s, Test Files 172 passed, exit 0

A clean exit rules out the open-handle/leak hypothesis — these slices are genuinely slow, not wedged.

Root cause

deriveBudgetMs tightens the watchdog budget to expected × 3.5 whenever scripts/test-timings.json is younger than the 30-day staleness window. The committed snapshot (2026-06-03, 18 days old → still "fresh") undercounts these import- and real-git-subprocess-heavy slices — 368 of 520 engine files sit at the 100ms bucket floor, so the snapshot total is far below current wall-clock. The result was a too-tight, false-kill budget (340–405s) that the floor/ceiling band exists precisely to prevent. core[2/2] needs 283s locally against a 338s budget — only 1.2× headroom even on a fast machine, guaranteeing failure on slower CI runners.

The fix

Raise the shard budget-band floor from 5min to 15min (scripts/lib/run-vitest-watchdog.mjs). Heavy slices can no longer be tightened into a false-kill, while a genuine hang is still bounded far under the job's 60min ceiling. This follows the watchdog's own KTD-2 ("adjust the budget only once a group is proven slow-not-hung, with measured numbers") and the predecessor plan docs/plans/2026-06-13-001-fix-test-timeout-failures-plan.md, which flagged the 5min floor as provisional.

New budgets: engine/core slices → 900s (was 405s/338s); a genuinely huge slice still caps at the 30min ceiling; a true infinite hang is still killed.

Tests

  • Updated deriveBudgetMs "tightens within band" test input so it still exercises the un-clamped path under the new floor.
  • Added a regression guard pinning shard.floor = 15min and asserting a 525s derived budget clamps up to the floor — an accidental revert to 5min now fails loudly.
  • node --test scripts/__tests__/run-vitest-watchdog.test.mjs → 14/14 pass.
  • check-no-test-timeout-appeasement and check-no-kill-4040 guards both pass — this raises an outer wall-clock watchdog, not a per-test assertion timeout, so it is not appeasement.

Follow-up (not in this PR)

Refresh scripts/test-timings.json from a default-branch CI run so per-slice budgets reflect current durations; consider a dedicated heavy-shard band so light shards keep tighter hang protection.

🤖 Generated with Claude Code


Open in Stage

Summary by CodeRabbit

  • Bug Fixes

    • Resolved unhandled promise rejections in CLI authentication and presence probes when spawn fails.
    • Fixed sidebar layout to prevent the Settings button from being obscured by the fixed executor status footer.
    • Improved project selector fallback labels to remain readable when translations are incomplete.
  • Documentation

    • Updated board view workflow switcher documentation to clarify dropdown behavior and count badge styling.
    • Added diagnostic plan for CI test hang issues.
  • Tests

    • Added spawn error handling tests for CLI probes.
    • Extended watchdog timeout threshold for test shard execution.

gsxdsm added 6 commits June 20, 2026 21:16
Align workflow switcher status count badges with their board column colors.

- Map Todo, In Progress, and Done workflow count badge text to the matching board column CSS tokens.
- Cover the badge color contract with a CSS fixture regression test.
- Document the color-token behavior for board and list workflow dropdown counts.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/WorkflowSwitcher.css  | 10 +++++++---
 .../components/__tests__/WorkflowSwitcher.test.tsx | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6805

Fusion-Task-Lineage: aab7140c-ad37-4bd8-b73d-199534285b37
Keep the experimental left sidebar Settings control clear of the fixed executor footer while preserving readable project selector fallbacks.

- Share the executor footer visibility state with the left sidebar and project content.
- Reserve executor-footer height on the sidebar when the status footer is visible so Settings stays clickable in expanded and collapsed modes.
- Add project-selector translation fallbacks for incomplete locale fixtures.
- Cover footer-clearance behavior in left sidebar tests and add a patch changeset.

Files changed:
 .changeset/fn-6819-sidebar-footer-clearance.md     |  5 +++
 packages/dashboard/app/App.tsx                     |  8 +++--
 .../dashboard/app/components/LeftSidebarNav.css    |  9 ++++++
 .../dashboard/app/components/LeftSidebarNav.tsx    |  4 ++-
 .../dashboard/app/components/ProjectSelector.css   |  2 +-
 .../dashboard/app/components/ProjectSelector.tsx   | 11 +++++--
 .../components/__tests__/LeftSidebarNav.test.tsx   | 36 ++++++++++++++++++++++
 7 files changed, 67 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6819

Fusion-Task-Lineage: 950da852-8dcf-4379-a91b-0188b12d1a6c
Resolve synchronous AI CLI probe launch failures as unavailable auth states.

- Catch synchronous spawn failures in Claude and Droid probe helpers so fire-and-forget validation paths do not reject.
- Return unavailable/unauthenticated sentinels for Droid model discovery and CLI presence/auth checks.
- Add regression coverage for Claude and Droid presence/auth probes plus a patch changeset.

Files changed:
 .../fn-6808-cli-probe-unhandled-rejection.md       |  5 ++++
 .../src/__tests__/process-manager.test.ts          | 25 ++++++++++++++++++++
 .../src/__tests__/process-manager.test.ts          | 25 ++++++++++++++++++++
 packages/pi-claude-cli/src/process-manager.ts      | 12 +++++++++-
 .../src/process-manager.ts                         | 27 +++++++++++++++++++---
 5 files changed, 90 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6808

Fusion-Task-Lineage: 79702ef2-e116-4313-a557-da17a6888c30
The Full Suite (non-blocking) workflow has been red for 30+ runs on main.
Diagnosis: the @fusion/engine [1/2], [2/2] and @fusion/core [2/2] shard
slices were SIGKILLed at their watchdog budgets (405s/405s/338s), not because
they hang but because those budgets are too tight for current wall-clock.

Local baselines (this machine, all pass, exit 0):
  - engine [2/2]: 145s wall / 309 files
  - core   [2/2]: 283s wall / 172 files  (old budget was only 338s!)

deriveBudgetMs tightens the budget to expected*3.5 whenever the committed
scripts/test-timings.json is <30d old. The snapshot (2026-06-03) undercounts
the import- and real-git-subprocess overhead of these heavy slices, so the
'fresh' snapshot produced a too-tight, false-kill budget on slower CI runners
-- the exact failure mode the floor/ceiling band exists to prevent.

Fix (plan KTD-2): raise the shard band floor 5min -> 15min so the heaviest
slices can't be tightened into a false-kill, while a true hang is still bounded
far under the job's 60min ceiling. Mirrors the dashboard-lane heavy-lane floor.
Follow-up: refresh scripts/test-timings.json from a default-branch CI run.
- Reformat shard-floor justification as an FNXC:TestInfrastructure comment
  (project-standards: AGENTS.md FNXC_LOG convention).
- Clarify that the shard and dashboard-lane 15min floors are not coupled and
  may diverge (maintainability: avoid implying an unenforced contract).
- Add a regression-guard test pinning shard.floor=15min and asserting a 525s
  derived budget clamps up to the floor, so an accidental revert to the old
  5min floor fails loudly (correctness + testing + project-standards).
@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Three independent patches: CLI probes for Droid and Claude now wrap spawn in try/catch, resolving to sentinel exit code 127 instead of producing unhandled rejections. Dashboard fixes add executor footer clearance padding to LeftSidebarNav, switch WorkflowSwitcher count badges to board column color tokens, and add ProjectSelector i18n fallbacks. The CI vitest watchdog shard floor is raised from 5 to 15 minutes with a regression test and a new hang-diagnosis plan document.

Changes

CLI Probe Spawn Error Handling

Layer / File(s) Summary
Probe spawn try/catch implementation
packages/pi-claude-cli/src/process-manager.ts, plugins/fusion-plugin-droid-runtime/src/process-manager.ts
runClaudeProbe and runDroidProbe wrap spawn(...) in try/catch to resolve sentinel exit code 127 on synchronous throws; discoverDroidModels resolves null per-attempt on spawn failure.
Probe tests and changeset
packages/droid-cli/src/__tests__/process-manager.test.ts, packages/pi-claude-cli/src/__tests__/process-manager.test.ts, .changeset/fn-6808-cli-probe-unhandled-rejection.md
New tests for validateCliPresenceAsync and validateCliAuthAsync in both packages assert resolved ok: false / false on synchronous spawn throw; changeset entry documents the fix.

Dashboard UI Fixes

Layer / File(s) Summary
CSS variable scoping and LeftSidebarNav footer clearance
packages/dashboard/app/components/ProjectSelector.css, packages/dashboard/app/components/LeftSidebarNav.css, packages/dashboard/app/components/LeftSidebarNav.tsx
--executor-footer-height moved to .dashboard-project-shell; .left-sidebar-nav gains box-sizing and a --with-footer padding-bottom variant; LeftSidebarNav adds optional footerVisible prop that applies the variant class.
App.tsx wiring and LeftSidebarNav tests
packages/dashboard/app/App.tsx, packages/dashboard/app/components/__tests__/LeftSidebarNav.test.tsx
App.tsx derives executorFooterVisible once and passes it as footerVisible to LeftSidebarNav and project-content class logic; tests assert --with-footer class conditional behavior across expanded/collapsed modes.
WorkflowSwitcher board column color tokens
packages/dashboard/app/components/WorkflowSwitcher.css, packages/dashboard/app/components/__tests__/WorkflowSwitcher.test.tsx
Count badge CSS rules for todo/in-progress/done switch from muted/warning/success tokens to --todo, --in-progress, --done board column tokens; tests assert each badge color references the correct var() token.
ProjectSelector i18n fallbacks
packages/dashboard/app/components/ProjectSelector.tsx
Introduces projectsLabel with English default; trigger title and visible text use it; dropdown aria-label switches from raw translation call to projectsLabel with default.
Changeset and dashboard guide docs
.changeset/fn-6819-sidebar-footer-clearance.md, docs/dashboard-guide.md
Changeset for sidebar/selector patch; dashboard guide updated to describe workflow switcher themed dropdown trigger, count badge rendering location, and board column token colors.

CI Watchdog Shard Floor and Hang Plan

Layer / File(s) Summary
Shard floor bump and regression test
scripts/lib/run-vitest-watchdog.mjs, scripts/__tests__/run-vitest-watchdog.test.mjs
CLASS_BUDGET_BANDS.shard.floor raised from 5 to 15 minutes; existing tightening test updated to a new input value; new regression test asserts the floor pins heavy slices above the false-kill window.
Full-suite engine/core hang diagnosis plan
docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md
New plan document covers problem statement (vitest shards never exit), implementation units (reproduce, fix teardown leaks, verify clean exit), risks, and source references.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • Runfusion/Fusion#1669: Directly touches the same scripts/lib/run-vitest-watchdog.mjs and scripts/__tests__/run-vitest-watchdog.test.mjs files, specifically CLASS_BUDGET_BANDS.shard and deriveBudgetMs logic.

Poem

🐰 A rabbit hopped through the code one day,
Found probes that would throw and run away.
"Wrap them in catch!" the bunny said with cheer,
Sidebar now clears the footer—no fear!
The watchdog sleeps fifteen minutes deep,
While badges wear the right colors to keep. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.77% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: raising the CI shard watchdog floor to 15 minutes to prevent false-kills in the Full Suite workflow. It directly addresses the root cause documented in the PR objectives.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 fix/full-suite-engine-core-hang

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.

@ghost

ghost commented Jun 21, 2026

Copy link
Copy Markdown

Ready to review this PR? Stage has broken it down into 5 individual chapters for you:

Title
1 Document the Full Suite investigation plan
2 Raise shard watchdog floor to 15 minutes
3 Prevent unhandled rejections in CLI probes
4 Fix sidebar clearance and project labels
5 Update workflow switcher count colors
Open in Stage

Chapters generated by Stage for commit 9af9bf4 on Jun 21, 2026 4:54am UTC.

@greptile-apps

greptile-apps Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR raises the CI shard watchdog floor from 5 minutes to 15 minutes in scripts/lib/run-vitest-watchdog.mjs to stop false-kill SIGKILLs on the @fusion/engine and @fusion/core shards, and fixes unhandled promise rejections in the droid/Claude CLI spawn-based presence probes by wrapping synchronous throws. Dashboard UI fixes are also included: sidebar footer padding clearance, CSS board-column color token updates, and a translation fallback for the project selector.

  • Watchdog floor raise: CLASS_BUDGET_BANDS.shard.floor goes from 300s to 900s; a regression guard test pins the new concrete value and asserts that a 525s derived budget clamps up to the floor, so an accidental revert fails loudly.
  • Spawn guard: runClaudeProbe and runDroidProbe (and discoverDroidModels) now catch synchronous spawn errors and resolve with exit code 127, matching the existing async-error path so callers degrade gracefully instead of surfacing unhandled rejections.

Confidence Score: 4/5

Safe to merge — the watchdog floor change is clearly justified, well-tested with a concrete regression guard, and the spawn-guard fixes are minimal and well-scoped.

All changed code paths are exercised by updated or new tests. The core watchdog change is a single numeric constant guarded by a pinned regression test. The spawn-guard additions are mechanical and match the existing error-sentinel convention. The only loose end is the plan document whose 'active' status may mislead future contributors, but this does not affect runtime behavior.

docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md — status field and KTD-1 language are in tension with what was actually implemented; worth updating before the follow-up work begins.

Important Files Changed

Filename Overview
scripts/lib/run-vitest-watchdog.mjs Core change: shard floor raised from 5min to 15min with detailed explanatory comment; logic in deriveBudgetMs is unchanged and correct.
scripts/tests/run-vitest-watchdog.test.mjs Updated 'tightens within band' input from 200s to 300s (correct: 200s×3.5=700s would now fall below new 900s floor); added regression guard pinning shard.floor===15min.
packages/pi-claude-cli/src/process-manager.ts Added try/catch around spawn('claude', ...) to resolve 127 on synchronous throw instead of leaving the promise unsettled; mirrors existing async-error sentinel path.
plugins/fusion-plugin-droid-runtime/src/process-manager.ts Same spawn-guard fix applied to runDroidProbe and discoverDroidModels; packages/droid-cli re-exports from this file so both are covered by a single change.
packages/dashboard/app/App.tsx Extracted executorFooterVisible boolean to deduplicate three identical conditions; logic is preserved but the final JSX guard has a redundant &&currentProject since the variable already checks !!currentProject.
packages/dashboard/app/components/LeftSidebarNav.tsx Added footerVisible prop that conditionally applies left-sidebar-nav--with-footer class; prop defaults to false so existing callers are unaffected.
packages/dashboard/app/components/ProjectSelector.css Moved --executor-footer-height token from .project-content--with-footer to .dashboard-project-shell so the variable is available to sibling elements like the sidebar.
packages/dashboard/app/components/WorkflowSwitcher.css Switched count badge colors from --text-muted/--color-warning/--color-success to matching board column tokens --todo/--in-progress/--done.
docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md New plan document describing the open-handle hang hypothesis; status is 'active' but all three implementation units (U1/U2/U3) are deferred — only the budget-floor raise from the plan's KTD-2 exception is implemented in this PR.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["deriveBudgetMs(klass, expectedDurationMs, timingsFresh)"] --> B{timingsFresh AND\nexpectedDurationMs > 0?}
    B -- No --> C["return band.ceiling\n(generous fallback)"]
    B -- Yes --> D["derived = round(expectedDurationMs × 3.5)"]
    D --> E{derived < band.floor?}
    E -- Yes --> F["return band.floor\n(shard: 15min ← was 5min)"]
    E -- No --> G{derived > band.ceiling?}
    G -- Yes --> H["return band.ceiling\n(shard: 30min)"]
    G -- No --> I["return derived\n(tightened value)"]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["deriveBudgetMs(klass, expectedDurationMs, timingsFresh)"] --> B{timingsFresh AND\nexpectedDurationMs > 0?}
    B -- No --> C["return band.ceiling\n(generous fallback)"]
    B -- Yes --> D["derived = round(expectedDurationMs × 3.5)"]
    D --> E{derived < band.floor?}
    E -- Yes --> F["return band.floor\n(shard: 15min ← was 5min)"]
    E -- No --> G{derived > band.ceiling?}
    G -- Yes --> H["return band.ceiling\n(shard: 30min)"]
    G -- No --> I["return derived\n(tightened value)"]
Loading

Reviews (1): Last reviewed commit: "docs(plans): add Full Suite engine/core ..." | Re-trigger Greptile

</div>
</div>
{viewMode === "project" && currentProject && (
{executorFooterVisible && currentProject && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 The && currentProject guard is redundant here — executorFooterVisible is defined as viewMode === "project" && !!currentProject, so it can only be true when currentProject is already truthy. The double-check adds no protection and may mislead readers into thinking currentProject could be falsy at this point.

Suggested change
{executorFooterVisible && currentProject && (
{executorFooterVisible && (

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +120 to +126
---

## Implementation Units

### U1. Reproduce the hang locally and isolate the leaking test(s)

**Goal:** Turn the CI-only failure into a deterministic local repro and name the

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Plan status is "active" but all U1/U2/U3 units are deferred

The document's front-matter sets status: active and KTD-1 explicitly says "raising the watchdog budget would mask a real open-handle leak." This PR implements only the KTD-2 budget-floor raise (the stated last resort), with U1–U3 left for follow-up work. Future contributors reading this plan may be confused about whether the open-handle investigation is still expected or was superseded. Consider setting status: deferred or adding a short note at the top clarifying that KTD-2 was applied as the immediate fix and the hang-diagnosis work is tracked separately.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
plugins/fusion-plugin-droid-runtime/src/process-manager.ts (1)

294-303: ⚡ Quick win

Add an explicit regression test for discoverDroidModels synchronous spawn throws.

This branch was added here, but the updated tests only cover presence/auth sync-throw behavior. Add a focused test that makes one discovery attempt throw synchronously and asserts fallback/empty behavior remains non-rejecting.

🤖 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 `@plugins/fusion-plugin-droid-runtime/src/process-manager.ts` around lines 294
- 303, Add a focused regression test for the discoverDroidModels function that
verifies when the spawn call for the "droid" process throws synchronously, the
function properly handles the error in the try-catch block and continues
execution without rejecting. The test should mock or configure spawn to throw
synchronously during one discovery attempt, then assert that the function still
completes successfully with appropriate fallback behavior (returning null or an
empty result), ensuring the error handling in the loop at the specified location
does not cause unexpected rejections.
🤖 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 `@docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md`:
- Around line 103-115: The fenced code block in the document is missing a
language specifier after the opening triple backticks, which violates
markdownlint rule MD040. Add a language specifier such as "text" immediately
after the opening ``` on the code block that contains the ASCII diagram showing
the CI shard flow and process hang issue. This applies to the block that starts
with "CI shard → pnpm --filter..." and should be changed from ``` to ```text.

---

Nitpick comments:
In `@plugins/fusion-plugin-droid-runtime/src/process-manager.ts`:
- Around line 294-303: Add a focused regression test for the discoverDroidModels
function that verifies when the spawn call for the "droid" process throws
synchronously, the function properly handles the error in the try-catch block
and continues execution without rejecting. The test should mock or configure
spawn to throw synchronously during one discovery attempt, then assert that the
function still completes successfully with appropriate fallback behavior
(returning null or an empty result), ensuring the error handling in the loop at
the specified location does not cause unexpected rejections.
🪄 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: 179369be-3baa-4b5a-9ec1-9c6b5a07908a

📥 Commits

Reviewing files that changed from the base of the PR and between c766bc9 and 9af9bf4.

📒 Files selected for processing (18)
  • .changeset/fn-6808-cli-probe-unhandled-rejection.md
  • .changeset/fn-6819-sidebar-footer-clearance.md
  • docs/dashboard-guide.md
  • docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md
  • packages/dashboard/app/App.tsx
  • packages/dashboard/app/components/LeftSidebarNav.css
  • packages/dashboard/app/components/LeftSidebarNav.tsx
  • packages/dashboard/app/components/ProjectSelector.css
  • packages/dashboard/app/components/ProjectSelector.tsx
  • packages/dashboard/app/components/WorkflowSwitcher.css
  • packages/dashboard/app/components/__tests__/LeftSidebarNav.test.tsx
  • packages/dashboard/app/components/__tests__/WorkflowSwitcher.test.tsx
  • packages/droid-cli/src/__tests__/process-manager.test.ts
  • packages/pi-claude-cli/src/__tests__/process-manager.test.ts
  • packages/pi-claude-cli/src/process-manager.ts
  • plugins/fusion-plugin-droid-runtime/src/process-manager.ts
  • scripts/__tests__/run-vitest-watchdog.test.mjs
  • scripts/lib/run-vitest-watchdog.mjs

Comment on lines +103 to +115
```
CI shard → pnpm --filter @fusion/engine exec vitest run --project=…
├── all test bodies pass ✅ (Test Files summary never printed)
└── process does NOT exit ❌
│ leaked handle keeps event loop alive:
│ • spawned git/worktree child process not awaited/killed
│ • setInterval / heartbeat timer not cleared in teardown
│ • worktree-pool / db handle not closed
watchdog budget reached → SIGTERM/SIGKILL → exit≠0 → shard FAIL
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a language to the fenced block to satisfy markdownlint MD040.

The fenced block is missing a language specifier; this can fail markdown lint checks.

Suggested fix
-```
+```text
 CI shard → pnpm --filter `@fusion/engine` exec vitest run --project=… 
               │
               ├── all test bodies pass  ✅ (Test Files summary never printed)
@@
               watchdog budget reached → SIGTERM/SIGKILL → exit≠0 → shard FAIL
-```
+```
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 103-103: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 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 `@docs/plans/2026-06-21-001-fix-full-suite-engine-core-hang-plan.md` around
lines 103 - 115, The fenced code block in the document is missing a language
specifier after the opening triple backticks, which violates markdownlint rule
MD040. Add a language specifier such as "text" immediately after the opening ```
on the code block that contains the ASCII diagram showing the CI shard flow and
process hang issue. This applies to the block that starts with "CI shard → pnpm
--filter..." and should be changed from ``` to ```text.

Source: Linters/SAST tools

@gsxdsm
gsxdsm merged commit 2c1cff8 into main Jun 21, 2026
6 checks passed
@gsxdsm
gsxdsm deleted the fix/full-suite-engine-core-hang branch June 21, 2026 05:01
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.

1 participant