Schema v33: adds error_stack_trace and is_permanent columns to sync_logs
SyncLogEntry gains stackTrace and isPermanent fields; SyncLogRepository.log() gains matching optional parameters; IMAP and JMAP sync loops forward the stack trace string and isPermanent flag when writing error entries
New lib/ui/utils/about_markdown.dart utility shared by AboutScreen and the sync log copy feature
AboutScreen refactored to use the shared utility (no behavior change)
SyncLogScreen: subtitle shows "Error (permanent)" for permanent errors; expanded view shows stack trace in red monospace; each tile has a Copy button that copies a markdown summary of the entry plus the About section
Test plan
Unit tests pass: flutter test test/unit/ — 330 tests
Widget tests pass: flutter test test/widget/ — 135 tests
Coverage gate passes: 83% (threshold 80%)
flutter analyze — no issues
Migration test updated for v33 columns
New repo test validates stackTrace and isPermanent round-trip
## Summary
- Schema v33: adds `error_stack_trace` and `is_permanent` columns to `sync_logs`
- `SyncLogEntry` gains `stackTrace` and `isPermanent` fields; `SyncLogRepository.log()` gains matching optional parameters; IMAP and JMAP sync loops forward the stack trace string and `isPermanent` flag when writing error entries
- New `lib/ui/utils/about_markdown.dart` utility shared by `AboutScreen` and the sync log copy feature
- `AboutScreen` refactored to use the shared utility (no behavior change)
- `SyncLogScreen`: subtitle shows "Error (permanent)" for permanent errors; expanded view shows stack trace in red monospace; each tile has a Copy button that copies a markdown summary of the entry plus the About section
## Test plan
- [ ] Unit tests pass: `flutter test test/unit/` — 330 tests
- [ ] Widget tests pass: `flutter test test/widget/` — 135 tests
- [ ] Coverage gate passes: 83% (threshold 80%)
- [ ] `flutter analyze` — no issues
- [ ] Migration test updated for v33 columns
- [ ] New repo test validates `stackTrace` and `isPermanent` round-trip
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
error_stack_traceandis_permanentcolumns tosync_logsSyncLogEntrygainsstackTraceandisPermanentfields;SyncLogRepository.log()gains matching optional parameters; IMAP and JMAP sync loops forward the stack trace string andisPermanentflag when writing error entrieslib/ui/utils/about_markdown.dartutility shared byAboutScreenand the sync log copy featureAboutScreenrefactored to use the shared utility (no behavior change)SyncLogScreen: subtitle shows "Error (permanent)" for permanent errors; expanded view shows stack trace in red monospace; each tile has a Copy button that copies a markdown summary of the entry plus the About sectionTest plan
flutter test test/unit/— 330 testsflutter test test/widget/— 135 testsflutter analyze— no issuesstackTraceandisPermanentround-trip🤖 Generated with Claude Code