enhance(#4570): allow disabling planner stall detection (#4585)

* enhance(#4570): allow disabling planner stall detection

* docs(#4570): add changelog fragment

Emitted-Drift-Ack-Growth: plan-phase.md — the explicit opt-out gate covers all five planner and checker spawn classes
Emitted-Drift-Ack-Growth: settings-advanced.md — the toggle prompt and bounded-recovery warning expose the new setting

* chore(#4570): refresh compact-content baseline

* fix(#4570): preserve default-on watchdog fallback

* docs(#4570): qualify the chunked-mode orchestrator rules with the toggle

The two chunked-planning-mode stall-watch imperatives read as
unconditional, with the opt-out stated only in a following bullet. State
the PLANNER_STALL_DETECTION_ENABLED condition inline, matching the three
sites already qualified in plan-phase.md.

* chore(#4570): refresh compact-content baselines against rebased next

* fix(#4570): sync planner stall launcher

Keep the stall-detection helper aligned with the canonical runtime launcher.

* chore(#4570): refresh compact baseline after rebase

---------

Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
This commit is contained in:
Michel Moreira
2026-09-23 19:46:23 -03:00
committed by GitHub
parent 17bf25a3d2
commit 1e3e1f7cd8
21 changed files with 417 additions and 53 deletions

View File

@@ -62,6 +62,9 @@ const REPO_ROOT = path.join(__dirname, '..');
const { INSTALL_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const PILOT_REL = path.join('gsd-core', 'workflows', 'execute-phase.md');
const PILOT_PATH = path.join(REPO_ROOT, PILOT_REL);
const PLAN_PHASE_REL = path.join('gsd-core', 'workflows', 'plan-phase.md');
const CHUNKED_PLAN_REL = path.join('gsd-core', 'workflows', 'plan-phase', 'steps', 'chunked-planning-mode.md');
const STALL_HELPERS_REL = path.join('gsd-core', 'workflows', 'plan-phase', 'steps', 'stall-detection-helpers.md');
// plan-phase.md was the original #2930 pilot but was reverted to unmarked
// (chore/2930 retarget: it sits 36 B under the ADR-857 Phase-6 PRE_PHASE6
// gate and cannot absorb marker overhead) — it was a genuinely unmarked
@@ -284,6 +287,22 @@ test('noSectionMarkerLeaksIntoEmittedArtifacts', (t) => {
false,
`${runtime}: emitted execute-phase.md still contains a gsd:section marker token`,
);
// #4570: assert against the real installed workflow bytes for every runtime,
// after composition and runtime conversion. The background parameter itself
// is runtime vocabulary (`run_in_background` becomes `background` on Hermes),
// so parity is pinned on the shared gate and its two semantic branches.
for (const relativePath of [PLAN_PHASE_REL, CHUNKED_PLAN_REL, STALL_HELPERS_REL]) {
const installedPath = path.join(configDir, relativePath);
assert.ok(fs.existsSync(installedPath), `${runtime}: emitted ${relativePath} is missing`);
const installed = fs.readFileSync(installedPath, 'utf8');
assert.match(installed, /PLANNER_STALL_DETECTION_ENABLED/,
`${runtime}: ${relativePath} lost the planner stall-detection gate during conversion`);
assert.match(installed, /gsd_stall_watch/,
`${runtime}: ${relativePath} lost the default-on watcher branch during conversion`);
assert.match(installed, /runtime-native/,
`${runtime}: ${relativePath} lost the explicit-off ordinary completion branch during conversion`);
}
cleanup(root);
}
});