@evident-ai/runner-synchroniser 3.4.1-dev.b740141 → 3.4.1-dev.b9f71fa

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.
Files changed (3) hide show
  1. package/README.md +24 -10
  2. package/dist/cli.js +33910 -34827
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -56,7 +56,7 @@ build time.
56
56
  | `env` | resolved config as shell-eval'able vars | `0` = ran; non-zero = tool broken |
57
57
  | `litestream-config` | the generated `litestream.yml` | `0` = ran; non-zero = tool broken |
58
58
  | `restore <claude\|opencode>` | — | `0` = ran; non-zero = tool broken |
59
- | `sync-once <claude\|opencode>` | — | `0` = ran; non-zero = tool broken |
59
+ | `sync-once <claude\|opencode>` | — | `0` = uploaded/unchanged/absent/disabled; `40` = not persisted; other = tool broken |
60
60
  | `model-auth-ready` | — | `0` = ready, `10` = not ready; other = tool broken |
61
61
  | `self-stop` | — | `0` = stopped, `20` = keep the task; other = tool broken |
62
62
  | `session-db-classify <litestream-restore-exit-code> <attempt> [--on-unusable-replica=<prune\|leave\|clear\|crash>] [--recovery-occurred] [--fresh-db-fallback]` | — | `0` = restored/no-replica/disabled, `32` = re-run and ask again, `31` = unusable (booted fresh, replicates into the existing prefix), `30` = fatal; other = usage/tool broken |
@@ -86,6 +86,13 @@ a warning `restore_retried` record before the retry's result is known. Writing i
86
86
  and never changes this command's exit code. The CLI reader owns this record contract: add a new
87
87
  `v` rather than repurposing a field.
88
88
 
89
+ MicroVM boot-shell give-ups use that same JSONL contract and path. The hook truncates the
90
+ report at the start of each `/run`, so a later startup decision supersedes an earlier one;
91
+ `/resume` preserves the current report. Their `replication_suspended` field is `true`, meaning
92
+ that start is not backing up its new session history. The normal mapper defaults the field to
93
+ `false`; the MicroVM `--fresh-db-fallback` outcome is also `true` because it cannot safely
94
+ replicate that boot.
95
+
89
96
  #### Positionals
90
97
 
91
98
  | Positional | Meaning |
@@ -119,6 +126,9 @@ marks a runtime that intentionally has no retry budget and will therefore boot f
119
126
  otherwise-transient failure. Each flag may appear once, does not change the command's exit code,
120
127
  and is rejected when repeated.
121
128
 
129
+ On the MicroVM's one-attempt path, `--fresh-db-fallback` also means the fresh database does not
130
+ replicate during that boot.
131
+
122
132
  #### Outcome → exit code
123
133
 
124
134
  | Outcome | Code | When |
@@ -138,6 +148,9 @@ and is rejected when repeated.
138
148
  | `fatal(misconfig)` | `30` | no object store while persistence is enabled, or the probe failed on attempt 2 |
139
149
  | `fatal(deliberate)` | `30` | attempt 2, `crash` |
140
150
 
151
+ Fatal exit codes 30 and 34 are reported directly to `POST /v1/runners/self/startup-failure`
152
+ before the CLI starts. Reporting is best-effort and never changes the exit code.
153
+
141
154
  `31` also guarantees local debris (`opencode.db`, `-wal`, `-shm`) is discarded, one `try` per path, at the classifier's single return point. Note `32` isn't purely "transient" — `recovered` shares it with `retryTransient` even though a `recovered` outcome already mutated S3.
142
155
 
143
156
  The probe is a `list`, not a `get`: S3 answers a wrong bucket name with `NoSuchBucket`, also a 404, so a `get`-based probe would read a misconfigured bucket as healthy and unlock recovery against it.
@@ -217,7 +230,7 @@ what it is.
217
230
  - **`clear`** — deletes every key under `<prefix>/opencode.db/` passing `isDeletableReplicaKey`; that guard, not the `list()` prefix, is the boundary (IAM grants `s3:DeleteObject*` bucket-wide). One `try` per key. A **partial** clear still reports `recovered`/`32`. Cost: all saved history, unconditionally.
218
231
  - **`crash`** — first in the switch, no S3 mutation even considered → `fatal(deliberate)`/`30` → `entrypoint.sh` `die`s → task replaced → **crash loop** until an operator intervenes.
219
232
 
220
- #### The measured real-world key layout (litestream 0.5.13)
233
+ #### The measured real-world key layout (litestream 0.5.13 historical sample)
221
234
 
222
235
  `parseLtxKey` (`src/replica-keys.ts`) expects
223
236
  `<prefix>/opencode.db/<level:04d>/<minTxid>-<maxTxid>.ltx` — **no `ltx/` path segment**,
@@ -314,15 +327,16 @@ same way it already reuses `SESSION-DB-REPLICA-UNUSABLE` for `session-db-classif
314
327
 
315
328
  ### Why the contract is asymmetric
316
329
 
317
- `restore` and `sync-once` **never** report a domain outcome through the exit code. A
318
- missing remote object, a corrupt local file, a failed upload, an IAM denial — all of
319
- those are logged and still exit `0`. None of them should abort a boot: a runner with no
320
- credentials yet is a runner a human can still log into.
330
+ `restore` logs domain outcomes and still exits `0`: a missing remote object or a
331
+ restore failure should not abort a boot, because a runner with no credentials yet
332
+ is a runner a human can still log into. `sync-once` returns `40` when the current
333
+ credential file is not persisted (`failed`, `hashFailed`, or `localInvalid`), while
334
+ `absent` and `disabled` remain legitimate `0` outcomes.
321
335
 
322
- The consequence is the point: **any non-zero status from `restore`/`sync-once` means the
323
- tool itself broke** — bad arguments (`2`), an uncaught throw (`1`), or a bundle that
324
- would not run at all. The shell needs no case analysis to know something is wrong, so
325
- its "credential persistence is DEGRADED" error lives in exactly one helper.
336
+ The consequence is the point: **any non-zero status from `restore` means the tool itself
337
+ broke** — and `sync-once` uses `40` for its typed persistence answer; other non-zero
338
+ statuses still mean bad arguments (`2`), an uncaught throw (`1`), or a bundle that would
339
+ not run at all. The shell keeps that distinction in one helper.
326
340
 
327
341
  The **two predicates** — `model-auth-ready` and `self-stop` — each need to distinguish
328
342
  "the answer is no" from "the tool is broken", so each answers no with its own dedicated