Two backlogs: the release scope, and what the work turned up.
Planned work. An item is only here if it loses data, breaks a promise on a public surface, or stops a stranger installing and running the thing. A ticket that reaches Done carries the version it shipped in.
| Key | Summary | Component | Status | Version | Blocked by |
|---|---|---|---|---|---|
| SAPE-1 | Build identity: version embedded, version command, product version in handshake | server | Done | 1.0.0 | — |
| SAPE-2 | Versioning and compatibility policy | docs | To do | — | — |
| SAPE-3 | Prebuilt binaries and a published container image | release | To do | — | — |
| SAPE-4 | Tag-driven release workflow for the server | release | To do | — | — |
| SAPE-5 | Install path and quickstart | docs | To do | — | SAPE-3 |
| SAPE-6 | Upgrade rehearsal: one build writes, the next reads it all back | server | To do | — | ISS-4 |
| SAPE-7 | Config reload, led by partial reload | server | To do | — | — |
| SAPE-8 | Read an operation's cost envelope before trusting it | server | To do | — | — |
| SAPE-9 | Name collision: decide whether namespaces exist | server | To do | — | — |
| SAPE-10 | Sign and verify an operation binary | server | To do | — | — |
| SAPE-11 | List the external operations installed on a server | server | To do | — | SAPE-8 |
| SAPE-12 | One worked external operation, published as a challenge | docs | To do | — | SAPE-7, SAPE-10 |
| SAPE-13 | An artifact describing the shape of a request body | protocol | To do | — | — |
| SAPE-14 | Declare for collections | server | To do | — | — |
| SAPE-15 | learn.sapedb.com | docs | Done | 1.0.0 | — |
| SAPE-16 | sapedb.com | docs | Done | 1.0.0 | — |
| SAPE-17 | The on-disk format tag and the key labels say sapedb | server | Done | 1.0.0 | — |
| SAPE-18 | Reads share a database instead of queueing behind each other | server | Done | 1.0.0 | — |
| SAPE-19 | Declare an operation against a running daemon — frame 13 | protocol | Done | 1.0.0 | — |
| SAPE-20 | Composed operations, with a ceiling readable at any depth | server | Done | 1.0.0 | — |
| SAPE-21 | Scopes travel the wire as a signed grant | server | Done | 1.0.0 | — |
| SAPE-22 | A count must declare how far it walks | server | Done | 1.0.0 | — |
| SAPE-23 | InvokeVersion, so an older declaration is reachable | protocol | Done | 1.0.0 | — |
| SAPE-24 | Three clients, each run against a real daemon | clients | Done | 1.0.0 | — |
| SAPE-25 | Desktop workbench: connections, catalogue, run, shell, compose, declare | desktop | Done | 1.0.0 | — |
11 done, 14 open. SAPE-1 unblocked SAPE-2, 3, 4 and 6 when it landed; SAPE-6 now waits on ISS-4 instead, because the refusal path it measures has no test to build on.
Opened by the work in Backlog 1, not planned before it. Each one is triaged once: Fix in 1.0.0 only if it loses data, breaks a public promise, or blocks installing and running; otherwise Defer, and it goes to planning for the next version. The triage column is the decision, not a guess at how bad it feels.
| Key | Summary | Found while | Triage | Status | Version |
|---|---|---|---|---|---|
| ISS-1 | The covering index is built, decoded per entry, then discarded | SAPE-20 | Defer | Open | — |
| ISS-2 | Two fixture copies kept identical by hand; nothing compares them | SAPE-19 | Defer | Open | — |
| ISS-3 | The fixture covers 8 of 13 frame types | SAPE-13 | Defer | Open | — |
| ISS-4 | The ErrFormat refusal path has no test at all | SAPE-6 | Fix in 1.0.0 | Open | — |
| ISS-5 | A composed operation's rows come back flat and unlabelled | SAPE-20 | Defer | Open | — |
| ISS-6 | An encryption test is flaky: it searches ciphertext for a 3-character string | SAPE-17 | Defer | Open | — |
| ISS-7 | internal/cli's open() leaks partition files, as Server.Close did | SAPE-19 | Defer | Open | — |
| ISS-8 | Two write handlers in one file roll back differently | SAPE-19 | Defer | Open | — |
| ISS-9 | A read-only composed operation takes the write lock | SAPE-20 | Defer | Open | — |
| ISS-10 | A composed operation must name a collection it may never touch | SAPE-20 | Defer | Open | — |
| ISS-11 | A grant has no expiry and cannot be revoked short of rotating the server secret | SAPE-21 | Fix in 1.0.0 | Open | — |
| ISS-12 | The TypeScript client cannot present a grant, so it cannot reach a scoped operation | SAPE-21 | Fix in 1.0.0 | Open | — |
| ISS-13 | Declaring a collection is not recorded against anybody | SAPE-19 | Defer | Open | — |
| ISS-14 | The old product name survives in three production constants, assembled byte by byte | SAPE-17 | Defer | Open | — |
| ISS-15 | The release plan went stale the same day it was written | SAPE-2 | — | Done | 1.0.0 |
| ISS-16 | The TypeScript client ignores the product version the daemon now sends | SAPE-1 | Defer | Open | — |
| ISS-17 | sapedbd has no version command; it only says so in a log line | SAPE-1 | Defer | Open | — |
| ISS-18 | A linker stamp aimed at a symbol that does not exist is accepted in silence | SAPE-1 | Defer | Open | — |
One question, asked once, and written down: does it lose data, break a promise on a public surface, or stop somebody installing and running the thing? Three of eighteen answer yes. The rest are real — some are embarrassing — and they wait, because a backlog that grows as fast as it shrinks has no answer to is it done yet.
A version number here is a promise that cannot be withdrawn. From the tag onwards these four surfaces
are fixed: the on-disk format, the wire protocol (frames 1…13
never change role; new frames start at 14; fields may be added, never renamed or removed), the
meaning of a declaration, and the public API. It does not promise
performance, the ordering of reads against writes, the file layout inside a partition, or anything
under internal/.