Notechondria

Version: 0.1.35 Build Date: 2026-04-18T13:00

What's Changed

§1.7 migration: Portal round complete

Every direct _appendUiLog(String) call site in frontend/portal_app/lib/app_shell.dart now emits the canonical "<consequence>: <module>/<process> \u2014 <cause>" shape via the structured _log({level, source, message}) helper.

Migrated sources (grouped):

  • Portal.LocalStore/{seed_starter, clear, clear_cache, copy_logs, restore_templates} \u2014 first-run shell seed, clear-local-data, clear-cache, frontend-logs-copy, admin template restore.
  • Portal.Sync.FrontPage/{bootstrap, pull} \u2014 initial data bootstrap and front-page refresh success/failure.
  • Portal.Sync.Settings/{save, avatar.upload} \u2014 settings save (no-change / offline-save / cloud success / remote-fail fallback) and avatar upload (missing session, cancellation reasons, success, error).
  • Portal.Sync.Courses/{push, create_local, load, subscribe, unsubscribe} \u2014 local-course push, local-course creation log, course-load failure, subscribe/unsubscribe guards.
  • Portal.Sync.Notes/{pull, push, create, save, save_local, delete, delete_local, restore, restore_version, empty_trash, push_all, list} \u2014 the full draft + cloud-note sync surface. The restore_version source covers the note-history restore path (distinct from the recycle-bin restore).
  • Portal.Sync.Events/{create, toggle} \u2014 planner event creation and is-completed toggle; portal does not have a local-only planner event path like planner.
  • Portal.Sync.Calendar/{refresh, import, subscribe, toggle, delete} \u2014 the five calendar-feed operations.
  • Portal.Sync.Activity/load_week \u2014 heatmap week load success
    • failure.
  • Portal.UI/{open_course, open_note, open_note_viewer, note_session.start, note_session.finish} \u2014 user-visible navigation actions and the note-session lifecycle.

Milestone: every app_shell.dart is \u00a71.7-compliant

With this round, all three Flutter apps' app_shell.dart files have zero direct _appendUiLog(String) call sites. The wrapper method stays only as the callback signature for widgets that accept onLogEvent (e.g. _LearnerPage, _SettingsPage). Entries routed through the callback still flow into _log with level: info, source: ''; those will be migrated when the module part-files are next touched.

Files Changed

New

  • docs/versions/0.1.35.md (this file).

Modified

  • VERSION: 0.1.34 \u2192 0.1.35.
  • docs/TODO.md: \u00a71.7 migration checklist marks Portal round done; frontend app_shell.dart migration is complete.
  • frontend/portal_app/lib/app_shell.dart: ~45 message sites rewritten to \u00a71.7 shape via _log(...). SnackBar text in user-facing surfaces (_updateSettings, _uploadAvatar, offline-fallback create/save, _syncAllLocalData, _restoreTemplateCourses, _clearLocalCache, _clearLocalData, _copyFrontendLogs) now carries the module/process prefix so an operator pasting the toast has the source. Also removed a duplicate _showMessage call in the _saveNote catch block that was left over from the initial edit pass.

Verification

  • portal_app: flutter analyze \u2014 66 issues (up from 53 in 0.1.27). The delta is entirely prefer_single_quotes info-level false-positives on intentional double-quoted strings that contain ' around titles (same category of lint misfire documented in 0.1.31\u20130.1.34). No errors.
  • portal_app: flutter test test/smoke_test.dart -r compact \u2014 passes.

Notes / follow-ups

  • Frontend \u00a71.7 migration is complete across all direct _appendUiLog(String) call sites in all three Flutter apps' app_shell.dart files. Remaining sub-work:
    • Module part-files (modules/learner.dart, modules/settings.dart, modules/course.dart, modules/activity.dart) across all three apps still route through onLogEvent: _appendUiLog. Those emit Info-level entries with empty source in the debug log card; they'll be migrated when the module files are next touched.
  • Backend \u00a71.7 migration is already complete (0.1.28\u20130.1.30).