Skip to content

test(wave-4): plagiarism cohort #1 — identical-broadcast (W4.1, #196)#198

Merged
Dewinator merged 2 commits into
agent/wave-4-forgery-fixturefrom
agent/wave-4-plagiarism-fixture
May 3, 2026
Merged

test(wave-4): plagiarism cohort #1 — identical-broadcast (W4.1, #196)#198
Dewinator merged 2 commits into
agent/wave-4-forgery-fixturefrom
agent/wave-4-plagiarism-fixture

Conversation

@Dewinator

Copy link
Copy Markdown
Owner

Summary

Second row of the W4.1 adversarial corpus, stacked on #197 (forgery row).

A canonical §10.4 cross-peer near-duplicate cohort: three signature-valid envelopes from three distinct fixture-key node IDs, near-identical embeddings (cosine > 0.95), identical content + evidence_root, signed within a 3-second window. Each envelope individually passes validateWireRecord — §10.4 is post-admission, REM-cycle, not admission-time.

The test asserts scoreFinding (the pure §10.4 decision layer the production REM cycle calls) clamps local_weight strictly below MIN_LOCAL_WEIGHT_FOR_BROADCAST (0.3) for both:

  • Saturation: over_concentration=1.0new_weight=0
  • Boundary: over_concentration=0.8 (the §10.4 trigger threshold) → new_weight=0.2 ≤ 0.3

That second case is the load-bearing claim of §10.4: even at the minimum-trigger over_concentration value, the cohort fails the broadcast firebreak.

Stacking

Files

  • cohort-keys-plagiarism.json — 3× Ed25519 fixture-only keys, sibling file (write-once, same discipline as fixture-key.json) so future cohort fixtures can reuse them
  • plagiarism/identical-broadcast-cohort.json — the cohort fixture
  • anti-echo-plagiarism.test.ts — 9 assertions across metadata, Pillar-6 signatures, wire-validator admission, §10.4 trigger conditions (cosine + signed_at window + shared evidence_root), and the scoreFinding decision layer
  • Extends ExpectedOutcome with broadcast_suppressed enum value — second arm of the broadcast firebreak (the first is tier_b)

Test plan

  • npx tsx --test src/__tests__/anti-echo-plagiarism.test.ts — 9/9 green
  • npx tsx --test src/__tests__/anti-echo-forgery.test.ts — 5/5 green (corpus-types extension is backward-compatible)
  • npm run build clean
  • node scripts/build-anti-echo-fixtures.mjs is idempotent (re-run produces byte-identical fixtures)

🤖 Generated with Claude Code

Second row of the W4.1 adversarial corpus. Three signature-valid
envelopes from three distinct fixture-key node IDs, near-identical
embeddings (cosine > 0.95), identical content + evidence_root, signed
within a 3-second window — the canonical §10.4 cross-peer near-duplicate
concentration case.

Each envelope individually passes validateWireRecord (§10.4 is a
post-admission, REM-cycle defense, not an admission-time hard rule).
The test asserts the §10.4 decision layer (`scoreFinding`) clamps
`local_weight` strictly below `MIN_LOCAL_WEIGHT_FOR_BROADCAST` (0.3) for
both the saturation case (over_concentration=1.0 → 0) and the boundary
trigger (over_concentration=0.8 → 0.2 ≤ 0.3).

Adds:
  - cohort-keys-plagiarism.json: 3× Ed25519 fixture-only keys, sibling
    file (not inline) so future cohort fixtures can reuse them
  - plagiarism/identical-broadcast-cohort.json: the cohort fixture
  - anti-echo-plagiarism.test.ts: 9 assertions across metadata, Pillar-6
    signatures, wire-validator admission, §10.4 trigger conditions
    (cosine + signed_at window + shared evidence_root), and the
    scoreFinding decision layer (saturation + boundary)
  - extends ExpectedOutcome with `broadcast_suppressed` enum value —
    second arm of the broadcast firebreak (the first is `tier_b`)

Build script extended with cohort key generation (write-once, same
discipline as fixture-key.json) and deterministic cohort builder
(seed-perturbed embedding ramp keeps cosine > 0.95 while differing
per-envelope so JCS canonicalization yields distinct signatures).

Tests: 9/9 plagiarism + 5/5 forgery green; build clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dewinator added a commit that referenced this pull request May 3, 2026
Three docs claimed W4.1 lands a "Vitest harness", but the actual harness
uses node:test (the Node.js built-in test runner — `npm test` runs
`node --test "dist/__tests__/**/*.test.js"`) and Vitest is not even a
dependency. The two W4.1 PRs already in the queue (#197 forgery, #198
plagiarism) ship `import { test } from "node:test"`, confirming the code
side. Drift was in:

- mcp-server/src/__tests__/fixtures/anti-echo/README.md step 6 ("How to
  add a new fixture" instructions)
- docs/wave-4-anti-echo.md §"What can land before Wave 2 finishes" and
  §"Sub-task decomposition" item 1
- docs/waves.md §"Wave 4" first paragraph

Each spot now names the runner explicitly and notes Vitest is
intentionally absent, so the next contributor (and #196's remaining
6 fixtures) does not pull in an unwanted dep.

No code change. Pure docs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dewinator added a commit that referenced this pull request May 3, 2026
…split)

The Native-App Track section claimed "Alle 9 PRs sind green und
MERGEABLE" and "9-PR-Queue", but the actual open-PR count has been 14
since PR #201 landed (151st tick). The 9-only framing under-stated the
drain workload Reed is sitting on and obscured the orthogonal cohorts —
3 W4.1 anti-echo PRs (#197, #198, #201) and 2 W2 federation PRs (#199,
#200) merge fully independent of the native-app stack (143rd-tick file-
overlap audit, 148th-tick 3-order commute proof on 13 PRs; #201 is
additive on top with no shared files).

Now CLAUDE.md states the 14-PR total with the cohort split and the
empirical commute evidence, so the next agent tick reads the correct
drain workload and the next "queue full → analyse, don't add" decision
is grounded in current state, not in the 2026-05-02 9-PR snapshot.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Dewinator Dewinator merged commit 59dd7cd into agent/wave-4-forgery-fixture May 3, 2026
1 check passed
Dewinator added a commit that referenced this pull request May 3, 2026
…rain)

Reed merged 10 PRs today: all 3 W4.1 anti-echo (#197/#198/#201), both W2
federation (#199/#200), 5 native-app (#190/#191/#192/#193/#194). Only the
linear 4-PR #178-stack remains open (#185 independent + #187#188#189
strictly stacked). Three-cohort split collapsed to one cohort — old order-
independence proofs (143rd/148th tick) now obsolete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dewinator added a commit that referenced this pull request May 4, 2026
…212

Doc was last refreshed 2026-05-03 when only row 3 (sybil-flood) was
shipped. Since then PRs #197 (forgery) and #198 (plagiarism) also
merged on 2026-05-03, and PR #212 (echo-chamber, row 4) is now in
flight behind the Wave-1 stack. The footer's "14-deep queue" reference
is also stale (queue is currently 5).

Changes:
- header: "row 3 shipped, 5 remaining" → "rows 1-3 merged, row 4 in PR
  queue, 4 remaining"
- TL;DR: enumerate PRs #197/#198/#201 as shipped and #212 as in-flight
- table: add rows 1 and 2 with their shipped-PR pointers; row 4 verdict
  is now "in PR #212 — test green, awaiting Reed merge"
- "What this means" section: drop the stale "queue's 14 PRs" wording
- fixture-key section: rows 5-8 (was 4-8) reuse the row-1 key; note
  plagiarism + echo-chamber both mint cohort keys following the same
  pattern as sybil-flood
- footer: "paused at 4/8 in flight" (was 3/8 against a 14-deep queue)

Direct-to-main, zero queue growth — saves the next W4.1 tick from
re-deriving shipped/in-flight state from gh + git log.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dewinator added a commit that referenced this pull request May 4, 2026
…sks 1/2/3-most/4/5/7-core landed

The 09024a2 (tick 103) snapshot is two days stale: 9 of the 9 PRs in its
"recommended merge order" have merged, plus #197/#198/#201/#202/#203/#204/
#205/#206/#207 landed in the same window. Refresh the doc that "is the
canonical entry point for the native-app initiative" so a fresh reader
does not get a 79-tick-old picture.

Concrete changes:
- Phase line: "spike phase complete · gated on PR-queue drain" →
  "implementation underway · sub-tasks 1, 2, 3 (most), 4, 5, 7 (core)
  landed; 5 PRs open, ~26 h Reed-lag since #202#207".
- End-state installer list: ".dmg / .msi / .AppImage" → ".pkg / .msi /
  .AppImage", with the 2026-05-04 epic-body decision (.pkg, not .dmg)
  cited.
- Sub-task table: legend (✅ landed, 🔄 PR open, ⏳ spike-only) plus
  per-row PR status reflecting the current main:
  - Row 1 picks up #204 (79-migration walk as CI gate).
  - Row 3 picks up #202, #203, #206, #207 as landed and #208#211 as
    open. Row was "_none yet_".
  - Row 4 / 5 reframed as "inherent" (PGlite is one WASM binary;
    node-llama-cpp ships per-platform bindings).
  - Row 7 picks up #205 (Docker → PGlite migration helpers core).
- New "DbClient sub-story" subsection: 22 services touch Supabase
  directly on main; 2 in flight (Skills, SwarmPin); 20 remain after
  the open stack lands. Pattern: one service per PR.
- "Recommended merge order — open PR queue (9 deep)" section replaced
  with "Open PR queue (5 deep, all CLEAN+MERGEABLE)" — the 9 it
  documented have all merged.
- "Post-drain implementation gate" → "Post-stack implementation gate":
  parallel tracks (DbClient long-tail of 20 services + the sub-tasks
  6/8/9 release-pipeline triangle on tauri-plugin-updater per #207).

Doc-only, zero risk, direct-to-main per the standing rule for this
file shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant