chore: small cleanups from the 2026-09 code review (checklist)
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
Research direction
The checklist names entry points across the project, including App.axaml.cs, MainActivity.OnPause, SystemAlarmService.cs, IncidentFile.SanitizeFileName, and DispatcherTimerTicker; read the relevant unchecked item and its referenced code first. Several items involve concurrency, lifecycle, security, or cancellation across subsystems, so select a narrowly scoped item and check whether it has already been split into another issue. Done means the chosen item is implemented and its behavior is covered by appropriate tests.
Written by the indexing model from the issue text.
Description
From the 2026-09-09 code review of main (35d86e1). Small, independent items; each is a short PR. Tick them off here.
- Four copy-paste JSON stores (
JsonRecentFilesStore,JsonLastSaveFolderStore,JsonLastPdfExportStorein AppLogic,JsonTrustStorein Sync) repeat the same read/deserialise/catch (JsonException)/write scaffolding. Extract one genericJsonFileStore<T>with the atomic temp+rename write that #286 added to the trust store. — #329 -
JsonTrustStore.Persist()mutates_cachebefore the disk write; ifFile.Movethrows, memory and disk diverge until the next write. Write first, then commit the in-memory change (noted in the #286 review). — #331 -
AboutViewModel.cs:68-77andLinksViewModel.cs:103-112are byte-identicalOpenUrlAsynctry/catch blocks; share one helper (also listed in #167 as "URL validation + opening duplicated"). — #332 -
RemoteIncidentSession.cs:496-501: a three-line comment block is duplicated verbatim. — #331 -
TasksSection.cs:54(PDF) usesDateTimeOffset.Nowto render "overdue", so the same incident exports differently depending on wall-clock time and the section is untestable. Pass theIClock(or an explicit "as of" timestamp) into the report. — #334 -
ForceUnit.StatusandRoleAssignment.Roleare free strings validated against nothing;Incident.StatusChangeText(:666) switches on the string, so a typo in master data silently falls through. Validate againstMasterDataSetat the session boundary, or model status as a small value type. — #355 -
App.CreateMainViewModel(App.axaml.cs:25) is a mutable public static delegate, a service-locator seam in an otherwise constructor-injected design. Pass the factory intoAppexplicitly. -
MainView.axaml.cs:19-32re-attachesPropertyChanged/Cancelled/… handlers to every newPendingPromptwithout detaching from the previous one. Same shape inIncidentWorkspaceView.axaml.cs:38,45. — #371 -
MainActivity.OnPausefires_ = _store?.FlushAsync()without awaiting; the last save can be lost when Android kills the process. Block briefly (with a timeout) as the desktopExithandler does. -
SystemAlarmServiceis never disposed on Android, so its temp WAV files leak. -
SystemAlarmService._voiceTempFilesis an unsynchronizedDictionarywritten byTempFileForonSerialAudioQueue's worker thread (SystemAlarmService.cs:107-125, reached fromPlayBlocking:80) and enumerated byDisposeon the UI thread at exit (:152) — a cue in flight during shutdown enumerates while the other thread mutates. Same class as theDispatcherTimerTickeritem below, but unlike that one this is genuinely cross-thread. While there: the temp path is a fixedlagebuch-{sound}.wavin the world-writable system temp dir (:116), with none of the per-open GUID directory and symlink refusalAttachmentTempPathsgives attachments — another local user can pre-create or symlink that path. (Found re-auditing #167.) - No
CancellationTokenSourceexists anywhere insrc/; tokens are only forwarded. A slow join, a large upload or a long PDF export cannot be cancelled by the user. Wire a cancel button on the join and export flows to a real CTS. -
IncidentFile.SanitizeFileName(#285) strips control characters but not Unicode format characters (e.g. U+202E RLO), so a display-name spoof is still possible in the Dateien list. StripUnicodeCategory.Formattoo. -
DispatcherTimerTickerallocates_subscribers.ToArray()on every tick and a throwing subscriber aborts the rest of the tick on the UI thread; isolate subscribers (also listed in #167). -
RemoteIncidentSession's per-device attachment cache underattachment-cache/is never evicted (also listed in #167). — split out as #382, tracked there. -
HttpClientHandlercreated inRemoteIncidentSessionis now disposed (#286); checkSystemAlarmService._voiceTempFilesandPdfLicense._configuredstatic state for testability while there.
- Dominant language
- C#
- Stars
- 1
- Forks
- 3
- Avg merge
- 4h 34m
- Merged PRs (30d)
- 182
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing 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.
More from CodeForFire/lagebuch
-
bug ux
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
CodeForFire/lagebuch#714 ·
Maintainers usually reply within 1 day
-
bug ux
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
CodeForFire/lagebuch#713 ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
CodeForFire/lagebuch#405 ·
Maintainers usually reply within 1 day
-
documentation good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
CodeForFire/lagebuch#349 ·
Maintainers usually reply within 1 day
-
documentation good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
CodeForFire/lagebuch#348 ·
Maintainers usually reply within 1 day
All issues in CodeForFire/lagebuch
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
bug priority: P2
Difficulty 1/5 Under an hour Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
IridiumIO/CompactGUI#699 ·
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day