Repository navigation
Conversation
Toni's report: completing a Vikunja task with the rotor action took more than a second to confirm on the iPhone. The write itself takes about 0.2 s (0.4 s for a recurring task); the rest was the reminder scan holding Expo's shared serial queue. Recorded under B13 with the three decisions: the scan gets its own native queue plus a rerun flag and a log line for the check-off (218), the phone keeps reading live with no 5-minute cache (219), and update_task takes the previous row so adapters send only what changed (220). The 17 s hang on an unreadable Vikunja page stays open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d one word for the scan The scan starts 2.5 s after the cacheObserver flush, which restarts the debounce, not 2.5 s after the check-off. Scan times as measured: mostly 3.4-4 s, once 5.2 s, once 21 s with 17 s on one Vikunja page. 220 names the plugin interface, which every external adapter is reached through. 219 no longer promises that a change from another device arrives at once. The reminder scan is called Erinnerungs-Durchlauf throughout, so it no longer shares a word with sync. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s silence The scan the second check-off waited on is named with its time and length (09:33:57-09:34:01 UTC, 4.0 s), so it is not read as the 21 s one. That 21 s scan was silent for 17 s and ended with every socket dead, as after each return from the background: the app was most likely suspended, and the Vikunja server had answered in 51 ms. 220 names the device adapter as the one task adapter outside the plugin interface, and the six task plugins instead of every plugin crate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…me, and one sentence The local store, like the device adapter, is called directly by the hosts, not through the plugin interface. The Vikunja server sent its headers in 51 ms, but the body never arrived. 220 says the host reads the cached row before every write; today it reads the list only when a recurring task is completed. One genitive fixed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d on the phone, who calls whom Both hosts already read the cached list after every external task write (write_through_task), and again after completing a recurring task; never before the write. The 90 ms were measured on the iPhone; two requests per change are saved on both hosts. The sentence on the built-in adapters now says plainly that the hosts call them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Records Toni's report of 2026-10-06 and the three decisions it led to. Docs only; nothing is implemented yet.
The report
Completing a Vikunja task with the rotor action took more than a second to confirm on the iPhone.
The log shows:
upcomingRemindersJsonruns on Expo's shared serial default queue. A scan mostly takes 3.4 to 4 s.updateTaskJsonand the settings reads queued behind it.cacheObserver.ts, which restarted the 2.5 s reminder debounce. The second check-off's PATCH came 32 ms after the scan ended.TODO B13
rescheduleRemindersruns again after a scan instead of dropping a request that arrives during one. A log line records when the check-off fired.TasksFeature::update_tasktakes the previous row, so adapters send only what changed. Vikunja then skips the assignee PUT and theGET /tasks/{id}behindreconcile_parent. This is a deliberate behaviour change: a newer change from another device is no longer overwritten. The row has to cross the plugin interface, which today carries a bareTask, so this includes the ABI question.First check (ee3e5e8)
Two checkers (code, log) and one skeptic per finding. Seven findings were confirmed and fixed:
cacheObserverflush, not 2.5 s after the check-off. That is about 3.8 s after the write.ffi_update_taskdecodes a bareTask.GETis named as the task's own read.Three were refuted.
Second check (b543594)
Five findings were confirmed and fixed:
ffi_update_task.Two were refuted.
Third check (8bdb03d)
Three findings were confirmed and fixed:
220 now also says that the host must read the cached row before every write.
Fourth check (528fec9)
Three findings were confirmed and fixed:
write_through_task), and again after completing a recurring task. Neither read comes before the write.One was refuted.
Fifth check (528fec9)
No findings. Three wording suggestions were refuted: each sentence is correct as written.
Docs
TODO only. DESIGN describes no behaviour that changes here.
🤖 Generated with Claude Code