fix(tests): the notes table has 27 columns — deleted_batch_id is the second deliberate exclusion (#3165)
CI & Build / Python lint (push) Successful in 5s
CI & Build / Plugin hooks (push) Successful in 11s
CI & Build / integration (push) Successful in 26s
CI & Build / TypeScript typecheck (push) Successful in 38s
CI & Build / Python tests (push) Successful in 1m18s
CI & Build / Build & push image (push) Successful in 24s

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.
This commit is contained in:
2026-08-28 14:55:44 -04:00
parent 2065781302
commit 2263fd04a4
2 changed files with 6 additions and 5 deletions
+2 -2
View File
@@ -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
+4 -3
View File
@@ -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