- Rewrote the remaining em dashes outside docs/reviews/ (preserved as historical record, matching the alktty precedent): tests/ (313), fuzz/ (34 plus one shell comment), tasks/ (671 plus 12 kept in fences), docs/research + sdd_process + plans (525 plus 25 in fences), docs/architecture/overview.md fence labels (13), README, CHANGELOG, AGENTS.md, fuzz/README.md (176), and the .opencode/agents prompts (110) - Rewrote fenced content too: ASCII tree and module-map label separators, Rust snippet comments, and template placeholders; wire data, JSON/BAST examples, and transcripts survive verbatim - Rewrote 6 assert/expect message literals in tests/ and 2 format strings in fuzz/shared/src; no test data changed - Added Project Convention 18: no em dashes in prose (doc comments, markdown including docs/ and tasks/, agent prompts, commit messages); fence content rule, en-dash clause rule, and the no-spaced-hyphen prohibition follow alktty's convention 15 Follows6b20924(src doc comments) andcd0afe0(docs/architecture). Verification: cargo test (141 pass); cargo clippy --all-targets -D warnings; cargo fmt --check; cargo doc --no-deps; wasm check and clippy for wasm32-unknown-unknown with -D warnings; em dash grep over the repo returns matches only in docs/reviews/
5.6 KiB
id, name, status, depends_on, scope, risk, impact, level, tags
| id | name | status | depends_on | scope | risk | impact | level | tags | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tunnels/review-002-doc-sync | D-1 + D-2. Sync wire.md's schema bounds + ADR-007's oneOf→if/then + the establisher-time→registry-gate sentence | completed | narrow | low | project | implementation |
|
Description
Two doc-only review 002 findings
(docs/reviews/002-graduation-implementation-review.md §D-1, §D-2)
batched: the shipped code is the wire-stable side and is correct; the
docs lag it. This is wire-contract-adjacent, so do it before the first
consumer (alksocks) ships.
D-1: wire.md omits the port bounds the shipped schema enforces
The shipped direct-op and forwarded-op schemas pin
"port": {"minimum": 0, "maximum": 65535} plus
"additionalProperties": false on the target/peer objects
(src/params.rs:208-222, 453-467), and listen with
"minimum": 1 (src/params.rs:442). wire.md (the normative WHAT)
says only port: <u16> and "integer > 0" in prose; it does not
record the bounds as schema properties, nor the
additionalProperties: false gate that makes cross-shape targets
fail the registry's INVALID_INPUT class BEFORE the establisher (the
behavior malformed_target_is_schema_class_and_leaves_no_channel
pins on the wire). The BAST doc (bast.md) covers only the
data-plane codec, not the params schemas; no second source records
these bounds.
Fix: record the exact schema constraints in wire.md's §The Direct Op
and §The Forwarded Op (the port bounds, additionalProperties: false per branch, the listen minimum: 1, and the gate-ordering
sentence). The risk addressed: a future consumer implementing from
wire.md alone accepting a shape the reference producer rejects (or
vice versa).
D-2: ADR-007's oneOf wording is stale; the "validated at establisher time" sentence contradicts the shipped design
- ADR-007 §2 (line ~82) says "the target sub-schema is per-substrate
(
oneOfon the siblingsubstratevalue, validated at establisher time; see Consequences)". The shipped schema (and wire.md §The Forwarded Op, and the unit tests pinning it) useallOfof twoif/thenbranches instead.oneOfof full-target-schemas would actually be WRONG here (aunix-substrate open would need to fail thetcpbranch, so plainoneOfon sibling-conditioned subschemas is awkward;if/thencomposes correctly with the baseproperties/required). The code is right; the ADR's one-word schema-structure reference is stale. - The same line's "validated at establisher time" contradicts the
shipped design and wire.md's own text: the test
(
malformed_target_is_schema_class_and_leaves_no_channel) proves the REGISTRY gate fires first (the establisher's dial never runs). The ADR/wire.md sentence should read "validated registry-side (the schema gate), before the establisher; re-checked by serde at establisher time as the backstop", which is exactly whatsrc/params.rs's doc comments already say.
Fix: a one-line ADR-007 erratum (or an amendment note; the house
style has precedent: ADR-008 carries numbered amendments) replacing
oneOf with the shipped allOf-of-if/then structure, plus the
corrected gate-ordering sentence; mirror the same
gate-ordering correction in wire.md §The Direct Op's
"validated at establisher time" sentence if it says the same thing
(verify both files while in there). No code changes.
Acceptance Criteria
- wire.md records the shipped schema bounds (
portmin/max,additionalProperties: false,listenminimum: 1) in both op sections - ADR-007 §2 corrected:
oneOf→ the shippedallOf/if/thenstructure (erratum or amendment, house style) - The "validated at establisher time" sentence corrected to "registry-side schema gate first; serde backstop at establisher time" in ADR-007 (and wire.md if it repeats it)
cargo doc --no-depsclean (docs changed, which trips the verification battery's doc gate)
References
- docs/reviews/002-graduation-implementation-review.md §D-1, §D-2
- docs/architecture/wire.md (§The Direct Op, §The Forwarded Op)
- docs/architecture/decisions/007-direct-open-op.md (§2, line ~82)
- src/params.rs:208-222, 442, 453-467 (the shipped schemas the docs must match)
Notes
Agent fills during implementation.
Implementation Notes (2026-09-20)
- D-1 (wire.md §The Direct Op + §The Forwarded Op): both sections
now record the exact shipped schema constraints: the per-branch
target/peer objects (
type: object,additionalProperties: false,portboundsminimum: 0/maximum: 65535, theunixpathbranch) and the forwardedlistenminimum: 1+ its serde-pin backstop, plus the gate-ordering sentence (registry-side schema gate before the establisher, serde backstop) and the cross-shape-INVALID_INPUT behavior the integration test pins. No second source existed for these bounds (bast.md covers only the data-plane codec); wire.md now is the complete record. - D-2 (ADR-007 §2): the stale sentence corrected in place
(
oneOf→ the shippedallOfof twoif/thenbranches; "validated at establisher time" → registry-side gate + serde backstop), plus a dated Erratum section documenting whyoneOfwould actually be wrong (exactly-one-branch-matches does not compose with the baseproperties/required) and citing the pinning test. wire.md §The Direct Op's mirrored sentence corrected in the same edit. ADR-008 was checked and needs no change (it never stated theoneOf/establisher-time claim). - Verification:
cargo doc --no-depsclean (0 warnings);cargo fmt --checkclean.