Compare commits

..
Author SHA1 Message Date
github-actions[bot] b3bf717947 Releasing 1.0.13 2026-08-13 02:48:28 +00:00
vorotamoroz 93f0f78494 Merge pull request #1104 from vrtmrz/release-notes/1.0.13
Add Metadata document ID repair release note
2026-08-13 11:46:39 +09:00
vorotamoroz 11cb09d49a docs: add metadata repair release note 2026-08-13 02:42:18 +00:00
vorotamoroz e0160f15f3 Merge pull request #1103 from vrtmrz/docs/clarify-metadata-identity-handling
Clarify Metadata document ID mismatch handling
2026-08-13 11:31:18 +09:00
vorotamoroz a3aa79ead9 docs: clarify metadata identity mismatch handling 2026-08-13 02:22:34 +00:00
vorotamoroz db8dac2db4 Merge pull request #1102 from vrtmrz/fix/metadata-document-id-repair
Add safe Metadata document ID repair
2026-08-13 11:13:13 +09:00
10 changed files with 50 additions and 35 deletions
+2 -2
View File
@@ -141,8 +141,8 @@ This field stores an array of Chunk Document IDs.
\_id is generated based on the path of the Obsidian note.
The validation, quarantine, and explicit repair contract for normal-file
Metadata whose stored path does not derive its actual ID is defined in
The validation and explicit repair contract for normal-file Metadata whose
actual ID does not match the ID derived from its stored path is defined in
[Normal-file Metadata Document ID Validation and Repair](design_docs/metadata_document_id_validation_and_repair.md).
- If the path starts with `_`, it is converted to `/_` for convenience.
@@ -11,7 +11,7 @@ Vault-relative path. Historical data can contain a readable Metadata document
whose actual local database ID no longer matches that derivation. An ordinary
path-based read then looks up a different ID. It may reach a separate,
consistently addressed Metadata document, or it may find no document at all;
it cannot reach the malformed document which the Offline Scanner enumerated.
it cannot reach the mismatched document which the Offline Scanner enumerated.
The mismatch can repeatedly produce failed reflection, and an offline-deletion
decision can be made before that failure. The scanner must therefore recognise
@@ -63,24 +63,26 @@ construction.
- Consistent special-namespace Metadata remains owned by its feature.
- An ID/path or namespace mismatch is left unchanged and does not enter pair
processing.
- If consistent, selected Metadata represents the same case-normalised path,
that Metadata and its storage file continue through the established
- If consistently addressed Metadata is selected for the same case-normalised
path, that Metadata and its storage file continue through the established
path-based scan. A stale enumerated document must not suppress this flow.
- If no consistent, selected Metadata represents that logical path, its storage
entry is also withheld. No storage write, database deletion, or last-seen
update is performed for that withheld path.
- Expired logical deletion history is not hard-tombstoned while its identity is
inconsistent.
- If no consistently addressed Metadata is selected for that logical path, its
storage entry is also withheld. No storage write, database deletion, or
last-seen update is performed for that withheld path.
- Expired logical deletion history with an inconsistent identity is left
unchanged.
The ordinary scan still returns its established Boolean execution result. A
recognised mismatch is a quarantined input, not a new public scan result and not
a Fast Setup or CLI policy. Detailed inspection is deliberately separate.
recognised mismatch is left unchanged and omitted before file-pair processing.
It therefore does not add a `FilePairProcessResult`, change the ordinary Boolean
scan contract, or change Fast Setup or CLI completion policy. Detailed
inspection remains separate.
## Inspection decision
inspectMetadataDocumentIdentities is read-only and enumerates the local database
by actual document ID. This is necessary because a path-first Inspector cannot
discover the malformed source.
`inspectMetadataDocumentIdentities` is read-only and enumerates the local
database by actual document ID. This is necessary because inspection through a
path-derived lookup cannot discover the mismatched source.
The existing **Inspect conflicts and file/database differences** interface shows
one card for each mismatch. It excludes that card's path from ordinary
@@ -95,7 +97,7 @@ A one-entry repair is offered only when all of these checks pass:
- the source is the current live revision and has no conflicts;
- the recorded path is valid and selected by current synchronisation policy;
- one case-normalised path maps to one source under the active filename setting;
- only one malformed source expects the target ID; and
- only one mismatched source expects the target ID; and
- the target ID is absent, or contains an exact structural copy left by an
earlier attempt.
@@ -115,7 +117,8 @@ Commonlib then:
4. removes the path from the Offline Scanner's durable last-seen map;
5. writes the expected target ID when it is absent;
6. reads the target back and verifies the exact structural copy;
7. hard-tombstones the source using the approved source revision; and
7. writes a deletion revision for the source against the approved source
revision; and
8. returns control to LiveSync, which requests an ordinary Vault scan.
The repair result and the follow-up scan result remain separate. If the scan is
@@ -175,10 +178,10 @@ This change does not:
## Verification
Focused Commonlib tests cover early quarantine, continued processing of a
resolvable same-path entry, expired logical-deletion retention, namespace
routing, read-only actual-ID inspection, repair preconditions, target-first
ordering, stale approval, exact-target retry, source preservation on failure,
and last-seen clearing. LiveSync tests cover selective presentation-path
withholding, separate confirmation, cancellation, and the ordinary scan request
after a completed repair.
Focused Commonlib tests cover unresolved-identity exclusion before pair
construction, continued processing of a resolvable same-path entry, expired
logical-deletion retention, namespace routing, read-only actual-ID inspection,
repair preconditions, target-first ordering, stale approval, exact-target retry,
source preservation on failure, and last-seen clearing. LiveSync tests cover
selective presentation-path withholding, separate confirmation, cancellation,
and the ordinary scan request after a completed repair.
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-livesync",
"name": "Self-hosted LiveSync",
"version": "1.0.12",
"version": "1.0.13",
"minAppVersion": "1.7.2",
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
"author": "vorotamoroz",
+5 -5
View File
@@ -1,12 +1,12 @@
{
"name": "obsidian-livesync",
"version": "1.0.12",
"version": "1.0.13",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "obsidian-livesync",
"version": "1.0.12",
"version": "1.0.13",
"license": "MIT",
"workspaces": [
"src/apps/cli",
@@ -15924,7 +15924,7 @@
},
"src/apps/cli": {
"name": "self-hosted-livesync-cli",
"version": "1.0.12-cli",
"version": "1.0.13-cli",
"dependencies": {
"chokidar": "^4.0.0",
"minimatch": "^10.2.5",
@@ -15949,7 +15949,7 @@
},
"src/apps/webapp": {
"name": "livesync-webapp",
"version": "1.0.12-webapp",
"version": "1.0.13-webapp",
"dependencies": {
"octagonal-wheels": "^0.1.52"
},
@@ -15961,7 +15961,7 @@
}
},
"src/apps/webpeer": {
"version": "1.0.12-webpeer",
"version": "1.0.13-webpeer",
"dependencies": {
"octagonal-wheels": "^0.1.52"
},
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "obsidian-livesync",
"version": "1.0.12",
"version": "1.0.13",
"description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
"main": "main.js",
"type": "module",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "self-hosted-livesync-cli",
"private": true,
"version": "1.0.12-cli",
"version": "1.0.13-cli",
"main": "dist/index.cjs",
"type": "module",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "livesync-webapp",
"private": true,
"version": "1.0.12-webapp",
"version": "1.0.13-webapp",
"type": "module",
"description": "Browser-based Self-hosted LiveSync using FileSystem API",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "webpeer",
"private": true,
"version": "1.0.12-webpeer",
"version": "1.0.13-webpeer",
"type": "module",
"scripts": {
"dev": "vite",
+11
View File
@@ -12,6 +12,17 @@ Earlier releases remain available in the 0.25 release history and the legacy rel
## Unreleased
## 1.0.13
13th August, 2026
### Conflict handling and recovery
#### Improved
- **Inspect conflicts and file/database differences** now reports local Metadata whose stored document ID does not match the ID derived from its recorded path. Ordinary scans leave unresolved entries and their corresponding Vault paths unchanged, while allowing consistently addressed Metadata for the same logical path to proceed normally.
- When one live, unconflicted entry has an unambiguous target, its wrench menu can repair that one local Metadata document after separate confirmation. The target is written and verified before the mismatched source ID is removed; ambiguous or otherwise unsafe entries remain read-only.
## 1.0.12
11th August, 2026
+2 -1
View File
@@ -24,5 +24,6 @@
"1.0.9": "1.7.2",
"1.0.10": "1.7.2",
"1.0.11": "1.7.2",
"1.0.12": "1.7.2"
"1.0.12": "1.7.2",
"1.0.13": "1.7.2"
}