fix(scripts): address Copilot review round 1 on #2147

- pty.mjs: narrow the BSD argv set to {darwin, freebsd}. Grouping every
  BSD together was wrong — NetBSD's `script` takes the command through
  `-c`, so the argv form fails at `script` startup, which this smoke would
  then report as a TUI crash. Rather than add an unverified `-c` branch
  for netbsd/openbsd, they fall through to `null` and the smoke skips with
  the reason: a guessed invocation turns a clean skip into a false failure
  while looking like support.

- pty.test.mjs: "supported unless Windows" would fail `test:scripts` on
  aix/sunos/netbsd/openbsd, where a null wrapper is correct and the smoke
  skips by design. State the policy once (SUPPORTED_PLATFORMS) and branch
  on it, keeping the real-probe teeth that catch a `script` missing from
  PATH. Pin netbsd/openbsd/aix/sunos to null in scriptFlavorFor's tests
  so "unsupported" reads as the default, not a win32 special case.

- render-smoke.mjs: the @returns contract claimed a close guarantee the
  code does not give — both drain give-up branches resolve after only a
  warning, so output can be truncated and the child may still hold the
  work dir. Document the bounded fallback and name the required cleanup
  shape (removeSafe, not rmSync), since a caller "tightening" cleanup on
  the old wording would reintroduce #1801 exactly where it doesn't hold.

- AGENTS.md, clients/launcher/README.md: drop the pre-#2111 claim that the
  smokes build test-servers "on demand if it is missing". ensureTestServers
  rebuilds unconditionally, once per process — presence is not freshness.

- .github/copilot-instructions.md: mirror the survival rule, per the
  same-PR mirroring requirement. One bullet, generalized past this fix:
  a smoke must assert the thing survives, not that it started, and the
  started-then-died branch belongs in a scripts/lib test against a stub.

Signed-off-by: Cliff Hall <cliff@futurescale.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-08-26 21:20:52 -04:00
commit bd7297da88

View file

@ -31,8 +31,19 @@
import { spawnSync } from "node:child_process";
/** Platforms whose `script` takes the BSD argv form. */
const BSD_PLATFORMS = new Set(["darwin", "freebsd", "openbsd", "netbsd"]);
/**
* Platforms whose `script` takes the BSD argv form (`script -q FILE cmd args…`).
*
* Deliberately just these two. darwin is verified empirically here; freebsd is
* where darwin's implementation comes from and shares its usage. **netbsd and
* openbsd are excluded on purpose** — the BSDs do not agree on this, NetBSD's
* `script` takes the command through `-c` — and nobody has run either here. A
* guessed invocation is worse than none: it fails at `script` startup, which
* this smoke would then report as a TUI crash. They fall through to `null` and
* the smoke skips, saying so. Adding a `-c` flavor for them is a small change
* for whoever can actually verify it on the box.
*/
const BSD_PLATFORMS = new Set(["darwin", "freebsd"]);
/**
* Quote one argument for a POSIX shell command string.
@ -70,8 +81,9 @@ export function scriptFlavorFor({ platform, versionOutput = "" }) {
// own usage error in the captured output, which is diagnosable — silently
// skipping is the outcome this issue exists to stop rewarding.
if (platform === "linux") return "util-linux";
// win32 and anything else: no `script(1)`. `node-pty` is the portable answer
// if this smoke ever has to run there.
// win32 (no `script(1)` at all), and any platform whose invocation nobody has
// verified — aix, sunos, netbsd, openbsd. The caller skips loudly rather than
// guessing. `node-pty` is the portable answer if this ever has to run there.
return null;
}