| Ticket Hash: | ecdf07eb527f75d69ae9abcbf85c697378519ef4 | ||
| Title: | FOR STONE (file there once stone.fossil is recovered): sync shows a green checkmark when the server never replied; success must require the round-trip line, and missing counts must be a failure | ||
| Status: | Active | Type: | Code_Defect |
| Severity: | Normal | Priority: | High |
| Subsystem: | Resolution: | ||
| Last Modified: |
2026-09-20 21:08:09 51.5 days ago |
Created: |
2026-09-20 21:08:08 51.5 days ago |
| Version Found In: | |||
| Description: | ||||
|
Maintainer 2026-09-20: 'Stone reports a server non-reply as a green checkmark.' Reproduced against the live cause: https://ollama.openbeagle.org/stone/timeline resets the connection right now (the served stone.fossil is corrupt, ollama ticket 07e146dd53), and the app shows the repo as synced.
Cause, from ios/Stone/Services/RepoStore.swift (syncAll, around line 220, same on the single-repo path in RepoWebView.runSync): after the embedded 'fossil sync' returns without throwing, the status becomes .success whenever detectAuthFailure finds nothing; the artifact counts come from parseArtifactCounts(output) ?? (sent: 0, received: 0), so output with no counts at all, which is what a connection reset, a timeout, or an HTML error page produces, is shown as a green checkmark with 0/0. Non-reply is treated as an empty success. Fix: a sync is .success only when the output carries Fossil's round-trip summary line ('Round-trips: N Artifacts sent: X received: Y') and no 'server did not reply', 'Cannot connect', 'Error:' or non-Fossil (HTML) body; parseArtifactCounts returning nil is a .failure('no reply from server') and counts in the summary line, never a default. FossilEngine.CommandResult.succeeded (exitCode == 0) is not enough on its own, fossil sync exits 0 in some of these cases. Spec: a fixture output with no round-trip line yields .failure; the existing sent/received fixtures still yield .success. Show the failure icon the RepoListView already reserves for it. This ticket lives on ollama only because stone.fossil is unreadable; move it to stone once ticket 07e146dd53 completes and close this copy with the new hash. | ||||