Notechondria

Version: 0.1.25 Build Date: 2026-04-18T02:30

What's Changed

AGENTS.md submodule bump + project-specific override

  • Submodule AGENTS.md pointer bumped from 6cfe3bd to 6a2c40f. The upstream adds a new \u00a71.7 "Error and info messages (IMPORTANT)" section requiring every error/warning/info/debug message to carry three components: consequence, module/process, and cause. Informal shape: "<consequence>: <module>/<process> \u2014 <cause>".
  • New project-specific override at docs/AGENTS.md defines the canonical module/process name table for this repo (Editor.Auth, Editor.Sync.Courses, Backend.Creators.Auth, etc.) and lists the substring sentinels that must survive any future rewrite (invalid token, not_registered, No account found, bind, etc.).
  • A phased migration plan for bringing all ~230 existing messages across frontend and backend into \u00a71.7 compliance lives in docs/TODO.md under "\u00a71.7 message-compliance migration". Only the OAuth launch + callback messages in editor_app have been migrated so far; remaining modules are decomposed per-round to keep each diff reviewable.

Splash screen \u2014 particles, morph continuity, backend tag

  • Free-drifting particles. Background molecules now drift across the whole viewport instead of orbiting around the cycle ring. _Particle reshaped to cartesian seed + velocity + phase; positions wrap modulo an extended box so particles smoothly re-enter at the opposite edge. Ring-proximity attenuation keeps formula glyphs unobscured.
  • Continuous metabolite morph. The previous sin(stepFraction * pi) alpha curve dipped to zero at each step boundary, producing a visible blank frame on narrow / mobile layouts. New per-step paint sequence: previous formula lingers through the first 35% of the new step, active fades only in the final 35%, and the incoming fades in over the same overlap window. Result: at least one skeletal structure is near-full alpha at every moment of the cycle, with a clear cross-fade between adjacent metabolites.
  • Backend domain tag on splash. Bottom-left version line now reads v0.1.25 \u00b7 <host> where <host> is derived from the app's configured api_base_url. Empty / null / unparseable URLs collapse to offline. SplashScreen takes a new optional apiBaseUrl parameter; each app_shell's splash call site threads _localSettings['api_base_url'] through.

OAuth callback loading message

  • During OAuth callback handling the splash status line now reads Completing sign-in via Google / Completing sign-in via GitHub (or Linking Google account / Linking GitHub account when intent=bind) instead of the generic Completing sign-in. All three apps push the provider-specific status early in _handleOAuthCallback before the /auth/... call fires.

Editor \u2014 offline-first UI behavior

  • Cloud categories hidden while signed out. The _allCategories getter in editor_app/lib/app_shell.dart returns only _localCourses when _token is null or empty, so cloud rows vanish from the sidebar in offline mode and the app reads as a local-only workspace. Cached remote note content is still addressable by UUID so mid-edit drafts aren't dropped; on re-login the cloud rows reappear and the usual _loadInitialData pull-then-merge runs.
  • (No change required for editor starter workspace \u2014 it already seeds only an Inbox plus two welcome drafts.)

Files Changed

New

  • docs/AGENTS.md \u2014 project-specific agent override with canonical module table and preserved-sentinel list.
  • docs/versions/0.1.25.md (this file).

Modified

  • AGENTS.md (submodule pointer) \u2014 6cfe3bd \u2192 6a2c40f.
  • frontend/notechondria_shared/lib/src/components/splash_screen.dart:
    • SplashScreen adds apiBaseUrl parameter + _formatBackendTag helper; bottom-left line renders v<version> \u00b7 <host>.
    • _Particle replaced with cartesian seed+velocity+phase model; _drawParticles uses screen-wrapping positions with ring-proximity attenuation.
    • Active-metabolite paint sequence rewritten to paint previous, active, and next formulas in the same cycle step with overlapping alpha curves, eliminating the step-boundary blank gap.
  • frontend/editor_app/lib/app_shell.dart:
    • _allCategories gated on _token so cloud rows hide offline.
    • _handleOAuthCallback pushes Completing sign-in via <provider> / Linking <provider> account to _splashStatus.
    • SplashScreen(apiBaseUrl: ...) wired.
    • OAuth launch + callback error/log messages migrated to AGENTS.md \u00a71.7 shape (Editor.Auth/oauth.launch, Editor.Auth/oauth.callback, Editor.Auth/bind).
  • frontend/planner_app/lib/app_shell.dart:
    • _handleOAuthCallback pushes provider-specific status.
    • SplashScreen(apiBaseUrl: ...) wired.
  • frontend/portal_app/lib/app_shell.dart: same wiring as planner.
  • VERSION: 0.1.24 \u2192 0.1.25.
  • docs/TODO.md: migration plan added; completed items removed; follow-up items rescoped.

Verification

  • notechondria_shared: flutter analyze \u2014 2 pre-existing surfaceVariant deprecation infos; no new errors.
  • editor_app / planner_app / portal_app:
    • flutter analyze \u2014 issue count unchanged vs 0.1.24.
    • flutter test test/smoke_test.dart -r compact \u2014 all pass.

Notes / follow-ups

  • Task 5a (backend phased bind error) deferred to TODO: requires catching each phase of /api/v1/auth/bind/<provider>/ (config lookup, token exchange, profile fetch, email match, DB write) and returning structured {"detail": "<consequence>: Backend.Creators.Auth/bind.<phase> \u2014 <cause>"} payloads with test coverage. Separate round once the bind-endpoint surface is touched.
  • Task 4b extension deferred to TODO: the same offline-hide applied to editor's _allCategories needs to be replicated in planner and portal sidebars.
  • \u00a71.7 migration is ongoing; only editor OAuth sites migrated so far. docs/TODO.md \u00a7"\u00a71.7 message-compliance migration" decomposes the remaining ~220 sites into reviewable per-module rounds.