summaryrefslogtreecommitdiff
path: root/docs/spec.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/spec.md')
-rw-r--r--docs/spec.md33
1 files changed, 33 insertions, 0 deletions
diff --git a/docs/spec.md b/docs/spec.md
new file mode 100644
index 0000000..4537620
--- /dev/null
+++ b/docs/spec.md
@@ -0,0 +1,33 @@
+# Specification baseline
+
+The baseline is Plan 9's 9P2000 manual, read before defining the package boundary.
+Reference implementations are comparison partners, not the specification.
+
+| Requirement | Primary source | Implementation |
+|---|---|---|
+| Little-endian framing, counted strings, tags, qids | [intro(9P)](https://9fans.github.io/plan9port/man/man9/intro.html) | `wire.zig` |
+| First-message negotiation, NOTAG, msize, session reset | [version(9P)](https://9fans.github.io/plan9port/man/man9/version.html) | `Client`, `Server.negotiate`; backend releases fids |
+| Authentication and attach | [attach(9P)](https://9fans.github.io/plan9port/man/man9/attach.html) | All wire/client messages; backend authentication |
+| Tag reservation and cancellation completion | [flush(9P)](https://9fans.github.io/plan9port/man/man9/flush.html) | Client reservations; server Rflush retires oldtag |
+| Walk bounds, cloning and partial walks | [walk(9P)](https://9fans.github.io/plan9port/man/man9/walk.html) | Codec and count checks; backend commits only full walks |
+| Opening, creation, permissions and iounit | [open(9P)](https://9fans.github.io/plan9port/man/man9/open.html) | All wire/client messages; backend filesystem behavior |
+| Read/write counts and directory records | [read(9P)](https://9fans.github.io/plan9port/man/man9/read.html) | Reply count checks; backend directory offsets and records |
+| Fid release, including failed removal | [clunk(9P)](https://9fans.github.io/plan9port/man/man9/clunk.html), [remove(9P)](https://9fans.github.io/plan9port/man/man9/remove.html) | Client messages; backend releases handles |
+| Double stat lengths and atomic metadata changes | [stat(9P)](https://9fans.github.io/plan9port/man/man9/stat.html) | `Stat`, wire length checks; backend atomic updates |
+| Error replies | [error(9P)](https://9fans.github.io/plan9port/man/man9/error.html) | Counted errors, frame-size truncation, no Rerror for Tflush |
+
+The local 24-byte session floor and fixed request capacities are resource choices,
+not additional wire requirements. TCP, Unix, and QUIC adapters carry unchanged
+9P2000 frames. QUIC ALPN and authentication policy are not defined by 9P2000.
+
+[Tiger Style](https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md)
+informs bounded memory, explicit ownership, assertions for internal invariants,
+recoverable errors for external input, and deterministic tests. Zig standard
+library conventions take precedence for names: functions use camelCase, values
+use snake_case, and types use PascalCase. The code is formatted with `zig fmt`.
+
+The wire codec and initial client were extracted from Pardes and checked against
+these rules. Cloud9 adds the reusable server connection, missing client
+operations, cancellation bookkeeping, bounds checks, shared transports, and
+independent conformance harness. Pardes regression tests remain with its adapter;
+wire regression tests moved with the codec.