Files
fips/docs/design/diagrams/dynamics-partition.svg
Johnathan Corgan 00e26765bd Design documentation illustration and review pass
Wire format diagrams:
- Add 24 SVG diagrams covering every FMP and FSP wire format: common
  prefix, established frame headers, Noise IK handshake messages,
  handshake flow, TreeAnnounce, AncestryEntry, FilterAnnounce,
  LookupRequest/Response, SessionDatagram, Disconnect, SenderReport,
  ReceiverReport, FSP complete message, SessionSetup/Ack/Msg3,
  PathMtuNotification, CoordsRequired, PathBroken, and MtuExceeded
- Replace ASCII art in fips-wire-formats.md with SVG references
- Apply text edits to fips-mesh-layer.md, fips-mesh-operation.md,
  fips-transport-layer.md, and fips-ipv6-adapter.md

Spanning tree dynamics:
- Add 12 topology SVG diagrams: node join (overview + 3-panel steps),
  three-node convergence (4-panel), link addition with depth labels,
  link removal, partition formation, and 6 real-world example diagrams
  (office, mixed-link, two-site WAN topologies)
- Rewrite all code blocks to narrative prose with diagram references
- Add inline prior art attributions distinguishing Yggdrasil-derived
  concepts from FIPS-novel contributions
- Add 3 new references (De Couto ETX, IEEE 802.1D, RFC 2328 OSPF) and
  Prior Art summary
- Remove outdated sections: indirect partition note, integration test
  gaps, DHT-based lookup reference
- Change "must elect a new root" to "must rediscover its new root"

Spanning tree design review (fips-spanning-tree.md):
- Rename "Root Election" to "Root Discovery" across docs
- Add "What Is a Spanning Tree?" introductory section
- Add parent selection intro explaining self-organization role
- Fix tree distance example: 4 hops, not 2
- Clarify timestamp field as advisory only
- Remove unimplemented ROOT_TIMEOUT and TREE_ENTRY_TTL from timing
  parameters and implementation status tables

Bloom filter design review (fips-bloom-filters.md):
- Add "What Is a Bloom Filter?" intro section
- Rewrite Purpose section to frame filters as routing path identification
- Correct FPR analysis (old values were 3-50x overstated)
- Add Filter Occupancy Model based on network size and tree position
- Fix filter expiration to describe actual MMP-based cleanup
- Combine Scale Considerations with Size Classes after Wire Format
- Fix stale FPR values in src/bloom/mod.rs comments

Session layer review (fips-session-layer.md):
- Add inline prior art attributions: Noise Protocol Framework, WireGuard,
  DTLS (RFC 6347), IKEv2 (RFC 7296), RFC 1191 PMTUD, Yggdrasil, NIP-44
- Replace warmup state machine ASCII art with SVG diagram
- Convert CoordsWarmup wire format code block to prose
- Add External References section with full citations

Level 5 implementation doc cleanup:
- Delete fips-software-architecture.md (redundant with protocol layer docs)
- Delete fips-state-machines.md (Rust tutorial, not protocol design)
- Add fipsctl command reference to README.md
- Update cross-references in fips-intro.md, docs/design/README.md,
  fips-transport-layer.md, fips-configuration.md

Fixes:
- Correct fd::/8 to fd00::/8 in fips-session-layer.md,
  fips-identity-derivation.svg, and fips-node-architecture.svg
- Fix config example MTU: 1197 → 1472 in fips-configuration.md

File organization:
- Move all SVG diagrams into docs/design/diagrams/ subdirectory
- Update all diagram references to use new paths
2026-02-24 17:32:37 +00:00

96 lines
4.7 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 370" font-family="monospace" font-size="13">
<!-- Background -->
<rect width="700" height="370" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="350" y="28" fill="#e0e0e0" text-anchor="middle" font-size="15" font-weight="bold">Network Partition &#8212; Link C&#8596;D Fails</text>
<!-- Section divider between Before and After -->
<line x1="310" y1="42" x2="310" y2="360" stroke="#404060" stroke-width="1" stroke-dasharray="6,4"/>
<!-- ======================== BEFORE (left side) ======================== -->
<text x="155" y="55" fill="#909090" text-anchor="middle" font-size="14">Before</text>
<!-- Node A (root) at y=100 -->
<text x="155" y="76" fill="#d0a040" text-anchor="middle" font-size="10">&#9733; root</text>
<circle cx="155" cy="100" r="20" fill="#1a1a2e" stroke="#d0a040" stroke-width="2.5"/>
<text x="155" y="105" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">A</text>
<!-- Link A&#8594;B -->
<line x1="155" y1="120" x2="155" y2="140" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node B at y=160 -->
<circle cx="155" cy="160" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="155" y="165" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">B</text>
<!-- Link B&#8594;C -->
<line x1="155" y1="180" x2="155" y2="200" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node C at y=220 -->
<circle cx="155" cy="220" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="155" y="225" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">C</text>
<!-- Link C&#8594;D (failing &#8212; dashed) -->
<line x1="155" y1="240" x2="155" y2="260" stroke="#d0a040" stroke-width="2.5" stroke-dasharray="4,3" opacity="0.5"/>
<!-- Red X on C&#8596;D link -->
<line x1="143" y1="243" x2="167" y2="259" stroke="#c04040" stroke-width="3" stroke-linecap="round"/>
<line x1="167" y1="243" x2="143" y2="259" stroke="#c04040" stroke-width="3" stroke-linecap="round"/>
<!-- Node D at y=280 -->
<circle cx="155" cy="280" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="155" y="285" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">D</text>
<!-- Link D&#8594;E -->
<line x1="155" y1="300" x2="155" y2="320" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node E at y=340 -->
<circle cx="155" cy="340" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="155" y="345" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">E</text>
<!-- ======================== AFTER (right side) ======================== -->
<text x="505" y="55" fill="#909090" text-anchor="middle" font-size="14">After</text>
<!-- Partition labels -->
<text x="415" y="80" fill="#909090" text-anchor="middle" font-size="11">Partition 1</text>
<text x="595" y="80" fill="#909090" text-anchor="middle" font-size="11">Partition 2</text>
<!-- Partition separator -->
<line x1="505" y1="88" x2="505" y2="360" stroke="#404060" stroke-width="1" stroke-dasharray="6,4"/>
<!-- === Partition 1: A &#8592; B &#8592; C === -->
<!-- Node A (root) at y=130 -->
<text x="415" y="106" fill="#d0a040" text-anchor="middle" font-size="10">&#9733; root</text>
<circle cx="415" cy="130" r="20" fill="#1a1a2e" stroke="#d0a040" stroke-width="2.5"/>
<text x="415" y="135" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">A</text>
<!-- Link A&#8594;B -->
<line x1="415" y1="150" x2="415" y2="175" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node B at y=195 -->
<circle cx="415" cy="195" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="415" y="200" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">B</text>
<!-- Link B&#8594;C -->
<line x1="415" y1="215" x2="415" y2="240" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node C at y=260 -->
<circle cx="415" cy="260" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="415" y="265" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">C</text>
<!-- === Partition 2: D &#8592; E === -->
<!-- Node D (new root) at y=130 -->
<text x="595" y="106" fill="#d0a040" text-anchor="middle" font-size="10">&#9733; root</text>
<circle cx="595" cy="130" r="20" fill="#1a1a2e" stroke="#d0a040" stroke-width="2.5"/>
<text x="595" y="135" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">D</text>
<!-- Link D&#8594;E -->
<line x1="595" y1="150" x2="595" y2="175" stroke="#d0a040" stroke-width="2.5"/>
<!-- Node E at y=195 -->
<circle cx="595" cy="195" r="20" fill="#1a1a2e" stroke="#e0e0e0" stroke-width="2"/>
<text x="595" y="200" fill="#e0e0e0" text-anchor="middle" font-weight="bold" font-size="14">E</text>
</svg>