Skip to content

Verify BDPD³ — Governing the signal, not the symptom

Purpose

Confirm that BDPD³ (paper_03) is internally consistent, empirically backed, and bibliographically clean. The paper's central claim is the leading-vs-lagging axis: in a polycentric Seneca cascade on the Bardi engine (\(R, C, P\)), the trigger signal (which variable fires the regulator) matters more than the lever (which variable the regulator pulls). Specifically:

  1. Cap-on-\(k_1\) armed by pollution fails — by the time pollution rises, the capital boom has already committed the trajectory.
  2. Cap-on-\(k_1\) armed by capital succeeds — triggering on the leading, visible \(C\) signal preserves the emitter A and rescues downwind arenas B and C. Win-win.
  3. OFAT robustness — Claim A and C hold at 20/20; Claim B (the win-win) holds at 5/5 across \(k_1, \text{baseFraction}, \text{linkRate}\) but only 3/5 across \(dt\) (cedes at \(dt \geq 3.5\); baseline \(dt = 3.0\) is the edge of the win-win regime — this is in Limitations).
  4. Pareto-improving recoverylevy + C-trigger recovers downwind B more than cap + C-trigger (+31.6 % vs +19.7 %), the experiment added in response to external review.

A pass means all four claims are recoverable from v11_s3/, the substrate matches engine/seneca.js, and Bardi citations are faithfully deployed.

Round-2 scope (2026-06-16+). Round 2 is a complete re-verification from zero, not a delta of round 1. Every claim, every citation, every number is re-checked. Round-1 verdicts are inputs only. Five audit dimensions are appended after the core Procedure: Numeric audit, Narrative-flow audit, Balance audit, Harmonization audit, Epistemic-honesty audit. The Quick reference table at the bottom lists every load-bearing number with its canonical anchor. The Bardi/Seneca citations are the paper's substrate and require extra care; confirm no non-bibliographic name-drop of any individual appears in the prose as social capital (see [[no-endorser-mentions]]). Round-1 reports live at tmp/verification/<reviewer>_paper_03_report.md; round-2 reports land at tmp/verification_round2/<reviewer>_paper_03_report.md (do not overwrite).

Where to look

Paper sources

  • migration/docs/publications/paper_03/index.qmd
  • migration/docs/publications/paper_03/00-abstract.qmd
  • migration/docs/publications/paper_03/01-introduction.qmd
  • migration/docs/publications/paper_03/02-approach.qmd (also 02-model.qmd in some renditions)
  • migration/docs/publications/paper_03/03-experiments.qmd (also 03-results.qmd)
  • migration/docs/publications/paper_03/04-discussion.qmd
  • migration/docs/publications/paper_03/05-limitations.qmd
  • migration/docs/publications/paper_03/_quarto.yml

(Paper_03 was converted to a Quarto book mid-project; the book chapters are authoritative.)

Compiled output

  • migration/docs/publications/paper_03/_site/index.html and the matching PDF.
  • tmp/arxiv_paper_03/submission.tar.gz — the arXiv-ready bundle (929 KB). Cross-check it matches _site/.

Bibliography

  • migration/docs/publications/paper_00/bdpd_full.bib — shared.
  • migration/docs/library/<bibkey>.pdf and migration/docs/library/txts/<bibkey>.txt.

Key bibkey families:

  • Seneca framework: bardi2017seneca, bardi2018seneca, grammaticos2019revisiting (discrete-integrator variant), perissi2019archetypes. (bardi2011revisited is NOT cited by paper_03 despite being in the bib.)
  • Leading/lagging: lohmann2021ratedependent (rate-dependent cascading tipping point, load-bearing for the paper's central framing), sinet2025leadingfollowing, armstrongmckay2022exceeding (Earth-system tipping), wunderling2020interacting, wunderling2024review, klose2019cascadingdomino, klose2021tippingcascade, kronke2019networktopology, lenton2019riskytobet, motesharrei2014human, ritchie2023rate.
  • Polycentric governance carried over from BDPD²: ostrom2010polycentric, carlisle2019polycentric, ahlstrom2017governance, heikkila2018bringing.
  • Reviewer round 1 anchors added in revision: see tmp/paper_03_review_* files (drafts) for what the external review demanded and what was added.

Pilot data — the empirical record under the claims

  • migration/data/pilot/v11_s1/ — S1 Seneca standalone (single-arena calibration).
  • migration/data/pilot/v11_s2/ — S2 polycentric cascade (A emits, B and C downwind; the un-governed baseline showing the cascade).
  • migration/data/pilot/v11_s3/ — S3 governance: cap × \(\{P, C\}\) trigger × treatments. This is the main experimental record. Includes:
  • The 2×2 leading/lagging × lever cells.
  • The OFAT robustness sweep across \(k_1, \text{baseFraction}, \text{linkRate}, dt\).
  • The levy + C-trigger Pareto cell added during external-review rewrite.
  • The fine negative-control cell (no demand→production channel; should not save the system).

Code — the Bardi engine and the regulator

  • engine/seneca.js — three-variable ODE substrate (\(R, C, P\)).
  • engine/commons.jsSENECA_DEFAULTS (baseline parameter values, senecaEulerStep).
  • agents/governance.jsPollutionRegulator and other meta-agents; trigger logic (\(P > \theta_P\) vs \(C > \theta_C\)).
  • platform/perturbation.js — the perturbation types (setPollution, setCapital, capital_shock, fine).
  • experiments/definitions/seneca_*.json and any s3_*.json — the sweep defs that produced v11_s3/.

External review record (context)

  • tmp/paper_03_review_*.md — the external reviewer's critiques and the project author's response. These document why the levy+C-trigger and P-threshold sweep cells were added in revision.

Procedure

  1. Read PDF once, with particular attention to §5 (Results) and §6 (Limitations). The Limitations section must state the dt-sensitivity finding from the OFAT sweep.
  2. Claim ↔ pilot data trace — for each claim listed in Purpose, locate the cell in v11_s3/ and confirm the number is recoverable.
  3. OFAT robustness recheck — open the OFAT sweep output and compute, for each varied parameter (\(k_1, \text{baseFraction}, \text{linkRate}, dt\)), the coverage (cells where claim holds / total cells). Claim B should hold 5/5 except across \(dt\) where it is 3/5.
  4. Pareto-improving recovery check — pick the cell that compares levy + C-trigger vs cap + C-trigger. Confirm the recovery delta (≈ +31.6 % vs +19.7 % for downwind B).
  5. Negative control check — the fine cell (perturbation on household wealth, no path to production) should not save the system. Confirm it doesn't.
  6. Substrate ↔ code trace — open engine/seneca.js / engine/commons.js:senecaEulerStep and confirm the three ODE equations match what the paper writes:
  7. \(dR = (-k_1 R C - l_3 R) \, dt\)
  8. \(dC = (+k_1 R C - k_2 C P - l_1 C) \, dt\)
  9. \(dP = (+k_2 C P - l_2 P) \, dt\) Confirm SENECA_DEFAULTS matches the canonical configuration the paper claims.
  10. Bib audit — every cited bibkey present in library/ as a PDF.
  11. Citation-in-context spot-check. The Bardi/Seneca citations are load-bearing — the entire substrate of paper_03 rests on them. Pick at least four sentences attributing claims to Bardi, plus two leading/lagging citations, plus two polycentric carry-overs from BDPD². For each:

a. Content accuracy. Grep migration/docs/library/txts/<bibkey>.txt for the keyword in the surrounding sentence (e.g. "Seneca cliff", "growth-and-collapse", "tipping element"). Open the matching PDF passage and confirm the paraphrase is faithful. b. Context appropriateness. Bardi's framework was developed for civilisational collapse (Roman Empire, fisheries). Paper_03 applies it to a regulator-on-a-polycentric-commons setting. Confirm each Bardi citation is deployed where the structural analogy actually holds, and that the paper acknowledges the analogy explicitly rather than implicitly. These citations are the paper's entire substrate; spend extra time here. c. Hedging match. Bardi's framing is structural, not predictive. Paper claims like "the Seneca cliff predicts X" are findings; the framework explains shapes, it does not predict specific real-world timings. d. Bib-key precision. As in verify_paper_00.md step 5.d.

Highest-priority spot-checks: bardi2017seneca, bardi2018seneca, plus lohmann2021ratedependent (the leading-lagging anchor) and armstrongmckay2022exceeding (Earth-system tipping). NB: bardi2011revisited is NOT cited by paper_03 — do not spot-check it. 9. arXiv bundle check — extract tmp/arxiv_paper_03/submission.tar.gz into a temp dir and confirm the PDF inside matches _site/'s PDF (or differs only in title-block metadata). Confirm natbib cite-method and numbers+sort style are active. 10. Render checkbash render_publications.sh --which paper_03. 11. Round-2 git-log waypoint. git log d0a26ff..HEAD -- docs/publications/paper_03/. Reading-priority hint.

Round-2 audit dimensions

Numeric audit (round 2)

Purpose. Re-derive every literal number quoted by paper_03 from its canonical source.

Procedure. Same as paper_00. The polycentric cascade numbers (76% capital downwind, 16 turns earlier, 7.1× peak P / 3.227 absolute) and the Pareto-improving deltas (+31.6% vs +19.7%) are the highest-priority recompute targets. The OFAT coverage fractions (20/20, 5/5, 3/5 on \(dt\)) must be recoverable from the sweep aggregate.

Acceptance. Same four-row table.

Narrative-flow audit (round 2)

Identical to paper_00. paper_03 specific: the narrative should establish (i) the cascade is real and severe (S2), (ii) the obvious-trigger (P-based) regulator fails, (iii) the leading-trigger (C-based) regulator succeeds, (iv) the Pareto-improving levy+C variant is even better, (v) the dt-sensitivity caveat in Limitations. Skip-from-(i)-to-(iii) without (ii) is an orphan setup.

Balance audit (round 2)

Identical to paper_00. The Pareto-improving cell was added in response to external review — confirm its prose footprint is appropriate (a notable bonus finding, not buried, not dominant).

Harmonization audit (round 2)

Identical to paper_00. paper_03 specific:

  • ODE notation (R, C, P, k_1, k_2, l_1, l_2, l_3, dt) must match engine/seneca.js, engine/commons.js:senecaEulerStep, SENECA_DEFAULTS, and the paper's own glossary if it has one.
  • Cross-paper: BDPD²'s polycentric substrate description is the same World layer — confirm cross-paper consistency.
  • "Cliff" (= Seneca cliff, Bardi/asymmetric collapse) is correctly used here — this is the one BDPD paper where "cliff" is the right word. paper_00/01/02 use "collapse" for their findings.

Epistemic-honesty audit (round 2)

Identical to paper_00. paper_03 specific:

  • The "win-win" framing must be qualified: it is a win-win within the configurations explored, with the dt-edge caveat from OFAT. Avoid framing "the leading-signal regulator solves the cascade" without the OFAT qualifier.
  • Name-drop discipline. Confirm zero non-bibliographic mentions of any individual as social capital (acknowledgments or cover-letter-style prose). Bardi's name should appear only in the technical citations (bardi2017seneca, bardi2018seneca) in the bibliography. See [[no-endorser-mentions]].
  • Bardi's framework is structural; paper claims should not present it as predictive of specific real-world thresholds.

Acceptance criteria (composite)

Check Pass Partial Fail
4 cells of the 2×2 leading-lagging × lever all present, headline statistic recoverable 3/4 < 3
OFAT coverage matrix matches paper's claim (5/5 on \(k_1, bf, \text{linkRate}\); 3/5 on \(dt\)) minor recount difference direction wrong
Pareto-improving cell (levy + C-trigger) recovers B more than cap + C-trigger recovery delta within ±5 % of paper's number wrong direction
fine negative control does not save the system weakly negative claims to save → finding
Substrate ↔ code ODE + SENECA_DEFAULTS match paper minor parameter drift core ODE structure differs
Bib audit all PDFs present 1–2 missing ≥3 missing
Bardi spot-check (3 paraphrases) faithful one loose misrepresentation
arXiv bundle matches _site/ PDF metadata differs only content differs
Render clean HTML + PDF stylistic glitch broken
Numeric audit every literal traced 1–2 untraced systemic
Narrative-flow audit (i)→(ii)→(iii)→(iv)→(v) flow lands one orphan systemic
Balance audit Pareto-improving footprint appropriate one outlier systemic
Harmonization audit ODE + cross-paper match minor drift systemic
Epistemic-honesty audit win-win qualified, zero non-bibliographic name-drops 1 borderline systemic or any social-capital name-drop

Common pitfalls

  • Greek letters in qmd outside math mode break PDF (θ_P?). Use $\theta_P$. See feedback_no_unicode_in_paper_qmd.
  • The dt sensitivity is acknowledged in Limitations. A reviewer flagging the \(dt\)-edge as a finding must check that the paper already discloses it — if so, downgrade to partial rather than fail.
  • PollutionRegulator is the canonical name even when it triggers on capital. Do not flag this as a naming bug — the regulator class is variable-agnostic; its trigger condition is a parameter.
  • The arXiv bundle freezes a specific version of the paper. If the working tree has diverged from the bundle, the reviewer should report on _site/ (current truth), not on the bundle.
  • External-review responses (tmp/paper_03_review_*.md) are internal notes, not part of the paper. Do not cite them in the review report; cite the actual paper text.
  • Cliff vs collapse — terminology discipline. Paper_03 is the one paper in the series where "cliff" / "Seneca cliff" is the correct term (Bardi/asymmetric collapse). Do not flag it. paper_00/01/02 use "collapse" for their findings; cross-paper references in paper_03 to BDPD⁰'s "cliff edge" (the threshold \(i \approx 0.05\)) are legitimate paper_00 terminology and should be preserved.
  • Name-drop discipline — high priority for paper_03. Any "thanks to …" / "with …'s support" social-capital name-drop in the paper or cover letter is a hard fail under [[no-endorser-mentions]]. Only the bibliographic citations bardi2017seneca, bardi2018seneca are acceptable mentions of Bardi's name.
  • Round-1 false positives — do not re-trigger. For paper_03 the numeric claims live in paper_03/02-model.qmd and 03-results.qmd (and the OFAT in 04-discussion.qmd / 05-limitations.qmd). Do not descend to v11_s2/aggregate.json or v11_s3/aggregate.json before consulting the paper qmd — round-1 DS audit on pitch_01 produced 6/7 false positives by skipping this step.
  • migration/ is the working tree, not the repo root. Path checks fail silently if cwd is bdpd/.

Quick reference — facts you should not re-derive

Claim Value Canonical anchor
S2 cascade — downwind capital \(\approx -76\%\) (B/C capital drop) 02-model.qmd, data/pilot/v11_s2/aggregate.json
S2 cascade — earlier collapse \(\approx 16\) turns earlier 02-model.qmd, data/pilot/v11_s2/aggregate.json
S2 cascade — peak pollution \(\approx 7.1\times\) baseline (absolute 3.227 vs emitter peak) 02-model.qmd, 03-results.qmd:**3.227**, data/pilot/v11_s2/aggregate.json
Cap-on-\(k_1\) + P-trigger (lagging) Fails — capital boom commits trajectory before P rises 03-results.qmd 2×2 cell, data/pilot/v11_s3/
Cap-on-\(k_1\) + C-trigger (leading) Win-win: preserves emitter A, rescues B/C 03-results.qmd 2×2 cell, data/pilot/v11_s3/
OFAT Claim A and C coverage \(20/20\) 04-discussion.qmd OFAT section, data/pilot/v11_s3/
OFAT Claim B on \(k_1, \text{baseFraction}, \text{linkRate}\) \(5/5\) same
OFAT Claim B on \(dt\) \(3/5\) — cedes at \(dt \geq 3.5\); baseline \(dt = 3.0\) is edge of win-win regime 05-limitations.qmd, same OFAT data
Pareto-improving levy + C-trigger recovers B \(+31.6\%\) 03-results.qmd, data/pilot/v11_s3/levy_* cell
Pareto-improving cap + C-trigger (baseline for comparison) recovers B \(+19.7\%\) same
fine negative control does not save the system (no demand→production channel) 04-discussion.qmd, data/pilot/v11_s3/fine_* cell
Seneca ODE \(dR=(-k_1 R C - l_3 R) dt\), \(dC=(+k_1 R C - k_2 C P - l_1 C) dt\), \(dP=(+k_2 C P - l_2 P) dt\) engine/commons.js:senecaEulerStep:216-218, 02-model.qmd
Canonical Seneca defaults SENECA_DEFAULTS engine/commons.js, 02-model.qmd

Output

A report at tmp/verification_round2/<reviewer>_paper_03_report.md with:

  1. Header (reviewer, mode, commit, date).
  2. 2×2 cell ledger(lever, trigger) → outcome, with directory + headline number per cell.
  3. OFAT coverage matrix — one row per varied parameter (\(k_1, \text{baseFraction}, \text{linkRate}, dt\)), with the claim-B coverage fraction.
  4. Pareto-improving check — recovery percentages for levy + C-trigger vs cap + C-trigger, with delta.
  5. Substrate trace — ODE check, SENECA_DEFAULTS check.
  6. Bib audit, Bardi spot-check, arXiv bundle, render notes.
  7. Round-2 audit tables — one per dimension.
  8. Name-drop audit — explicit statement that zero non-bibliographic mentions of any individual (Bardi or otherwise) were found (or list of any that were).
  9. Findings list with severity.

Reviewer prompt (copy-paste)

You are an independent reviewer verifying BDPD³ — Governing the signal, not the symptom, completely and from zero — this is round 2, no round-1 verdict is inherited. The repository is at migration/ on the round-2 working branch (or tag v1.1.2). Follow the playbook at migration/docs/verification/verify_paper_03.md from top to bottom: core Procedure (steps 1–11) plus the five Round-2 audit dimensions. The paper's central claim is the leading-vs-lagging axis — triggering a regulator on the visible (leading) capital signal \(C\) rather than the lagging pollution signal \(P\) produces a win-win outcome (emitter survives, downwind rescued). Verify the 2×2 cell evidence in v11_s3/, the OFAT robustness sweep (including the \(dt\)-edge caveat in Limitations), the levy+C-trigger Pareto-improving cell, and the fine negative control. Substrate description must match engine/seneca.js and SENECA_DEFAULTS. Before starting the Numeric audit, read the Quick reference table. Name-drop discipline: confirm that the only mentions of Bardi's name are the bibliographic citations (bardi2017seneca, bardi2018seneca); any prose-level social-capital name-drop is a hard fail. Produce the report at tmp/verification_round2/<reviewer>_paper_03_report.md. Time budget: roughly one and a half working days.