Notechondria

Version: 0.1.28 Build Date: 2026-04-18T06:00

What's Changed

§1.7 migration: Backend.Notes.* round

Every user-facing error detail in backend/notes/api.py now follows the canonical "<consequence>: <module>/<process> \u2014 <cause>" shape documented in docs/AGENTS.md. No test or parser sentinels were touched.

Migrated surfaces:

  • Backend.Notes.Courses/create \u2014 unauthenticated POST to /courses/.
  • Backend.Notes.Courses/update \u2014 unauthenticated / non-owner / default-category PATCH branches.
  • Backend.Notes.Courses/delete \u2014 unauthenticated / non-owner / default-category DELETE branches.
  • Backend.Notes.Notes/update and Backend.Notes.Notes/delete \u2014 unauthenticated / non-owner branches on id-addressed endpoints.
  • Backend.Notes.Notes/update_by_uuid and Backend.Notes.Notes/delete_by_uuid \u2014 unauthenticated / non-owner branches on UUID-addressed endpoints.
  • Backend.Notes.Notes/access_check and Backend.Notes.Notes/access_check_by_uuid \u2014 private-note access denial raised by require_note_access and _get_note on NoteByUuidApiView.
  • Backend.Notes.Notes/history, Backend.Notes.Notes/snapshot, Backend.Notes.Notes/restore \u2014 non-owner branches on note versioning endpoints.
  • Backend.Notes.Blocks/add, Backend.Notes.Blocks/update, Backend.Notes.Blocks/delete, Backend.Notes.Blocks/reorder \u2014 non-owner and reorder-list-mismatch branches on block CRUD.

Each migrated message now carries three components:

  • Consequence: what the user can no longer do (Cannot update note, Cannot delete category, Note access denied, Reorder list rejected, etc.).
  • Module / process: the stable Backend.Notes.* source listed above, greppable across the codebase.
  • Cause: the specific trigger (unauthenticated user, ownership mismatch, default-category protection, private-note access, missing or duplicate block ids).

Files Changed

New

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

Modified

  • VERSION: 0.1.27 \u2192 0.1.28.
  • docs/TODO.md: \u00a71.7 migration checklist marks Backend.Notes.* done.
  • backend/notes/api.py: ~20 error-detail strings rewritten to \u00a71.7 shape across courses / notes / blocks / versioning endpoints and the two require_note_access / _get_note access-check raises.

Verification

  • DJANGO_SETTINGS_MODULE=notechondria.settings_test python manage.py test notes -v 1 \u2014 50 tests pass.
  • backend/notes/tests.py contains no substring assertions on response detail text, so no test update was needed.

Notes / follow-ups

  • Remaining \u00a71.7 rounds still pending in docs/TODO.md:
    • Backend.Creators.Auth (non-bind) \u2014 register / login / verify / password-reset endpoints in backend/creators/api.py.
    • Backend.Creators.Settings \u2014 settings / profile endpoints.
    • Backend.Mcp.Protocol and Backend.Gptutils \u2014 MCP + OpenAI wrapper modules.
    • Editor.Sync.*, Editor.LocalStore, Editor.UI frontend cosmetic info logs.
    • Planner.Sync.*, Planner.UI, Portal.Sync.*, Portal.UI.
    • Shared.AuthDialog.
  • Legacy _appendUiLog(String) wrapper calls in all three Flutter apps still pass through empty-source debug-log entries; migration happens per-module as those call sites are next touched.