**Status:** ๐ก IN PROGRESS โ kit verified reproducible-by-stranger (fresh-clone
simulation 2026-08-03 PASS); **actual external reproducer still NOT engaged โ
that is the one remaining human step (Prateek sends the recruit message).**
---
An uninvolved person was simulated exactly: fresh `git clone` of the public
repo into a clean temp dir, then **only** the published instructions
(`README.md` โ "Reproduce in 30 seconds" + `research/reproduce/README.md` โ
"Run all three") were followed. No insider knowledge, no extra files, no help.
| Path tested | Result |
| `python3 tools/research/reproduce.py` (one-command) | โ **PASS** โ exit 0, prints avg **0.2406**, min 0.0490, max 1.0757, 153/155 below 1ร, writes chart |
|---|---|
| `bash research/reproduce/cross_check.sh` (all three) | โ **PASS** โ JS / Python / C all agree (avg 0.240641, min 0.049048, max 1.075697), VERDICT: ALL THREE AGREE |
| `gcc -O2 -o reproduce_sccr reproduce_sccr.c -lm` (C from source) | โ **PASS** โ compiles clean on macOS, produces 0.2406 |
| Python 3.9 (system, no pip installs needed) | โ works (stdlib only for compute; chart skips gracefully if matplotlib absent) |
| Input data (155 entries, heights 960562โ960732) | โ committed + versioned in `input/fee_history_capture.json`; `reproduce.py` **defaults to it** (no DB needed) |
| Node (JS impl) | โ works from clone |
| **Definitive re-test (post-push, 2026-08-03):** fresh clone of the **live GitHub repo** (`59573b0`), one-command path + `cross_check.sh`, then `git status` | โ **PASS** โ 0.2406, all three agree, working tree **completely clean** after all runs (deterministic, zero dirty state) |
1. **โโโ C binary missing in clones.** `cross_check.sh` step 3/3 called
`./research/reproduce/reproduce_sccr`, but the binary is gitignored โ a
stranger following "Run all three" hit `No such file or directory` and the
script failed (exit 1). **Fix:** `cross_check.sh` now auto-compiles the C
source when the binary is absent (with a clear message + fallback gcc
command).
2. **โโโ Scary sqlite errors in JS step.** `storage-ratio.js` in frozen-input
mode still tried DB queries (`no such table: block_stats / research_findings`
printed to stderr) and overwrote the committed dated report file in the
clone. **Fix:** `SCCR_INPUT_FILE` mode is now fully DB-free and
side-effect-free โ no sqlite queries, no research_findings insert, no report
file written; output explicitly says "frozen-input reproduction โ no report
written". Canonical live-DB behavior unchanged when env var absent.
3. **โโโ Heights not sorted (contiguous-set but unordered).** A stranger
checking `heights == list(range(960562, 960733))` would get `False` even
though all 171 heights were present. **Fix:** `input/fee_history_capture.json`
normalized to ascending height order โ order-invariant computation (verified:
all three implementations still produce identical avg/min/max, and per-block
values unchanged), so this is a pure determinism improvement. Reference
outputs (`output/reproduce_sccr_python.json`, `sccr_chart.png`) regenerated.
(public; live at bitcoinsahi.com)
External reproduction is **Prateek's task**: an *uninvolved* person must run the
3-step protocol. TELOS cannot recruit a real human, and autonomous posting is
blocked on two gates:
1. **arXiv is NOT yet live** (`TODO-bitcoin-oracle.md` R5: arXiv/Optech not
submitted; awaiting Prateek's arXiv account/ORCID/license). The community
review plan's outreach list is explicitly sequenced *after* the preprint
URL exists, so those venues (Optech, Delving, bitcoin-dev, Chaincode,
r/BitcoinEngineering) are not ready.
2. **The Nostr publisher uses Prateek's key** (`captured-data/nostr-key.json`,
gitignored). Posting through `tools/marketing/publisher.js` would use his
account โ **not** something TELOS does without his explicit say-so.
**What Prateek does (โ5 min):** open `research/reproduce/recruit-message.md`,
copy the message into an email/DM to one person (friend, colleague, any
technically-literate non-crypto person), and send. Then record the result
below.
| Reproducer | Environment | Result | Notes |
| **You (Prateek)** | macOS (darwin); Python 3.9 + Node + gcc | **0.2406** (Reference) | Reference run โ the published numbers (avg 0.2406, min 0.0490, max 1.0757, 153/155 below 1ร); confirmed by fresh-clone simulation 2026-08-03 |
|---|---|---|---|
| External #1 | *(pending)* | *(pending)* | |
| External #2 | *(pending)* | *(pending)* | |
| External #3 | *(pending)* | *(pending)* |
An external run is recorded under exactly one of three outcomes. Never collapse
the middle one into either neighbor โ **"reproduced the number but disagrees
with the framing" is not a failed reproduction**; it is honest scientific
disagreement about documented assumptions (working-paper ยง7.1).
| Outcome | What it means | Effect on the D5 milestone | Where it is recorded |
| โ **Reproduced** | Number matches from a clean clone (avg 0.2406, min 0.0490, max 1.0757, 153/155 below 1ร) | **Milestone MET** โ GO/SUBMIT trigger fires | Detail row below (Verdict = Reproduced) |
|---|---|---|---|
| ๐ก **Reproduced number, disagrees with framing** | Number matches, but the reproducer challenges a documented assumption (C = $925/yr bundling, T = 10 horizon, storage-as-first-resource, externality reading) | **Milestone MET** โ the number was reproduced; the disagreement is feedback, not failure | Detail row below (Verdict = "Reproduced + framing objection") **and** logged in the community-feedback triage (`research/community-review-plan.md` ยง4 โ `research/community-feedback.md`) |
| โ **Failed to reproduce** | Materially different number from a clean clone (different avg/band or per-block mismatch), not reconciled | **Milestone NOT met** โ submission BLOCKED until reconciled | Detail row below (Verdict = Failed); investigated as falsifier 1 of working-paper ยง7.1 |
**Recording rule:** the number reproduced correctly = milestone met even if the
reproducer challenges assumptions; the disagreement goes to community feedback,
never into the Fail column.
Use **"Independently reproduced by external participants following the published
reproduction protocol"** โ **NOT** "externally verified."
| Date | Reproducer | Language/Env | Avg SCCR | Min | Max | Below 1ร | Per-block max dev | Verdict (Reproduced / Reproduced + framing objection / Failed) |
| *(pending)* |
|---|
**Milestone achieved** when any external participant replies with the equivalent
of: **"I cloned it, ran one command, and got 0.2406"** โ i.e., an uninvolved human
independently confirms the published numbers from a clean clone, following the
published protocol.
**โ milestone achieved โ stop polishing โ submit.**
**The trigger fires on reproduction of the number โ regardless of framing
objections.** A reproducer who confirms the numbers but disputes a documented
assumption (C bundling, T = 10, storage-first, externality reading) has still met
the milestone: record the objection in the community-feedback triage
(`research/community-review-plan.md` ยง4 โ `research/community-feedback.md`) and
fold it into the next revision โ it does not block submission. Conversely, a
reproducer who **cannot** reproduce the number (materially different result from
a clean clone, not reconciled) **blocks submission** until the discrepancy is
reconciled; that is falsifier 1 of working-paper ยง7.1.
Until a reproduction-of-the-number reply lands, the submission gate stays
closed. When it lands: record the reply (quote + date + reproducer, anonymous
ok) in this log, then submit.
**Recruit assets (2026-08-03):** copy-paste message `recruit-message.md` ยท
personalized variants `recruit-message-personalized.md` ยท verified contact list
`external-reproducer-contacts.md` (8 verified channels; no fabricated emails).
---
*Bitcoin Sahi Research โ external reproduction log (working-paper v2.1.0,
model-spec v2.0.1). Simulation + fixes 2026-08-03.*