test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

test(cli): replace fixed waits in Pi TUI coverage with observable completion - #2448

Merged
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits
Aug 7, 2026
Merged

test(cli): replace fixed waits in Pi TUI coverage with observable completion#2448
jackwener merged 1 commit into
apache:mainfrom
UncertaintyDeterminesYou4ndMe:perf/2389-pi-tui-observable-waits

Conversation

@UncertaintyDeterminesYou4ndMe

Copy link
Copy Markdown
Contributor

Part of #2389 (Pi TUI workspace; Runtime Host, desktop e2e, and alignment audit follow in separate PRs per the issue).

What changed

Three fixed-wait patterns in pi-tui-runner.test.ts (plus one helper in tui-terminal-mock.ts), replaced with the closest deterministic mechanism:

PatternCountReplacement
Unconditional await delay(20..2500)55waitFor on the actual observable fact: first TUI paint (waitForTuiPaint), prompt arming ("Allow access outside the workspace?" on screen), wizard frames opening/closing, drafts appearing, driver retry counts
Promise.race([run, delay(50/500).then(throw)]) close watchdogs81CLOSE_BUDGET_MS = max(WAIT_BUDGET_MS, 500) — a passing race still resolves the moment run settles; only failure reporting pays the budget (same split as waitFor, #2221)
Off-screen ticker test sleeping 2.5s for two real 1s ticks1The shell-run elapsed ticker's now + schedule are now injectable via MakaPiTuiInput.shellRunTicker (same test-injection pattern as attentionLongTurnThresholdMs); the test fires both ticks deterministically

For must-NOT-happen assertions, the suite now uses three deterministic idioms instead of sleeping and hoping:

  • Sentinel render: type one char and wait for it to paint — any wrongly-scheduled UI change (stale wizard failure line, dropped-recap render, rewind picker, scrollback wipe) would be in that same coalesced frame.
  • Close-anchored asserts: for driver-level negatives (no prompt sent, no response for a dead request, no rewind), assert after await run — every queued input has provably drained.
  • delay(0) macrotask barrier: for gates that run synchronously off input dispatch (double-Escape counting, Ctrl-C/Ctrl-D, submit gates) — one macrotask turn runs strictly after every queued microtask, independent of machine load.

The never-dropped fallback-enqueue test no longer sleeps 2.2s blind: the fake driver counts enqueue attempts, and the test waits for the retries to observably cross the old ~20-attempt give-up budget (the exact regression #1135-era bug shape), still at the real 100ms cadence so a reintroduced time-based budget would also trip it.

Retained real-boundary contracts (unchanged by design)

  • runSignalExitProbe / runFatalExitProbe: real child processes, real signals, and the real 3s PROCESS_EXIT_GRACE_MS deadline (3.5s + 2×0.5s of the remaining wall time).
  • The 100ms fallback retry cadence (retry-budget test above).
  • The 250ms hydration-retry cancellation window — a real-timer negative; now documented as derived from the retry schedule rather than an arbitrary sleep.

Production surface

One additive, optional injection point: MakaPiTuiInput.shellRunTicker?: { now?, schedule? }, threaded into createShellRunElapsedTicker (which already accepted both). Defaults unchanged.

Timing (local, node --test dist/__tests__/pi-tui-runner.test.js, 142 tests)

BeforeAfter
Wall15.5s12.1s
CPU (user)4.2s4.1s

The remaining wall time is dominated by the preserved real-boundary tests listed above; every other test now completes the moment its observed condition holds, and no assertion in the suite races scheduler timing anymore. Full packages/cli suite: 492/494 pass — the 2 failures are pre-existing local noise (run-command.test.ts expects empty stderr; Node 22.17 emits a SQLite ExperimentalWarning) on paths this PR does not touch.

…pletion
Part of apache#2389. The Pi TUI runner suite guessed at scheduler timing in three
ways, all sensitive to CI load:
- 55 unconditional sleeps (delay(20)..delay(2500)) where the awaited fact is
observable: startup paints, prompt arming, wizard frames opening/closing,
drafts appearing, and retry attempts are all now waited on directly via the
existing waitFor helper, a new waitForTuiPaint helper, sentinel-render
barriers for must-not-render negatives, and close-anchored assertions for
must-never-happen driver calls.
- 81 Promise.race close watchdogs with a flat 50/500ms deadline that a loaded
runner can miss; they now share CLOSE_BUDGET_MS (WAIT_BUDGET_MS-scaled), so
a passing race is unchanged and only failure reporting pays the budget.
- The off-screen ticker test slept 2.5s for two real 1s ticks; the shell-run
elapsed ticker's clock and interval scheduling are now injectable
(MakaPiTuiInput.shellRunTicker, same pattern as
attentionLongTurnThresholdMs) and the test drives both ticks itself.
Synchronous input-dispatch negatives (double-Escape counting, Ctrl-C/Ctrl-D
gating, submit gates) settle on one macrotask turn (delay(0)) instead of a
20-30ms guess, and the never-dropped fallback-enqueue test now waits for the
driver to observe the retries crossing the old give-up budget instead of
sleeping 2.2s blind.
Preserved as real timeouts or real process boundaries: the SIGTERM/fatal exit
probes (real child processes and the 3s exit grace), the 100ms fallback retry
cadence, and the 250ms hydration-retry cancellation window (now documented
as schedule-derived).
Focused timing (node --test dist/__tests__/pi-tui-runner.test.js, 142 tests):
15.5s -> 12.1s wall locally, with the remainder dominated by the preserved
real-boundary tests, and no fixed-delay races left in the suite.
Sign up for freeto 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.

2 participants

@UncertaintyDeterminesYou4ndMe@jackwener