From 2263fd04a4c2508721957b6f20f69e0d138ecf2b Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 28 Aug 2026 14:55:44 -0400 Subject: [PATCH] =?UTF-8?q?fix(tests):=20the=20notes=20table=20has=2027=20?= =?UTF-8?q?columns=20=E2=80=94=20deleted=5Fbatch=5Fid=20is=20the=20second?= =?UTF-8?q?=20deliberate=20exclusion=20(#3165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pin test caught its own inaccuracy on the first run, which is what it is for. `deleted_batch_id` comes from SoftDeleteMixin alongside `deleted_at` and is excluded for the same reason: trashed rows are not exported, so neither is the batch id that groups them for restore(). The nine-field gap #3182 tracks is unchanged. --- src/scribe/services/backup.py | 4 ++-- tests/test_services_backup.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) 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