Notechondria
Version: 0.1.26 Build Date: 2026-04-18T04:00
What's Changed
Offline-first sidebar parity (planner + portal)
-
Planner and portal sidebars now hide cloud categories while the
user is signed out, matching the editor behavior landed in 0.1.25.
planner_app/lib/app_shell.dartandportal_app/lib/app_shell.darteach gate theircourses:parameter on_token == null || _token!.isEmptyat the single call site where_LearnerPagecomposes_localCourses + _courses. When signed out the learner view sees only local categories; cached cloud note content stays addressable by UUID.
§1.7 migration: Editor.Auth round
-
editor_app/lib/app_shell.dartauth methods migrated to the canonical"<consequence>: Editor.Auth/<process> \u2014 <cause>"shape (as documented indocs/AGENTS.md):_register\u2192Editor.Auth/register_verify\u2192Editor.Auth/verify_resendVerification\u2192Editor.Auth/resend_verification_login\u2192Editor.Auth/login_requestPasswordReset\u2192Editor.Auth/password.reset.request_confirmPasswordReset\u2192Editor.Auth/password.reset.confirm_applyAuthPayloadsettings-bootstrap fallback \u2192Editor.Sync.Settings/bootstrap_applyAuthPayloadsuccess \u2192Editor.Auth/applyAuthPayload_logout\u2192Editor.Auth/logout
-
Legacy
_appendUiLog(String)wrapper preserved so other untouched call sites still compile; new code paths on this round call the richer_log(...)form. -
Preserved substring sentinels verified:
"invalid token","token_not_valid","authentication credentials were not provided","not_registered", and"No account found"all still appear in the pre- or post-prefix text paths where the session-rejection and OAuth-registration detectors look for them.
§1.7 migration: Backend.Creators.Auth/bind.* phased detail
(task 5a)
-
BindGoogleApiView.postnow fails with a distinctdetailand appropriate HTTP status for each phase:bind.google.config_lookup\u2192503whenGOOGLE_OAUTH_CLIENT_IDorGOOGLE_OAUTH_CLIENT_SECRETis missing from server settings.bind.google.token_exchange\u2192502on network errors reaching Google's token endpoint,400when Google rejects the code or returns noid_token.bind.google.token_verify\u2192502on network errors,400when tokeninfo rejects theid_tokenor the audience mismatches.bind.google.db_write\u2192500on an unexpected persistence failure,409on the pre-existing "already linked to another user" conflict path.
-
BindGithubApiView.postmirrors the same phased layout:bind.github.config_lookup\u2192503on missing GitHub OAuth credentials.bind.github.token_exchange\u2192502network errors,400when GitHub rejects code or returns no access token.bind.github.profile_fetch\u2192502network errors,400when/userreturns a non-200.bind.github.db_write\u2192 same shared path via_BindOAuthMixin.
-
_BindOAuthMixin._bind_social_accountwraps theSocialAccount.update_or_createin atry / exceptso a DB-side failure (uniqueness race, transient connectivity, etc.) is no longer surfaced as a generic500 Internal Server Errorbut asAccount linking failed: Backend.Creators.Auth/bind.<provider>.db_write \u2014 <cause>. -
Existing
creators.tests.OAuthBindRejectionTestsstill pass: the publicbindsubstring sentinel used bytest_google_public_endpoint_rejects_bind_intentandtest_github_public_endpoint_rejects_bind_intentis untouched.
Files Changed
New
docs/versions/0.1.26.md(this file).
Modified
VERSION: 0.1.25 \u2192 0.1.26.docs/TODO.md: 4b-extension item removed; 5b OAuth-callback-loading item removed (already landed in 0.1.25); \u00a71.7 migration checklist updated withEditor.AuthandBackend.Creators.Auth/bind.*marked done.frontend/editor_app/lib/app_shell.dart: 8 auth-related messages rewritten to the \u00a71.7 shape;_applyAuthPayload's remote-settings-unavailable path now logs via_logat warning level withEditor.Sync.Settings/bootstrapsource instead of concatenating a free-form_appendUiLogstring.frontend/planner_app/lib/app_shell.dart:_LearnerPage.coursesexpression gated on_tokenpresence.frontend/portal_app/lib/app_shell.dart: same gate.backend/creators/api.py:_BindOAuthMixin,BindGoogleApiView.post,BindGithubApiView.postrestructured for per-phase error responses with network-error wrapping.
Verification
flutter analyzeon editor / planner / portal \u2014 issue count unchanged vs 0.1.25 (same pre-existing infos).flutter test test/smoke_test.dart -r compacton all three apps \u2014 pass.DJANGO_SETTINGS_MODULE=notechondria.settings_test python manage.py test creators -v 1\u2014 29 tests, all pass, including theOAuthBindRejectionTestssuite that asserts thebindsubstring sentinel survives.
Notes / follow-ups
Editor.Sync.*,Editor.LocalStore,Editor.UIrounds remain open indocs/TODO.md\u00a7"\u00a71.7 message-compliance migration". Do not bundle them with unrelated changes; each module ships as its own commit.- Planner / portal Auth rounds still need the same Editor.Auth-style migration. Defer until their auth code paths are next touched.
- The Flutter host code that catches bind failures already surfaces the
server's
detailverbatim via SnackBar, so no frontend code change was needed to use the new phased messages \u2014 the richer detail simply flows through.