English | 中文
Status: resolved
A Web agent changed the GUI source but did not know which URL and process hosted its session. It delegated acceptance to the user, then treated a bare Vite HTTP 200 as success despite a missing window.__DSH_BOOT__ white screen, and finally validated a replacement dsh web server on another port while the original page had already picked up rebuilt artifacts. The fix makes the current URL and runtime mode model-visible and shell-queryable, rejects standalone Vite before listen, and verifies production refresh and development HMR against external state.
The session ran inside the DeepSeek Harness Web GUI at port 3081 while its selected Workspace was an empty test/ directory. The model request named neither the GUI nor its source checkout, URL, process, or update mode. Repository affordances exposed apps/web with a Vite development script, while the full browser composition lived behind dsh web.
The resulting actions were individually plausible but did not share one acceptance target. A source edit, a successful build, an HTTP 200, an injected boot manifest, and the user's existing page were treated as interchangeable facts.
The evidence source is the persisted event log for session-3eb796c2-5159-4686-affe-df8719f6f987, whose header records cwd /Users/tn.shen/Documents/deepseek-harness-gui-master/test. Its initial request header is sequence 6; the user-facing handoff, bare-Vite launch, replacement-host launch, boot-manifest probe, and first 3081 process probe are sequences 30939, 31865, 34309, 34441, and 34681 respectively. The timeline below follows those events rather than reconstructing intent from the later report.
The user had to identify three consecutive mistakes: acceptance was delegated back to them; the proposed preview was a blank page; and the reported successful URL was not the page they were using. An unmanaged replacement server also outlived the turn until the user challenged it.
No change in this investigation restarted or modified the read-only 3081 and 3082 trial services.
pnpm run demo:tui or open an unspecified Web application. It ran no assembled Web acceptance.apps/web/package.json, launched bare Vite on port 5173 at sequence 31865, observed HTTP 200, and declared success. The browser instead threw client-modules: window.__DSH_BOOT__ is missing or not an object and rendered a white page.dsh web path, rebuilt the shell, launched an unmanaged process on port 3334 at sequence 34309, and checked only that this replacement returned 200 with a boot manifest at sequence 34441. It never probed port 3081.The Web assembly had no model-visible identity for the current GUI, canonical URL, or runtime mode. The session cwd correctly identified the user's selected Workspace, but the model treated that project directory as the application directory. No durable record related the GUI source checkout, built artifacts, serving process, target origin, and browser acceptance.
The wrong startup path looked legitimate because bare Vite returned HTTP 200. window.__DSH_BOOT__ is injected only by the full host, so transport readiness did not imply application readiness. The first regression test repeated this mistake in another form: a timeout killed Vite and satisfied a nonzero-exit assertion. Live reproduction exposed that false positive.
Background process semantics were also bypassed with shell &, so job identity, completion notices, collection, and cleanup did not apply. Verifying port 3334 therefore proved only that a second service worked.
app:web-surface prompt section and managed $DSH_WEB_URL/$DSH_WEB_MODE environment.dsh web --dev mounts only the HMR receiver; pnpm run dev:web in the same checkout must also rebuild client-plugin bundles, while shell and plain-package changes still require refresh.apps/web standalone Vite serve mode rejects during configuration. Its subprocess test proves natural exit and instruments Server.listen() so a transient bind cannot pass unnoticed.