You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(validation): §4.5 adversarial network-fault campaign on the shipped 0.16.8-sqd.1 build (#150)
Records the fault-proxy campaign (merged #149, `5a2fe88`) re-run on the published
subsquid-ponder@0.16.8-sqd.1 package as a new Layer-C §4.5: 8/8 body/transport faults
(429/5xx/retry-after/reset/stall/gzip/ndjson/204) + head-freeze complete byte-identical to
a clean baseline (digest 360af51…, intervals tile exactly), every fault non-vacuously fired;
head-regression-100k / head-flap correctly recorded not-applicable (stream-mode property, not
a pass). Honest AIMD labels (sparse vs recovery observed) per the #149 fix. Lands §2 shipped-
build anchor #2 (planned → done) and adds a §4-intro forward reference. Numbers independently
re-verified from on-disk verdicts; overclaim-reviewed.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The chaos kill-loop was accepted against the campaign's acceptance criteria. Aggregate result:
@@ -1114,6 +1121,92 @@ To stress the dense-source / factory-child discovery path (many concurrent `data
1114
1121
1115
1122
-**This section does NOT assert, and deliberately does not claim, that a fresh dense process's first discovery scan is warmup-bounded.** On attempt 1 of a fresh process, the first `portal-dense-discovery-scan` covers the ENTIRE range in ~8 windows (a grid-aligned `[20528000, 20579207]`, ~51.2k blocks, starting just below the configured floor `20529207` — do not reconcile it against the 50000-block data range) because the concurrent `dataChunk` fan-out supplies a full-range `needTo` when Ponder feeds a large first interval. This is expected (a consequence of `planDiscovery`'s `to = max(needTo, min(endHint, through+quantum))` tracking a large interval, not the watermark) — it is NOT a #50 regression and NOT a fork bug, because a wide discovery scan fetches no data, does not delay first commit, and only front-loads factory-child discovery I/O.
1116
1123
1124
+
### 4.5 Adversarial network/transport-fault campaign on the shipped `0.16.8-sqd.1` build (ACCEPTED 2026-07-11)
1125
+
1126
+
The §4.1–§4.4 campaigns kill the **app process** and prove crash/resume identity. This campaign leaves
1127
+
the app running and instead injects **network and transport faults** on the wire between the app and
1128
+
the **public** Portal, via an in-path fault proxy (`harness/chaos/proxy.mjs`, unit-tested in
1129
+
`proxy.test.mjs`), driven by `harness/chaos/fault-proxy-campaign.sh`. It proves a complementary
1130
+
property: under an adversarial network, the Portal backfill still **completes byte-identical to a clean
1131
+
baseline** — a fault surfaces as a retry, never as silent data corruption or coverage loss. It ran on
1132
+
the **shipped `0.16.8-sqd.1` package** (tarball `subsquid-ponder-0.16.8-sqd.1.tgz`, sha256
1133
+
`b5a0daa6f8439a67afd36d715451f040a9addc1e7d55f7043400092ac3869b70`), the fault-proxy code merged in
1134
+
[#149](../../pull/149) (`5a2fe88`), so it doubles as the §2 shipped-build anchor #2. Backend is
1135
+
`postgres16` (`fsync=on`, recorded `postgres16-fsync-on`), app `euler-app` (factory
1136
+
`0x29a56a1b8214D9Cf7c5561811750D5cBDb45CC8e`), chain 1 (ethereum) range `[20529207, 20579207]` (span
1137
+
50000), Portal `portal.sqd.dev/datasets/ethereum-mainnet`. The clean baseline logical digest is
0 commit comments