Two milestones: a note can carry its own check (317), and a rule keeps what it used to say (323) #135
@@ -52,7 +52,7 @@ logger = logging.getLogger(__name__)
|
|||||||
# (milestone 297): the WHY a project inherits what it does, and its opt-outs.
|
# (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 /
|
# v11 (2026-08) added the note verification trio — notes.verify_with /
|
||||||
# expires_when / verified_at (milestone 317). NOT an audit of the notes
|
# 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.
|
# have been missing since long before this.
|
||||||
# Bump when the serialized schema changes.
|
# Bump when the serialized schema changes.
|
||||||
BACKUP_VERSION = 11
|
BACKUP_VERSION = 11
|
||||||
@@ -296,7 +296,7 @@ def _milestone_rows(rows) -> list[dict]:
|
|||||||
|
|
||||||
def _note_rows(rows) -> list[dict]:
|
def _note_rows(rows) -> list[dict]:
|
||||||
# INCOMPLETE, and knowingly so — see #3182. This carries 16 of the
|
# 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`,
|
# `description`, `recurrence_rule`, `recurrence_next_spawn_at`,
|
||||||
# `started_at` and `completed_at` are all absent, so a restore flattens
|
# `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
|
# every snippet and process into a plain note and every issue and spike
|
||||||
|
|||||||
@@ -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():
|
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
|
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 a plain note, and without `task_kind` every issue and spike
|
||||||
restores as `work`.
|
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
|
missing = {c.name for c in Note.__table__.columns} - carried
|
||||||
|
|
||||||
assert missing == {
|
assert missing == {
|
||||||
# Deliberate: trashed rows are not exported.
|
# Deliberate: trashed rows are not exported, so neither is the batch
|
||||||
"deleted_at",
|
# id that groups them for restore().
|
||||||
|
"deleted_at", "deleted_batch_id",
|
||||||
# NOT deliberate — the #3182 gap, in the order they hurt.
|
# NOT deliberate — the #3182 gap, in the order they hurt.
|
||||||
"note_type", # snippets and processes flatten into notes
|
"note_type", # snippets and processes flatten into notes
|
||||||
"task_kind", # issues and spikes flatten into work
|
"task_kind", # issues and spikes flatten into work
|
||||||
|
|||||||
Reference in New Issue
Block a user