Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 31 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@ user's reading position quietly stops syncing.
- **[`reference-server/`](reference-server/)** — how to run the reference
implementation locally, which was itself undocumented.
- **[`coverage.mjs`](coverage.mjs)** — fails if a requirement in `SPEC.md` has
neither a test nor a written reason why it cannot have one. Runs in CI, so
the spec and its test suite cannot drift apart quietly.
neither a test nor a written reason why it cannot have one, and if a proposed
requirement belongs to no optional feature. Runs in CI, so the spec and its
test suite cannot drift apart quietly.

One section is not observed behaviour of a released server: **§5.8 describes an
open, unmerged pull request** and is pinned to a branch commit. It is an
optional feature, so a server that does not implement it skips those
requirements and stays conformant.

This is **not** an official KOReader project and carries no endorsement from
it. It is a description of observed behaviour. Where it and the reference
Expand Down Expand Up @@ -68,16 +74,25 @@ writes to your server: see [Running the verifier](#running-the-verifier) below.

## Results

Measured 2026-09-21. `verify.mjs` against each server, with the profile flags
Measured 2026-09-23. `verify.mjs` against each server, with the profile flags
each one's design calls for.

| Implementation | Version | Passed | MUST failed | SHOULD failed | Verdict |
|---|---|---:|---:|---:|---|
| `koreader/koreader-sync-server` (reference) | `koreader/kosync:latest`, OpenResty 1.29.2.3, gin 0.2.0 | 49 | **0** | 2 | conformant |
| `pid1/tsundoku` | branch `main` | 47 | **0** | 2 | conformant |
| Implementation | Version | Passed | MUST failed | SHOULD failed | Skipped | Verdict |
|---|---|---:|---:|---:|---:|---|
| `koreader/koreader-sync-server` (reference) | `koreader/kosync:latest`, OpenResty 1.29.2.3, gin 0.2.0 | 49 | **0** | 2 | 20 | conformant |
| `pid1/tsundoku` | branch `main` | 47 | **0** | 0 | 22 | conformant |

Neither server implements §5.8, and nor does any server you can download, so both
runs skip its twenty `[K-ID-…]` requirements. tsundoku's run skips two more, the
registration assertions, because it closes kosync self-registration by design and
the run declared `--registration-off`.

tsundoku's run skips the two registration assertions, because it closes kosync
self-registration by design and the run declared `--registration-off`.
Measured 2026-09-23 against `koreader/koreader-sync-server` PR #55 (branch
`multi-identifier-aliases` at `49dbd38`, built locally on OpenResty 1.29.2.3),
where the probe does find §5.8: **71 passed, 0 MUST failures, 0 SHOULD failures,
0 skipped**. The 51 outside §5.8 are what the published image is scored on, where
it passes 49 and fails two SHOULD — that branch also carries the unreleased fix
for the document-id defect below.

The reference server's two SHOULD failures are a genuine defect in it, not a
disagreement about the protocol: `PUT` accepts any document id, while `GET`
Expand Down Expand Up @@ -166,6 +181,13 @@ of synthetic document ids derived from `--document`. Those ids are constant
across runs by design, so a hundred runs leave five rows rather than five
hundred. Point it at a test account.

The `identifiers` feature of §5.8 is the exception: it allocates **fresh digests
on every run**, because an alias, once created, is never repointed, so a second
run over the same digests would resolve through the first run's aliases and
assert nothing. Against a server that implements it, each run leaves roughly
twenty document and alias keys behind; against one that does not, it leaves the
single record its probe writes.

It **never probes `DELETE /users/me`**, because a conformant server would
delete the account under test.

Expand Down
Loading
Loading