Add explicit stopped-Journal recovery to Obsidian and CLI

Offer a confirmation in Maintenance and the journal-skip command to skip
only the current stopped Journal and resume receipt. Keep Commonlib notices
visible on stderr during ordinary CLI use.

Document the missing-content risk and replay procedure, and cover
cancellation, stale failures, subsequent failures, and receipt with unit
and plain and encrypted CLI and Obsidian end-to-end tests.

Requires the Commonlib stopped-Journal recovery API. Adopt its exact
published package version before integrating this consumer change.
This commit is contained in:
vorotamoroz committed 2026-11-04 15:25:30 +00:00
1 parent bf2241e5ee
commit a94c3fef90
18 files changed
+1321 -234

No files matched your search

+143 -207
View File
@@ -1,209 +1,145 @@
{
"test:helpers": {
"test": [
"helpers/process.test.ts",
"test-ci-task-contract.ts"
]
},
"test": {
"tasks": [
"test:ci"
]
},
"test:ci": {
"script": "run-ci-suite.ts"
},
"test:p2p:compose": {
"script": "run-compose-p2p.ts"
},
"test:local": {
"tasks": [
"test:setup-put-cat",
"test:mirror",
"test:daemon"
]
},
"test:daemon": {
"test": [
"test-daemon.ts"
]
},
"test:daemon-startup": {
"test": [
"test-daemon-startup.ts"
]
},
"test:decoupled-vault": {
"test": [
"test-decoupled-vault.ts"
]
},
"test:remote-commands": {
"test": [
"test-remote-commands.ts"
]
},
"test:settings-writeback": {
"test": [
"test-settings-writeback.ts"
]
},
"test:fetch-database-continuity": {
"test": [
"test-fetch-database-continuity.ts"
]
},
"test:remote-administration-exit-codes": {
"test": [
"test-remote-administration-exit-codes.ts"
]
},
"test:push-pull": {
"test": [
"test-push-pull.ts"
]
},
"test:setup-put-cat": {
"test": [
"test-setup-put-cat.ts"
]
},
"test:mirror": {
"test": [
"test-mirror.ts"
]
},
"test:sync-two-local": {
"test": [
"test-sync-two-local-databases.ts"
]
},
"test:sync-locked-remote": {
"test": [
"test-sync-locked-remote.ts"
]
},
"test:p2p-host": {
"test": [
"test-p2p-host.ts"
]
},
"test:p2p-peers": {
"test": [
"test-p2p-peers-local-relay.ts"
]
},
"test:p2p-sync": {
"test": [
"test-p2p-sync.ts"
]
},
"test:p2p-automatic-host": {
"test": [
"test-p2p-automatic-host.ts"
]
},
"test:p2p-replacement": {
"test": [
"test-p2p-replicator-replacement.ts"
]
},
"test:p2p-relay-disconnect": {
"test": [
"test-p2p-relay-disconnect.ts"
]
},
"test:p2p:ci": {
"test": [
"test-p2p-sync.ts",
"test-p2p-automatic-host.ts",
"test-p2p-replicator-replacement.ts",
"test-p2p-relay-disconnect.ts"
]
},
"test:p2p-three-nodes": {
"test": [
"test-p2p-three-nodes-conflict.ts"
]
},
"test:p2p-upload-download": {
"test": [
"test-p2p-upload-download-repro.ts"
]
},
"test:benchmark-contract": {
"test": [
"test-benchmark-contract.ts"
]
},
"bench:p2p": {
"script": "bench-p2p.ts"
},
"bench:couchdb": {
"script": "bench-couchdb.ts"
},
"bench:compression": {
"script": "bench-compression.ts"
},
"bench:cases": {
"script": "bench-network-cases.ts"
},
"bench:latency-sweep": {
"script": "bench-latency-sweep.ts"
},
"bench:p2p-split-node": {
"script": "bench-p2p-split-node.ts"
},
"bench:item1": {
"command": "bash",
"args": [
"./bench-run-item1.sh"
]
},
"bench:item1:full": {
"command": "bash",
"args": [
"-lc",
"BENCH_MD_FILE_COUNT=1500 BENCH_MD_MIN_SIZE_BYTES=1024 BENCH_MD_MAX_SIZE_BYTES=20480 BENCH_BIN_FILE_COUNT=500 BENCH_BIN_SIZE_BYTES=102400 BENCH_COUCHDB_RTT_MS=50 bash ./bench-run-item1.sh"
]
},
"test:e2e-couchdb": {
"test": [
"test-e2e-two-vaults-couchdb.ts"
]
},
"test:journal-chunk-recovery": {
"test": [
"test-journal-chunk-recovery.ts"
]
},
"test:e2e-matrix": {
"test": [
"test-e2e-two-vaults-matrix.ts"
]
},
"test:e2e-matrix:couchdb-enc0": {
"test": [
"test-e2e-two-vaults-matrix.ts"
],
"filter": "e2e matrix: COUCHDB-enc0"
},
"test:e2e-matrix:couchdb-enc1": {
"test": [
"test-e2e-two-vaults-matrix.ts"
],
"filter": "e2e matrix: COUCHDB-enc1"
},
"test:e2e-matrix:minio-enc0": {
"test": [
"test-e2e-two-vaults-matrix.ts"
],
"filter": "e2e matrix: MINIO-enc0"
},
"test:e2e-matrix:minio-enc1": {
"test": [
"test-e2e-two-vaults-matrix.ts"
],
"filter": "e2e matrix: MINIO-enc1"
}
"test:helpers": {
"test": ["helpers/process.test.ts", "test-ci-task-contract.ts"]
},
"test": {
"tasks": ["test:ci"]
},
"test:ci": {
"script": "run-ci-suite.ts"
},
"test:p2p:compose": {
"script": "run-compose-p2p.ts"
},
"test:local": {
"tasks": ["test:setup-put-cat", "test:mirror", "test:daemon"]
},
"test:daemon": {
"test": ["test-daemon.ts"]
},
"test:daemon-startup": {
"test": ["test-daemon-startup.ts"]
},
"test:decoupled-vault": {
"test": ["test-decoupled-vault.ts"]
},
"test:remote-commands": {
"test": ["test-remote-commands.ts"]
},
"test:settings-writeback": {
"test": ["test-settings-writeback.ts"]
},
"test:fetch-database-continuity": {
"test": ["test-fetch-database-continuity.ts"]
},
"test:remote-administration-exit-codes": {
"test": ["test-remote-administration-exit-codes.ts"]
},
"test:push-pull": {
"test": ["test-push-pull.ts"]
},
"test:setup-put-cat": {
"test": ["test-setup-put-cat.ts"]
},
"test:mirror": {
"test": ["test-mirror.ts"]
},
"test:sync-two-local": {
"test": ["test-sync-two-local-databases.ts"]
},
"test:sync-locked-remote": {
"test": ["test-sync-locked-remote.ts"]
},
"test:p2p-host": {
"test": ["test-p2p-host.ts"]
},
"test:p2p-peers": {
"test": ["test-p2p-peers-local-relay.ts"]
},
"test:p2p-sync": {
"test": ["test-p2p-sync.ts"]
},
"test:p2p-automatic-host": {
"test": ["test-p2p-automatic-host.ts"]
},
"test:p2p-replacement": {
"test": ["test-p2p-replicator-replacement.ts"]
},
"test:p2p-relay-disconnect": {
"test": ["test-p2p-relay-disconnect.ts"]
},
"test:p2p:ci": {
"test": [
"test-p2p-sync.ts",
"test-p2p-automatic-host.ts",
"test-p2p-replicator-replacement.ts",
"test-p2p-relay-disconnect.ts"
]
},
"test:p2p-three-nodes": {
"test": ["test-p2p-three-nodes-conflict.ts"]
},
"test:p2p-upload-download": {
"test": ["test-p2p-upload-download-repro.ts"]
},
"test:benchmark-contract": {
"test": ["test-benchmark-contract.ts"]
},
"bench:p2p": {
"script": "bench-p2p.ts"
},
"bench:couchdb": {
"script": "bench-couchdb.ts"
},
"bench:compression": {
"script": "bench-compression.ts"
},
"bench:cases": {
"script": "bench-network-cases.ts"
},
"bench:latency-sweep": {
"script": "bench-latency-sweep.ts"
},
"bench:p2p-split-node": {
"script": "bench-p2p-split-node.ts"
},
"bench:item1": {
"command": "bash",
"args": ["./bench-run-item1.sh"]
},
"bench:item1:full": {
"command": "bash",
"args": [
"-lc",
"BENCH_MD_FILE_COUNT=1500 BENCH_MD_MIN_SIZE_BYTES=1024 BENCH_MD_MAX_SIZE_BYTES=20480 BENCH_BIN_FILE_COUNT=500 BENCH_BIN_SIZE_BYTES=102400 BENCH_COUCHDB_RTT_MS=50 bash ./bench-run-item1.sh"
]
},
"test:e2e-couchdb": {
"test": ["test-e2e-two-vaults-couchdb.ts"]
},
"test:journal-chunk-recovery": {
"test": ["test-journal-chunk-recovery.ts"]
},
"test:journal-receive-failure": {
"test": ["test-journal-receive-failure.ts"]
},
"test:e2e-matrix": {
"test": ["test-e2e-two-vaults-matrix.ts"]
},
"test:e2e-matrix:couchdb-enc0": {
"test": ["test-e2e-two-vaults-matrix.ts"],
"filter": "e2e matrix: COUCHDB-enc0"
},
"test:e2e-matrix:couchdb-enc1": {
"test": ["test-e2e-two-vaults-matrix.ts"],
"filter": "e2e matrix: COUCHDB-enc1"
},
"test:e2e-matrix:minio-enc0": {
"test": ["test-e2e-two-vaults-matrix.ts"],
"filter": "e2e matrix: MINIO-enc0"
},
"test:e2e-matrix:minio-enc1": {
"test": ["test-e2e-two-vaults-matrix.ts"],
"filter": "e2e matrix: MINIO-enc1"
}
}