From d785e35919c7fbf6dd989a05bc71d79c084d9178 Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Tue, 12 May 2026 09:33:39 -0600 Subject: [PATCH] feat(mdbook): publish spec via mdBook on GitHub Pages Set up the protocol spec as an mdBook and add a GitHub Actions workflow that builds it on every push/PR and deploys to GitHub Pages on main. The repo is now both a machine-readable corpus and a browsable, searchable site. Structure changes (one-time, mechanical): - Rename the spec source directory from `spec/` to `src/` to match mdBook's default convention. All 21 chapter files move; their internal relative cross-links are unchanged. - Add `src/SUMMARY.md` as the mdBook table of contents, grouping chapters under Wire Format, Payloads, Cryptography & Identity, and Routing & Higher-Layer Protocols. - Add `book.toml` at repo root: title, author, search enabled, fold enabled, edit-on-GitHub links, navy theme. - Add `.github/workflows/mdbook.yml`: build on push + PR, deploy on push to main only (configure-pages + upload-pages-artifact + deploy-pages from actions/). - Add `/book/` to .gitignore. Reference updates so the old path is fully retired: - Every `spec_ref` in `corpus/**/*.json` rewritten from `spec/` to `src/` (54 files). - Schema description text and example path in `corpus/schema/test-vector.schema.json`. - `README.md`: prominent link to the published site near the top; "What's Here" updated for the new layout. - `CONTRIBUTING.md`: spec-editing instructions point at `src/` and note the SUMMARY.md requirement. - `CLAUDE.md`: directory-layout notes updated. CHANGELOG.md historical entries intentionally keep their `spec/` paths since those record what the paths were at the time of those commits. After this lands, the user needs to enable GitHub Pages in repo settings with source = "GitHub Actions" (one-time, manual). The workflow will then publish to https://swaits.github.io/meshcore-spec/ on every push to main. Verified locally: `mdbook build` produces a clean book/ tree with all 21 chapters rendered and the SUMMARY-driven sidebar populated. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/mdbook.yml | 47 +++++++++++++++++++ .gitignore | 3 ++ CLAUDE.md | 6 ++- CONTRIBUTING.md | 3 +- README.md | 11 ++++- book.toml | 22 +++++++++ corpus/bridge/framing.json | 2 +- corpus/companion/commands.json | 2 +- corpus/companion/framing.json | 2 +- corpus/companion/responses.json | 2 +- corpus/crypto/aes128ecb/block-padding.json | 2 +- corpus/crypto/aes128ecb/encrypt.json | 2 +- corpus/crypto/ecdh/shared-secret.json | 2 +- corpus/crypto/ed25519/sign-verify.json | 2 +- corpus/crypto/encrypt-then-mac/roundtrip.json | 2 +- corpus/crypto/hmac-sha256/truncated-mac.json | 2 +- corpus/crypto/sha256/ack-crc.json | 2 +- corpus/crypto/sha256/basic.json | 2 +- corpus/crypto/sha256/packet-hash.json | 2 +- corpus/kiss/framing.json | 2 +- corpus/kiss/sethardware.json | 2 +- corpus/kiss/standard-commands.json | 2 +- corpus/payloads/ack/basic.json | 2 +- corpus/payloads/ack/boundary.json | 2 +- corpus/payloads/advert/app-data-combined.json | 2 +- corpus/payloads/advert/app-data-location.json | 2 +- corpus/payloads/advert/app-data-types.json | 2 +- corpus/payloads/advert/basic.json | 2 +- corpus/payloads/anon-req/basic.json | 2 +- corpus/payloads/control/basic.json | 2 +- corpus/payloads/encrypted/basic.json | 2 +- corpus/payloads/encrypted/mac-verify.json | 2 +- corpus/payloads/encrypted/padding.json | 2 +- corpus/payloads/encrypted/roundtrip.json | 2 +- corpus/payloads/encrypted/with-extra.json | 2 +- corpus/payloads/group/grp-data.json | 2 +- corpus/payloads/group/grp-txt.json | 2 +- corpus/payloads/multipart/basic.json | 2 +- corpus/payloads/path-return/basic.json | 2 +- corpus/payloads/raw-custom/basic.json | 2 +- corpus/payloads/trace/basic.json | 2 +- corpus/schema/test-vector.schema.json | 2 +- corpus/wire-format/framing/decode-only.json | 2 +- corpus/wire-format/framing/empty-payload.json | 2 +- corpus/wire-format/framing/maximal.json | 2 +- corpus/wire-format/framing/minimal.json | 2 +- corpus/wire-format/header/combined.json | 2 +- corpus/wire-format/header/payload-types.json | 2 +- corpus/wire-format/header/route-types.json | 2 +- corpus/wire-format/header/versions.json | 2 +- corpus/wire-format/invalid/bad-path-len.json | 2 +- corpus/wire-format/invalid/too-short.json | 2 +- corpus/wire-format/invalid/truncated.json | 2 +- corpus/wire-format/path/boundary.json | 2 +- corpus/wire-format/path/hash-counts.json | 2 +- corpus/wire-format/path/hash-sizes.json | 2 +- corpus/wire-format/transport-codes/basic.json | 2 +- {spec => src}/00-overview.md | 0 {spec => src}/01-wire-format.md | 0 {spec => src}/02-header.md | 0 {spec => src}/03-path.md | 0 {spec => src}/04-payload-ack.md | 0 {spec => src}/05-payload-advert.md | 0 {spec => src}/06-payload-encrypted.md | 0 {spec => src}/07-payload-anon-req.md | 0 {spec => src}/08-payload-group.md | 0 {spec => src}/09-payload-path.md | 0 {spec => src}/10-payload-trace.md | 0 {spec => src}/11-payload-multipart.md | 0 {spec => src}/12-payload-control.md | 0 {spec => src}/13-payload-raw-custom.md | 0 {spec => src}/14-crypto.md | 0 {spec => src}/15-identity.md | 0 {spec => src}/16-packet-hash.md | 0 {spec => src}/17-routing.md | 0 {spec => src}/18-companion-protocol.md | 0 {spec => src}/19-kiss-protocol.md | 0 {spec => src}/20-bridge-protocol.md | 0 src/SUMMARY.md | 35 ++++++++++++++ 79 files changed, 173 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/mdbook.yml create mode 100644 book.toml rename {spec => src}/00-overview.md (100%) rename {spec => src}/01-wire-format.md (100%) rename {spec => src}/02-header.md (100%) rename {spec => src}/03-path.md (100%) rename {spec => src}/04-payload-ack.md (100%) rename {spec => src}/05-payload-advert.md (100%) rename {spec => src}/06-payload-encrypted.md (100%) rename {spec => src}/07-payload-anon-req.md (100%) rename {spec => src}/08-payload-group.md (100%) rename {spec => src}/09-payload-path.md (100%) rename {spec => src}/10-payload-trace.md (100%) rename {spec => src}/11-payload-multipart.md (100%) rename {spec => src}/12-payload-control.md (100%) rename {spec => src}/13-payload-raw-custom.md (100%) rename {spec => src}/14-crypto.md (100%) rename {spec => src}/15-identity.md (100%) rename {spec => src}/16-packet-hash.md (100%) rename {spec => src}/17-routing.md (100%) rename {spec => src}/18-companion-protocol.md (100%) rename {spec => src}/19-kiss-protocol.md (100%) rename {spec => src}/20-bridge-protocol.md (100%) create mode 100644 src/SUMMARY.md diff --git a/.github/workflows/mdbook.yml b/.github/workflows/mdbook.yml new file mode 100644 index 0000000..0f82fd5 --- /dev/null +++ b/.github/workflows/mdbook.yml @@ -0,0 +1,47 @@ +name: mdBook + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install mdBook + uses: peaceiris/actions-mdbook@v2 + with: + mdbook-version: latest + - name: Configure Pages + uses: actions/configure-pages@v5 + - name: Build book + run: mdbook build + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./book + + deploy: + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index fec40c5..fd5bab0 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ Thumbs.db /build/ /dist/ /references/ + +# mdBook output +/book/ diff --git a/CLAUDE.md b/CLAUDE.md index 812b524..c7053a9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,8 @@ A specification and conformance test suite for the MeshCore mesh networking protocol. It contains: -1. RFC-style spec documents in `spec/` (Markdown, using RFC 2119 language) +1. RFC-style spec documents in `src/` (Markdown, using RFC 2119 language; this + is also the mdbook source root) 2. JSON test vector corpus in `corpus/` 3. Validation tooling in `tools/` @@ -31,7 +32,8 @@ protocol. It contains: ## File Organization -- `spec/NN-topic.md` — Spec sections, numbered for reading order +- `src/NN-topic.md` — Spec sections, numbered for reading order (mdbook root) +- `src/SUMMARY.md` — mdbook table of contents; new chapters MUST be added here - `corpus/schema/` — JSON Schema for test vector validation - `corpus/{layer}/{type}/` — Test vectors organized by protocol layer - `tools/` — Python validation and generation scripts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab7635d..965cf77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,8 @@ ## Editing the Specification -1. Spec documents live in `spec/` and are numbered for reading order. +1. Spec documents live in `src/` (the mdbook source root) and are numbered for + reading order. New chapters must also be listed in `src/SUMMARY.md`. 2. Use RFC 2119 language (MUST, SHOULD, MAY) for normative requirements. 3. Include ASCII wire format diagrams where applicable. 4. Cross-reference related spec sections and test vector files. diff --git a/README.md b/README.md index 7d402f0..b7868d7 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ A comprehensive specification and conformance test suite for the [MeshCore](https://github.com/meshcore-dev/MeshCore) mesh networking protocol. +**📖 Read the spec online:** + MeshCore Spec aims to be the authoritative, machine-readable definition of the MeshCore wire format — much like [RubySpec](https://github.com/ruby/spec) became the definitive specification of the Ruby language. Any implementation that passes @@ -38,12 +40,17 @@ before relying on the spec for anything load-bearing. ## What's Here -- **`spec/`** — RFC-style protocol specification in Markdown, covering every - layer from packet framing to cryptographic operations. +- **`src/`** — RFC-style protocol specification in Markdown, covering every + layer from packet framing to cryptographic operations. Also the source root + for the [mdBook](https://rust-lang.github.io/mdBook/) build published to + GitHub Pages. - **`corpus/`** — JSON test vectors organized by protocol layer. Each vector pairs a structured representation with its exact binary encoding, enabling any implementation to verify encode and decode correctness. - **`tools/`** — Validation and generation utilities. +- **`book.toml`** + **`.github/workflows/mdbook.yml`** — mdBook configuration + and the GitHub Actions workflow that builds and deploys the spec on every + push to `main`. ## Test Vector Format diff --git a/book.toml b/book.toml new file mode 100644 index 0000000..e8db1ad --- /dev/null +++ b/book.toml @@ -0,0 +1,22 @@ +[book] +title = "MeshCore Protocol Specification" +authors = ["Stephen Waits"] +description = "An independent, AI-authored specification and conformance test corpus for the MeshCore mesh networking protocol. The official MeshCore C++ firmware is the source of truth; this spec is downstream." +language = "en" +src = "src" + +[output.html] +default-theme = "navy" +preferred-dark-theme = "navy" +git-repository-url = "https://github.com/swaits/meshcore-spec" +edit-url-template = "https://github.com/swaits/meshcore-spec/edit/main/{path}" +site-url = "/meshcore-spec/" + +[output.html.fold] +enable = true +level = 1 + +[output.html.search] +enable = true +limit-results = 20 +use-boolean-and = true diff --git a/corpus/bridge/framing.json b/corpus/bridge/framing.json index 85be53a..b09bcb2 100644 --- a/corpus/bridge/framing.json +++ b/corpus/bridge/framing.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "Bridge Protocol - Framing", - "spec_ref": "spec/20-bridge-protocol.md", + "spec_ref": "src/20-bridge-protocol.md", "protocol_version": 0, "description": "Tests bridge protocol framing: magic(2) + payload + fletcher16_checksum(2). RS232 variant adds length(2) between magic and payload.", "vectors": [ diff --git a/corpus/companion/commands.json b/corpus/companion/commands.json index 49b077a..5f6039b 100644 --- a/corpus/companion/commands.json +++ b/corpus/companion/commands.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "Companion Protocol - Commands", - "spec_ref": "spec/18-companion-protocol.md", + "spec_ref": "src/18-companion-protocol.md", "protocol_version": 0, "description": "Tests companion protocol command type encoding for various command types.", "vectors": [ diff --git a/corpus/companion/framing.json b/corpus/companion/framing.json index 4931782..d5b8cbf 100644 --- a/corpus/companion/framing.json +++ b/corpus/companion/framing.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "Companion Protocol - Framing", - "spec_ref": "spec/18-companion-protocol.md", + "spec_ref": "src/18-companion-protocol.md", "protocol_version": 0, "description": "Tests companion protocol frame encoding: type byte followed by variable-length data.", "vectors": [ diff --git a/corpus/companion/responses.json b/corpus/companion/responses.json index c569442..ec63a4b 100644 --- a/corpus/companion/responses.json +++ b/corpus/companion/responses.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "Companion Protocol - Responses", - "spec_ref": "spec/18-companion-protocol.md", + "spec_ref": "src/18-companion-protocol.md", "protocol_version": 0, "description": "Tests companion protocol response type encoding.", "vectors": [ diff --git a/corpus/crypto/aes128ecb/block-padding.json b/corpus/crypto/aes128ecb/block-padding.json index dc40366..452da11 100644 --- a/corpus/crypto/aes128ecb/block-padding.json +++ b/corpus/crypto/aes128ecb/block-padding.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "AES-128-ECB Block Padding", - "spec_ref": "spec/14-crypto.md", + "spec_ref": "src/14-crypto.md", "protocol_version": 0, "description": "Tests AES-128-ECB zero-padding for partial blocks. MeshCore pads the final block with zeros before encryption.", "vectors": [ diff --git a/corpus/crypto/aes128ecb/encrypt.json b/corpus/crypto/aes128ecb/encrypt.json index b7b07a7..e483c9a 100644 --- a/corpus/crypto/aes128ecb/encrypt.json +++ b/corpus/crypto/aes128ecb/encrypt.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "AES-128-ECB Encryption", - "spec_ref": "spec/14-crypto.md", + "spec_ref": "src/14-crypto.md", "protocol_version": 0, "description": "Standalone AES-128-ECB encryption test vectors. Key is the first 16 bytes of the shared secret. These vectors test the raw encryption operation without MAC.", "vectors": [ diff --git a/corpus/crypto/ecdh/shared-secret.json b/corpus/crypto/ecdh/shared-secret.json index 0d64719..54d2e57 100644 --- a/corpus/crypto/ecdh/shared-secret.json +++ b/corpus/crypto/ecdh/shared-secret.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "ECDH Shared Secret (X25519)", - "spec_ref": "spec/15-identity.md", + "spec_ref": "src/15-identity.md", "protocol_version": 0, "description": "X25519 ECDH key exchange test vectors. MeshCore uses Ed25519 keys transposed to X25519 for key exchange. The resulting 32-byte shared secret is used as: AES key (bytes 0-15) and HMAC key (bytes 0-31).", "vectors": [ diff --git a/corpus/crypto/ed25519/sign-verify.json b/corpus/crypto/ed25519/sign-verify.json index c809d14..90124f9 100644 --- a/corpus/crypto/ed25519/sign-verify.json +++ b/corpus/crypto/ed25519/sign-verify.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Ed25519 Sign/Verify", - "spec_ref": "spec/15-identity.md", + "spec_ref": "src/15-identity.md", "protocol_version": 0, "description": "Ed25519 signature test vectors. MeshCore uses Ed25519 for advertisement signing. These vectors use RFC 8032 test keypairs for cross-validation.", "vectors": [ diff --git a/corpus/crypto/encrypt-then-mac/roundtrip.json b/corpus/crypto/encrypt-then-mac/roundtrip.json index 789dccc..75a507d 100644 --- a/corpus/crypto/encrypt-then-mac/roundtrip.json +++ b/corpus/crypto/encrypt-then-mac/roundtrip.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypt-then-MAC Roundtrip", - "spec_ref": "spec/14-crypto.md", + "spec_ref": "src/14-crypto.md", "protocol_version": 0, "description": "Full encrypt-then-MAC pipeline test vectors. Each vector provides the shared secret, plaintext, and expected MAC+ciphertext output. Implementations should verify: (1) encrypt produces the ciphertext, (2) HMAC produces the MAC, (3) MACThenDecrypt recovers the plaintext.", "vectors": [ diff --git a/corpus/crypto/hmac-sha256/truncated-mac.json b/corpus/crypto/hmac-sha256/truncated-mac.json index 14e6476..6fe4d08 100644 --- a/corpus/crypto/hmac-sha256/truncated-mac.json +++ b/corpus/crypto/hmac-sha256/truncated-mac.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "HMAC-SHA256 Truncated to 2 Bytes", - "spec_ref": "spec/14-crypto.md", + "spec_ref": "src/14-crypto.md", "protocol_version": 0, "description": "Tests HMAC-SHA256 computation with 32-byte key, truncated to CIPHER_MAC_SIZE (2 bytes). The HMAC key is the full 32-byte shared secret (PUB_KEY_SIZE), not just the 16-byte AES key.", "vectors": [ diff --git a/corpus/crypto/sha256/ack-crc.json b/corpus/crypto/sha256/ack-crc.json index 6c9afcd..acb2e1a 100644 --- a/corpus/crypto/sha256/ack-crc.json +++ b/corpus/crypto/sha256/ack-crc.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "SHA-256 ACK CRC Computation", - "spec_ref": "spec/04-payload-ack.md", + "spec_ref": "src/04-payload-ack.md", "protocol_version": 0, "description": "Tests MeshCore ACK CRC computation: SHA-256(timestamp_le || txt_type_attempt || text || sender_pub_key)[0..3]. Each vector presents the full ACK packet that would be returned, along with the crypto_context showing the plaintext fed to SHA-256. Vectors ack-crc-001..004 share timestamp/text/pub_key and differ only in the attempt nibble of txt_type_attempt, demonstrating that each retry produces a distinct ACK CRC.", "vectors": [ diff --git a/corpus/crypto/sha256/basic.json b/corpus/crypto/sha256/basic.json index 5273692..3d89f18 100644 --- a/corpus/crypto/sha256/basic.json +++ b/corpus/crypto/sha256/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "SHA-256 Basic", - "spec_ref": "spec/14-crypto.md", + "spec_ref": "src/14-crypto.md", "protocol_version": 0, "description": "Basic SHA-256 hash computation test vectors. MeshCore uses SHA-256 for packet hashing, channel hash derivation, and HMAC.", "vectors": [ diff --git a/corpus/crypto/sha256/packet-hash.json b/corpus/crypto/sha256/packet-hash.json index c394ce4..0480d2e 100644 --- a/corpus/crypto/sha256/packet-hash.json +++ b/corpus/crypto/sha256/packet-hash.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "SHA-256 Packet Hash", - "spec_ref": "spec/16-packet-hash.md", + "spec_ref": "src/16-packet-hash.md", "protocol_version": 0, "description": "Tests MeshCore packet hash computation: SHA-256(payload_type || payload)[0..7]. TRACE packets additionally include path_len in the hash input.", "vectors": [ diff --git a/corpus/kiss/framing.json b/corpus/kiss/framing.json index 26a93a9..0d08e8f 100644 --- a/corpus/kiss/framing.json +++ b/corpus/kiss/framing.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "KISS Protocol - Framing", - "spec_ref": "spec/19-kiss-protocol.md", + "spec_ref": "src/19-kiss-protocol.md", "protocol_version": 0, "description": "Tests KISS frame encoding including FEND delimiters, byte stuffing (FESC sequences), and type byte encoding.", "vectors": [ diff --git a/corpus/kiss/sethardware.json b/corpus/kiss/sethardware.json index 96dff30..5c4cc3c 100644 --- a/corpus/kiss/sethardware.json +++ b/corpus/kiss/sethardware.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "KISS Protocol - SetHardware Extensions", - "spec_ref": "spec/19-kiss-protocol.md", + "spec_ref": "src/19-kiss-protocol.md", "protocol_version": 0, "description": "Tests MeshCore-specific SetHardware (0x06) sub-commands and responses.", "vectors": [ diff --git a/corpus/kiss/standard-commands.json b/corpus/kiss/standard-commands.json index 9cc47da..1683179 100644 --- a/corpus/kiss/standard-commands.json +++ b/corpus/kiss/standard-commands.json @@ -1,7 +1,7 @@ { "$schema": "../schema/test-vector.schema.json", "name": "KISS Protocol - Standard Commands", - "spec_ref": "spec/19-kiss-protocol.md", + "spec_ref": "src/19-kiss-protocol.md", "protocol_version": 0, "description": "Tests standard KISS commands (TXDELAY, Persistence, SlotTime, etc.).", "vectors": [ diff --git a/corpus/payloads/ack/basic.json b/corpus/payloads/ack/basic.json index 4a55a1d..d5a786a 100644 --- a/corpus/payloads/ack/basic.json +++ b/corpus/payloads/ack/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "ACK Payload - Basic", - "spec_ref": "spec/04-payload-ack.md", + "spec_ref": "src/04-payload-ack.md", "protocol_version": 0, "description": "Basic ACK payload encoding/decoding tests with various CRC values.", "vectors": [ diff --git a/corpus/payloads/ack/boundary.json b/corpus/payloads/ack/boundary.json index edde12e..2e7b867 100644 --- a/corpus/payloads/ack/boundary.json +++ b/corpus/payloads/ack/boundary.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "ACK Payload - Boundary Values", - "spec_ref": "spec/04-payload-ack.md", + "spec_ref": "src/04-payload-ack.md", "protocol_version": 0, "description": "ACK CRC boundary value tests including all-zeros, all-ones, and single-bit patterns.", "vectors": [ diff --git a/corpus/payloads/advert/app-data-combined.json b/corpus/payloads/advert/app-data-combined.json index 088d4c3..160c00f 100644 --- a/corpus/payloads/advert/app-data-combined.json +++ b/corpus/payloads/advert/app-data-combined.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Advertisement App Data - Combined Optional Fields", - "spec_ref": "spec/05-payload-advert.md", + "spec_ref": "src/05-payload-advert.md", "protocol_version": 0, "description": "Tests app_data with multiple optional fields present simultaneously. Fields appear in order: flags, location (lat+lon), feat1, feat2, name.", "vectors": [ diff --git a/corpus/payloads/advert/app-data-location.json b/corpus/payloads/advert/app-data-location.json index cfdd613..362e1ef 100644 --- a/corpus/payloads/advert/app-data-location.json +++ b/corpus/payloads/advert/app-data-location.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Advertisement App Data - Location", - "spec_ref": "spec/05-payload-advert.md", + "spec_ref": "src/05-payload-advert.md", "protocol_version": 0, "description": "Tests app_data with location fields (latitude and longitude as int32_le × 1,000,000).", "vectors": [ diff --git a/corpus/payloads/advert/app-data-types.json b/corpus/payloads/advert/app-data-types.json index 7236d91..a69c85f 100644 --- a/corpus/payloads/advert/app-data-types.json +++ b/corpus/payloads/advert/app-data-types.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Advertisement App Data - Node Types", - "spec_ref": "spec/05-payload-advert.md", + "spec_ref": "src/05-payload-advert.md", "protocol_version": 0, "description": "Tests all defined node types in the app_data flags field (bits 0-3). Uses a common pub_key, zero timestamp, and zero signature for structural testing.", "vectors": [ diff --git a/corpus/payloads/advert/basic.json b/corpus/payloads/advert/basic.json index 82c6e95..38891e8 100644 --- a/corpus/payloads/advert/basic.json +++ b/corpus/payloads/advert/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Advertisement Payload - Basic Structure", - "spec_ref": "spec/05-payload-advert.md", + "spec_ref": "src/05-payload-advert.md", "protocol_version": 0, "description": "Tests the basic structure of advertisement payloads: pub_key(32) + timestamp(4) + signature(64) + optional app_data. Uses synthetic signature bytes since signature verification requires real Ed25519 operations (see signature-verify.json for verifiable vectors).", "vectors": [ diff --git a/corpus/payloads/anon-req/basic.json b/corpus/payloads/anon-req/basic.json index 75edde0..b926c6e 100644 --- a/corpus/payloads/anon-req/basic.json +++ b/corpus/payloads/anon-req/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Anonymous Request Payload", - "spec_ref": "spec/07-payload-anon-req.md", + "spec_ref": "src/07-payload-anon-req.md", "protocol_version": 0, "description": "Tests anonymous request payload: dest_hash(1) + sender_pub_key(32) + cipher_mac(2) + ciphertext.", "vectors": [ diff --git a/corpus/payloads/control/basic.json b/corpus/payloads/control/basic.json index b888c1e..28d1177 100644 --- a/corpus/payloads/control/basic.json +++ b/corpus/payloads/control/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Control Payload - Basic", - "spec_ref": "spec/12-payload-control.md", + "spec_ref": "src/12-payload-control.md", "protocol_version": 0, "description": "Tests control payload encoding. Control packets carry raw bytes where the first byte's bit 7 indicates zero-hop-only restriction.", "vectors": [ diff --git a/corpus/payloads/encrypted/basic.json b/corpus/payloads/encrypted/basic.json index 7b60085..f8b90d3 100644 --- a/corpus/payloads/encrypted/basic.json +++ b/corpus/payloads/encrypted/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypted Payload - Basic", - "spec_ref": "spec/06-payload-encrypted.md", + "spec_ref": "src/06-payload-encrypted.md", "protocol_version": 0, "description": "Tests encrypted payload encoding (REQ/RESPONSE/TXT_MSG) with known cryptographic material. Uses shared_secret = 0x000102...1F, AES key = first 16 bytes, HMAC key = full 32 bytes.", "vectors": [ diff --git a/corpus/payloads/encrypted/mac-verify.json b/corpus/payloads/encrypted/mac-verify.json index c4d0dd6..915215a 100644 --- a/corpus/payloads/encrypted/mac-verify.json +++ b/corpus/payloads/encrypted/mac-verify.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypted Payload - MAC Verification", - "spec_ref": "spec/06-payload-encrypted.md", + "spec_ref": "src/06-payload-encrypted.md", "protocol_version": 0, "description": "Tests MAC verification: valid MACs must pass, tampered MACs or ciphertext must fail.", "vectors": [ diff --git a/corpus/payloads/encrypted/padding.json b/corpus/payloads/encrypted/padding.json index 5023372..8a28331 100644 --- a/corpus/payloads/encrypted/padding.json +++ b/corpus/payloads/encrypted/padding.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypted Payload - AES Block Padding", - "spec_ref": "spec/06-payload-encrypted.md", + "spec_ref": "src/06-payload-encrypted.md", "protocol_version": 0, "description": "Tests AES-128-ECB zero-padding behavior at block boundaries. Plaintexts of 1, 15, 16, 17, and 32 bytes exercise all padding edge cases.", "vectors": [ diff --git a/corpus/payloads/encrypted/roundtrip.json b/corpus/payloads/encrypted/roundtrip.json index d054a96..751fd11 100644 --- a/corpus/payloads/encrypted/roundtrip.json +++ b/corpus/payloads/encrypted/roundtrip.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypted Payload - Roundtrip Verification", - "spec_ref": "spec/06-payload-encrypted.md", + "spec_ref": "src/06-payload-encrypted.md", "protocol_version": 0, "description": "Roundtrip encrypt-then-MAC verification vectors. Each vector provides full key material enabling implementations to verify: (1) encryption produces the given ciphertext, (2) MAC computation produces the given MAC, (3) MAC verification succeeds, (4) decryption recovers the plaintext.", "vectors": [ diff --git a/corpus/payloads/encrypted/with-extra.json b/corpus/payloads/encrypted/with-extra.json index 5bc14bb..c3fea66 100644 --- a/corpus/payloads/encrypted/with-extra.json +++ b/corpus/payloads/encrypted/with-extra.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Encrypted Payload - Extra Edge Cases", - "spec_ref": "spec/06-payload-encrypted.md", + "spec_ref": "src/06-payload-encrypted.md", "protocol_version": 0, "description": "Additional encrypted payload tests: non-FLOOD routes, hash_size>1 paths, 32-byte plaintext, and payload-level invalid cases.", "vectors": [ diff --git a/corpus/payloads/group/grp-data.json b/corpus/payloads/group/grp-data.json index 7e6fa50..b947ffc 100644 --- a/corpus/payloads/group/grp-data.json +++ b/corpus/payloads/group/grp-data.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Group Data Payload", - "spec_ref": "spec/08-payload-group.md", + "spec_ref": "src/08-payload-group.md", "protocol_version": 0, "description": "Tests group datagram payload. Same wire format as GRP_TXT but payload type = 0x06.", "vectors": [ diff --git a/corpus/payloads/group/grp-txt.json b/corpus/payloads/group/grp-txt.json index fbe7888..4298e38 100644 --- a/corpus/payloads/group/grp-txt.json +++ b/corpus/payloads/group/grp-txt.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Group Text Payload", - "spec_ref": "spec/08-payload-group.md", + "spec_ref": "src/08-payload-group.md", "protocol_version": 0, "description": "Tests group text message payload: channel_hash(1) + cipher_mac(2) + ciphertext.", "vectors": [ diff --git a/corpus/payloads/multipart/basic.json b/corpus/payloads/multipart/basic.json index 4c0e336..57cc3a6 100644 --- a/corpus/payloads/multipart/basic.json +++ b/corpus/payloads/multipart/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Multipart Payload - Basic", - "spec_ref": "spec/11-payload-multipart.md", + "spec_ref": "src/11-payload-multipart.md", "protocol_version": 0, "description": "Tests multipart payload encoding: first byte = (remaining << 4) | sub_type. Currently only multipart ACK (sub_type=3) is defined.", "vectors": [ diff --git a/corpus/payloads/path-return/basic.json b/corpus/payloads/path-return/basic.json index d5d147d..48dce1f 100644 --- a/corpus/payloads/path-return/basic.json +++ b/corpus/payloads/path-return/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Path Return Payload - Basic", - "spec_ref": "spec/09-payload-path.md", + "spec_ref": "src/09-payload-path.md", "protocol_version": 0, "description": "Tests path return payload outer structure: dest_hash(1) + src_hash(1) + encrypt-then-MAC. The encrypted inner format contains path_len + path + extra_type + extra_data.", "vectors": [ diff --git a/corpus/payloads/raw-custom/basic.json b/corpus/payloads/raw-custom/basic.json index 58fd627..f323598 100644 --- a/corpus/payloads/raw-custom/basic.json +++ b/corpus/payloads/raw-custom/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Raw Custom Payload - Basic", - "spec_ref": "spec/13-payload-raw-custom.md", + "spec_ref": "src/13-payload-raw-custom.md", "protocol_version": 0, "description": "Tests raw custom payload encoding. RAW_CUSTOM carries application-defined raw bytes.", "vectors": [ diff --git a/corpus/payloads/trace/basic.json b/corpus/payloads/trace/basic.json index 265eae8..ed23246 100644 --- a/corpus/payloads/trace/basic.json +++ b/corpus/payloads/trace/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Trace Payload - Basic", - "spec_ref": "spec/10-payload-trace.md", + "spec_ref": "src/10-payload-trace.md", "protocol_version": 0, "description": "Tests the basic 9-byte TRACE payload structure: tag(4) + auth_code(4) + flags(1).", "vectors": [ diff --git a/corpus/schema/test-vector.schema.json b/corpus/schema/test-vector.schema.json index f1b62c8..c66a38c 100644 --- a/corpus/schema/test-vector.schema.json +++ b/corpus/schema/test-vector.schema.json @@ -17,7 +17,7 @@ }, "spec_ref": { "type": "string", - "description": "Path to the relevant spec section (e.g., 'spec/01-wire-format.md')" + "description": "Path to the relevant spec section (e.g., 'src/01-wire-format.md')" }, "protocol_version": { "type": "integer", diff --git a/corpus/wire-format/framing/decode-only.json b/corpus/wire-format/framing/decode-only.json index 0d5bc85..ef6eb91 100644 --- a/corpus/wire-format/framing/decode-only.json +++ b/corpus/wire-format/framing/decode-only.json @@ -1,7 +1,7 @@ { "$schema": "../../../schema/test-vector.schema.json", "name": "Framing - Decode Only", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests one-way decode cases where the binary is valid to decode but may not be the canonical encoding a conformant encoder would produce.", "vectors": [ diff --git a/corpus/wire-format/framing/empty-payload.json b/corpus/wire-format/framing/empty-payload.json index 695672c..66bbcb6 100644 --- a/corpus/wire-format/framing/empty-payload.json +++ b/corpus/wire-format/framing/empty-payload.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Framing - Empty Payload Rejection", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Verifies that packets with zero-length payload are rejected. The reference implementation (Packet::readFrom) checks 'if (i >= len) return false' after reading header+transport+path_len+path, requiring at least 1 byte of payload.", "vectors": [ diff --git a/corpus/wire-format/framing/maximal.json b/corpus/wire-format/framing/maximal.json index 204dc71..df080b7 100644 --- a/corpus/wire-format/framing/maximal.json +++ b/corpus/wire-format/framing/maximal.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Framing - Maximum Size Packets", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests packets at or near the maximum wire size of 255 bytes (MAX_TRANS_UNIT). Verifies size calculation: total = 1 (header) + transport(0|4) + 1 (path_len) + path_bytes + payload_len.", "vectors": [ diff --git a/corpus/wire-format/framing/minimal.json b/corpus/wire-format/framing/minimal.json index 158ee17..7e542b3 100644 --- a/corpus/wire-format/framing/minimal.json +++ b/corpus/wire-format/framing/minimal.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Framing - Minimal Valid Packets", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests the smallest valid packets for each route type. A valid packet must have at least header(1) + path_len(1) + payload(1+) bytes, plus 4 bytes for transport codes if applicable.", "vectors": [ diff --git a/corpus/wire-format/header/combined.json b/corpus/wire-format/header/combined.json index 4f7eee4..365620c 100644 --- a/corpus/wire-format/header/combined.json +++ b/corpus/wire-format/header/combined.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Header - Combined Field Encoding", - "spec_ref": "spec/02-header.md", + "spec_ref": "src/02-header.md", "protocol_version": 0, "description": "Combinatorial tests of header byte encoding, exercising various combinations of version, payload type, and route type to verify correct bit packing.", "vectors": [ diff --git a/corpus/wire-format/header/payload-types.json b/corpus/wire-format/header/payload-types.json index 808daa9..6c234fa 100644 --- a/corpus/wire-format/header/payload-types.json +++ b/corpus/wire-format/header/payload-types.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Header - Payload Types", - "spec_ref": "spec/02-header.md", + "spec_ref": "src/02-header.md", "protocol_version": 0, "description": "Tests encoding of all defined payload types in the header byte. Uses FLOOD routing and minimal payloads to isolate header encoding.", "vectors": [ diff --git a/corpus/wire-format/header/route-types.json b/corpus/wire-format/header/route-types.json index 0146a50..b5d9f97 100644 --- a/corpus/wire-format/header/route-types.json +++ b/corpus/wire-format/header/route-types.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Header - Route Types", - "spec_ref": "spec/02-header.md", + "spec_ref": "src/02-header.md", "protocol_version": 0, "description": "Tests encoding and decoding of all 4 route types in the header byte, using ACK (payload_type=3) as a simple payload.", "vectors": [ diff --git a/corpus/wire-format/header/versions.json b/corpus/wire-format/header/versions.json index ebca863..7d9c8c1 100644 --- a/corpus/wire-format/header/versions.json +++ b/corpus/wire-format/header/versions.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Header - Protocol Versions", - "spec_ref": "spec/02-header.md", + "spec_ref": "src/02-header.md", "protocol_version": 0, "description": "Tests encoding of all 4 protocol version values in header bits 6-7. Uses ACK (type=3) with FLOOD routing as a simple baseline.", "vectors": [ diff --git a/corpus/wire-format/invalid/bad-path-len.json b/corpus/wire-format/invalid/bad-path-len.json index 58d5588..e701927 100644 --- a/corpus/wire-format/invalid/bad-path-len.json +++ b/corpus/wire-format/invalid/bad-path-len.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Invalid - Bad Path Length Encoding", - "spec_ref": "spec/03-path.md", + "spec_ref": "src/03-path.md", "protocol_version": 0, "description": "Tests invalid path_len values including the reserved hash_size=4 and path overflow conditions.", "vectors": [ diff --git a/corpus/wire-format/invalid/too-short.json b/corpus/wire-format/invalid/too-short.json index eceaa1b..c79f400 100644 --- a/corpus/wire-format/invalid/too-short.json +++ b/corpus/wire-format/invalid/too-short.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Invalid - Too Short Packets", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests packets that are shorter than the minimum required size for their route type.", "vectors": [ diff --git a/corpus/wire-format/invalid/truncated.json b/corpus/wire-format/invalid/truncated.json index e38dc72..01dd445 100644 --- a/corpus/wire-format/invalid/truncated.json +++ b/corpus/wire-format/invalid/truncated.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Invalid - Truncated Packets", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests packets that are truncated at various points, verifying that decoders reject them gracefully.", "vectors": [ diff --git a/corpus/wire-format/path/boundary.json b/corpus/wire-format/path/boundary.json index 55063c4..f9bfe13 100644 --- a/corpus/wire-format/path/boundary.json +++ b/corpus/wire-format/path/boundary.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Path - Boundary Conditions", - "spec_ref": "spec/03-path.md", + "spec_ref": "src/03-path.md", "protocol_version": 0, "description": "Tests boundary conditions for path encoding including maximum valid values and values just below overflow thresholds.", "vectors": [ diff --git a/corpus/wire-format/path/hash-counts.json b/corpus/wire-format/path/hash-counts.json index 620d29a..7b344b6 100644 --- a/corpus/wire-format/path/hash-counts.json +++ b/corpus/wire-format/path/hash-counts.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Path - Hash Counts", - "spec_ref": "spec/03-path.md", + "spec_ref": "src/03-path.md", "protocol_version": 0, "description": "Tests various hash count values including zero, small, and maximum values for each hash size.", "vectors": [ diff --git a/corpus/wire-format/path/hash-sizes.json b/corpus/wire-format/path/hash-sizes.json index 783759c..6394e16 100644 --- a/corpus/wire-format/path/hash-sizes.json +++ b/corpus/wire-format/path/hash-sizes.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Path - Hash Sizes", - "spec_ref": "spec/03-path.md", + "spec_ref": "src/03-path.md", "protocol_version": 0, "description": "Tests all valid hash sizes (1, 2, 3 bytes) in the path length encoding. These vectors are critical for catching implementations that treat path_len as a raw byte count.", "vectors": [ diff --git a/corpus/wire-format/transport-codes/basic.json b/corpus/wire-format/transport-codes/basic.json index a8e4ca0..4412da1 100644 --- a/corpus/wire-format/transport-codes/basic.json +++ b/corpus/wire-format/transport-codes/basic.json @@ -1,7 +1,7 @@ { "$schema": "../../schema/test-vector.schema.json", "name": "Transport Codes - Basic", - "spec_ref": "spec/01-wire-format.md", + "spec_ref": "src/01-wire-format.md", "protocol_version": 0, "description": "Tests transport code encoding with various values and route types that include/exclude transport codes.", "vectors": [ diff --git a/spec/00-overview.md b/src/00-overview.md similarity index 100% rename from spec/00-overview.md rename to src/00-overview.md diff --git a/spec/01-wire-format.md b/src/01-wire-format.md similarity index 100% rename from spec/01-wire-format.md rename to src/01-wire-format.md diff --git a/spec/02-header.md b/src/02-header.md similarity index 100% rename from spec/02-header.md rename to src/02-header.md diff --git a/spec/03-path.md b/src/03-path.md similarity index 100% rename from spec/03-path.md rename to src/03-path.md diff --git a/spec/04-payload-ack.md b/src/04-payload-ack.md similarity index 100% rename from spec/04-payload-ack.md rename to src/04-payload-ack.md diff --git a/spec/05-payload-advert.md b/src/05-payload-advert.md similarity index 100% rename from spec/05-payload-advert.md rename to src/05-payload-advert.md diff --git a/spec/06-payload-encrypted.md b/src/06-payload-encrypted.md similarity index 100% rename from spec/06-payload-encrypted.md rename to src/06-payload-encrypted.md diff --git a/spec/07-payload-anon-req.md b/src/07-payload-anon-req.md similarity index 100% rename from spec/07-payload-anon-req.md rename to src/07-payload-anon-req.md diff --git a/spec/08-payload-group.md b/src/08-payload-group.md similarity index 100% rename from spec/08-payload-group.md rename to src/08-payload-group.md diff --git a/spec/09-payload-path.md b/src/09-payload-path.md similarity index 100% rename from spec/09-payload-path.md rename to src/09-payload-path.md diff --git a/spec/10-payload-trace.md b/src/10-payload-trace.md similarity index 100% rename from spec/10-payload-trace.md rename to src/10-payload-trace.md diff --git a/spec/11-payload-multipart.md b/src/11-payload-multipart.md similarity index 100% rename from spec/11-payload-multipart.md rename to src/11-payload-multipart.md diff --git a/spec/12-payload-control.md b/src/12-payload-control.md similarity index 100% rename from spec/12-payload-control.md rename to src/12-payload-control.md diff --git a/spec/13-payload-raw-custom.md b/src/13-payload-raw-custom.md similarity index 100% rename from spec/13-payload-raw-custom.md rename to src/13-payload-raw-custom.md diff --git a/spec/14-crypto.md b/src/14-crypto.md similarity index 100% rename from spec/14-crypto.md rename to src/14-crypto.md diff --git a/spec/15-identity.md b/src/15-identity.md similarity index 100% rename from spec/15-identity.md rename to src/15-identity.md diff --git a/spec/16-packet-hash.md b/src/16-packet-hash.md similarity index 100% rename from spec/16-packet-hash.md rename to src/16-packet-hash.md diff --git a/spec/17-routing.md b/src/17-routing.md similarity index 100% rename from spec/17-routing.md rename to src/17-routing.md diff --git a/spec/18-companion-protocol.md b/src/18-companion-protocol.md similarity index 100% rename from spec/18-companion-protocol.md rename to src/18-companion-protocol.md diff --git a/spec/19-kiss-protocol.md b/src/19-kiss-protocol.md similarity index 100% rename from spec/19-kiss-protocol.md rename to src/19-kiss-protocol.md diff --git a/spec/20-bridge-protocol.md b/src/20-bridge-protocol.md similarity index 100% rename from spec/20-bridge-protocol.md rename to src/20-bridge-protocol.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md new file mode 100644 index 0000000..5df1005 --- /dev/null +++ b/src/SUMMARY.md @@ -0,0 +1,35 @@ +# Summary + +[Introduction](00-overview.md) + +# Wire Format + +- [Wire Format](01-wire-format.md) +- [Header](02-header.md) +- [Path](03-path.md) + +# Payloads + +- [ACK](04-payload-ack.md) +- [Advertisement](05-payload-advert.md) +- [Encrypted (REQ / RESPONSE / TXT_MSG)](06-payload-encrypted.md) +- [Anonymous Request](07-payload-anon-req.md) +- [Group (GRP_TXT / GRP_DATA)](08-payload-group.md) +- [Path Return](09-payload-path.md) +- [Trace](10-payload-trace.md) +- [Multipart](11-payload-multipart.md) +- [Control](12-payload-control.md) +- [Raw Custom](13-payload-raw-custom.md) + +# Cryptography & Identity + +- [Cryptography](14-crypto.md) +- [Identity](15-identity.md) +- [Packet Hash](16-packet-hash.md) + +# Routing & Higher-Layer Protocols + +- [Routing](17-routing.md) +- [Companion Protocol](18-companion-protocol.md) +- [KISS Modem Protocol](19-kiss-protocol.md) +- [Bridge Protocol](20-bridge-protocol.md)