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/updateandBackend.Notes.Notes/delete\u2014 unauthenticated / non-owner branches on id-addressed endpoints.Backend.Notes.Notes/update_by_uuidandBackend.Notes.Notes/delete_by_uuid\u2014 unauthenticated / non-owner branches on UUID-addressed endpoints.Backend.Notes.Notes/access_checkandBackend.Notes.Notes/access_check_by_uuid\u2014 private-note access denial raised byrequire_note_accessand_get_noteonNoteByUuidApiView.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 marksBackend.Notes.*done.backend/notes/api.py: ~20 error-detail strings rewritten to \u00a71.7 shape across courses / notes / blocks / versioning endpoints and the tworequire_note_access/_get_noteaccess-check raises.
Verification
DJANGO_SETTINGS_MODULE=notechondria.settings_test python manage.py test notes -v 1\u2014 50 tests pass.backend/notes/tests.pycontains no substring assertions on responsedetailtext, 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 inbackend/creators/api.py.Backend.Creators.Settings\u2014 settings / profile endpoints.Backend.Mcp.ProtocolandBackend.Gptutils\u2014 MCP + OpenAI wrapper modules.Editor.Sync.*,Editor.LocalStore,Editor.UIfrontend 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.