`, `git diff --check`, and the protected
+ resolver zero-diff gate pass after formatting.
+- Residual boundary: local macOS skips both native live cases. Commit the diagnostic and evidence,
+ then require a fresh exact-head artifact run with the same successful lifecycle on Windows x64
+ and ARM64 plus exact profile/directory teardown before any production handle change.
## Accepted Gaps
@@ -19492,12 +19555,12 @@ The project is not complete until every applicable item below is checked with ev
## Next Required Action
-Implement the purpose-named disconnected Windows no-input handle diagnostic required by
-`E-M6-WINDOWS-NOINPUT-STANDARD-PIPE-CI-RED-001`. Compare an overlapped pipe with immediate parent
-destruction against inherited stdin, keep each attempt bounded, and record sentinel/stdout-end/
-process-exit/channel-close on native x64 and ARM64. Do not change the production Windows handle or
-check the broad Milestone 6 Windows system-SSH item until the diagnostic selects a console-independent
-strategy. Do not add an Electron/startup/product importer, per-target mode wiring, fallback, tuple
+Commit and push the disconnected no-`-n` standard-pipe diagnostic recorded by
+`E-M6-WINDOWS-NOINPUT-PIPE-NO-N-LOCAL-001`, then run the exact head on Windows x64 and ARM64 and
+record sentinel/stdout-end/process-exit/channel-close plus exact profile/directory teardown. Do not
+change the production Windows handle or check the broad Milestone 6 Windows system-SSH item until
+both architectures select the same console-independent strategy. Do not add an
+Electron/startup/product importer, per-target mode wiring, fallback, tuple
enablement, release publication, or default behavior.
Keep Node upstream `.tar.xz` inputs, Windows ZIP, `ORCA_RELAY_PATH`, existing desktop required-assets
behavior, detached-signature byte encoding, Windows arm64 build 26100, macOS 13.5, Linux kernel 4.18,
diff --git a/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html b/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html
index 9a1e9a8c39a..9d12a8dc7cb 100644
--- a/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html
+++ b/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html
@@ -1646,13 +1646,15 @@
stdout-end, sentinel, and channel-close settlement; POSIX no-input probes use an
OS-level ignored stdin handle plus OpenSSH -n; Windows must not map
stdin to NUL because Win32-OpenSSH issues #856/#1330 document a
- redirected-handle hang; a standard anonymous pipe with its parent write end
- destroyed is also rejected by native x64/arm64 evidence; qualify a
- console-independent overlapped-pipe EOF strategy against an inherited-stdin
- control before selecting the Windows handle, always with -n;
- fixture-owned Windows session processes settle before profile hives are
- boundedly unloaded and native profile deletion begins;
- MaxSessions=1; interrupted upload; stale lock
+ redirected-handle hang; native x64/arm64 evidence also proves that inherited,
+ standard-pipe, and overlapped-pipe handles all hang when the Windows client is
+ simultaneously forced through -n, so those runs do not isolate the
+ child handle. Qualify the upstream-recommended standard-pipe EOF with Windows
+ -n omitted as the next single-variable diagnostic; only test an
+ overlapped stdin pipe, also without -n, if the standard pipe fails.
+ POSIX retains ignored stdin plus -n; fixture-owned Windows session
+ processes settle before profile hives are boundedly unloaded and native profile
+ deletion begins; MaxSessions=1; interrupted upload; stale lock
Bundled Node hashes the full staged tree before sentinel write;
diff --git a/src/main/ssh/ssh-system-no-input-windows-openssh.test.ts b/src/main/ssh/ssh-system-no-input-windows-openssh.test.ts
index 94aa511423a..ed3bf45f24b 100644
--- a/src/main/ssh/ssh-system-no-input-windows-openssh.test.ts
+++ b/src/main/ssh/ssh-system-no-input-windows-openssh.test.ts
@@ -7,7 +7,7 @@ import type { SshTarget } from '../../shared/ssh-types'
import { buildSshArgs } from './system-ssh-args'
import { findSystemSsh } from './system-ssh-binary'
-type DiagnosticMode = 'inherited' | 'overlapped'
+type DiagnosticMode = 'pipe-eof-no-n'
type DiagnosticResult = {
mode: DiagnosticMode
@@ -42,28 +42,20 @@ function createTarget(): SshTarget {
}
}
-async function runDiagnostic(mode: DiagnosticMode): Promise {
+async function runDiagnostic(): Promise {
const sshPath = findSystemSsh()
if (!sshPath) {
throw new Error('Native Windows OpenSSH client is unavailable')
}
+ const mode: DiagnosticMode = 'pipe-eof-no-n'
const startedAt = performance.now()
- const child = spawn(
- sshPath,
- [...buildSshArgs(createTarget(), { noInput: true }), 'echo ORCA-SYSTEM-SSH-OK'],
- {
- // Why: qualify a console-independent overlapped pipe against the
- // upstream inherited-handle control before changing production.
- stdio:
- mode === 'overlapped'
- ? ['overlapped', 'overlapped', 'overlapped']
- : ['inherit', 'pipe', 'pipe'],
- windowsHide: true
- }
- )
- if (mode === 'overlapped') {
- child.stdin?.destroy()
- }
+ const child = spawn(sshPath, [...buildSshArgs(createTarget()), 'echo ORCA-SYSTEM-SSH-OK'], {
+ // Why: isolate the upstream-recommended pipe EOF from Win32-OpenSSH's
+ // null-input path before changing the production no-input command.
+ stdio: ['pipe', 'pipe', 'pipe'],
+ windowsHide: true
+ })
+ child.stdin?.destroy()
return new Promise((resolve, reject) => {
let stdout = ''
@@ -141,18 +133,14 @@ async function runDiagnostic(mode: DiagnosticMode): Promise {
describe.skipIf(!hasLiveInput)('Windows OpenSSH no-input child-handle diagnostic', () => {
it(
- 'compares inherited stdin with a console-independent overlapped EOF pipe',
- { timeout: 30_000 },
+ 'qualifies a standard EOF pipe without the Windows null-input option',
+ { timeout: 15_000 },
async () => {
expect(process.platform).toBe('win32')
- const inherited = await runDiagnostic('inherited')
- const overlapped = await runDiagnostic('overlapped')
- console.log(
- `ssh_windows_no_input_handle_diagnostic=${JSON.stringify({ inherited, overlapped })}`
- )
+ const pipeEofNoN = await runDiagnostic()
+ console.log(`ssh_windows_no_input_handle_diagnostic=${JSON.stringify({ pipeEofNoN })}`)
- // The inherited control must settle or this fixture cannot distinguish handle strategies.
- expect(inherited.success).toBe(true)
+ expect(pipeEofNoN.success).toBe(true)
}
)
})
|