diff --git a/src/scribe/services/backup.py b/src/scribe/services/backup.py index 552a8a9..ad8af39 100644 --- a/src/scribe/services/backup.py +++ b/src/scribe/services/backup.py @@ -52,7 +52,7 @@ logger = logging.getLogger(__name__) # (milestone 297): the WHY a project inherits what it does, and its opt-outs. # v11 (2026-08) added the note verification trio — notes.verify_with / # expires_when / verified_at (milestone 317). NOT an audit of the notes -# section: it carries 16 of the 26 `notes` columns, and #3182 tracks the nine that +# section: it carries 16 of the 27 `notes` columns, and #3182 tracks the nine that # have been missing since long before this. # Bump when the serialized schema changes. BACKUP_VERSION = 11 @@ -296,7 +296,7 @@ def _milestone_rows(rows) -> list[dict]: def _note_rows(rows) -> list[dict]: # INCOMPLETE, and knowingly so — see #3182. This carries 16 of the - # `notes` table's 26 columns. `note_type`, `task_kind`, `arose_from_id`, `data`, + # `notes` table's 27 columns. `note_type`, `task_kind`, `arose_from_id`, `data`, # `description`, `recurrence_rule`, `recurrence_next_spawn_at`, # `started_at` and `completed_at` are all absent, so a restore flattens # every snippet and process into a plain note and every issue and spike diff --git a/tests/test_services_backup.py b/tests/test_services_backup.py index f6603dd..be60e6c 100644 --- a/tests/test_services_backup.py +++ b/tests/test_services_backup.py @@ -67,7 +67,7 @@ def test_a_never_checked_note_exports_a_null_stamp_and_restores_as_one(): def test_the_note_section_gap_is_pinned_rather_than_silent(): - """#3182. `_note_rows` carries 16 of the `notes` table's 26 columns, and the + """#3182. `_note_rows` carries 16 of the `notes` table's 27 columns, and the absences are not harmless: without `note_type` every snippet and process restores as a plain note, and without `task_kind` every issue and spike restores as `work`. @@ -86,8 +86,9 @@ def test_the_note_section_gap_is_pinned_rather_than_silent(): missing = {c.name for c in Note.__table__.columns} - carried assert missing == { - # Deliberate: trashed rows are not exported. - "deleted_at", + # Deliberate: trashed rows are not exported, so neither is the batch + # id that groups them for restore(). + "deleted_at", "deleted_batch_id", # NOT deliberate — the #3182 gap, in the order they hurt. "note_type", # snippets and processes flatten into notes "task_kind", # issues and spikes flatten into work