Skip to content

Fix output capture races and bound stalled CI tests - #447

Merged
Sev7eNup merged 3 commits into
mainfrom
fix/ci-test-stability
Sep 28, 2026
Merged

Sev7eNup merged 3 commits into
mainfrom
fix/ci-test-stability

Conversation

@Sev7eNup

@Sev7eNup Sev7eNup commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

What and why

CI exposed both timing-dependent tests and actual output loss: startProgram stopped reading five seconds after the child exited even while it was still collecting buffered stderr. A delayed reader could therefore return a successful result with missing lines. A stalled backend run also kept Actions occupied for more than 23 minutes without identifying the stuck test.

Changes

  • Renew the post-exit drain grace when bytes are captured. Discarded output beyond the cap does not renew it, and process timeout plus grace remains a hard total bound. Keep the incomplete-capture warning and document the behavior in German and English.
  • Add delayed-reader regression cases for complete capture and the hard total bound. The capture case failed before the fix.
  • Render each website variant in a shared fixture with a 30-second build limit, then check publication and route isolation under the normal test limit.
  • Use a start signal and a test-controlled gate for PowerShell cancellation, with asynchronous cancellation and bounded waits. Verify a background process is still alive instead of measuring startup speed. Compare cron forecasts with request time.
  • Stop hung test hosts after two minutes without test progress and retain their sequence and diagnostic minidump. Limit the backend test step to 10 minutes and its job to 15 minutes.
  • Cap MSBuild test projects at two concurrent runs. The VSTest container limit alone did not enforce this: the failed runner started four projects together. Extend the configuration guard to cover this separate limit.

No retries or skipped checks are added.

Validation

  • All 220 website tests and strict ESLint pass.
  • All 10 OperationalKnowledgeReader tests pass.
  • All 34 affected startProgram and runspace tests pass with coverage and the hang-detection options, including Windows PowerShell 5.1 capture and cleanup tests.
  • Both test-run configuration guards pass through the solution-level command with the MSBuild concurrency cap.
  • The complete local Engine suite passed before the additional drain fix (2,620 passed, 10 provider tests skipped); CI validates the final combined change.

Unrelated Dependabot Quartz API incompatibilities are outside this change.

@Sev7eNup
Sev7eNup enabled auto-merge (squash) September 28, 2026 19:09
@Sev7eNup Sev7eNup changed the title Make CI tests independent of runner timing Fix output capture races and bound stalled CI tests Sep 28, 2026
@Sev7eNup
Sev7eNup merged commit 2fe56a6 into main Sep 28, 2026
17 checks passed
@Sev7eNup
Sev7eNup deleted the fix/ci-test-stability branch September 28, 2026 19:51
Sev7eNup added a commit that referenced this pull request Oct 3, 2026
#452)

Daily documentation sweep over the pull requests active since
2026-09-28T01:03:39Z. Three surfaces had drifted.

#448 allowed same-origin downloads in the Electron shell, added the
computer-use acceptance gate and made globals resolve inside a custom
activity definition:

- deploy/desktop/README.md and content/{de,en}/deployment/desktop.md still
  listed downloads among the things the shell blocks outright.
- The tray entry the shell README tells you to use is now "Quit NodePilot".
- CLAUDE.md counted three mandatory release runs; scripts/release-lab/
  computer-use/ is a fourth, and RELEASING.md step 6 describes it.
- docs/custom-activities.md and content/{de,en}/concepts/data-bus.md
  described the globals contract for runScript only, although a
  {{globals.X}} in a ScriptTemplate or an input default now resolves and
  fails the step when it is missing or undecryptable.

#446 renamed the designer's run button from "Test run" to "Run"
("Ausführen"). docs/workflow-designer-features.md and both language
versions of designer/properties-modes.md still named the old label,
including in their keyboard-shortcut tables.

Verified against the checked-out main rather than the pull request diffs.
The counts these changes could have invalidated all still match the code:
27 activity types, 10 skins, 242 vitest files, 77 E2E specs. #447 carried
its own documentation across docs/claude-reference.md and both copies of
activities-reference.md, so the startProgram drain semantics needed no
edit.


Claude-Session: https://claude.ai/code/session_018Hdn3USoyZs9C2DQ3LboAA

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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