maniator / maniator/verticopolis

[Bug]: [P3] The live export path has no late-success wording, so a stalled live export closes with silence

Open
#784 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
5
Forks
1
PR merge metrics
No merged PRs in 30d

Description

Deferred from the adversarial review of the GH #774 fix (Blind Hunter, defer).

#774 gave a late-settling export its own wording, The earlier export of "<name>" finished. Check where you saved it., but only on the stored-byte branch. The live-serialize path can reach the same state and closes the loop with nothing.

Mechanism

On a wrapped session, in src/game/exportFlow.ts:

  1. runExportFlow takes the single-flight latch and calls exportStoredTower.
  2. The stored attempt answers "fallback" PROMPTLY (an exportRecord-less or non-authoritative store, a failed flush, or a rejecting or malformed bridge). The run still owns the latch, so the late-fallback bail does not fire and the flow enters the live path.
  3. UI.downloadFile routes to the shell's saveFile, awaited raw under the same 10-minute watchdog (GH #773). That dialog hangs.
  4. The watchdog frees the latch and toasts The export is not responding. You can try exporting again. The player moves on, usually into another tower.
  5. The dialog finally settles, and nothing is said.

The player's sequence is therefore: Tower exported (N KB). Check your downloads. (the live path emits it ABOVE the await, deliberately, because the port resolves identically for a written file and a canceled dialog), then ten minutes later The export is not responding., then silence when it lands. That is the same "you were told it stalled, then it landed" confusion #774 addressed on the stored branch, arriving in a different order and never corrected.

Reachable only where the stored path is unavailable, which is an old or nonconforming shell, or a session whose flush failed. The conforming-shell stored path is covered.

Why it was left out of #774

Deliberate scope, not an oversight. The copy ruling on #774 (2026-08-07) holds the live-path string byte-identical, so wording this branch there would have violated the acceptance criterion that pinned it.

Fix shape

Wants a copy decision first, because the live-path toast fires before the await and the flow cannot tell a written file from a canceled dialog at settle time. Either the late line has to be honest about that ambiguity, or the saveFile cancel channel recorded as #773's residual has to land first, at which point a late settle can say which outcome it was and name the tower from the same invocation-time capture the stored branch already keeps.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in src/game/exportFlow.ts and compare the live path with the stored branch addressed by #774. Review #773's saveFile cancel-channel residual before deciding how a late settle should be described. Done requires an agreed copy decision and a late-success outcome that does not misrepresent a canceled or written file.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
game-dev
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.