@plinth-music/cli 0.22.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,83 @@
2
2
 
3
3
  Notable changes to `@plinth-music/cli`. Grouped by what a user notices, not by PR.
4
4
 
5
+ ## 0.23.1 - 2026-09-29
6
+
7
+ Two code PRs since `0.23.0` (`v0.23.0..0dd34dc`: #212, #213; #209, #210 and #211 docs).
8
+ A patch: fixes only, no new command or sync surface.
9
+
10
+ ⚠️ **A file you delete from the mirror stays deleted** (#213). A poll landing in the
11
+ second or so between your `rm` and the daemon's delete hold could write the file back,
12
+ and the delete was then dropped; four of seven documents came back this way on 26 Sept.
13
+ The daemon now leaves a path it saw you remove alone for five minutes, and waits one
14
+ poll before restoring a file that is missing for a reason it has not seen yet. A file
15
+ missing for any other reason is still restored, about one poll later than before.
16
+
17
+ ⚠️ **One slow calendar no longer freezes every calendar view** (#212). A calendar whose
18
+ read fails or times out now shows as not read, with no entries, until the next refresh.
19
+ Before, the whole refresh failed and every `views/calendar/` file kept its old contents.
20
+ A read that did not complete is described as incomplete, not as Google refusing access.
21
+
22
+ **The daemon stops re-downloading what has not changed** (#213). Since 0.22.0 every
23
+ poll fetched every memory fact in full, left `_freshness.md` reporting memory as
24
+ `unknown` / `incomplete_apply`, and re-fetched the extracted text of every PDF. Both now
25
+ happen once. Feeds ask from the server's high-water mark instead of re-reading their
26
+ last page; a full read from the cursor still runs at boot, on `plinth sync` and once an
27
+ hour, so nothing is missed. On the release commit, over 47 minutes after the first pass:
28
+ no full memory-fact downloads, no text re-fetches, no inconsistent trails.
29
+
30
+ **Each calendar view says what it covers** (#212). A view holds only its window and now
31
+ says so, naming the Plinth tool `list_calendar_events` for any other date. A truncated
32
+ read says why it was cut short.
33
+
34
+ **What is not proven.**
35
+
36
+ - The delete fix was driven live on the release commit (a delete inside a poll, and a
37
+ held batch left 13 minutes past the window: neither came back). A delete within about
38
+ 1.6 s of the lid closing has one exposed poll on wake.
39
+ - The calendar changes were not exercised live: the test workspace has no mapped
40
+ calendar. They are covered by tests and are checked on a real workspace after release.
41
+ - A sync request that hangs can still stall the poll loop for minutes (seen once, 4 min
42
+ 7 s, in the release check). Pre-existing; not fixed here.
43
+
44
+ ## 0.23.0 - 2026-09-23
45
+
46
+ One code PR since `0.22.0` (`v0.22.0..f3334fb`, #207; #204, #205 and #206 docs). A
47
+ minor: a new sync surface (permanent-deletion reconciliation, dormant until the server
48
+ switches it on) and a fix to how the mirror treats a file it has no record of.
49
+
50
+ ⚠️ **A file you made by hand in the mirror is no longer overwritten without a copy
51
+ being kept when a row of the same name arrives** (#207, the S224 fix). On 0.22.0, if you
52
+ created an entity file (a document, task, project and so on) under the mirror by hand,
53
+ and `plinth sync` or the daemon's first pull then brought down a row that lands at that
54
+ path, the row replaced your file and nothing kept it. Your bytes are now stashed to
55
+ `~/.plinth/_conflicts/<workspace>/` first and the log names the stash path. The cloud
56
+ copy still wins on boot, as before.
57
+
58
+ **Permanently deleted documents and files no longer survive in an offline mirror and
59
+ come back on the next sync** (#207). The daemon keeps an owner-only journal
60
+ (`permanent-deletions.json`) of each retirement, stashes any unsynced local edit to
61
+ `_conflicts/` before removing the active copy, replays a retirement in two phases so a
62
+ crash part-way is finished cleanly on the next run, and sends a retired-generation
63
+ acknowledgement (`X-Plinth-Retired-Generation`) when a name is deliberately recreated.
64
+ A recreate without it is refused by the server (`409 permanent_name_retired`) rather
65
+ than resurrecting the deleted item. `plinth status` gains a **Deletion** row: nothing
66
+ pending, N pending or feed refreshes required, or BLOCKED when the journal needs
67
+ recovery. **All of this is dormant until the server's rollout flags are switched on.**
68
+ The server side (Plinth #455) is live with every flag off, so no artist can be
69
+ permanently deleted yet and nothing changes for you on 0.23.0 until then.
70
+
71
+ **What is not proven.**
72
+
73
+ - #207's suite, a 101-test focused regression and the packed-install pre-flight passed;
74
+ a bounded joint proof against web `cc8cc1b` and real local Storage covered dirty
75
+ document and file recovery, daemon recreation and old-client file refusal. The live
76
+ race and crash matrix and the old-document-write case are not comprehensively proven.
77
+ - The hand-made-file loss was found live (DELACC, via a permanent deletion) and
78
+ reproduced on 0.22.0 from source; it has not been driven on the packaged app.
79
+ - The three 0.22.0 known gaps (double-save false conflict, revert-to-synced overwrite
80
+ without a copy, long-path re-download every poll) are unchanged.
81
+
5
82
  ## 0.22.0 - 2026-09-22
6
83
 
7
84
  Four code PRs since `0.21.1` (`v0.21.1..c1bb82e`, #199, #200, #201, #202; #197 and #198
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha": "b01cf9f82bb5e757f1f7d672180060285343577f",
2
+ "sha": "9dd9f6493dc707acce22c95ce564d8b189dbf27d",
3
3
  "dirty": false,
4
- "built_at": "2026-09-22T07:49:15.526Z"
4
+ "built_at": "2026-09-29T22:26:55.840Z"
5
5
  }