From 9d92cfeab4ea552e8c3f662fcd2cb1a3b8eee012 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Thu, 23 Jul 2026 15:47:28 +0000 Subject: [PATCH] Correct three scenario headers that documented conclusions since disproved congestion-stress said the transport drop-detection path "is exercised by nothing". Widening the scan beyond this one scenario finds it firing in six others, so the path is live and what is dead is this scenario's ability to provoke it. Records the arithmetic that explains why: at the 1 Mbps cap the receive queue needs tens of milliseconds of reader stall to overflow, and the ingress policer discards the same traffic a layer below the socket. mixed-technology said the implementation does not do what its criteria say. It does. The criteria were conditioned on a tree rooted at n01 while the mesh rooted at n09, under which n08's choice was settled by depth before link technology could matter. The archived parent distributions are relabelled as describing the old root so nobody calibrates against them. cost-reeval now records why it had no assertion about its own subject: its designated subject was the root, so the parent switch it exists to observe could not occur. The historical logs show the switch on n04 in 13 of 14 runs when the root still wandered, and only on n01 in the five runs before the fix. Each header now names what remains to be done and where it is tracked, rather than leaving a disproved conclusion in place for the next reader to inherit. --- testing/chaos/scenarios/cost-reeval.yaml | 22 ++++++++++ testing/chaos/scenarios/mixed-technology.yaml | 42 +++++++++++-------- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/testing/chaos/scenarios/cost-reeval.yaml b/testing/chaos/scenarios/cost-reeval.yaml index 559966d..51d2f08 100644 --- a/testing/chaos/scenarios/cost-reeval.yaml +++ b/testing/chaos/scenarios/cost-reeval.yaml @@ -32,6 +32,28 @@ # re-evaluation" (trigger=periodic). If mutation never creates enough # asymmetry in a particular seed, the test still validates that periodic # re-eval runs without interference. +# +# THIS SCENARIO COULD NOT EXERCISE ITS SUBJECT AT ALL until 2026-07-23, and +# the reason is worth keeping because nothing about it was visible from here. +# The mesh roots at the numerically smallest NodeAddr, a hash of the node's +# key (src/tree/state.rs:363-390), and that turned out to be **n04** — this +# scenario's own designated test subject. A root has no parent, and +# evaluate_parent returns early for the smallest address, so the parent switch +# described above could never happen. The tree was inverted: n04 at depth 0, +# n01 a leaf at depth 2, in all five recent runs. +# +# The archived logs show exactly that shape. The live info! string above +# appears in 14 of 105 historical runs, on n04 in 13 of them, back when keys +# were regenerated per run and the root wandered. In the five runs before this +# fix it appears only on **n01** — the node that actually had a parent choice. +# +# `topology.pin_root` (default true) now assigns identities in NodeAddr order +# so n01 is root and n04 is the depth-1 subject this file describes. +# +# STILL TO DO: this scenario has no assertion about its own subject, and that +# was a consequence rather than an omission — none could have passed. With the +# subject now reachable, decide whether the switch is reliable enough across +# seeds to assert, and encode it if so. Tracked in ISSUE-2026-0085. scenario: name: "cost-reeval" diff --git a/testing/chaos/scenarios/mixed-technology.yaml b/testing/chaos/scenarios/mixed-technology.yaml index 9e52923..d6cb1f3 100644 --- a/testing/chaos/scenarios/mixed-technology.yaml +++ b/testing/chaos/scenarios/mixed-technology.yaml @@ -31,25 +31,33 @@ # # Netem mutation shifts fiber-only links between normal and degraded. # -# NEITHER TEST SUBJECT IS ASSERTED, because the implementation does not do -# what the two lines above say. Across the five archived runs that carry a -# status.txt and are therefore provably completed, n06's parent is n10 in -# three and n03 in two, and n08's is n04 in four and n03 in one. Encoding -# either as written would red the scenario most runs; encoding what it -# actually does would pin behaviour nobody specified and would silently -# bless it. +# NEITHER TEST SUBJECT IS ASSERTED YET, and the reason has been found and +# fixed at the root rather than papered over here. # -# So this is an open question rather than a missing assertion: either -# cost-based selection is not preferring fiber here, or the criteria were -# written for a topology this file no longer has. n06 taking n10 is the -# more interesting half — n10 reaches n06 by fiber, so the choice may be -# defensible and the comment simply stale. It needs someone to work out -# which, and until then this scenario proves nothing about parent choice. +# The diagram above puts n01 at the top, and both test subjects only make +# sense in a tree rooted there. The mesh does not root by topology: it roots +# at the numerically smallest NodeAddr (src/tree/state.rs:363-390), which is a +# hash of the node's key and bears no relation to the numbering. Until +# 2026-07-23 this scenario rooted at **n09** in every run, which put both +# criteria out of reach. Under that root n08's two candidates were not at +# equal depth, so its choice was settled by depth long before link technology +# could matter, and n08 taking n04 was CORRECT behaviour that these comments +# made look like a defect. # -# That leaves this scenario asserting nothing about its own subject. The -# baseline block further down holds it to forming a tree and carrying -# traffic, which is a floor and not a substitute: nothing here checks that -# the tree it forms is the one these comments describe. +# What the archive shows, for anyone re-deriving this later: across the five +# runs under the old root, n06's parent is n10 in three and n03 in two, and +# n08's is n04 in four and n03 in one. Those numbers describe a tree rooted at +# n09 and must not be used to calibrate anything now. +# +# `topology.pin_root` (default true) now assigns identities in NodeAddr order, +# so n01 holds the smallest and the diagram describes the tree that forms. +# Both criteria should therefore become reachable and assertable. +# +# STILL TO DO: run this under the pinned root, confirm n06 and n08 both take +# n03, and encode `tree_parents` for them. Until then the baseline block below +# is a floor and not a substitute — it holds the mesh to forming a tree and +# carrying traffic, and nothing here yet checks that the tree is the one these +# comments describe. Tracked in ISSUE-2026-0085. scenario: name: "mixed-technology"