maniator / maniator/verticopolis
[Bug]: [P3] The live export path has no late-success wording, so a stalled live export closes with silence
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:
runExportFlowtakes the single-flight latch and callsexportStoredTower.- The stored attempt answers
"fallback"PROMPTLY (anexportRecord-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. UI.downloadFileroutes to the shell'ssaveFile, awaited raw under the same 10-minute watchdog (GH #773). That dialog hangs.- 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. - 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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