test(#4518): migrate loop/hook-point e2e batch to named timeout constants

Batch 7 of 17 in the ad hoc timeout literal migration (epic #4445).
Replaces every bare numeric timeout/timeoutMs object-literal property in
tests/loop-render-hooks.test.cjs, tests/loop-walk.qa.test.cjs,
tests/loop-hooks-empty-points-e2e.test.cjs, tests/loop-hooks-ship-pre-e2e.test.cjs,
tests/loop-hooks-verify-post-e2e.test.cjs, tests/check-gap-analysis-plan-post-e2e.test.cjs,
tests/check-tdd-review-checkpoint-e2e.test.cjs, tests/execute-wave-post-gate-pipeline-e2e.test.cjs,
tests/plan-pre-hook-e2e.test.cjs, and tests/qa/tdd-walk.cjs with a named
constant, per eslint-rules/no-adhoc-timeout-literal.cjs. Removes the 10
files from the rule's allowlist.

Promotes a new shared class norm to tests/helpers/timeouts.cjs,
LOOP_HOOK_POINT_CLI_TIMEOUT_MS: 7 files independently arrived at the same
value for a single gsd-tools.cjs CLI subcommand invocation with no
confirmed subprocess fan-out. Reuses the existing PROBE_TIMEOUT_MS for
loop-render-hooks.test.cjs's 11 sites (same class, exact value match).
Adds 4 file-local constants for values that share a class with the new
norm or an existing one but diverge in pre-existing value, or that
numerically coincide with an unrelated existing constant without
matching its actual operation.

Isolated Standards-axis review caught that the new shared constant's doc
comment exhaustively enumerated 3 verb families while a 7th genuine site
(an `init new-project` invocation) also correctly belonged to the class;
fixed by rewording the comment to state the class definition (call
shape) first and list all 4 representative verbs, explicitly
illustrative rather than exhaustive. No value changed, no site's
classification changed.

No src/bin file touched, no numeric value changed anywhere.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sim
2026-09-10 15:50:52 -04:00
parent 138e70d734
commit 6d6e3eea73
12 changed files with 91 additions and 31 deletions

View File

@@ -21,6 +21,16 @@ const { promisify } = require('node:util');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { getLiveCommandTokens } = require('./helpers/live-command-registry.cjs');
const { LOOP_HOOK_POINT_CLI_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
// Bounds a full run of scripts/qa-smell-ratchet.cjs against the real repo
// tree (a static-analysis scan, not an installer or a CLI subcommand). The
// value numerically coincides with INSTALL_TIMEOUT_MS in
// tests/helpers/timeouts.cjs, but describes a different class of work, so
// it is kept local rather than reusing that constant. No fresh bench data
// justifies a different number, so the pre-existing 120000ms literal is
// preserved exactly under this name.
const QA_SMELL_RATCHET_SCAN_TIMEOUT_MS = 120000;
const { KIND, classify } = require('./qa/result.cjs');
const { ORACLES, runOracles, SEVERITY } = require('./qa/oracles.cjs');
@@ -1617,7 +1627,7 @@ describe('worktree-concurrency (dedicated — trajectory 9 is not expressible as
const { stdout } = await execFileAsync(
process.execPath,
[TOOLS_PATH, '--json-errors', ...argv],
{ cwd: dir, encoding: 'utf-8', env, timeout: 60000 },
{ cwd: dir, encoding: 'utf-8', env, timeout: LOOP_HOOK_POINT_CLI_TIMEOUT_MS },
);
return { stdout: stdout.trim(), startedAtMs, finishedAtMs: Date.now() };
}
@@ -1849,7 +1859,7 @@ describe('qa-smell-ratchet gate (#3597)', () => {
const result = spawnSync(
process.execPath,
['-e', `require(${JSON.stringify(scriptPath)})`],
{ cwd: repoRoot, timeout: 120000, encoding: 'utf-8' },
{ cwd: repoRoot, timeout: QA_SMELL_RATCHET_SCAN_TIMEOUT_MS, encoding: 'utf-8' },
);
assert.strictEqual(
result.status,