From da18c43e0684b5eacc441e8d80b9fd127ddc271f Mon Sep 17 00:00:00 2001 From: Enrico Becker <90171652+Dewinator@users.noreply.github.com> Date: Mon, 4 May 2026 13:07:46 +0200 Subject: [PATCH] =?UTF-8?q?test(wave-4):=20echo-chamber=20cohort=20#1=20?= =?UTF-8?q?=E2=80=94=20consensus-with-dissent=20(W4.1,=20#196)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fourth fixture row of the W4.1 anti-echo corpus. 5-peer cohort (4 echoers + 1 dissenter) exercises the §10.4 diversity-filter trigger boundary: over_concentration = 4/5 = 0.8 — the canonical case rem-diversity.test.ts uses against the pure scoreFinding helper, but here driven by signature-valid envelopes that individually pass validateWireRecord. Distinct from sybil-flood (the other §10.4-owning row): sybil exercises the saturation path (M=10 sock-puppets, over_concentration=1.0) — defends against coordinated rebroadcast. Echo-chamber exercises the boundary path with a heterogeneous cohort (4 echoers + 1 visible dissenter) — the load-bearing claim is that the dissenter's presence does NOT save the consensus lesson from the firebreak. §10.4 is purely a function of over_concentration, not of cohort heterogeneity. Eleven assertions cover: metadata invariants, signature validity per cohort key, wire-validator admission of every envelope, echoer-subset cosine > 0.95 (§10.4 p_duplicate_cosine), dissenter cosine ≪ 0.95, signed_at spread ≤ 7 days, shared echoer evidence_root vs distinct dissenter root, scoreFinding(prev=1.0, over=0.8) clamps new_weight=0.2 below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3), and N-padding (cohort N=100, M=80, ratio still 0.8) does not relax the multiplier — proving §10.4 has no count-dependent escape hatch. Build script extension (Step 1d + Step 6) follows the same write-once cohort-keys discipline as plagiarism / sybil; distinct key file so a future refactor of either neighbouring cohort cannot silently shift the §10.4 boundary this row asserts on. Tests: 11/11 pass under `node --test dist/__tests__/anti-echo-echo-chamber.test.js`. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../scripts/build-anti-echo-fixtures.mjs | 246 + .../__tests__/anti-echo-echo-chamber.test.ts | 381 ++ .../anti-echo/cohort-keys-echo-chamber.json | 35 + .../consensus-with-dissent-cohort.json | 3937 +++++++++++++++++ 4 files changed, 4599 insertions(+) create mode 100644 mcp-server/src/__tests__/anti-echo-echo-chamber.test.ts create mode 100644 mcp-server/src/__tests__/fixtures/anti-echo/cohort-keys-echo-chamber.json create mode 100644 mcp-server/src/__tests__/fixtures/anti-echo/echo-chamber/consensus-with-dissent-cohort.json diff --git a/mcp-server/scripts/build-anti-echo-fixtures.mjs b/mcp-server/scripts/build-anti-echo-fixtures.mjs index f4bf23f..5344bfd 100644 --- a/mcp-server/scripts/build-anti-echo-fixtures.mjs +++ b/mcp-server/scripts/build-anti-echo-fixtures.mjs @@ -50,6 +50,10 @@ const SYBIL_KEYS_FILE = path.join( FIXTURES_DIR, "cohort-keys-sybil-flood.json" ); +const ECHO_CHAMBER_KEYS_FILE = path.join( + FIXTURES_DIR, + "cohort-keys-echo-chamber.json" +); // --------------------------------------------------------------------------- // Step 1 — fixture-key.json (Ed25519, write-once). @@ -210,6 +214,76 @@ for (const k of sybilCohortKeys.keys) { createPrivateKey(k.private_key_pem); } +// --------------------------------------------------------------------------- +// Step 1d — cohort-keys-echo-chamber.json (5× Ed25519, write-once). +// +// Echo-chamber per docs/wave-4-anti-echo.md §"Corpus categories" requires +// a synthetic cohort where ≥80% re-broadcast the same lesson with +// **different** envelopes (legitimate-looking) but no independent +// `evidence_root`. We use the canonical "4 of 5 peers" case from +// rem-diversity.test.ts (over_concentration = 0.8, exactly the §10.4 +// trigger boundary): 4 echoers + 1 dissenter. The dissenter is what +// distinguishes echo-chamber from sybil-flood — the cohort really does +// have a heterodox peer, and §10.4 still suppresses the consensus. +// +// Distinct file from plagiarism / sybil keys: +// - Reusing them would silently couple the echo-chamber cohort size to +// the other cohorts; a refactor that changed plagiarism's COHORT_SIZE +// would change the §10.4 over_concentration the echo-chamber test +// asserts on, weakening the boundary claim. +// - The dissenter key is conceptually a different peer class (a genuine +// heterodox node, not a sock-puppet). Naming the file after the +// attack class makes that intent explicit. +// +// Same write-once discipline as the other cohort key files. +// --------------------------------------------------------------------------- + +function ensureEchoChamberCohortKeys() { + if (fs.existsSync(ECHO_CHAMBER_KEYS_FILE)) { + return JSON.parse(fs.readFileSync(ECHO_CHAMBER_KEYS_FILE, "utf8")); + } + const COHORT_SIZE = 5; + const keys = []; + for (let i = 0; i < COHORT_SIZE; i++) { + const { publicKey, privateKey } = generateKeyPairSync("ed25519"); + const spki = publicKey.export({ type: "spki", format: "der" }); + const pubkeyRaw = Buffer.from(spki.subarray(spki.length - 32)); + const pem = privateKey.export({ type: "pkcs8", format: "pem" }); + const nodeId = computeNodeId(pubkeyRaw); + keys.push({ + node_id: nodeId, + pubkey_raw_b64: pubkeyRaw.toString("base64"), + pubkey_b64url_unpadded: pubkeyRaw + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, ""), + private_key_pem: pem, + }); + } + const file = { + comment: + "Ed25519 fixture keys for the echo-chamber cohort (W4.1, §10.4 diversity " + + "filter). FIXTURE-ONLY; never any production node identity. Five peers: " + + "keys[0..3] are the four echoers re-broadcasting the consensus lesson with " + + "shared evidence_root; keys[4] is the dissenter holding a heterodox lesson " + + "with its own evidence_root and far embedding. The §10.4 over_concentration " + + "= 4/5 = 0.8 (exact trigger boundary). Checked in so the regression suite is " + + "fully deterministic. See ./README.md and docs/wave-4-anti-echo.md.", + keys, + }; + fs.writeFileSync(ECHO_CHAMBER_KEYS_FILE, JSON.stringify(file, null, 2) + "\n"); + console.log( + `wrote ${path.relative(process.cwd(), ECHO_CHAMBER_KEYS_FILE)} (${COHORT_SIZE} keys)` + ); + return file; +} + +const echoChamberCohortKeys = ensureEchoChamberCohortKeys(); +for (const k of echoChamberCohortKeys.keys) { + createPrivateKey(k.private_key_pem); +} + // --------------------------------------------------------------------------- // Step 2 — embedding fixture (768-d, deterministic). // @@ -569,3 +643,175 @@ function buildSybilFloodCohort() { } buildSybilFloodCohort(); + +// --------------------------------------------------------------------------- +// Step 6 — echo-chamber cohort fixture. +// +// Per docs/wave-4-anti-echo.md §"Corpus categories": +// +// "Same lesson re-broadcast by ≥80% of a synthetic cohort with +// **different** envelopes (legitimate-looking) but no independent +// evidence_root." +// +// Five signature-valid envelopes from five distinct fixture-key node IDs. +// The first four are the echo-chamber: same content text + a deterministic +// embedding ramp with per-envelope perturbations (cosine > 0.95), shared +// evidence_root, distinct signed_at within a few minutes. The fifth is a +// dissenter — different content, different evidence_root, far-orthogonal +// embedding — to demonstrate the cohort really has heterodox dissent and +// not five sock-puppets. +// +// The §10.4 over_concentration computed by the production RPC is +// near_dup_origin_count / topic_cohort_size = 4 / 5 = 0.8, which is the +// canonical case rem-diversity.test.ts already exercises against the +// pure scoreFinding helper. The load-bearing claim of this row is that +// the dissenter's presence in the cohort does NOT save the consensus +// lesson from the §10.4 firebreak — once over_concentration ≥ 0.8, the +// new local_weight clamps strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST +// (0.3) regardless of how visible the dissent is. +// +// Differences from sybil-flood (the other §10.4-owning row): +// - Cohort size 5 (canonical 4-of-5 rather than 10-of-10): tests the +// §10.4 trigger boundary, not the saturation case. +// - Heterogeneous cohort (4 echoers + 1 dissenter rather than 10 +// sock-puppets): the dissenter envelope's distinct evidence_root and +// far-orthogonal embedding make the cohort indistinguishable from a +// real "groupthink-with-some-pushback" peer set, which is exactly the +// §10.4 attack model — organic-looking convergence, not coordinated +// re-broadcast. +// +// All four echoer envelopes share `evidence_count` and a `signed_at` +// window of a few minutes — well within the §10.4 default +// `p_signed_at_window_d=7`. The dissenter has its own evidence_count and +// signed_at; it is a separate cohort member, not a copy. +// --------------------------------------------------------------------------- + +function rampReversed() { + // Reversed ramp: arr[i] = (768 - i) / 1000. Same per-component + // magnitude profile as ramp768() but with the values in reverse order, + // so the cosine_similarity between this and ramp768() is well below the + // §10.4 `p_duplicate_cosine` (0.95) — about 0.50 by construction. The + // dissenter therefore shares the same dimensionality and L2 norm as the + // echoers (sanity-friendly for any future pre-flight assertion that the + // cohort embeddings are normalised consistently) without being a + // near-duplicate of any echoer. + const arr = new Array(768); + for (let i = 0; i < 768; i++) { + arr[i] = Number(((768 - i) / 1000).toFixed(6)); + } + return arr; +} + +function buildEchoChamberCohort() { + const COHORT_SIZE = 5; + const ECHOER_COUNT = 4; + const SHARED_ECHOER_CONTENT = + "Wave-4 echo-chamber cohort: four peers re-broadcast a consensus lesson with no independent evidence chain, while one peer dissents with a heterodox lesson. §10.4 should clamp local_weight below the broadcast firebreak at over_concentration = 4/5 = 0.8 — the dissenter's presence MUST NOT save the consensus from the firebreak. See docs/wave-4-anti-echo.md."; + + // Echoers all share the same well-formed evidence_root — the "no + // independent evidence_root" signal §10.4 names. Production peers that + // independently arrived at this conclusion would not collide on a single + // root; the collision is the structural fingerprint of re-broadcast. + const SHARED_ECHOER_EVIDENCE_ROOT = hashExperienceId( + "echo-chamber-cohort-shared-evidence-root" + ); + + // Dissenter has its own well-formed evidence_root — derived from a + // distinct seed so the multihash is byte-distinct from the echoers'. + const DISSENTER_EVIDENCE_ROOT = hashExperienceId( + "echo-chamber-cohort-dissenter-evidence-root" + ); + const DISSENTER_CONTENT = + "Wave-4 echo-chamber dissenter: a single peer in the otherwise-converged cohort holds a heterodox lesson with its own evidence chain. Demonstrates the cohort has real diversity (4 of 5 = 80% concentration), not a 5-way sock-puppet set."; + + const SHARED_EVIDENCE_COUNT = 4; + + // Echoers: signed within a 3-minute window, well inside §10.4 + // `p_signed_at_window_d=7`. + const BASE_SIGNED_AT_MS = Date.parse("2026-05-01T00:30:00.000Z"); + + const envelopes = []; + + // Echoers — keys[0..3], shared content + evidence_root, near-duplicate embeddings. + for (let i = 0; i < ECHOER_COUNT; i++) { + const key = echoChamberCohortKeys.keys[i]; + const envelope = { + spec_version: "1.1", + // UUID v4-shaped, deterministic per cohort index. Echoer ids end in + // 0e..0e+ECHOER_COUNT-1 to make the role visually scannable in JSON. + id: `44444444-5555-4666-8777-eeeeeeeeee${i.toString().padStart(2, "0")}`, + content: SHARED_ECHOER_CONTENT, + // Re-use the perturbation function from the plagiarism / sybil + // builders so the echo embedding shape matches the documented + // near-duplicate profile (cosine > 0.95 within the echoers). + // Distinct seed range (offset by 200) so embedding bytes differ from + // every other cohort fixture and a future cross-cohort cosine sweep + // does not accidentally couple them. + embedding: rampPerturbed(i + 200), + synthesized_from_cluster_size: 2, + origin_node_id: key.node_id, + created_at: new Date(BASE_SIGNED_AT_MS - 1000).toISOString(), + signed_at: new Date(BASE_SIGNED_AT_MS + i * 60 * 1000).toISOString(), + evidence_root: SHARED_ECHOER_EVIDENCE_ROOT, + evidence_count: SHARED_EVIDENCE_COUNT, + prev_lesson_hash: null, + maturity_age_days: 1, + useful_count: 0, + }; + const signature = sign(envelope, key.private_key_pem); + envelopes.push({ ...envelope, signature }); + } + + // Dissenter — keys[4], distinct content + evidence_root, reversed-ramp embedding. + { + const dissenterKey = echoChamberCohortKeys.keys[ECHOER_COUNT]; + const dissenterEnvelope = { + spec_version: "1.1", + id: "44444444-5555-4666-8777-ffffffffff04", + content: DISSENTER_CONTENT, + embedding: rampReversed(), + synthesized_from_cluster_size: 2, + origin_node_id: dissenterKey.node_id, + created_at: new Date(BASE_SIGNED_AT_MS - 1000).toISOString(), + // Signed at the very end of the echoer window so the spread test + // covers the full cohort, not just the four echoers. + signed_at: new Date(BASE_SIGNED_AT_MS + ECHOER_COUNT * 60 * 1000).toISOString(), + evidence_root: DISSENTER_EVIDENCE_ROOT, + evidence_count: SHARED_EVIDENCE_COUNT, + prev_lesson_hash: null, + maturity_age_days: 1, + useful_count: 0, + }; + const dissenterSignature = sign(dissenterEnvelope, dissenterKey.private_key_pem); + envelopes.push({ ...dissenterEnvelope, signature: dissenterSignature }); + } + + const fixture = { + metadata: { + category: "echo-chamber", + // §10.4 admits each envelope individually but clamps the consensus + // lesson's local_weight below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3). + // The dissenter is admitted normally; only the four echoers' lesson + // is suppressed. + expected_outcome: "broadcast_suppressed", + // Same convention as plagiarism / sybil: §10.4 itself does not + // directly mutate trust edges. The negative scalar reflects the + // eventual operator-driven reputation cost of a flagged consensus + // cluster; harness asserts only sign + order-of-magnitude band. + expected_trust_delta: -0.01, + owns_mechanism: "§10.4 diversity filter", + comment: + "Five signature-valid envelopes from five distinct fixture-key node IDs. envelopes[0..3] are echoers — same content text, shared evidence_root, near-identical embeddings (pairwise cosine > 0.95 within the echoer subset), signed within a 3-minute window. envelopes[4] is a dissenter — heterodox content, distinct evidence_root, reversed-ramp embedding (cosine ≈ 0.5 vs any echoer). §10.4 cross-peer concentration on the consensus lesson is 4/5 = 0.8 (exact trigger boundary). scoreFinding(prev=1.0, over=0.8) clamps new_weight to 0.2, strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3). The load-bearing claim is that the dissenter's presence in the cohort does NOT save the consensus from the firebreak — §10.4 is purely a function of over_concentration, not of cohort heterogeneity.", + }, + cohort_size: COHORT_SIZE, + envelopes, + }; + + const outDir = path.join(FIXTURES_DIR, "echo-chamber"); + fs.mkdirSync(outDir, { recursive: true }); + const outFile = path.join(outDir, "consensus-with-dissent-cohort.json"); + fs.writeFileSync(outFile, JSON.stringify(fixture, null, 2) + "\n"); + console.log(`wrote ${path.relative(process.cwd(), outFile)}`); +} + +buildEchoChamberCohort(); diff --git a/mcp-server/src/__tests__/anti-echo-echo-chamber.test.ts b/mcp-server/src/__tests__/anti-echo-echo-chamber.test.ts new file mode 100644 index 0000000..3cf9c35 --- /dev/null +++ b/mcp-server/src/__tests__/anti-echo-echo-chamber.test.ts @@ -0,0 +1,381 @@ +/** + * Anti-echo-chamber adversarial corpus — echo-chamber category (W4.1, issue #196). + * + * Asserts the §10.4 diversity filter clamps a cohort of N=5 peers (4 + * echoers + 1 dissenter) below the broadcast firebreak + * (`MIN_LOCAL_WEIGHT_FOR_BROADCAST = 0.3`) at over_concentration = 4/5 = + * 0.8 — the §10.4 trigger boundary and the canonical case + * `rem-diversity.test.ts` already exercises against the pure helper. + * + * Distinct from sybil-flood (the other §10.4-owning row): + * - Sybil exercises the *saturation* path (M=10 sock-puppets, + * over_concentration=1.0) — defends against coordinated re-broadcast. + * - Echo-chamber exercises the *boundary* path with a heterogeneous + * cohort (4 echoers + 1 dissenter, over_concentration=0.8) — defends + * against organic-looking groupthink where a visible dissenting + * minority might otherwise be argued to "save" the consensus from + * suppression. + * + * Mechanics under test: + * - Each cohort envelope individually passes `validateWireRecord` — + * §10.4 is a post-admission, REM-cycle defense. The wire validator + * never sees the cohort as a unit. + * - All envelope signatures verify against their cohort key (Pillar-6). + * - Echoer subset (envelopes[0..3]) has pairwise cosine_similarity > + * 0.95 — the §10.4 default `p_duplicate_cosine`. Without this the + * diversity RPC would not flag the echoers as a near-duplicate set. + * - Echoer subset shares evidence_root and signed_at falls inside the + * §10.4 default `p_signed_at_window_d` (7 days). + * - Dissenter (envelopes[4]) has cosine ≈ 0.5 vs every echoer (well + * below `p_duplicate_cosine`), a distinct evidence_root, and + * heterodox content — proves the cohort has real diversity, not five + * sock-puppets. + * - `scoreFinding(prev=1.0, over=0.8)` clamps new_weight to 0.2, + * strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3). The + * load-bearing assertion of this row is that the dissenter does NOT + * save the consensus — the firebreak is purely a function of + * over_concentration, not of cohort heterogeneity. + * + * Scope — what this row does NOT cover: + * - The full RPC + lesson_diversity_log + swarm_lessons.local_weight + * UPDATE chain (asserted in `migration-082-swarm-lesson-diversity.test.ts` + * and `rem-diversity.test.ts`). + * - Multi-node trust-edge delta (asserted in the W4.3 campaign report). + */ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { verify } from "../services/signature.js"; +import { validateWireRecord } from "../services/wire-validator.js"; +import { cosineSimilarity } from "../services/lesson-contradiction-gate.js"; +import { + scoreFinding, + type RemDiversityFinding, +} from "../services/rem-diversity.js"; +import { MIN_LOCAL_WEIGHT_FOR_BROADCAST } from "../swarm/endpoints/lesson-feed.js"; +import type { + AntiEchoCohortFixture, + AntiEchoFixtureMetadata, +} from "./fixtures/anti-echo/corpus-types.js"; + +// --------------------------------------------------------------------------- +// Fixture loaders +// --------------------------------------------------------------------------- + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const FIXTURES_DIR = path.resolve( + __dirname, + "..", + "..", + "src", + "__tests__", + "fixtures", + "anti-echo" +); + +// Per the build script's structural convention: envelopes[0..ECHOER_COUNT-1] +// are the echoers, envelopes[ECHOER_COUNT..] are the dissenters. This row +// fixes ECHOER_COUNT = 4 (cohort_size=5, over_concentration=4/5=0.8). A +// future fixture in the same category may pick a different split; if so +// the new fixture should expose the count in the JSON metadata rather than +// hard-coding the constant in the test, and this constant becomes per-row. +const ECHOER_COUNT = 4; + +interface FixtureCohortKey { + node_id: string; + pubkey_raw_b64: string; + private_key_pem: string; +} + +interface CohortKeysFile { + comment: string; + keys: FixtureCohortKey[]; +} + +function loadCohortKeys(): CohortKeysFile { + return JSON.parse( + fs.readFileSync( + path.join(FIXTURES_DIR, "cohort-keys-echo-chamber.json"), + "utf8" + ) + ); +} + +function loadEchoChamberCohort(): AntiEchoCohortFixture { + return JSON.parse( + fs.readFileSync( + path.join(FIXTURES_DIR, "echo-chamber", "consensus-with-dissent-cohort.json"), + "utf8" + ) + ); +} + +// --------------------------------------------------------------------------- +// (1) Metadata invariants +// --------------------------------------------------------------------------- + +test("echo-chamber cohort: metadata declares broadcast_suppressed + negative trust delta + §10.4 owner", () => { + const fixture = loadEchoChamberCohort(); + const meta: AntiEchoFixtureMetadata = fixture.metadata; + assert.equal(meta.category, "echo-chamber"); + assert.equal( + meta.expected_outcome, + "broadcast_suppressed", + "§10.4 admits each envelope and clamps the consensus lesson's local_weight below the broadcast firebreak" + ); + assert.ok( + meta.expected_trust_delta < 0, + `expected negative trust delta for a defended-against attack class, got ${meta.expected_trust_delta}` + ); + assert.match( + meta.owns_mechanism, + /§10\.4/, + "owns_mechanism must name §10.4 (the diversity filter is the sole §10 mechanism this row exercises)" + ); +}); + +test("echo-chamber cohort: cohort_size matches envelopes.length and produces over_concentration ≥ §10.4 0.8 trigger", () => { + const fixture = loadEchoChamberCohort(); + // Cross-check defends against a copy-paste authoring error. The spec + // (docs/wave-4-anti-echo.md §"Corpus categories") names "≥80% of a + // synthetic cohort" as the echo-chamber threshold. ECHOER_COUNT / + // cohort_size < 0.8 would silently weaken the row — the §10.4 RPC's + // default `p_over_concentration` is 0.8 and a sub-trigger ratio would + // not fire it at all. + assert.equal( + fixture.cohort_size, + fixture.envelopes.length, + "cohort_size must equal envelopes.length" + ); + const overConcentration = ECHOER_COUNT / fixture.cohort_size; + assert.ok( + overConcentration >= 0.8, + `echoer ratio ${ECHOER_COUNT}/${fixture.cohort_size} = ${overConcentration} must hit the §10.4 spec threshold ≥ 0.8` + ); +}); + +// --------------------------------------------------------------------------- +// (2) Pillar-6 — every envelope's signature verifies before §10 fires +// --------------------------------------------------------------------------- + +test("echo-chamber cohort: every envelope is signature-valid against its cohort key", () => { + const fixture = loadEchoChamberCohort(); + const cohortKeys = loadCohortKeys(); + assert.equal( + cohortKeys.keys.length, + fixture.cohort_size, + "cohort_keys file must have one key per cohort envelope" + ); + for (let i = 0; i < fixture.envelopes.length; i++) { + const envelope = fixture.envelopes[i]; + const key = cohortKeys.keys[i]; + assert.equal( + envelope.origin_node_id, + key.node_id, + `envelope[${i}].origin_node_id must match cohort_keys[${i}].node_id` + ); + const pubkey = new Uint8Array(Buffer.from(key.pubkey_raw_b64, "base64")); + const ok = verify(envelope, envelope.signature, pubkey); + assert.equal( + ok, + true, + `envelope[${i}] signature must verify — echo-chamber tests §10.4, not §3.7 wire-signature` + ); + } +}); + +test("echo-chamber cohort: distinct origin_node_id per envelope (5 peers, not one peer 5 times)", () => { + const fixture = loadEchoChamberCohort(); + const origins = new Set(fixture.envelopes.map((e) => e.origin_node_id)); + assert.equal( + origins.size, + fixture.cohort_size, + `every envelope must have a distinct origin_node_id, got ${origins.size}/${fixture.cohort_size}` + ); +}); + +// --------------------------------------------------------------------------- +// (3) Wire validator — every envelope is independently admissible +// --------------------------------------------------------------------------- + +test("echo-chamber cohort: every envelope passes validateWireRecord (§10.4 is post-admission)", async () => { + const fixture = loadEchoChamberCohort(); + const cohortKeys = loadCohortKeys(); + const pubkeyByNode = new Map(); + for (const k of cohortKeys.keys) { + pubkeyByNode.set( + k.node_id, + new Uint8Array(Buffer.from(k.pubkey_raw_b64, "base64")) + ); + } + for (let i = 0; i < fixture.envelopes.length; i++) { + const envelope = fixture.envelopes[i]; + const result = await validateWireRecord(envelope, "lesson", { + ourSpecMajor: 1, + now: new Date("2026-05-02T00:00:00Z"), + getPubkeyForNode: (id) => pubkeyByNode.get(id) ?? null, + }); + assert.deepEqual( + result, + { ok: true }, + `envelope[${i}] must pass the wire validator — §10.4 fires AFTER admission` + ); + } +}); + +// --------------------------------------------------------------------------- +// (4) §10.4 trigger conditions — echoer subset is near-duplicate +// --------------------------------------------------------------------------- + +test("echo-chamber cohort: pairwise cosine_similarity > 0.95 within the echoer subset (§10.4 p_duplicate_cosine default)", () => { + const fixture = loadEchoChamberCohort(); + const DUPLICATE_COSINE_THRESHOLD = 0.95; + // Only the echoer subset (envelopes[0..ECHOER_COUNT-1]) must satisfy + // the near-duplicate threshold. The dissenter is asserted separately + // (next test) as falling well below it. + for (let i = 0; i < ECHOER_COUNT; i++) { + for (let j = i + 1; j < ECHOER_COUNT; j++) { + const cos = cosineSimilarity( + fixture.envelopes[i].embedding, + fixture.envelopes[j].embedding + ); + assert.ok( + cos > DUPLICATE_COSINE_THRESHOLD, + `cosine(echoer[${i}], echoer[${j}]) = ${cos} must exceed §10.4 duplicate threshold ${DUPLICATE_COSINE_THRESHOLD}` + ); + } + } +}); + +test("echo-chamber cohort: dissenter cosine ≪ §10.4 p_duplicate_cosine vs every echoer (real heterodox peer)", () => { + const fixture = loadEchoChamberCohort(); + const DUPLICATE_COSINE_THRESHOLD = 0.95; + const dissenter = fixture.envelopes[ECHOER_COUNT]; + for (let i = 0; i < ECHOER_COUNT; i++) { + const cos = cosineSimilarity( + fixture.envelopes[i].embedding, + dissenter.embedding + ); + assert.ok( + cos < DUPLICATE_COSINE_THRESHOLD, + `cosine(echoer[${i}], dissenter) = ${cos} must fall below §10.4 duplicate threshold ${DUPLICATE_COSINE_THRESHOLD} — otherwise the dissenter would silently collapse into the echoer subset and the cohort would degenerate to a 5-way plagiarism row` + ); + } +}); + +test("echo-chamber cohort: signed_at spread inside §10.4 p_signed_at_window_d (7 days)", () => { + const fixture = loadEchoChamberCohort(); + const SIGNED_AT_WINDOW_MS = 7 * 24 * 60 * 60 * 1000; + const timestamps = fixture.envelopes + .map((e) => Date.parse(e.signed_at)) + .sort((a, b) => a - b); + const spread = timestamps[timestamps.length - 1] - timestamps[0]; + assert.ok( + spread <= SIGNED_AT_WINDOW_MS, + `signed_at spread ${spread}ms must fit inside §10.4 7-day window ${SIGNED_AT_WINDOW_MS}ms` + ); +}); + +test("echo-chamber cohort: echoers share evidence_root, dissenter has its own (no independent evidence chain across the echoer subset)", () => { + const fixture = loadEchoChamberCohort(); + const echoerRoots = new Set( + fixture.envelopes.slice(0, ECHOER_COUNT).map((e) => e.evidence_root) + ); + const dissenter = fixture.envelopes[ECHOER_COUNT]; + // Independent peers would not collide on evidence_root through + // independent evidence chains — that is the §10.4 "no independent + // evidence_root" signal echo-chamber exists to defend against. The + // dissenter's distinct root is the structural proof that the cohort is + // not five sock-puppets. + assert.equal( + echoerRoots.size, + 1, + `evidence_root must be identical across the four echoers (re-broadcast of one consensus body), got ${echoerRoots.size} distinct values` + ); + assert.ok( + !echoerRoots.has(dissenter.evidence_root), + "dissenter evidence_root must differ from the shared echoer root — otherwise the cohort degenerates to a 5-peer plagiarism row" + ); +}); + +// --------------------------------------------------------------------------- +// (5) §10.4 decision layer — scoreFinding clamps below the broadcast firebreak +// --------------------------------------------------------------------------- + +test("echo-chamber cohort: scoreFinding at trigger boundary (over_concentration=0.8, M=4 of 5) clamps below broadcast threshold", () => { + const fixture = loadEchoChamberCohort(); + // Synthesize the RemDiversityFinding the production §10.4 RPC would + // emit for this cohort: the four echoers carry the near-duplicate, the + // dissenter does not. topic_cohort_size = 5 (the full cohort the RPC + // saw), near_dup_origin_count = 4 (only the echoers), over_concentration + // = 4/5 = 0.8 (the §10.4 RPC's default `p_over_concentration` trigger). + // + // The load-bearing claim: at prev_weight = 1.0 (a fresh consensus + // lesson), the §10.4 multiplier `(1 - over_concentration)` = 0.2 yields + // new_weight = 0.2 — strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3). + // The dissenter exists in the cohort and is visible to the RPC, but the + // firebreak fires anyway: §10.4 is a function of over_concentration + // alone, not of cohort heterogeneity. + const consensusLesson = fixture.envelopes[0]; // any echoer is the consensus + const finding: RemDiversityFinding = { + swarm_lesson_id: consensusLesson.id, + origin_node_id: consensusLesson.origin_node_id, + swarm_lesson_text: consensusLesson.content, + topic_cohort_size: fixture.cohort_size, + near_dup_origin_count: ECHOER_COUNT, + over_concentration: ECHOER_COUNT / fixture.cohort_size, + near_dup_lesson_ids: fixture.envelopes + .slice(0, ECHOER_COUNT) + .map((e) => e.id), + }; + const { new_weight, reason } = scoreFinding(1.0, finding); + assert.ok( + Math.abs(new_weight - 0.2) < 1e-12, + `new_weight should be ~0.2 (= 1.0 * (1 - 0.8)), got ${new_weight}` + ); + assert.ok( + new_weight < MIN_LOCAL_WEIGHT_FOR_BROADCAST, + `new_weight ${new_weight} must clamp below MIN_LOCAL_WEIGHT_FOR_BROADCAST (${MIN_LOCAL_WEIGHT_FOR_BROADCAST}) — even with a visible dissenter in the cohort, §10.4's firebreak fires at over_concentration=0.8` + ); + assert.match( + reason, + /§10\.4/, + "audit reason must self-describe with the spec section" + ); +}); + +test("echo-chamber cohort: scoreFinding does NOT relax the firebreak when topic_cohort_size grows but over_concentration stays at 0.8", () => { + const fixture = loadEchoChamberCohort(); + // Adversary's natural escalation: pad the cohort with extra dissenters + // to make the consensus look like a smaller fraction of a larger + // peer-set. topic_cohort_size = 100, near_dup_origin_count = 80 — same + // 0.8 ratio. §10.4 must still clamp below the firebreak; otherwise the + // attack would be "gather enough dissenters to dilute the + // concentration ratio" and §10.4 would have an N-dependent escape. + // Pinning this at M=80 (vs the fixture's M=4) proves §10.4 is + // ratio-driven, not count-driven. + const consensusLesson = fixture.envelopes[0]; + const finding: RemDiversityFinding = { + swarm_lesson_id: consensusLesson.id, + origin_node_id: consensusLesson.origin_node_id, + swarm_lesson_text: consensusLesson.content, + topic_cohort_size: 100, + near_dup_origin_count: 80, + over_concentration: 0.8, + near_dup_lesson_ids: fixture.envelopes + .slice(0, ECHOER_COUNT) + .map((e) => e.id), + }; + const { new_weight } = scoreFinding(1.0, finding); + assert.ok( + Math.abs(new_weight - 0.2) < 1e-12, + `padding the cohort to N=100 with the same 0.8 ratio must NOT relax the multiplier — got new_weight=${new_weight}, expected 0.2` + ); + assert.ok( + new_weight < MIN_LOCAL_WEIGHT_FOR_BROADCAST, + `padded-cohort new_weight ${new_weight} must clamp below MIN_LOCAL_WEIGHT_FOR_BROADCAST (${MIN_LOCAL_WEIGHT_FOR_BROADCAST}) — §10.4 has no N-dependent escape hatch` + ); +}); diff --git a/mcp-server/src/__tests__/fixtures/anti-echo/cohort-keys-echo-chamber.json b/mcp-server/src/__tests__/fixtures/anti-echo/cohort-keys-echo-chamber.json new file mode 100644 index 0000000..1801cdc --- /dev/null +++ b/mcp-server/src/__tests__/fixtures/anti-echo/cohort-keys-echo-chamber.json @@ -0,0 +1,35 @@ +{ + "comment": "Ed25519 fixture keys for the echo-chamber cohort (W4.1, §10.4 diversity filter). FIXTURE-ONLY; never any production node identity. Five peers: keys[0..3] are the four echoers re-broadcasting the consensus lesson with shared evidence_root; keys[4] is the dissenter holding a heterodox lesson with its own evidence_root and far embedding. The §10.4 over_concentration = 4/5 = 0.8 (exact trigger boundary). Checked in so the regression suite is fully deterministic. See ./README.md and docs/wave-4-anti-echo.md.", + "keys": [ + { + "node_id": "QmUTGvxNjyout7ngociUic81KMCoi6Qp8byLGpJZ65Q8f4", + "pubkey_raw_b64": "+UgJv0if5bxOLXnTWqVVreBbmMxwdbqq1468IFjY9eo=", + "pubkey_b64url_unpadded": "-UgJv0if5bxOLXnTWqVVreBbmMxwdbqq1468IFjY9eo", + "private_key_pem": "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIOtBMuf7JYNwHttl5Ty+jEe6BJhd5eveU0+3ZTTHWM8o\n-----END PRIVATE KEY-----\n" + }, + { + "node_id": "QmcsYpRedtij43idB99ZgHkFX6UNiisndcx7GxPan4dbRC", + "pubkey_raw_b64": "OJbjMk44OqYMh6rkfKrCbljksEzffJCvQ//NDMP8jpA=", + "pubkey_b64url_unpadded": "OJbjMk44OqYMh6rkfKrCbljksEzffJCvQ__NDMP8jpA", + "private_key_pem": "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIFQ0BJSmRbv4grVZnQwC9mxtnX3ssN8mIhgL7uPtBsQD\n-----END PRIVATE KEY-----\n" + }, + { + "node_id": "QmeUZpeX9z3BnSquAjkaTUq3TRtQYHpCeupaNd9PdpW9t3", + "pubkey_raw_b64": "sonFSdlPOw5Q45eLuct9gH66wokw/2lHxvjGnqaheEI=", + "pubkey_b64url_unpadded": "sonFSdlPOw5Q45eLuct9gH66wokw_2lHxvjGnqaheEI", + "private_key_pem": "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIIfus4dLnM3M/TEEP7PxE+adlkcOGxu+R55cxllIU7OS\n-----END PRIVATE KEY-----\n" + }, + { + "node_id": "QmevpThrKKeTkYQYA4rwoj2eFjfRcXqpJWakCYRdHvQV76", + "pubkey_raw_b64": "ePZQ6rpRixUu8WcUqpHOsbU/SqYCaaQnbz/s4bGEbTM=", + "pubkey_b64url_unpadded": "ePZQ6rpRixUu8WcUqpHOsbU_SqYCaaQnbz_s4bGEbTM", + "private_key_pem": "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIE+zbS+PBA+9SgmTeBEBA+2JHQ/j/C9KPLx+Vvuf8xe+\n-----END PRIVATE KEY-----\n" + }, + { + "node_id": "QmW1KQT9EUxfQfgKKpB1MX18t6kEbp5bVG8cXw4am95BAz", + "pubkey_raw_b64": "Rd+SnM1VEJ69tlIqPrYsYcNUgq8dDbNtrIyKy90liQM=", + "pubkey_b64url_unpadded": "Rd-SnM1VEJ69tlIqPrYsYcNUgq8dDbNtrIyKy90liQM", + "private_key_pem": "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEINGOxIpdKYrPg6rPIko4Bhql9EbPEYXqfr7yDD5BREKB\n-----END PRIVATE KEY-----\n" + } + ] +} diff --git a/mcp-server/src/__tests__/fixtures/anti-echo/echo-chamber/consensus-with-dissent-cohort.json b/mcp-server/src/__tests__/fixtures/anti-echo/echo-chamber/consensus-with-dissent-cohort.json new file mode 100644 index 0000000..50d7b00 --- /dev/null +++ b/mcp-server/src/__tests__/fixtures/anti-echo/echo-chamber/consensus-with-dissent-cohort.json @@ -0,0 +1,3937 @@ +{ + "metadata": { + "category": "echo-chamber", + "expected_outcome": "broadcast_suppressed", + "expected_trust_delta": -0.01, + "owns_mechanism": "§10.4 diversity filter", + "comment": "Five signature-valid envelopes from five distinct fixture-key node IDs. envelopes[0..3] are echoers — same content text, shared evidence_root, near-identical embeddings (pairwise cosine > 0.95 within the echoer subset), signed within a 3-minute window. envelopes[4] is a dissenter — heterodox content, distinct evidence_root, reversed-ramp embedding (cosine ≈ 0.5 vs any echoer). §10.4 cross-peer concentration on the consensus lesson is 4/5 = 0.8 (exact trigger boundary). scoreFinding(prev=1.0, over=0.8) clamps new_weight to 0.2, strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3). The load-bearing claim is that the dissenter's presence in the cohort does NOT save the consensus from the firebreak — §10.4 is purely a function of over_concentration, not of cohort heterogeneity." + }, + "cohort_size": 5, + "envelopes": [ + { + "spec_version": "1.1", + "id": "44444444-5555-4666-8777-eeeeeeeeee00", + "content": "Wave-4 echo-chamber cohort: four peers re-broadcast a consensus lesson with no independent evidence chain, while one peer dissents with a heterodox lesson. §10.4 should clamp local_weight below the broadcast firebreak at over_concentration = 4/5 = 0.8 — the dissenter's presence MUST NOT save the consensus from the firebreak. See docs/wave-4-anti-echo.md.", + "embedding": [ + 0.002, + 0.002, + 0.003, + 0.004, + 0.005, + 0.006, + 0.007, + 0.008, + 0.009, + 0.01, + 0.011, + 0.012, + 0.013, + 0.014, + 0.015, + 0.016, + 0.017, + 0.018, + 0.019, + 0.02, + 0.021, + 0.022, + 0.023, + 0.024, + 0.025, + 0.026, + 0.027, + 0.028, + 0.029, + 0.03, + 0.031, + 0.032, + 0.034, + 0.034, + 0.035, + 0.036, + 0.037, + 0.038, + 0.039, + 0.04, + 0.041, + 0.042, + 0.043, + 0.044, + 0.045, + 0.046, + 0.047, + 0.048, + 0.049, + 0.05, + 0.051, + 0.052, + 0.053, + 0.054, + 0.055, + 0.056, + 0.057, + 0.058, + 0.059, + 0.06, + 0.061, + 0.062, + 0.063, + 0.064, + 0.066, + 0.066, + 0.067, + 0.068, + 0.069, + 0.07, + 0.071, + 0.072, + 0.073, + 0.074, + 0.075, + 0.076, + 0.077, + 0.078, + 0.079, + 0.08, + 0.081, + 0.082, + 0.083, + 0.084, + 0.085, + 0.086, + 0.087, + 0.088, + 0.089, + 0.09, + 0.091, + 0.092, + 0.093, + 0.094, + 0.095, + 0.096, + 0.098, + 0.098, + 0.099, + 0.1, + 0.101, + 0.102, + 0.103, + 0.104, + 0.105, + 0.106, + 0.107, + 0.108, + 0.109, + 0.11, + 0.111, + 0.112, + 0.113, + 0.114, + 0.115, + 0.116, + 0.117, + 0.118, + 0.119, + 0.12, + 0.121, + 0.122, + 0.123, + 0.124, + 0.125, + 0.126, + 0.127, + 0.128, + 0.13, + 0.13, + 0.131, + 0.132, + 0.133, + 0.134, + 0.135, + 0.136, + 0.137, + 0.138, + 0.139, + 0.14, + 0.141, + 0.142, + 0.143, + 0.144, + 0.145, + 0.146, + 0.147, + 0.148, + 0.149, + 0.15, + 0.151, + 0.152, + 0.153, + 0.154, + 0.155, + 0.156, + 0.157, + 0.158, + 0.159, + 0.16, + 0.162, + 0.162, + 0.163, + 0.164, + 0.165, + 0.166, + 0.167, + 0.168, + 0.169, + 0.17, + 0.171, + 0.172, + 0.173, + 0.174, + 0.175, + 0.176, + 0.177, + 0.178, + 0.179, + 0.18, + 0.181, + 0.182, + 0.183, + 0.184, + 0.185, + 0.186, + 0.187, + 0.188, + 0.189, + 0.19, + 0.191, + 0.192, + 0.194, + 0.194, + 0.195, + 0.196, + 0.197, + 0.198, + 0.199, + 0.2, + 0.201, + 0.202, + 0.203, + 0.204, + 0.205, + 0.206, + 0.207, + 0.208, + 0.209, + 0.21, + 0.211, + 0.212, + 0.213, + 0.214, + 0.215, + 0.216, + 0.217, + 0.218, + 0.219, + 0.22, + 0.221, + 0.222, + 0.223, + 0.224, + 0.226, + 0.226, + 0.227, + 0.228, + 0.229, + 0.23, + 0.231, + 0.232, + 0.233, + 0.234, + 0.235, + 0.236, + 0.237, + 0.238, + 0.239, + 0.24, + 0.241, + 0.242, + 0.243, + 0.244, + 0.245, + 0.246, + 0.247, + 0.248, + 0.249, + 0.25, + 0.251, + 0.252, + 0.253, + 0.254, + 0.255, + 0.256, + 0.258, + 0.258, + 0.259, + 0.26, + 0.261, + 0.262, + 0.263, + 0.264, + 0.265, + 0.266, + 0.267, + 0.268, + 0.269, + 0.27, + 0.271, + 0.272, + 0.273, + 0.274, + 0.275, + 0.276, + 0.277, + 0.278, + 0.279, + 0.28, + 0.281, + 0.282, + 0.283, + 0.284, + 0.285, + 0.286, + 0.287, + 0.288, + 0.29, + 0.29, + 0.291, + 0.292, + 0.293, + 0.294, + 0.295, + 0.296, + 0.297, + 0.298, + 0.299, + 0.3, + 0.301, + 0.302, + 0.303, + 0.304, + 0.305, + 0.306, + 0.307, + 0.308, + 0.309, + 0.31, + 0.311, + 0.312, + 0.313, + 0.314, + 0.315, + 0.316, + 0.317, + 0.318, + 0.319, + 0.32, + 0.322, + 0.322, + 0.323, + 0.324, + 0.325, + 0.326, + 0.327, + 0.328, + 0.329, + 0.33, + 0.331, + 0.332, + 0.333, + 0.334, + 0.335, + 0.336, + 0.337, + 0.338, + 0.339, + 0.34, + 0.341, + 0.342, + 0.343, + 0.344, + 0.345, + 0.346, + 0.347, + 0.348, + 0.349, + 0.35, + 0.351, + 0.352, + 0.354, + 0.354, + 0.355, + 0.356, + 0.357, + 0.358, + 0.359, + 0.36, + 0.361, + 0.362, + 0.363, + 0.364, + 0.365, + 0.366, + 0.367, + 0.368, + 0.369, + 0.37, + 0.371, + 0.372, + 0.373, + 0.374, + 0.375, + 0.376, + 0.377, + 0.378, + 0.379, + 0.38, + 0.381, + 0.382, + 0.383, + 0.384, + 0.386, + 0.386, + 0.387, + 0.388, + 0.389, + 0.39, + 0.391, + 0.392, + 0.393, + 0.394, + 0.395, + 0.396, + 0.397, + 0.398, + 0.399, + 0.4, + 0.401, + 0.402, + 0.403, + 0.404, + 0.405, + 0.406, + 0.407, + 0.408, + 0.409, + 0.41, + 0.411, + 0.412, + 0.413, + 0.414, + 0.415, + 0.416, + 0.418, + 0.418, + 0.419, + 0.42, + 0.421, + 0.422, + 0.423, + 0.424, + 0.425, + 0.426, + 0.427, + 0.428, + 0.429, + 0.43, + 0.431, + 0.432, + 0.433, + 0.434, + 0.435, + 0.436, + 0.437, + 0.438, + 0.439, + 0.44, + 0.441, + 0.442, + 0.443, + 0.444, + 0.445, + 0.446, + 0.447, + 0.448, + 0.45, + 0.45, + 0.451, + 0.452, + 0.453, + 0.454, + 0.455, + 0.456, + 0.457, + 0.458, + 0.459, + 0.46, + 0.461, + 0.462, + 0.463, + 0.464, + 0.465, + 0.466, + 0.467, + 0.468, + 0.469, + 0.47, + 0.471, + 0.472, + 0.473, + 0.474, + 0.475, + 0.476, + 0.477, + 0.478, + 0.479, + 0.48, + 0.482, + 0.482, + 0.483, + 0.484, + 0.485, + 0.486, + 0.487, + 0.488, + 0.489, + 0.49, + 0.491, + 0.492, + 0.493, + 0.494, + 0.495, + 0.496, + 0.497, + 0.498, + 0.499, + 0.5, + 0.501, + 0.502, + 0.503, + 0.504, + 0.505, + 0.506, + 0.507, + 0.508, + 0.509, + 0.51, + 0.511, + 0.512, + 0.514, + 0.514, + 0.515, + 0.516, + 0.517, + 0.518, + 0.519, + 0.52, + 0.521, + 0.522, + 0.523, + 0.524, + 0.525, + 0.526, + 0.527, + 0.528, + 0.529, + 0.53, + 0.531, + 0.532, + 0.533, + 0.534, + 0.535, + 0.536, + 0.537, + 0.538, + 0.539, + 0.54, + 0.541, + 0.542, + 0.543, + 0.544, + 0.546, + 0.546, + 0.547, + 0.548, + 0.549, + 0.55, + 0.551, + 0.552, + 0.553, + 0.554, + 0.555, + 0.556, + 0.557, + 0.558, + 0.559, + 0.56, + 0.561, + 0.562, + 0.563, + 0.564, + 0.565, + 0.566, + 0.567, + 0.568, + 0.569, + 0.57, + 0.571, + 0.572, + 0.573, + 0.574, + 0.575, + 0.576, + 0.578, + 0.578, + 0.579, + 0.58, + 0.581, + 0.582, + 0.583, + 0.584, + 0.585, + 0.586, + 0.587, + 0.588, + 0.589, + 0.59, + 0.591, + 0.592, + 0.593, + 0.594, + 0.595, + 0.596, + 0.597, + 0.598, + 0.599, + 0.6, + 0.601, + 0.602, + 0.603, + 0.604, + 0.605, + 0.606, + 0.607, + 0.608, + 0.61, + 0.61, + 0.611, + 0.612, + 0.613, + 0.614, + 0.615, + 0.616, + 0.617, + 0.618, + 0.619, + 0.62, + 0.621, + 0.622, + 0.623, + 0.624, + 0.625, + 0.626, + 0.627, + 0.628, + 0.629, + 0.63, + 0.631, + 0.632, + 0.633, + 0.634, + 0.635, + 0.636, + 0.637, + 0.638, + 0.639, + 0.64, + 0.642, + 0.642, + 0.643, + 0.644, + 0.645, + 0.646, + 0.647, + 0.648, + 0.649, + 0.65, + 0.651, + 0.652, + 0.653, + 0.654, + 0.655, + 0.656, + 0.657, + 0.658, + 0.659, + 0.66, + 0.661, + 0.662, + 0.663, + 0.664, + 0.665, + 0.666, + 0.667, + 0.668, + 0.669, + 0.67, + 0.671, + 0.672, + 0.674, + 0.674, + 0.675, + 0.676, + 0.677, + 0.678, + 0.679, + 0.68, + 0.681, + 0.682, + 0.683, + 0.684, + 0.685, + 0.686, + 0.687, + 0.688, + 0.689, + 0.69, + 0.691, + 0.692, + 0.693, + 0.694, + 0.695, + 0.696, + 0.697, + 0.698, + 0.699, + 0.7, + 0.701, + 0.702, + 0.703, + 0.704, + 0.706, + 0.706, + 0.707, + 0.708, + 0.709, + 0.71, + 0.711, + 0.712, + 0.713, + 0.714, + 0.715, + 0.716, + 0.717, + 0.718, + 0.719, + 0.72, + 0.721, + 0.722, + 0.723, + 0.724, + 0.725, + 0.726, + 0.727, + 0.728, + 0.729, + 0.73, + 0.731, + 0.732, + 0.733, + 0.734, + 0.735, + 0.736, + 0.738, + 0.738, + 0.739, + 0.74, + 0.741, + 0.742, + 0.743, + 0.744, + 0.745, + 0.746, + 0.747, + 0.748, + 0.749, + 0.75, + 0.751, + 0.752, + 0.753, + 0.754, + 0.755, + 0.756, + 0.757, + 0.758, + 0.759, + 0.76, + 0.761, + 0.762, + 0.763, + 0.764, + 0.765, + 0.766, + 0.767, + 0.768 + ], + "synthesized_from_cluster_size": 2, + "origin_node_id": "QmUTGvxNjyout7ngociUic81KMCoi6Qp8byLGpJZ65Q8f4", + "created_at": "2026-05-01T00:29:59.000Z", + "signed_at": "2026-05-01T00:30:00.000Z", + "evidence_root": "QmPQHaufdSfx11srT19JwtLykTMfuXyVv3CPLFur6hRU9Z", + "evidence_count": 4, + "prev_lesson_hash": null, + "maturity_age_days": 1, + "useful_count": 0, + "signature": "LQgTWLUukmg1QHwod163cXFww6XV0JhwW9x1JMxqOiujDvaAcAoBGqy0pxlixMciIhzzxyS5k5DAq5CsjZn1Bg==" + }, + { + "spec_version": "1.1", + "id": "44444444-5555-4666-8777-eeeeeeeeee01", + "content": "Wave-4 echo-chamber cohort: four peers re-broadcast a consensus lesson with no independent evidence chain, while one peer dissents with a heterodox lesson. §10.4 should clamp local_weight below the broadcast firebreak at over_concentration = 4/5 = 0.8 — the dissenter's presence MUST NOT save the consensus from the firebreak. See docs/wave-4-anti-echo.md.", + "embedding": [ + 0.002005, + 0.002, + 0.003, + 0.004, + 0.005, + 0.006, + 0.007, + 0.008, + 0.009, + 0.01, + 0.011, + 0.012, + 0.013, + 0.014, + 0.015, + 0.016, + 0.017, + 0.018, + 0.019, + 0.02, + 0.021, + 0.022, + 0.023, + 0.024, + 0.025, + 0.026, + 0.027, + 0.028, + 0.029, + 0.03, + 0.031, + 0.032, + 0.034005, + 0.034, + 0.035, + 0.036, + 0.037, + 0.038, + 0.039, + 0.04, + 0.041, + 0.042, + 0.043, + 0.044, + 0.045, + 0.046, + 0.047, + 0.048, + 0.049, + 0.05, + 0.051, + 0.052, + 0.053, + 0.054, + 0.055, + 0.056, + 0.057, + 0.058, + 0.059, + 0.06, + 0.061, + 0.062, + 0.063, + 0.064, + 0.066005, + 0.066, + 0.067, + 0.068, + 0.069, + 0.07, + 0.071, + 0.072, + 0.073, + 0.074, + 0.075, + 0.076, + 0.077, + 0.078, + 0.079, + 0.08, + 0.081, + 0.082, + 0.083, + 0.084, + 0.085, + 0.086, + 0.087, + 0.088, + 0.089, + 0.09, + 0.091, + 0.092, + 0.093, + 0.094, + 0.095, + 0.096, + 0.098005, + 0.098, + 0.099, + 0.1, + 0.101, + 0.102, + 0.103, + 0.104, + 0.105, + 0.106, + 0.107, + 0.108, + 0.109, + 0.11, + 0.111, + 0.112, + 0.113, + 0.114, + 0.115, + 0.116, + 0.117, + 0.118, + 0.119, + 0.12, + 0.121, + 0.122, + 0.123, + 0.124, + 0.125, + 0.126, + 0.127, + 0.128, + 0.130005, + 0.13, + 0.131, + 0.132, + 0.133, + 0.134, + 0.135, + 0.136, + 0.137, + 0.138, + 0.139, + 0.14, + 0.141, + 0.142, + 0.143, + 0.144, + 0.145, + 0.146, + 0.147, + 0.148, + 0.149, + 0.15, + 0.151, + 0.152, + 0.153, + 0.154, + 0.155, + 0.156, + 0.157, + 0.158, + 0.159, + 0.16, + 0.162005, + 0.162, + 0.163, + 0.164, + 0.165, + 0.166, + 0.167, + 0.168, + 0.169, + 0.17, + 0.171, + 0.172, + 0.173, + 0.174, + 0.175, + 0.176, + 0.177, + 0.178, + 0.179, + 0.18, + 0.181, + 0.182, + 0.183, + 0.184, + 0.185, + 0.186, + 0.187, + 0.188, + 0.189, + 0.19, + 0.191, + 0.192, + 0.194005, + 0.194, + 0.195, + 0.196, + 0.197, + 0.198, + 0.199, + 0.2, + 0.201, + 0.202, + 0.203, + 0.204, + 0.205, + 0.206, + 0.207, + 0.208, + 0.209, + 0.21, + 0.211, + 0.212, + 0.213, + 0.214, + 0.215, + 0.216, + 0.217, + 0.218, + 0.219, + 0.22, + 0.221, + 0.222, + 0.223, + 0.224, + 0.226005, + 0.226, + 0.227, + 0.228, + 0.229, + 0.23, + 0.231, + 0.232, + 0.233, + 0.234, + 0.235, + 0.236, + 0.237, + 0.238, + 0.239, + 0.24, + 0.241, + 0.242, + 0.243, + 0.244, + 0.245, + 0.246, + 0.247, + 0.248, + 0.249, + 0.25, + 0.251, + 0.252, + 0.253, + 0.254, + 0.255, + 0.256, + 0.258005, + 0.258, + 0.259, + 0.26, + 0.261, + 0.262, + 0.263, + 0.264, + 0.265, + 0.266, + 0.267, + 0.268, + 0.269, + 0.27, + 0.271, + 0.272, + 0.273, + 0.274, + 0.275, + 0.276, + 0.277, + 0.278, + 0.279, + 0.28, + 0.281, + 0.282, + 0.283, + 0.284, + 0.285, + 0.286, + 0.287, + 0.288, + 0.290005, + 0.29, + 0.291, + 0.292, + 0.293, + 0.294, + 0.295, + 0.296, + 0.297, + 0.298, + 0.299, + 0.3, + 0.301, + 0.302, + 0.303, + 0.304, + 0.305, + 0.306, + 0.307, + 0.308, + 0.309, + 0.31, + 0.311, + 0.312, + 0.313, + 0.314, + 0.315, + 0.316, + 0.317, + 0.318, + 0.319, + 0.32, + 0.322005, + 0.322, + 0.323, + 0.324, + 0.325, + 0.326, + 0.327, + 0.328, + 0.329, + 0.33, + 0.331, + 0.332, + 0.333, + 0.334, + 0.335, + 0.336, + 0.337, + 0.338, + 0.339, + 0.34, + 0.341, + 0.342, + 0.343, + 0.344, + 0.345, + 0.346, + 0.347, + 0.348, + 0.349, + 0.35, + 0.351, + 0.352, + 0.354005, + 0.354, + 0.355, + 0.356, + 0.357, + 0.358, + 0.359, + 0.36, + 0.361, + 0.362, + 0.363, + 0.364, + 0.365, + 0.366, + 0.367, + 0.368, + 0.369, + 0.37, + 0.371, + 0.372, + 0.373, + 0.374, + 0.375, + 0.376, + 0.377, + 0.378, + 0.379, + 0.38, + 0.381, + 0.382, + 0.383, + 0.384, + 0.386005, + 0.386, + 0.387, + 0.388, + 0.389, + 0.39, + 0.391, + 0.392, + 0.393, + 0.394, + 0.395, + 0.396, + 0.397, + 0.398, + 0.399, + 0.4, + 0.401, + 0.402, + 0.403, + 0.404, + 0.405, + 0.406, + 0.407, + 0.408, + 0.409, + 0.41, + 0.411, + 0.412, + 0.413, + 0.414, + 0.415, + 0.416, + 0.418005, + 0.418, + 0.419, + 0.42, + 0.421, + 0.422, + 0.423, + 0.424, + 0.425, + 0.426, + 0.427, + 0.428, + 0.429, + 0.43, + 0.431, + 0.432, + 0.433, + 0.434, + 0.435, + 0.436, + 0.437, + 0.438, + 0.439, + 0.44, + 0.441, + 0.442, + 0.443, + 0.444, + 0.445, + 0.446, + 0.447, + 0.448, + 0.450005, + 0.45, + 0.451, + 0.452, + 0.453, + 0.454, + 0.455, + 0.456, + 0.457, + 0.458, + 0.459, + 0.46, + 0.461, + 0.462, + 0.463, + 0.464, + 0.465, + 0.466, + 0.467, + 0.468, + 0.469, + 0.47, + 0.471, + 0.472, + 0.473, + 0.474, + 0.475, + 0.476, + 0.477, + 0.478, + 0.479, + 0.48, + 0.482005, + 0.482, + 0.483, + 0.484, + 0.485, + 0.486, + 0.487, + 0.488, + 0.489, + 0.49, + 0.491, + 0.492, + 0.493, + 0.494, + 0.495, + 0.496, + 0.497, + 0.498, + 0.499, + 0.5, + 0.501, + 0.502, + 0.503, + 0.504, + 0.505, + 0.506, + 0.507, + 0.508, + 0.509, + 0.51, + 0.511, + 0.512, + 0.514005, + 0.514, + 0.515, + 0.516, + 0.517, + 0.518, + 0.519, + 0.52, + 0.521, + 0.522, + 0.523, + 0.524, + 0.525, + 0.526, + 0.527, + 0.528, + 0.529, + 0.53, + 0.531, + 0.532, + 0.533, + 0.534, + 0.535, + 0.536, + 0.537, + 0.538, + 0.539, + 0.54, + 0.541, + 0.542, + 0.543, + 0.544, + 0.546005, + 0.546, + 0.547, + 0.548, + 0.549, + 0.55, + 0.551, + 0.552, + 0.553, + 0.554, + 0.555, + 0.556, + 0.557, + 0.558, + 0.559, + 0.56, + 0.561, + 0.562, + 0.563, + 0.564, + 0.565, + 0.566, + 0.567, + 0.568, + 0.569, + 0.57, + 0.571, + 0.572, + 0.573, + 0.574, + 0.575, + 0.576, + 0.578005, + 0.578, + 0.579, + 0.58, + 0.581, + 0.582, + 0.583, + 0.584, + 0.585, + 0.586, + 0.587, + 0.588, + 0.589, + 0.59, + 0.591, + 0.592, + 0.593, + 0.594, + 0.595, + 0.596, + 0.597, + 0.598, + 0.599, + 0.6, + 0.601, + 0.602, + 0.603, + 0.604, + 0.605, + 0.606, + 0.607, + 0.608, + 0.610005, + 0.61, + 0.611, + 0.612, + 0.613, + 0.614, + 0.615, + 0.616, + 0.617, + 0.618, + 0.619, + 0.62, + 0.621, + 0.622, + 0.623, + 0.624, + 0.625, + 0.626, + 0.627, + 0.628, + 0.629, + 0.63, + 0.631, + 0.632, + 0.633, + 0.634, + 0.635, + 0.636, + 0.637, + 0.638, + 0.639, + 0.64, + 0.642005, + 0.642, + 0.643, + 0.644, + 0.645, + 0.646, + 0.647, + 0.648, + 0.649, + 0.65, + 0.651, + 0.652, + 0.653, + 0.654, + 0.655, + 0.656, + 0.657, + 0.658, + 0.659, + 0.66, + 0.661, + 0.662, + 0.663, + 0.664, + 0.665, + 0.666, + 0.667, + 0.668, + 0.669, + 0.67, + 0.671, + 0.672, + 0.674005, + 0.674, + 0.675, + 0.676, + 0.677, + 0.678, + 0.679, + 0.68, + 0.681, + 0.682, + 0.683, + 0.684, + 0.685, + 0.686, + 0.687, + 0.688, + 0.689, + 0.69, + 0.691, + 0.692, + 0.693, + 0.694, + 0.695, + 0.696, + 0.697, + 0.698, + 0.699, + 0.7, + 0.701, + 0.702, + 0.703, + 0.704, + 0.706005, + 0.706, + 0.707, + 0.708, + 0.709, + 0.71, + 0.711, + 0.712, + 0.713, + 0.714, + 0.715, + 0.716, + 0.717, + 0.718, + 0.719, + 0.72, + 0.721, + 0.722, + 0.723, + 0.724, + 0.725, + 0.726, + 0.727, + 0.728, + 0.729, + 0.73, + 0.731, + 0.732, + 0.733, + 0.734, + 0.735, + 0.736, + 0.738005, + 0.738, + 0.739, + 0.74, + 0.741, + 0.742, + 0.743, + 0.744, + 0.745, + 0.746, + 0.747, + 0.748, + 0.749, + 0.75, + 0.751, + 0.752, + 0.753, + 0.754, + 0.755, + 0.756, + 0.757, + 0.758, + 0.759, + 0.76, + 0.761, + 0.762, + 0.763, + 0.764, + 0.765, + 0.766, + 0.767, + 0.768 + ], + "synthesized_from_cluster_size": 2, + "origin_node_id": "QmcsYpRedtij43idB99ZgHkFX6UNiisndcx7GxPan4dbRC", + "created_at": "2026-05-01T00:29:59.000Z", + "signed_at": "2026-05-01T00:31:00.000Z", + "evidence_root": "QmPQHaufdSfx11srT19JwtLykTMfuXyVv3CPLFur6hRU9Z", + "evidence_count": 4, + "prev_lesson_hash": null, + "maturity_age_days": 1, + "useful_count": 0, + "signature": "ETz+KuFvZM62+gBYbHvA8brCHiohDGZUa+pkQF21Xdh5dKcFGuPQnrJiZbQ2hluFN4TV1WjP3/969BEqYMjyDA==" + }, + { + "spec_version": "1.1", + "id": "44444444-5555-4666-8777-eeeeeeeeee02", + "content": "Wave-4 echo-chamber cohort: four peers re-broadcast a consensus lesson with no independent evidence chain, while one peer dissents with a heterodox lesson. §10.4 should clamp local_weight below the broadcast firebreak at over_concentration = 4/5 = 0.8 — the dissenter's presence MUST NOT save the consensus from the firebreak. See docs/wave-4-anti-echo.md.", + "embedding": [ + 0.00201, + 0.002, + 0.003, + 0.004, + 0.005, + 0.006, + 0.007, + 0.008, + 0.009, + 0.01, + 0.011, + 0.012, + 0.013, + 0.014, + 0.015, + 0.016, + 0.017, + 0.018, + 0.019, + 0.02, + 0.021, + 0.022, + 0.023, + 0.024, + 0.025, + 0.026, + 0.027, + 0.028, + 0.029, + 0.03, + 0.031, + 0.032, + 0.03401, + 0.034, + 0.035, + 0.036, + 0.037, + 0.038, + 0.039, + 0.04, + 0.041, + 0.042, + 0.043, + 0.044, + 0.045, + 0.046, + 0.047, + 0.048, + 0.049, + 0.05, + 0.051, + 0.052, + 0.053, + 0.054, + 0.055, + 0.056, + 0.057, + 0.058, + 0.059, + 0.06, + 0.061, + 0.062, + 0.063, + 0.064, + 0.06601, + 0.066, + 0.067, + 0.068, + 0.069, + 0.07, + 0.071, + 0.072, + 0.073, + 0.074, + 0.075, + 0.076, + 0.077, + 0.078, + 0.079, + 0.08, + 0.081, + 0.082, + 0.083, + 0.084, + 0.085, + 0.086, + 0.087, + 0.088, + 0.089, + 0.09, + 0.091, + 0.092, + 0.093, + 0.094, + 0.095, + 0.096, + 0.09801, + 0.098, + 0.099, + 0.1, + 0.101, + 0.102, + 0.103, + 0.104, + 0.105, + 0.106, + 0.107, + 0.108, + 0.109, + 0.11, + 0.111, + 0.112, + 0.113, + 0.114, + 0.115, + 0.116, + 0.117, + 0.118, + 0.119, + 0.12, + 0.121, + 0.122, + 0.123, + 0.124, + 0.125, + 0.126, + 0.127, + 0.128, + 0.13001, + 0.13, + 0.131, + 0.132, + 0.133, + 0.134, + 0.135, + 0.136, + 0.137, + 0.138, + 0.139, + 0.14, + 0.141, + 0.142, + 0.143, + 0.144, + 0.145, + 0.146, + 0.147, + 0.148, + 0.149, + 0.15, + 0.151, + 0.152, + 0.153, + 0.154, + 0.155, + 0.156, + 0.157, + 0.158, + 0.159, + 0.16, + 0.16201, + 0.162, + 0.163, + 0.164, + 0.165, + 0.166, + 0.167, + 0.168, + 0.169, + 0.17, + 0.171, + 0.172, + 0.173, + 0.174, + 0.175, + 0.176, + 0.177, + 0.178, + 0.179, + 0.18, + 0.181, + 0.182, + 0.183, + 0.184, + 0.185, + 0.186, + 0.187, + 0.188, + 0.189, + 0.19, + 0.191, + 0.192, + 0.19401, + 0.194, + 0.195, + 0.196, + 0.197, + 0.198, + 0.199, + 0.2, + 0.201, + 0.202, + 0.203, + 0.204, + 0.205, + 0.206, + 0.207, + 0.208, + 0.209, + 0.21, + 0.211, + 0.212, + 0.213, + 0.214, + 0.215, + 0.216, + 0.217, + 0.218, + 0.219, + 0.22, + 0.221, + 0.222, + 0.223, + 0.224, + 0.22601, + 0.226, + 0.227, + 0.228, + 0.229, + 0.23, + 0.231, + 0.232, + 0.233, + 0.234, + 0.235, + 0.236, + 0.237, + 0.238, + 0.239, + 0.24, + 0.241, + 0.242, + 0.243, + 0.244, + 0.245, + 0.246, + 0.247, + 0.248, + 0.249, + 0.25, + 0.251, + 0.252, + 0.253, + 0.254, + 0.255, + 0.256, + 0.25801, + 0.258, + 0.259, + 0.26, + 0.261, + 0.262, + 0.263, + 0.264, + 0.265, + 0.266, + 0.267, + 0.268, + 0.269, + 0.27, + 0.271, + 0.272, + 0.273, + 0.274, + 0.275, + 0.276, + 0.277, + 0.278, + 0.279, + 0.28, + 0.281, + 0.282, + 0.283, + 0.284, + 0.285, + 0.286, + 0.287, + 0.288, + 0.29001, + 0.29, + 0.291, + 0.292, + 0.293, + 0.294, + 0.295, + 0.296, + 0.297, + 0.298, + 0.299, + 0.3, + 0.301, + 0.302, + 0.303, + 0.304, + 0.305, + 0.306, + 0.307, + 0.308, + 0.309, + 0.31, + 0.311, + 0.312, + 0.313, + 0.314, + 0.315, + 0.316, + 0.317, + 0.318, + 0.319, + 0.32, + 0.32201, + 0.322, + 0.323, + 0.324, + 0.325, + 0.326, + 0.327, + 0.328, + 0.329, + 0.33, + 0.331, + 0.332, + 0.333, + 0.334, + 0.335, + 0.336, + 0.337, + 0.338, + 0.339, + 0.34, + 0.341, + 0.342, + 0.343, + 0.344, + 0.345, + 0.346, + 0.347, + 0.348, + 0.349, + 0.35, + 0.351, + 0.352, + 0.35401, + 0.354, + 0.355, + 0.356, + 0.357, + 0.358, + 0.359, + 0.36, + 0.361, + 0.362, + 0.363, + 0.364, + 0.365, + 0.366, + 0.367, + 0.368, + 0.369, + 0.37, + 0.371, + 0.372, + 0.373, + 0.374, + 0.375, + 0.376, + 0.377, + 0.378, + 0.379, + 0.38, + 0.381, + 0.382, + 0.383, + 0.384, + 0.38601, + 0.386, + 0.387, + 0.388, + 0.389, + 0.39, + 0.391, + 0.392, + 0.393, + 0.394, + 0.395, + 0.396, + 0.397, + 0.398, + 0.399, + 0.4, + 0.401, + 0.402, + 0.403, + 0.404, + 0.405, + 0.406, + 0.407, + 0.408, + 0.409, + 0.41, + 0.411, + 0.412, + 0.413, + 0.414, + 0.415, + 0.416, + 0.41801, + 0.418, + 0.419, + 0.42, + 0.421, + 0.422, + 0.423, + 0.424, + 0.425, + 0.426, + 0.427, + 0.428, + 0.429, + 0.43, + 0.431, + 0.432, + 0.433, + 0.434, + 0.435, + 0.436, + 0.437, + 0.438, + 0.439, + 0.44, + 0.441, + 0.442, + 0.443, + 0.444, + 0.445, + 0.446, + 0.447, + 0.448, + 0.45001, + 0.45, + 0.451, + 0.452, + 0.453, + 0.454, + 0.455, + 0.456, + 0.457, + 0.458, + 0.459, + 0.46, + 0.461, + 0.462, + 0.463, + 0.464, + 0.465, + 0.466, + 0.467, + 0.468, + 0.469, + 0.47, + 0.471, + 0.472, + 0.473, + 0.474, + 0.475, + 0.476, + 0.477, + 0.478, + 0.479, + 0.48, + 0.48201, + 0.482, + 0.483, + 0.484, + 0.485, + 0.486, + 0.487, + 0.488, + 0.489, + 0.49, + 0.491, + 0.492, + 0.493, + 0.494, + 0.495, + 0.496, + 0.497, + 0.498, + 0.499, + 0.5, + 0.501, + 0.502, + 0.503, + 0.504, + 0.505, + 0.506, + 0.507, + 0.508, + 0.509, + 0.51, + 0.511, + 0.512, + 0.51401, + 0.514, + 0.515, + 0.516, + 0.517, + 0.518, + 0.519, + 0.52, + 0.521, + 0.522, + 0.523, + 0.524, + 0.525, + 0.526, + 0.527, + 0.528, + 0.529, + 0.53, + 0.531, + 0.532, + 0.533, + 0.534, + 0.535, + 0.536, + 0.537, + 0.538, + 0.539, + 0.54, + 0.541, + 0.542, + 0.543, + 0.544, + 0.54601, + 0.546, + 0.547, + 0.548, + 0.549, + 0.55, + 0.551, + 0.552, + 0.553, + 0.554, + 0.555, + 0.556, + 0.557, + 0.558, + 0.559, + 0.56, + 0.561, + 0.562, + 0.563, + 0.564, + 0.565, + 0.566, + 0.567, + 0.568, + 0.569, + 0.57, + 0.571, + 0.572, + 0.573, + 0.574, + 0.575, + 0.576, + 0.57801, + 0.578, + 0.579, + 0.58, + 0.581, + 0.582, + 0.583, + 0.584, + 0.585, + 0.586, + 0.587, + 0.588, + 0.589, + 0.59, + 0.591, + 0.592, + 0.593, + 0.594, + 0.595, + 0.596, + 0.597, + 0.598, + 0.599, + 0.6, + 0.601, + 0.602, + 0.603, + 0.604, + 0.605, + 0.606, + 0.607, + 0.608, + 0.61001, + 0.61, + 0.611, + 0.612, + 0.613, + 0.614, + 0.615, + 0.616, + 0.617, + 0.618, + 0.619, + 0.62, + 0.621, + 0.622, + 0.623, + 0.624, + 0.625, + 0.626, + 0.627, + 0.628, + 0.629, + 0.63, + 0.631, + 0.632, + 0.633, + 0.634, + 0.635, + 0.636, + 0.637, + 0.638, + 0.639, + 0.64, + 0.64201, + 0.642, + 0.643, + 0.644, + 0.645, + 0.646, + 0.647, + 0.648, + 0.649, + 0.65, + 0.651, + 0.652, + 0.653, + 0.654, + 0.655, + 0.656, + 0.657, + 0.658, + 0.659, + 0.66, + 0.661, + 0.662, + 0.663, + 0.664, + 0.665, + 0.666, + 0.667, + 0.668, + 0.669, + 0.67, + 0.671, + 0.672, + 0.67401, + 0.674, + 0.675, + 0.676, + 0.677, + 0.678, + 0.679, + 0.68, + 0.681, + 0.682, + 0.683, + 0.684, + 0.685, + 0.686, + 0.687, + 0.688, + 0.689, + 0.69, + 0.691, + 0.692, + 0.693, + 0.694, + 0.695, + 0.696, + 0.697, + 0.698, + 0.699, + 0.7, + 0.701, + 0.702, + 0.703, + 0.704, + 0.70601, + 0.706, + 0.707, + 0.708, + 0.709, + 0.71, + 0.711, + 0.712, + 0.713, + 0.714, + 0.715, + 0.716, + 0.717, + 0.718, + 0.719, + 0.72, + 0.721, + 0.722, + 0.723, + 0.724, + 0.725, + 0.726, + 0.727, + 0.728, + 0.729, + 0.73, + 0.731, + 0.732, + 0.733, + 0.734, + 0.735, + 0.736, + 0.73801, + 0.738, + 0.739, + 0.74, + 0.741, + 0.742, + 0.743, + 0.744, + 0.745, + 0.746, + 0.747, + 0.748, + 0.749, + 0.75, + 0.751, + 0.752, + 0.753, + 0.754, + 0.755, + 0.756, + 0.757, + 0.758, + 0.759, + 0.76, + 0.761, + 0.762, + 0.763, + 0.764, + 0.765, + 0.766, + 0.767, + 0.768 + ], + "synthesized_from_cluster_size": 2, + "origin_node_id": "QmeUZpeX9z3BnSquAjkaTUq3TRtQYHpCeupaNd9PdpW9t3", + "created_at": "2026-05-01T00:29:59.000Z", + "signed_at": "2026-05-01T00:32:00.000Z", + "evidence_root": "QmPQHaufdSfx11srT19JwtLykTMfuXyVv3CPLFur6hRU9Z", + "evidence_count": 4, + "prev_lesson_hash": null, + "maturity_age_days": 1, + "useful_count": 0, + "signature": "epJP8xDOCxsdubFF3Dc5s+6MZQ583beIuGoN/Jh7YxDe89bxx/zCFV2tO5OHOqv1zuCkqYYtFUDbXd2+rtNjDw==" + }, + { + "spec_version": "1.1", + "id": "44444444-5555-4666-8777-eeeeeeeeee03", + "content": "Wave-4 echo-chamber cohort: four peers re-broadcast a consensus lesson with no independent evidence chain, while one peer dissents with a heterodox lesson. §10.4 should clamp local_weight below the broadcast firebreak at over_concentration = 4/5 = 0.8 — the dissenter's presence MUST NOT save the consensus from the firebreak. See docs/wave-4-anti-echo.md.", + "embedding": [ + 0.002015, + 0.002, + 0.003, + 0.004, + 0.005, + 0.006, + 0.007, + 0.008, + 0.009, + 0.01, + 0.011, + 0.012, + 0.013, + 0.014, + 0.015, + 0.016, + 0.017, + 0.018, + 0.019, + 0.02, + 0.021, + 0.022, + 0.023, + 0.024, + 0.025, + 0.026, + 0.027, + 0.028, + 0.029, + 0.03, + 0.031, + 0.032, + 0.034015, + 0.034, + 0.035, + 0.036, + 0.037, + 0.038, + 0.039, + 0.04, + 0.041, + 0.042, + 0.043, + 0.044, + 0.045, + 0.046, + 0.047, + 0.048, + 0.049, + 0.05, + 0.051, + 0.052, + 0.053, + 0.054, + 0.055, + 0.056, + 0.057, + 0.058, + 0.059, + 0.06, + 0.061, + 0.062, + 0.063, + 0.064, + 0.066015, + 0.066, + 0.067, + 0.068, + 0.069, + 0.07, + 0.071, + 0.072, + 0.073, + 0.074, + 0.075, + 0.076, + 0.077, + 0.078, + 0.079, + 0.08, + 0.081, + 0.082, + 0.083, + 0.084, + 0.085, + 0.086, + 0.087, + 0.088, + 0.089, + 0.09, + 0.091, + 0.092, + 0.093, + 0.094, + 0.095, + 0.096, + 0.098015, + 0.098, + 0.099, + 0.1, + 0.101, + 0.102, + 0.103, + 0.104, + 0.105, + 0.106, + 0.107, + 0.108, + 0.109, + 0.11, + 0.111, + 0.112, + 0.113, + 0.114, + 0.115, + 0.116, + 0.117, + 0.118, + 0.119, + 0.12, + 0.121, + 0.122, + 0.123, + 0.124, + 0.125, + 0.126, + 0.127, + 0.128, + 0.130015, + 0.13, + 0.131, + 0.132, + 0.133, + 0.134, + 0.135, + 0.136, + 0.137, + 0.138, + 0.139, + 0.14, + 0.141, + 0.142, + 0.143, + 0.144, + 0.145, + 0.146, + 0.147, + 0.148, + 0.149, + 0.15, + 0.151, + 0.152, + 0.153, + 0.154, + 0.155, + 0.156, + 0.157, + 0.158, + 0.159, + 0.16, + 0.162015, + 0.162, + 0.163, + 0.164, + 0.165, + 0.166, + 0.167, + 0.168, + 0.169, + 0.17, + 0.171, + 0.172, + 0.173, + 0.174, + 0.175, + 0.176, + 0.177, + 0.178, + 0.179, + 0.18, + 0.181, + 0.182, + 0.183, + 0.184, + 0.185, + 0.186, + 0.187, + 0.188, + 0.189, + 0.19, + 0.191, + 0.192, + 0.194015, + 0.194, + 0.195, + 0.196, + 0.197, + 0.198, + 0.199, + 0.2, + 0.201, + 0.202, + 0.203, + 0.204, + 0.205, + 0.206, + 0.207, + 0.208, + 0.209, + 0.21, + 0.211, + 0.212, + 0.213, + 0.214, + 0.215, + 0.216, + 0.217, + 0.218, + 0.219, + 0.22, + 0.221, + 0.222, + 0.223, + 0.224, + 0.226015, + 0.226, + 0.227, + 0.228, + 0.229, + 0.23, + 0.231, + 0.232, + 0.233, + 0.234, + 0.235, + 0.236, + 0.237, + 0.238, + 0.239, + 0.24, + 0.241, + 0.242, + 0.243, + 0.244, + 0.245, + 0.246, + 0.247, + 0.248, + 0.249, + 0.25, + 0.251, + 0.252, + 0.253, + 0.254, + 0.255, + 0.256, + 0.258015, + 0.258, + 0.259, + 0.26, + 0.261, + 0.262, + 0.263, + 0.264, + 0.265, + 0.266, + 0.267, + 0.268, + 0.269, + 0.27, + 0.271, + 0.272, + 0.273, + 0.274, + 0.275, + 0.276, + 0.277, + 0.278, + 0.279, + 0.28, + 0.281, + 0.282, + 0.283, + 0.284, + 0.285, + 0.286, + 0.287, + 0.288, + 0.290015, + 0.29, + 0.291, + 0.292, + 0.293, + 0.294, + 0.295, + 0.296, + 0.297, + 0.298, + 0.299, + 0.3, + 0.301, + 0.302, + 0.303, + 0.304, + 0.305, + 0.306, + 0.307, + 0.308, + 0.309, + 0.31, + 0.311, + 0.312, + 0.313, + 0.314, + 0.315, + 0.316, + 0.317, + 0.318, + 0.319, + 0.32, + 0.322015, + 0.322, + 0.323, + 0.324, + 0.325, + 0.326, + 0.327, + 0.328, + 0.329, + 0.33, + 0.331, + 0.332, + 0.333, + 0.334, + 0.335, + 0.336, + 0.337, + 0.338, + 0.339, + 0.34, + 0.341, + 0.342, + 0.343, + 0.344, + 0.345, + 0.346, + 0.347, + 0.348, + 0.349, + 0.35, + 0.351, + 0.352, + 0.354015, + 0.354, + 0.355, + 0.356, + 0.357, + 0.358, + 0.359, + 0.36, + 0.361, + 0.362, + 0.363, + 0.364, + 0.365, + 0.366, + 0.367, + 0.368, + 0.369, + 0.37, + 0.371, + 0.372, + 0.373, + 0.374, + 0.375, + 0.376, + 0.377, + 0.378, + 0.379, + 0.38, + 0.381, + 0.382, + 0.383, + 0.384, + 0.386015, + 0.386, + 0.387, + 0.388, + 0.389, + 0.39, + 0.391, + 0.392, + 0.393, + 0.394, + 0.395, + 0.396, + 0.397, + 0.398, + 0.399, + 0.4, + 0.401, + 0.402, + 0.403, + 0.404, + 0.405, + 0.406, + 0.407, + 0.408, + 0.409, + 0.41, + 0.411, + 0.412, + 0.413, + 0.414, + 0.415, + 0.416, + 0.418015, + 0.418, + 0.419, + 0.42, + 0.421, + 0.422, + 0.423, + 0.424, + 0.425, + 0.426, + 0.427, + 0.428, + 0.429, + 0.43, + 0.431, + 0.432, + 0.433, + 0.434, + 0.435, + 0.436, + 0.437, + 0.438, + 0.439, + 0.44, + 0.441, + 0.442, + 0.443, + 0.444, + 0.445, + 0.446, + 0.447, + 0.448, + 0.450015, + 0.45, + 0.451, + 0.452, + 0.453, + 0.454, + 0.455, + 0.456, + 0.457, + 0.458, + 0.459, + 0.46, + 0.461, + 0.462, + 0.463, + 0.464, + 0.465, + 0.466, + 0.467, + 0.468, + 0.469, + 0.47, + 0.471, + 0.472, + 0.473, + 0.474, + 0.475, + 0.476, + 0.477, + 0.478, + 0.479, + 0.48, + 0.482015, + 0.482, + 0.483, + 0.484, + 0.485, + 0.486, + 0.487, + 0.488, + 0.489, + 0.49, + 0.491, + 0.492, + 0.493, + 0.494, + 0.495, + 0.496, + 0.497, + 0.498, + 0.499, + 0.5, + 0.501, + 0.502, + 0.503, + 0.504, + 0.505, + 0.506, + 0.507, + 0.508, + 0.509, + 0.51, + 0.511, + 0.512, + 0.514015, + 0.514, + 0.515, + 0.516, + 0.517, + 0.518, + 0.519, + 0.52, + 0.521, + 0.522, + 0.523, + 0.524, + 0.525, + 0.526, + 0.527, + 0.528, + 0.529, + 0.53, + 0.531, + 0.532, + 0.533, + 0.534, + 0.535, + 0.536, + 0.537, + 0.538, + 0.539, + 0.54, + 0.541, + 0.542, + 0.543, + 0.544, + 0.546015, + 0.546, + 0.547, + 0.548, + 0.549, + 0.55, + 0.551, + 0.552, + 0.553, + 0.554, + 0.555, + 0.556, + 0.557, + 0.558, + 0.559, + 0.56, + 0.561, + 0.562, + 0.563, + 0.564, + 0.565, + 0.566, + 0.567, + 0.568, + 0.569, + 0.57, + 0.571, + 0.572, + 0.573, + 0.574, + 0.575, + 0.576, + 0.578015, + 0.578, + 0.579, + 0.58, + 0.581, + 0.582, + 0.583, + 0.584, + 0.585, + 0.586, + 0.587, + 0.588, + 0.589, + 0.59, + 0.591, + 0.592, + 0.593, + 0.594, + 0.595, + 0.596, + 0.597, + 0.598, + 0.599, + 0.6, + 0.601, + 0.602, + 0.603, + 0.604, + 0.605, + 0.606, + 0.607, + 0.608, + 0.610015, + 0.61, + 0.611, + 0.612, + 0.613, + 0.614, + 0.615, + 0.616, + 0.617, + 0.618, + 0.619, + 0.62, + 0.621, + 0.622, + 0.623, + 0.624, + 0.625, + 0.626, + 0.627, + 0.628, + 0.629, + 0.63, + 0.631, + 0.632, + 0.633, + 0.634, + 0.635, + 0.636, + 0.637, + 0.638, + 0.639, + 0.64, + 0.642015, + 0.642, + 0.643, + 0.644, + 0.645, + 0.646, + 0.647, + 0.648, + 0.649, + 0.65, + 0.651, + 0.652, + 0.653, + 0.654, + 0.655, + 0.656, + 0.657, + 0.658, + 0.659, + 0.66, + 0.661, + 0.662, + 0.663, + 0.664, + 0.665, + 0.666, + 0.667, + 0.668, + 0.669, + 0.67, + 0.671, + 0.672, + 0.674015, + 0.674, + 0.675, + 0.676, + 0.677, + 0.678, + 0.679, + 0.68, + 0.681, + 0.682, + 0.683, + 0.684, + 0.685, + 0.686, + 0.687, + 0.688, + 0.689, + 0.69, + 0.691, + 0.692, + 0.693, + 0.694, + 0.695, + 0.696, + 0.697, + 0.698, + 0.699, + 0.7, + 0.701, + 0.702, + 0.703, + 0.704, + 0.706015, + 0.706, + 0.707, + 0.708, + 0.709, + 0.71, + 0.711, + 0.712, + 0.713, + 0.714, + 0.715, + 0.716, + 0.717, + 0.718, + 0.719, + 0.72, + 0.721, + 0.722, + 0.723, + 0.724, + 0.725, + 0.726, + 0.727, + 0.728, + 0.729, + 0.73, + 0.731, + 0.732, + 0.733, + 0.734, + 0.735, + 0.736, + 0.738015, + 0.738, + 0.739, + 0.74, + 0.741, + 0.742, + 0.743, + 0.744, + 0.745, + 0.746, + 0.747, + 0.748, + 0.749, + 0.75, + 0.751, + 0.752, + 0.753, + 0.754, + 0.755, + 0.756, + 0.757, + 0.758, + 0.759, + 0.76, + 0.761, + 0.762, + 0.763, + 0.764, + 0.765, + 0.766, + 0.767, + 0.768 + ], + "synthesized_from_cluster_size": 2, + "origin_node_id": "QmevpThrKKeTkYQYA4rwoj2eFjfRcXqpJWakCYRdHvQV76", + "created_at": "2026-05-01T00:29:59.000Z", + "signed_at": "2026-05-01T00:33:00.000Z", + "evidence_root": "QmPQHaufdSfx11srT19JwtLykTMfuXyVv3CPLFur6hRU9Z", + "evidence_count": 4, + "prev_lesson_hash": null, + "maturity_age_days": 1, + "useful_count": 0, + "signature": "IigcfgMIh5SGuYbiTo+g7LFECtg2zTpMkfMXDzn+0d9W2hXSijd7ODjt1D6BF71Ezxr0TdAjSonVAh0UKxOPDQ==" + }, + { + "spec_version": "1.1", + "id": "44444444-5555-4666-8777-ffffffffff04", + "content": "Wave-4 echo-chamber dissenter: a single peer in the otherwise-converged cohort holds a heterodox lesson with its own evidence chain. Demonstrates the cohort has real diversity (4 of 5 = 80% concentration), not a 5-way sock-puppet set.", + "embedding": [ + 0.768, + 0.767, + 0.766, + 0.765, + 0.764, + 0.763, + 0.762, + 0.761, + 0.76, + 0.759, + 0.758, + 0.757, + 0.756, + 0.755, + 0.754, + 0.753, + 0.752, + 0.751, + 0.75, + 0.749, + 0.748, + 0.747, + 0.746, + 0.745, + 0.744, + 0.743, + 0.742, + 0.741, + 0.74, + 0.739, + 0.738, + 0.737, + 0.736, + 0.735, + 0.734, + 0.733, + 0.732, + 0.731, + 0.73, + 0.729, + 0.728, + 0.727, + 0.726, + 0.725, + 0.724, + 0.723, + 0.722, + 0.721, + 0.72, + 0.719, + 0.718, + 0.717, + 0.716, + 0.715, + 0.714, + 0.713, + 0.712, + 0.711, + 0.71, + 0.709, + 0.708, + 0.707, + 0.706, + 0.705, + 0.704, + 0.703, + 0.702, + 0.701, + 0.7, + 0.699, + 0.698, + 0.697, + 0.696, + 0.695, + 0.694, + 0.693, + 0.692, + 0.691, + 0.69, + 0.689, + 0.688, + 0.687, + 0.686, + 0.685, + 0.684, + 0.683, + 0.682, + 0.681, + 0.68, + 0.679, + 0.678, + 0.677, + 0.676, + 0.675, + 0.674, + 0.673, + 0.672, + 0.671, + 0.67, + 0.669, + 0.668, + 0.667, + 0.666, + 0.665, + 0.664, + 0.663, + 0.662, + 0.661, + 0.66, + 0.659, + 0.658, + 0.657, + 0.656, + 0.655, + 0.654, + 0.653, + 0.652, + 0.651, + 0.65, + 0.649, + 0.648, + 0.647, + 0.646, + 0.645, + 0.644, + 0.643, + 0.642, + 0.641, + 0.64, + 0.639, + 0.638, + 0.637, + 0.636, + 0.635, + 0.634, + 0.633, + 0.632, + 0.631, + 0.63, + 0.629, + 0.628, + 0.627, + 0.626, + 0.625, + 0.624, + 0.623, + 0.622, + 0.621, + 0.62, + 0.619, + 0.618, + 0.617, + 0.616, + 0.615, + 0.614, + 0.613, + 0.612, + 0.611, + 0.61, + 0.609, + 0.608, + 0.607, + 0.606, + 0.605, + 0.604, + 0.603, + 0.602, + 0.601, + 0.6, + 0.599, + 0.598, + 0.597, + 0.596, + 0.595, + 0.594, + 0.593, + 0.592, + 0.591, + 0.59, + 0.589, + 0.588, + 0.587, + 0.586, + 0.585, + 0.584, + 0.583, + 0.582, + 0.581, + 0.58, + 0.579, + 0.578, + 0.577, + 0.576, + 0.575, + 0.574, + 0.573, + 0.572, + 0.571, + 0.57, + 0.569, + 0.568, + 0.567, + 0.566, + 0.565, + 0.564, + 0.563, + 0.562, + 0.561, + 0.56, + 0.559, + 0.558, + 0.557, + 0.556, + 0.555, + 0.554, + 0.553, + 0.552, + 0.551, + 0.55, + 0.549, + 0.548, + 0.547, + 0.546, + 0.545, + 0.544, + 0.543, + 0.542, + 0.541, + 0.54, + 0.539, + 0.538, + 0.537, + 0.536, + 0.535, + 0.534, + 0.533, + 0.532, + 0.531, + 0.53, + 0.529, + 0.528, + 0.527, + 0.526, + 0.525, + 0.524, + 0.523, + 0.522, + 0.521, + 0.52, + 0.519, + 0.518, + 0.517, + 0.516, + 0.515, + 0.514, + 0.513, + 0.512, + 0.511, + 0.51, + 0.509, + 0.508, + 0.507, + 0.506, + 0.505, + 0.504, + 0.503, + 0.502, + 0.501, + 0.5, + 0.499, + 0.498, + 0.497, + 0.496, + 0.495, + 0.494, + 0.493, + 0.492, + 0.491, + 0.49, + 0.489, + 0.488, + 0.487, + 0.486, + 0.485, + 0.484, + 0.483, + 0.482, + 0.481, + 0.48, + 0.479, + 0.478, + 0.477, + 0.476, + 0.475, + 0.474, + 0.473, + 0.472, + 0.471, + 0.47, + 0.469, + 0.468, + 0.467, + 0.466, + 0.465, + 0.464, + 0.463, + 0.462, + 0.461, + 0.46, + 0.459, + 0.458, + 0.457, + 0.456, + 0.455, + 0.454, + 0.453, + 0.452, + 0.451, + 0.45, + 0.449, + 0.448, + 0.447, + 0.446, + 0.445, + 0.444, + 0.443, + 0.442, + 0.441, + 0.44, + 0.439, + 0.438, + 0.437, + 0.436, + 0.435, + 0.434, + 0.433, + 0.432, + 0.431, + 0.43, + 0.429, + 0.428, + 0.427, + 0.426, + 0.425, + 0.424, + 0.423, + 0.422, + 0.421, + 0.42, + 0.419, + 0.418, + 0.417, + 0.416, + 0.415, + 0.414, + 0.413, + 0.412, + 0.411, + 0.41, + 0.409, + 0.408, + 0.407, + 0.406, + 0.405, + 0.404, + 0.403, + 0.402, + 0.401, + 0.4, + 0.399, + 0.398, + 0.397, + 0.396, + 0.395, + 0.394, + 0.393, + 0.392, + 0.391, + 0.39, + 0.389, + 0.388, + 0.387, + 0.386, + 0.385, + 0.384, + 0.383, + 0.382, + 0.381, + 0.38, + 0.379, + 0.378, + 0.377, + 0.376, + 0.375, + 0.374, + 0.373, + 0.372, + 0.371, + 0.37, + 0.369, + 0.368, + 0.367, + 0.366, + 0.365, + 0.364, + 0.363, + 0.362, + 0.361, + 0.36, + 0.359, + 0.358, + 0.357, + 0.356, + 0.355, + 0.354, + 0.353, + 0.352, + 0.351, + 0.35, + 0.349, + 0.348, + 0.347, + 0.346, + 0.345, + 0.344, + 0.343, + 0.342, + 0.341, + 0.34, + 0.339, + 0.338, + 0.337, + 0.336, + 0.335, + 0.334, + 0.333, + 0.332, + 0.331, + 0.33, + 0.329, + 0.328, + 0.327, + 0.326, + 0.325, + 0.324, + 0.323, + 0.322, + 0.321, + 0.32, + 0.319, + 0.318, + 0.317, + 0.316, + 0.315, + 0.314, + 0.313, + 0.312, + 0.311, + 0.31, + 0.309, + 0.308, + 0.307, + 0.306, + 0.305, + 0.304, + 0.303, + 0.302, + 0.301, + 0.3, + 0.299, + 0.298, + 0.297, + 0.296, + 0.295, + 0.294, + 0.293, + 0.292, + 0.291, + 0.29, + 0.289, + 0.288, + 0.287, + 0.286, + 0.285, + 0.284, + 0.283, + 0.282, + 0.281, + 0.28, + 0.279, + 0.278, + 0.277, + 0.276, + 0.275, + 0.274, + 0.273, + 0.272, + 0.271, + 0.27, + 0.269, + 0.268, + 0.267, + 0.266, + 0.265, + 0.264, + 0.263, + 0.262, + 0.261, + 0.26, + 0.259, + 0.258, + 0.257, + 0.256, + 0.255, + 0.254, + 0.253, + 0.252, + 0.251, + 0.25, + 0.249, + 0.248, + 0.247, + 0.246, + 0.245, + 0.244, + 0.243, + 0.242, + 0.241, + 0.24, + 0.239, + 0.238, + 0.237, + 0.236, + 0.235, + 0.234, + 0.233, + 0.232, + 0.231, + 0.23, + 0.229, + 0.228, + 0.227, + 0.226, + 0.225, + 0.224, + 0.223, + 0.222, + 0.221, + 0.22, + 0.219, + 0.218, + 0.217, + 0.216, + 0.215, + 0.214, + 0.213, + 0.212, + 0.211, + 0.21, + 0.209, + 0.208, + 0.207, + 0.206, + 0.205, + 0.204, + 0.203, + 0.202, + 0.201, + 0.2, + 0.199, + 0.198, + 0.197, + 0.196, + 0.195, + 0.194, + 0.193, + 0.192, + 0.191, + 0.19, + 0.189, + 0.188, + 0.187, + 0.186, + 0.185, + 0.184, + 0.183, + 0.182, + 0.181, + 0.18, + 0.179, + 0.178, + 0.177, + 0.176, + 0.175, + 0.174, + 0.173, + 0.172, + 0.171, + 0.17, + 0.169, + 0.168, + 0.167, + 0.166, + 0.165, + 0.164, + 0.163, + 0.162, + 0.161, + 0.16, + 0.159, + 0.158, + 0.157, + 0.156, + 0.155, + 0.154, + 0.153, + 0.152, + 0.151, + 0.15, + 0.149, + 0.148, + 0.147, + 0.146, + 0.145, + 0.144, + 0.143, + 0.142, + 0.141, + 0.14, + 0.139, + 0.138, + 0.137, + 0.136, + 0.135, + 0.134, + 0.133, + 0.132, + 0.131, + 0.13, + 0.129, + 0.128, + 0.127, + 0.126, + 0.125, + 0.124, + 0.123, + 0.122, + 0.121, + 0.12, + 0.119, + 0.118, + 0.117, + 0.116, + 0.115, + 0.114, + 0.113, + 0.112, + 0.111, + 0.11, + 0.109, + 0.108, + 0.107, + 0.106, + 0.105, + 0.104, + 0.103, + 0.102, + 0.101, + 0.1, + 0.099, + 0.098, + 0.097, + 0.096, + 0.095, + 0.094, + 0.093, + 0.092, + 0.091, + 0.09, + 0.089, + 0.088, + 0.087, + 0.086, + 0.085, + 0.084, + 0.083, + 0.082, + 0.081, + 0.08, + 0.079, + 0.078, + 0.077, + 0.076, + 0.075, + 0.074, + 0.073, + 0.072, + 0.071, + 0.07, + 0.069, + 0.068, + 0.067, + 0.066, + 0.065, + 0.064, + 0.063, + 0.062, + 0.061, + 0.06, + 0.059, + 0.058, + 0.057, + 0.056, + 0.055, + 0.054, + 0.053, + 0.052, + 0.051, + 0.05, + 0.049, + 0.048, + 0.047, + 0.046, + 0.045, + 0.044, + 0.043, + 0.042, + 0.041, + 0.04, + 0.039, + 0.038, + 0.037, + 0.036, + 0.035, + 0.034, + 0.033, + 0.032, + 0.031, + 0.03, + 0.029, + 0.028, + 0.027, + 0.026, + 0.025, + 0.024, + 0.023, + 0.022, + 0.021, + 0.02, + 0.019, + 0.018, + 0.017, + 0.016, + 0.015, + 0.014, + 0.013, + 0.012, + 0.011, + 0.01, + 0.009, + 0.008, + 0.007, + 0.006, + 0.005, + 0.004, + 0.003, + 0.002, + 0.001 + ], + "synthesized_from_cluster_size": 2, + "origin_node_id": "QmW1KQT9EUxfQfgKKpB1MX18t6kEbp5bVG8cXw4am95BAz", + "created_at": "2026-05-01T00:29:59.000Z", + "signed_at": "2026-05-01T00:34:00.000Z", + "evidence_root": "QmSjNzYY8oGHGTwkZqJ8AY3XpCfiEiQXvaD3dj74fPGn5F", + "evidence_count": 4, + "prev_lesson_hash": null, + "maturity_age_days": 1, + "useful_count": 0, + "signature": "b8ZhC6BPoAnpLkPr5Cxhw0GF88E1SvkceeFd84WzJFM5xfo3csiSnF7GKhcSwuLxBWKO9vyVDhKfLE39P4SZDA==" + } + ] +}