mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-10-29 20:43:20 +00:00
Document published features and current technical behaviour
This commit is contained in:
1 parent
7d98f0c084
commit
2cfa4268cc
19 files changed
+241
-180
No files matched your search
@@ -2,7 +2,7 @@
|
||||
date: 2026-09-29
|
||||
commonlib-version: "0.1.33"
|
||||
self-hosted-livesync-version: "1.0.32"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# Configurable ID derivation
|
||||
@@ -21,12 +21,12 @@ including its passphrase-persistence correction at commit
|
||||
the `next` tag, provides the construction described here. It replaces the
|
||||
independent Chunk algorithm from the `0.1.32` prerelease without a
|
||||
compatibility branch or a new settings version. Legacy ID generation remains
|
||||
unchanged. LiveSync pins the published `0.1.33` package and its registry
|
||||
integrity in the lockfile.
|
||||
unchanged. At that implementation baseline, LiveSync pinned the published
|
||||
`0.1.33` package and its registry integrity in the lockfile.
|
||||
Its [Internal Metadata encryption design](https://github.com/vrtmrz/obsidian-livesync/blob/126d6eadb858a79a08ad7f600061e54fc8d31196/docs/design_docs/internal_metadata_encryption.md)
|
||||
remains the basis for Properties encryption and CouchDB feature admission.
|
||||
This document records an unreleased LiveSync feature. It does not select a
|
||||
plug-in release version.
|
||||
Independent ID derivation shipped in Self-hosted LiveSync 1.0.33. This document
|
||||
retains the design and package baseline recorded above.
|
||||
|
||||
## Feasibility
|
||||
|
||||
|
||||
@@ -10,40 +10,45 @@ This document uses the independent revision properties defined under
|
||||
[Revision](../glossary.md#revision) and the general state model in
|
||||
[Conflict resolution and revision provenance](../specs_conflict_resolution.md).
|
||||
|
||||
Document History can reconstruct an available historical revision from its
|
||||
Chunks and write that content to the Vault through **Back to this revision**.
|
||||
The current action writes directly through the storage adapter. It does not
|
||||
create a new Metadata revision, clear a logical deletion through a successor,
|
||||
or record which database revision produced the restored Vault file.
|
||||
Before the current restoration implementation, Document History could
|
||||
reconstruct an available historical revision from its Chunks and write that
|
||||
content to the Vault through **Back to this revision**. That action wrote
|
||||
directly through the storage adapter. It did not create a new Metadata revision,
|
||||
clear a logical deletion through a successor, or record which database revision
|
||||
produced the restored Vault file.
|
||||
|
||||
This leaves a logically deleted Metadata document at `deleted: true` after the
|
||||
file has returned to the Vault. A later ordinary Vault save may create a
|
||||
non-deleted successor, but restoration must not depend on an unrelated later
|
||||
file event.
|
||||
That left a logically deleted Metadata document at `deleted: true` after the
|
||||
file had returned to the Vault. A later ordinary Vault save could create a
|
||||
non-deleted successor, but restoration needed to succeed without depending on
|
||||
an unrelated later file event.
|
||||
|
||||
The same action does not inspect or preserve revision-tree intent explicitly
|
||||
when conflicts exist. Document History currently displays the ancestry of the
|
||||
PouchDB winner. It does not display the complete revision tree or the ancestry
|
||||
of every conflict leaf.
|
||||
Restoration does not resolve conflicts or provide a branch-aware history view.
|
||||
Document History displays the ancestry of the PouchDB winner; it does not
|
||||
display the complete revision tree or the ancestry of every conflict leaf.
|
||||
|
||||
This design covers restoration of one readable historical revision of a normal
|
||||
Vault file. It creates a new non-deleted successor revision, reflects that exact
|
||||
revision to the Vault, and leaves every other conflict branch available for the
|
||||
existing conflict workflow.
|
||||
|
||||
The current **Back to this revision** implementation writes that successor
|
||||
revision, reflects the exact created revision to the Vault, and records it as
|
||||
device-local provenance. The storage-only behaviour described above is the
|
||||
pre-fix history.
|
||||
|
||||
## Evidence
|
||||
|
||||
A real-Obsidian exercise created a Markdown document, removed it through the
|
||||
Vault API, and waited for LiveSync to store a logical-deletion successor. The
|
||||
Metadata retained all referenced Chunks, and Document History could reconstruct
|
||||
the deleted content.
|
||||
A real-Obsidian exercise before the current restoration implementation created
|
||||
a Markdown document, removed it through the Vault API, and waited for LiveSync
|
||||
to store a logical-deletion successor. The Metadata retained all referenced
|
||||
Chunks, and Document History could reconstruct the deleted content.
|
||||
|
||||
Selecting **Back to this revision** restored the file and its exact bytes to the
|
||||
Vault. The local database nevertheless retained the same deleted current
|
||||
revision after file processing had settled. An additional ordinary Vault save
|
||||
then created a new non-deleted successor. This demonstrates that content
|
||||
reconstruction works and that the missing operation is the database-aware
|
||||
restoration step.
|
||||
then created a new non-deleted successor. This historical reproduction showed
|
||||
that content reconstruction worked while the database-aware restoration step
|
||||
was missing.
|
||||
|
||||
## Revision-tree decision
|
||||
|
||||
|
||||
@@ -2,14 +2,15 @@
|
||||
date: 2026-09-27
|
||||
commonlib-version: "0.1.30"
|
||||
self-hosted-livesync-version: "1.0.32"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# Internal Metadata encryption and remote feature changes
|
||||
|
||||
This document defines the LiveSync integration of Commonlib's remote feature
|
||||
contract and encrypted Metadata for Hidden File Sync and Customisation Sync.
|
||||
It describes unreleased behaviour being implemented in this branch.
|
||||
The implementation shipped in Self-hosted LiveSync 1.0.33; this document
|
||||
retains its original design and implementation context.
|
||||
|
||||
Commonlib's companion `docs/remote-feature-compatibility.md` is the
|
||||
source of truth for the wire document, identifiers, validation, and shared
|
||||
@@ -159,11 +160,11 @@ after alignment. With the preference subsequently OFF, verify that Fast Fetch
|
||||
still decodes encrypted Metadata and preserves the remote feature declaration.
|
||||
|
||||
Keep the primary-language settings and troubleshooting guides, the
|
||||
database-compatibility ADR, and Unreleased notes aligned with this behaviour.
|
||||
Keep the detailed shared protocol in Commonlib and link to it after publication;
|
||||
do not maintain another copy of its wire schema here. Translations are a separate
|
||||
change. Update tested-version evidence when the implementation and its
|
||||
validation have been accepted.
|
||||
database-compatibility ADR, and release notes consistent with this behaviour.
|
||||
Commonlib's companion document remains the source of truth for the shared
|
||||
protocol; this document does not repeat its wire schema. Translations remain a
|
||||
separate change. The version fields above retain the original design baseline;
|
||||
add later tested-version evidence only when validation is recorded.
|
||||
|
||||
Related application contracts: [Replicator architecture](replicator_architecture.md),
|
||||
[Tweak compatibility](tweak_compatibility.md), and
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
date: 2026-09-04
|
||||
commonlib-version: "0.1.21"
|
||||
self-hosted-livesync-version: "1.0.24"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# Path component length compatibility
|
||||
@@ -11,9 +11,9 @@ status: unreleased
|
||||
|
||||
File systems place limits on each file or folder name, rather than applying one
|
||||
common limit to an entire Vault-relative path. Those limits are also expressed
|
||||
in different units. Self-hosted LiveSync therefore treats 255 UTF-8 bytes as a
|
||||
focused Android and Linux compatibility warning, not as a universal definition
|
||||
of a valid path.
|
||||
in different units. The warning shipped in Self-hosted LiveSync 1.0.26. It
|
||||
treats 255 UTF-8 bytes as a focused Android and Linux compatibility warning,
|
||||
not as a universal definition of a valid path.
|
||||
|
||||
## Basis for the 255-byte warning
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
date: 2026-09-16
|
||||
commonlib-version: "0.1.25"
|
||||
self-hosted-livesync-version: "1.0.28"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# TURN credentials in P2P connection settings
|
||||
@@ -14,6 +14,9 @@ by acquiring temporary TURN credentials on the device before opening a P2P room.
|
||||
The [P2P transport compatibility ADR](../adr/2026_08_p2p_transport_compatibility.md)
|
||||
records the connection and persistence policy.
|
||||
|
||||
Managed Cloudflare TURN credentials shipped in Self-hosted LiveSync 1.0.29.
|
||||
This document records the design and its remaining runtime verification limits.
|
||||
|
||||
LiveSync prepares a connection copy of `P2PSyncSetting`. Commonlib owns the room
|
||||
lifecycle and consumes the resulting ICE settings. Service-specific HTTP and
|
||||
validation remain under `src/integrations/`; Commonlib has no provider catalogue
|
||||
|
||||
@@ -3,40 +3,42 @@ date: 2026-09-28
|
||||
commonlib-version: "0.1.33"
|
||||
feasibility-probe-version: "0.1.27"
|
||||
self-hosted-livesync-version: "1.0.32"
|
||||
status: implementing
|
||||
status: released
|
||||
---
|
||||
|
||||
# Time-bound Setup URIs
|
||||
|
||||
## Purpose and status
|
||||
|
||||
Offer two modes when generating a [Setup URI](../glossary.md):
|
||||
The published Obsidian generator offers two choices when creating a [Setup URI](../glossary.md):
|
||||
|
||||
- **Ephemeral**, selected by default, derives an effective passphrase from the
|
||||
entered passphrase and the current fixed time window.
|
||||
- **Persistent** uses the entered passphrase and the existing URI format
|
||||
unchanged. It also serves as the compatibility mode for older readers.
|
||||
- **Time-bound** (the `ephemeral` derivation mode), selected by default,
|
||||
derives an effective passphrase from the entered passphrase and the current
|
||||
fixed time window.
|
||||
- **Compatible (no time limit)** (the `persistent` derivation mode) uses the
|
||||
entered passphrase and the existing URI format unchanged. It also serves as
|
||||
the compatibility mode for older readers.
|
||||
|
||||
The generation mode choice shows the exact time until which an Ephemeral URI
|
||||
can be opened through the ordinary reader. Import still requires only the URI and
|
||||
the entered passphrase. Neither the mode nor a timestamp is stored in the URI.
|
||||
The Time-bound choice shows the exact time until which the URI can be opened
|
||||
through the ordinary reader. Import still requires only the URI and the entered
|
||||
passphrase. Neither the mode nor a timestamp is stored in the URI.
|
||||
|
||||
The design is technically feasible with the existing encryption primitives.
|
||||
An executable protocol probe passes 22 cases against Commonlib 0.1.27 and
|
||||
octagonal-wheels 0.1.54. The implementation was first published as Commonlib 0.1.32
|
||||
on the npm `next` tag. LiveSync now pins Commonlib 0.1.33 from that tag in its npm
|
||||
dependency and independent Deno tool imports. A mobile performance bound remains
|
||||
outstanding.
|
||||
Both URI availability choices shipped in Self-hosted LiveSync 1.0.33. The
|
||||
initial executable protocol probe passed 22 cases against Commonlib 0.1.27 and
|
||||
octagonal-wheels 0.1.54. The implementation was first published as Commonlib
|
||||
0.1.32 on the npm `next` tag. Current Self-hosted LiveSync 1.0.42 uses Commonlib
|
||||
0.2.2. A mobile performance bound remains outstanding.
|
||||
|
||||
This document records the proposed key derivation and integration contract. The
|
||||
companion probe demonstrates them without changing an application entry point.
|
||||
This document records the protocol and the integration plan used for the
|
||||
published feature. The companion probe remains a standalone design check; it
|
||||
does not exercise an application entry point.
|
||||
|
||||
## Scope
|
||||
|
||||
The first version offers Ephemeral and Persistent only. Ephemeral uses one
|
||||
fixed seven-day window shared by every implementation. Arbitrary start dates,
|
||||
custom end dates, selectable window lengths, and rolling seven-day lifetimes
|
||||
are outside this version.
|
||||
The published protocol offers the Ephemeral and Persistent modes only.
|
||||
Ephemeral uses one fixed seven-day window shared by every implementation.
|
||||
Arbitrary start dates, custom end dates, selectable window lengths, and rolling
|
||||
seven-day lifetimes are outside this version.
|
||||
|
||||
Keep the current settings filtering, remote profiles, main and P2P selections,
|
||||
and short/full export variants. Time binding affects opening the exported
|
||||
@@ -255,15 +257,16 @@ separately shared message.
|
||||
## Ownership and compatibility
|
||||
|
||||
Commonlib owns preparation of exported settings, the time-window calculation,
|
||||
passphrase derivation, format parsing, and dual-candidate decoding. Make these
|
||||
changes in the Commonlib repository. LiveSync must consume a validated packed
|
||||
artefact and then an exact reviewed package version, following
|
||||
passphrase derivation, format parsing, and dual-candidate decoding. These
|
||||
changes were made in the Commonlib repository. LiveSync consumes the reviewed
|
||||
Commonlib package, following
|
||||
[the Commonlib dependency workflow](../../devs.md#commonlib-dependency).
|
||||
|
||||
Preserve the existing positional encoder API. Its third and fourth arguments
|
||||
already mean properties to remove and whether to omit default values. Add a
|
||||
separate encoder, provisionally `encodeTimeBoundSetupURI`, with an options
|
||||
object containing the mode and the existing export options. Its result is:
|
||||
The implementation preserves the existing positional encoder API. Its third
|
||||
and fourth arguments retain their meanings: properties to remove and whether
|
||||
to omit default values. It adds a separate `encodeTimeBoundSetupURI` encoder
|
||||
with an options object containing the mode and the existing export options.
|
||||
Its result is:
|
||||
|
||||
```typescript
|
||||
type TimeBoundSetupURIResult = {
|
||||
@@ -272,27 +275,27 @@ type TimeBoundSetupURIResult = {
|
||||
};
|
||||
```
|
||||
|
||||
The new encoder defaults to Ephemeral. Preserve the old encoder's legacy
|
||||
behaviour for callers which have not migrated. Extend
|
||||
`decodeSettingsFromSetupURI` to try both candidates for `%$` while retaining its
|
||||
The new encoder defaults to Ephemeral. The old encoder retains its legacy
|
||||
behaviour for callers which have not migrated. The updated
|
||||
`decodeSettingsFromSetupURI` tries both candidates for `%$` while retaining its
|
||||
settings return contract and historical format handling. Persistent generation
|
||||
through the new API delegates to the old encoder. Time injection belongs in
|
||||
through the new API delegates to the old encoder. Time injection remains in
|
||||
internal test seams, not an import option exposed to users.
|
||||
|
||||
| Surface | Required work |
|
||||
| Surface | Published integration |
|
||||
| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Obsidian generation](../../src/serviceFeatures/setupObsidian/setupUri.ts) | Reuse the passphrase and copy dialogues, add a mode choice with the exact current window end, and use the new encoder for all three copy variants and the copy event. Preserve each variant's export filters. |
|
||||
| [Obsidian import](../../src/modules/features/SetupWizard/dialogs/UseSetupURI.svelte) | Consume the updated decoder and retain one authentication failure message. The existing prefix check indicates URI shape, not successful authentication. |
|
||||
| [Protocol handler](../../src/serviceFeatures/setupObsidian/setupProtocol.ts) | Keep the existing `settings` reconstruction; test encoded delimiters for both modes. |
|
||||
| [CLI setup](../../src/apps/cli/commands/runCommand.ts) | Consume the updated decoder and leave settings unchanged after any rejection. |
|
||||
| [WebPeer generator](../../src/apps/webpeer/src/P2PCheckSetup.ts) | Choose a mode explicitly and return availability to its result UI; keep Ephemeral as the default. |
|
||||
| [Setup utility](../../utils/setup/generate_setup_uri.ts) | Add an explicit mode input, default to Ephemeral, and return/print the end time. Persistent is an explicit choice for durable provisioning output. |
|
||||
| [Setup utility package facade](../../utils/setup/livesync-commonlib.ts) | Update its independent Commonlib pin and associated lockfiles; updating the root npm dependency alone is insufficient. |
|
||||
| [Obsidian generation](../../src/serviceFeatures/setupObsidian/setupUri.ts) | Reuses the passphrase and copy dialogues, presents the mode choice and exact current window end, and uses the encoder for all copy variants and the copy event while preserving each variant's export filters. |
|
||||
| [Obsidian import](../../src/modules/features/SetupWizard/dialogs/UseSetupURI.svelte) | Consumes the updated decoder and retains one authentication failure message. The existing prefix check indicates URI shape, not successful authentication. |
|
||||
| [Protocol handler](../../src/serviceFeatures/setupObsidian/setupProtocol.ts) | Retains the existing `settings` reconstruction; encoded delimiters remain part of protocol validation for both modes. |
|
||||
| [CLI setup](../../src/apps/cli/commands/runCommand.ts) | Uses the updated decoder and leaves settings unchanged after a rejection. |
|
||||
| [WebPeer generator](../../src/apps/webpeer/src/P2PCheckSetup.ts) | Explicitly selects Time-bound mode and returns availability to its result UI; this generator does not offer a Persistent choice. |
|
||||
| [Setup utility](../../utils/setup/generate_setup_uri.ts) | Accepts an explicit mode, defaults to Time-bound, and returns or prints the end time. Persistent is selected for durable provisioning output. |
|
||||
| [Setup utility package facade](../../utils/setup/livesync-commonlib.ts) | Retains its independent Commonlib pin and associated lockfiles, separate from the root npm dependency. |
|
||||
|
||||
The Fly.io wrapper delegates to the setup utility and should inherit the same
|
||||
contract. All maintained generators must migrate explicitly before this
|
||||
feature is described as the default across applications. Non-interactive
|
||||
automation which needs a durable URI must select Persistent.
|
||||
The Fly.io wrapper delegates to the setup utility and inherits the same
|
||||
contract. The initial plan required each maintained generator to select a mode
|
||||
explicitly. Non-interactive automation which needs a durable URI selects
|
||||
Persistent.
|
||||
|
||||
WebPeer hides an Ephemeral URI and disables its copy and additional-device
|
||||
actions after the window ends. Its connection monitor remains available for a
|
||||
@@ -309,8 +312,9 @@ The assessed, unchanged Commonlib 0.1.27 decoder opens Persistent with the
|
||||
entered passphrase and rejects Ephemeral with that same passphrase. Persistent
|
||||
compatibility means compatibility with readers which already support the
|
||||
ordinary generated `%$` representation; it does not add that representation
|
||||
to still older readers. Historical supported versions and their settings
|
||||
schemas still need compatibility fixtures before rollout.
|
||||
to still older readers. This design does not establish compatibility with every
|
||||
historical reader or settings schema; compatibility fixtures are needed before
|
||||
making broader claims about them.
|
||||
|
||||
Keep the original raw-passphrase behaviour of existing URIs. They are
|
||||
indistinguishable from newly generated Persistent URIs to the updated reader.
|
||||
@@ -358,68 +362,72 @@ All 22 cases passed:
|
||||
and raw-passphrase candidates;
|
||||
- the deliberate limitation that clock rollback reproduces an old key.
|
||||
|
||||
This demonstrates the proposed mechanism and baseline interoperability, not
|
||||
completed application support, formal mode indistinguishability, or a mobile
|
||||
latency bound. The present encryption API may perform two PBKDF2 derivations
|
||||
on a cold import. Do not infer production performance from this small probe,
|
||||
whose operations can reuse the dependency's in-memory key cache.
|
||||
The probe demonstrates feasibility and baseline interoperability. Application
|
||||
integration is recorded above; the probe does not establish formal mode
|
||||
indistinguishability or a mobile latency bound. The encryption API may perform
|
||||
two PBKDF2 derivations on a cold import. Do not infer production performance
|
||||
from this small probe, whose operations can reuse the dependency's in-memory
|
||||
key cache.
|
||||
|
||||
Implementation validation must cover Commonlib unit and packed-package tests,
|
||||
plus shared fixed-input protocol vectors across consumers. Add targeted LiveSync
|
||||
tests for the generation metadata, cancellation, a window change during mode
|
||||
selection, encoded deep links, and rejected imports without settings writes. Extend CLI, WebPeer,
|
||||
and Deno setup-tool round trips, including their Persistent selection.
|
||||
The original implementation validation plan covered Commonlib unit and
|
||||
packed-package tests, plus shared fixed-input protocol vectors across consumers.
|
||||
It called for targeted LiveSync tests of generation metadata, cancellation, a
|
||||
window change during mode selection, encoded deep links, and rejected imports
|
||||
without settings writes, alongside CLI, WebPeer, and Deno setup-tool round trips
|
||||
for both modes.
|
||||
|
||||
Then run the required LiveSync checks, unit suite, and production build, one
|
||||
broad process at a time with `NODE_OPTIONS=--max-old-space-size=3072` and bounded
|
||||
test workers. Use the existing focused real-Obsidian Setup URI workflow for
|
||||
copy/paste, deep-link import, cancellation, and successful setup. Verify
|
||||
selection-boundary handling with an injected test clock and mobile behaviour on a
|
||||
supported runtime; do not change the host's system clock. No remote database
|
||||
service is needed for the protocol tests themselves.
|
||||
The plan also called for the LiveSync checks, unit suite, and production build,
|
||||
one broad process at a time with `NODE_OPTIONS=--max-old-space-size=3072` and
|
||||
bounded test workers. It used the focused real-Obsidian Setup URI workflow for
|
||||
copy/paste, deep-link import, cancellation, and successful setup. Selection-
|
||||
boundary handling was to use an injected test clock; mobile behaviour requires
|
||||
a supported runtime and must not change the host's system clock. Protocol tests
|
||||
do not require a remote database service.
|
||||
|
||||
There is no identified blocker in the Time-bound URI protocol. The Commonlib
|
||||
candidate based on 0.1.31 passed its type, unit, boundary, release-process,
|
||||
and packed-package gates before the 0.1.32 release. A clean `npm ci` against
|
||||
the published 0.1.32 artefact and the frozen Deno tool lock resolve the same
|
||||
registry integrity. LiveSync passes its source checks, production build, and
|
||||
1,034 unit tests on a local stack with [PR #1222](https://github.com/vrtmrz/obsidian-livesync/pull/1222).
|
||||
The two CLI installer tests need a runner which permits child processes; both
|
||||
pass under normal process permissions. The Deno setup-tool suite, CLI setup
|
||||
The original protocol assessment found no blocker in the Time-bound URI
|
||||
protocol. The Commonlib candidate based on 0.1.31 passed its type, unit,
|
||||
boundary, release-process, and packed-package gates before the 0.1.32 release. A
|
||||
clean `npm ci` against the published 0.1.32 artefact and the frozen Deno tool
|
||||
lock resolved the same registry integrity. In the original implementation
|
||||
baseline, LiveSync passed its source checks, production build, and 1,034 unit
|
||||
tests on a local stack with [PR #1222](https://github.com/vrtmrz/obsidian-livesync/pull/1222).
|
||||
The two CLI installer tests needed a runner which permits child processes; both
|
||||
passed under normal process permissions. The Deno setup-tool suite, CLI setup
|
||||
and file-operation contract, and WebPeer browser tests passed before stacking.
|
||||
|
||||
Focused real-Obsidian generation checks pass on desktop and emulated mobile,
|
||||
The recorded real-Obsidian generation checks passed on desktop and emulated mobile,
|
||||
including the displayed Time-bound end, Compatible output, and mobile touch
|
||||
targets. A two-device CouchDB workflow now passes on the local stack: the
|
||||
provisioning tool creates a generation 12 database, the first device generates
|
||||
targets. A two-device CouchDB workflow passed on the local stack: the
|
||||
provisioning tool created a generation 12 database, the first device generated
|
||||
a Time-bound Setup URI after declaring its required generation 13 feature, and
|
||||
the second device imports it. An ordinary note completes a round trip, and a
|
||||
hidden snippet synchronises. The separate real-Obsidian tests for live remote
|
||||
the second device imported it. An ordinary note completed a round trip, and a
|
||||
hidden snippet synchronised. The separate real-Obsidian tests for live remote
|
||||
feature changes, internal Metadata migration, and a percent-prefixed E2EE
|
||||
passphrase also pass with published Commonlib 0.1.32. Unit and protocol tests
|
||||
cover window boundaries and preserve the existing distinction between an empty
|
||||
passphrase and cancellation. The WebPeer browser test confirms that its monitor
|
||||
remains available after the URI window ends for a device which has already
|
||||
imported the URI.
|
||||
passphrase also passed with published Commonlib 0.1.32. Unit and protocol tests
|
||||
covered window boundaries and preserved the existing distinction between an
|
||||
empty passphrase and cancellation. The WebPeer browser test confirmed that its
|
||||
monitor remained available after the URI window ended for a device which had
|
||||
already imported the URI.
|
||||
|
||||
The current Commonlib 0.1.33 integration includes the merged host changes from
|
||||
PR #1222 and PR #1225. npm 10 and normal clean installations preserve the lockfile;
|
||||
source checks, the production build, 1,064 unit tests, and ten Deno setup-tool
|
||||
tests pass. Both URI modes preserve ID recovery and explicit legacy ID selection.
|
||||
The Commonlib 0.1.33 integration included the merged host changes from
|
||||
PR #1222 and PR #1225. At that baseline, npm 10 and normal clean installations
|
||||
preserved the lockfile; source checks, the production build, 1,064 unit tests,
|
||||
and ten Deno setup-tool tests passed. Both URI modes preserved ID recovery and
|
||||
explicit legacy ID selection.
|
||||
|
||||
Real Obsidian tests cover independent ID keys through Time-bound, Compatible,
|
||||
and QR setup, encrypted local persistence, natural restarts of both devices,
|
||||
and bidirectional note transfers with stable document and Chunk IDs. Incorrect
|
||||
passphrases and past-window URIs leave runtime and persisted settings unchanged.
|
||||
The past clock belongs to an isolated fixture worker, not Obsidian or the host.
|
||||
CouchDB tests also cover a custom ID source and recovery code, rejection of
|
||||
incompatible document keys before remote writes, and the Doctor's decline,
|
||||
reminder, dismissal, and later acceptance paths. The detailed commands and the
|
||||
remaining published-artefact and physical-device checks are recorded in the
|
||||
Recorded real-Obsidian tests covered independent ID keys through Time-bound,
|
||||
Compatible, and QR setup, encrypted local persistence, natural restarts of both
|
||||
devices, and bidirectional note transfers with stable document and Chunk IDs.
|
||||
Incorrect passphrases and past-window URIs left runtime and persisted settings
|
||||
unchanged. The past clock belonged to an isolated fixture worker, not Obsidian
|
||||
or the host. CouchDB tests also covered a custom ID source and recovery code,
|
||||
rejection of incompatible document keys before remote writes, and the Doctor's
|
||||
decline, reminder, dismissal, and later acceptance paths. The detailed commands,
|
||||
remaining published-artefact checks, and physical-device checks are recorded in the
|
||||
[real Obsidian test guide](../../test/e2e-obsidian/README.md#combined-setup-and-security-regression-checks).
|
||||
|
||||
Compatible preserves the URI encryption format; each receiving client must
|
||||
still support the shared settings and the remote's declared features. The host
|
||||
compatibility checks from PR #1222 remain necessary. These results do not
|
||||
establish a mobile performance bound. The first implementation changes only
|
||||
primary-language resources; translation changes require separate scope.
|
||||
establish a mobile performance bound. The initial implementation changed only
|
||||
primary-language resources; translation changes remain a separate scope.
|
||||
@@ -2,15 +2,16 @@
|
||||
date: 2026-10-17
|
||||
commonlib-version: "0.1.42"
|
||||
self-hosted-livesync-version: "1.0.37"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# Tweak compatibility and recovery
|
||||
|
||||
This document describes the compatibility and recovery contract, including
|
||||
unreleased changes after Self-hosted LiveSync 1.0.37 using Commonlib 0.1.42.
|
||||
Commonlib owns the interpretation of synchronisation settings; LiveSync owns
|
||||
the dialogues and operations which consume that result.
|
||||
This document describes the compatibility and recovery contract introduced
|
||||
after the Self-hosted LiveSync 1.0.37 and Commonlib 0.1.42 baseline recorded
|
||||
above. The current assessment is included in Self-hosted LiveSync 1.0.42 with
|
||||
Commonlib 0.2.2. Commonlib owns the interpretation of synchronisation settings;
|
||||
LiveSync owns the dialogues and operations which consume that result.
|
||||
|
||||
## Shared assessment
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
date: 2026-10-19
|
||||
commonlib-version: "0.1.43"
|
||||
self-hosted-livesync-version: "1.0.38"
|
||||
status: unreleased
|
||||
status: released
|
||||
---
|
||||
|
||||
# Unicode path identity
|
||||
@@ -17,8 +17,10 @@ Commonlib's [consumer contract](https://github.com/vrtmrz/livesync-commonlib/blo
|
||||
defines the shared package boundary.
|
||||
|
||||
NFC identity shipped in Self-hosted LiveSync `1.0.38` with Commonlib `0.1.42`.
|
||||
The deletion handling in reconstruction below uses Commonlib `0.1.43` and
|
||||
remains unreleased in Self-hosted LiveSync.
|
||||
Conflict-aware deletion handling during reconstruction was added separately
|
||||
and is included in current Commonlib `0.2.2`, used by Self-hosted LiveSync
|
||||
`1.0.42`. This later handling is distinct from the initial NFC identity
|
||||
release.
|
||||
|
||||
## Scope
|
||||
|
||||
|
||||
Reference in new issue
Block a user