โ† Research

External Reproduction Log

**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).**

---

โœ… Fresh-clone simulation (2026-08-03) โ€” the closest autonomous proxy

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 testedResult
`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)

Gaps found and fixed by the simulation (all fixed, all committed)

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.

๐Ÿ“ฆ Shareable package (for the human step)

  • **Repo (the whole package):** `https://github.com/prateekposwal/block-space-economics`
  • (public; live at bitcoinsahi.com)

  • **Protocol:** `research/reproduce/README.md` โ†’ *External reproduction protocol (3 steps)*
  • **Input:** `research/reproduce/input/fee_history_capture.json` (155 entries, committed)
  • **Expected output:** avg **0.2406**, min **0.0490**, max **1.0757**, 153/155 below 1ร—
  • **Recruit message (copy-paste ready):** `research/reproduce/recruit-message.md`
  • โณ The one remaining human step (requires Prateek)

    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.

    Result table (ready to fill)

    ReproducerEnvironmentResultNotes
    **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)*

    Outcome categories โ€” three, not two

    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).

    OutcomeWhat it meansEffect on the D5 milestoneWhere 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 firesDetail 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 failureDetail 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 reconciledDetail 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.

    Phrasing rule

    Use **"Independently reproduced by external participants following the published

    reproduction protocol"** โ€” **NOT** "externally verified."

    When a result lands, also record the detail row here:

    DateReproducerLanguage/EnvAvg SCCRMinMaxBelow 1ร—Per-block max devVerdict (Reproduced / Reproduced + framing objection / Failed)
    *(pending)*

    โœ… GO / SUBMIT TRIGGER โ€” "reproducibility milestone achieved" (advisor rule)

    **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.*