@@ -11,8 +11,9 @@ algorithm.
1111** Phases 1, 2, 4, 5, 7 are COMPLETE; Phase 3 is done except the v2 per-datagram MAC.** Every 🔴
1212item and every cleanly-testable or minor 🟠/🟡/📄 item has landed. What remains is the larger
1313reliability work: ** 3.2-v2** (a per-datagram MAC — the cryptographic upgrade over the v1
14- source-address check) and ** Phase 6** (6.1 notification anti-entropy, 6.2 chain/datagram size
15- bounds, 6.3 peer liveness, 6.4 IPv6, 6.5 log timestamps). 1.6 stays deferred (mooted by 1.1).
14+ source-address check) and the ** feature-scale Phase 6 items** (6.1 notification anti-entropy,
15+ 6.2 chain/datagram size bounds, 6.3 peer liveness) — each deserving its own sub-plan. 6.4 (IPv6)
16+ and 6.5 (log timestamps) are done. 1.6 stays deferred (mooted by 1.1).
1617
1718## Why now — the threat-model shift
1819
@@ -272,6 +273,9 @@ on-disk state stay consistent; a test drives a >2× single-record write and asse
272273
273274## Phase 6 — Reliability & scale 🟡
274275
276+ ** Status: 6.4 + 6.5 DONE.** The remaining items (6.1 anti-entropy, 6.2 chain/datagram size bounds,
277+ 6.3 peer liveness) are feature-scale and each deserves its own sub-plan like 2.4 did.
278+
275279- [ ] ** 6.1 — Reliable clock-notification delivery.** Reverse edges (the upper-bound walkability) are
276280 learned only from single, change-only UDP notifications ([ node.cpp:102] ( ../../src/core/node.cpp#L102 ) );
277281 a lost datagram loses that reverse edge permanently. Add periodic re-advertisement / anti-entropy of
@@ -285,11 +289,14 @@ on-disk state stay consistent; a test drives a >2× single-record write and asse
285289- [ ] ** 6.3 — Peer liveness and removal.** Implement ` peer rm ` / ` peer ping ` ; expire dead peers so a
286290 years-long node's overlay does not rot into a graveyard of unreachable addresses it keeps notifying.
287291 (This is also on the paper-vs-implementation "not implemented" list — coordinate.)
288- - [ ] ** 6.4 — IPv6 transport.** ` set_peer ` is ` inet_pton(AF_INET, …) ` only
289- ([ transport.hpp:59] ( ../../src/adapters/os/transport.hpp#L59 ) ); add an IPv6/dual-stack path for
290- real internet (IPv6-only ISPs, CGNAT).
291- - [ ] ** 6.5 — Log timestamps + verbosity.** ` LogTelemetry ` emits no wall-clock time and floods
292- discovery lifecycle lines unconditionally; add timestamps and gate discovery logging on verbosity.
292+ - [x] ** 6.4 — IPv6 transport.** DONE: ` UdpTransport ` opens a dual-stack ` AF_INET6 ` socket
293+ (` IPV6_V6ONLY ` off), so one socket serves IPv4-only, IPv6-only, and mixed networks. ` set_peer `
294+ accepts an IPv6 literal or an IPv4 literal (mapped to ` ::ffff:a.b.c.d ` ); the source-address check
295+ compares the full 16-byte v6 address. Test: an IPv6 ` ::1 ` round-trip; IPv4 (127.0.0.1) tests and
296+ all acceptance suites still pass via IPv4-mapping.
297+ - [x] ** 6.5 — Log timestamps.** DONE: ` LogTelemetry ` prefixes each line with a wall-clock timestamp
298+ (` YYYY-MM-DD HH:MM:SS.mmm ` ). (Verbosity gating of discovery lifecycle lines left as a minor
299+ follow-up — ` verbose_ ` already gates the noisiest per-clock-event line.)
293300
294301---
295302
0 commit comments