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:
- Cap-on-\(k_1\) armed by pollution fails — by the time pollution rises, the capital boom has already committed the trajectory.
- 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.
- 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).
- Pareto-improving recovery —
levy + C-triggerrecovers downwind B more thancap + 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.qmdmigration/docs/publications/paper_03/00-abstract.qmdmigration/docs/publications/paper_03/01-introduction.qmdmigration/docs/publications/paper_03/02-approach.qmd(also02-model.qmdin some renditions)migration/docs/publications/paper_03/03-experiments.qmd(also03-results.qmd)migration/docs/publications/paper_03/04-discussion.qmdmigration/docs/publications/paper_03/05-limitations.qmdmigration/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.htmland 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>.pdfandmigration/docs/library/txts/<bibkey>.txt.
Key bibkey families:
- Seneca framework:
bardi2017seneca,bardi2018seneca,grammaticos2019revisiting(discrete-integrator variant),perissi2019archetypes. (bardi2011revisitedis 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-triggerPareto cell added during external-review rewrite. - The
finenegative-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.js—SENECA_DEFAULTS(baseline parameter values,senecaEulerStep).agents/governance.js—PollutionRegulatorand 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_*.jsonand anys3_*.json— the sweep defs that producedv11_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¶
- 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. - Claim ↔ pilot data trace — for each claim listed in Purpose, locate the cell in
v11_s3/and confirm the number is recoverable. - 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.
- Pareto-improving recovery check — pick the cell that compares
levy + C-triggervscap + C-trigger. Confirm the recovery delta (≈ +31.6 % vs +19.7 % for downwind B). - Negative control check — the
finecell (perturbation on household wealth, no path to production) should not save the system. Confirm it doesn't. - Substrate ↔ code trace — open
engine/seneca.js/engine/commons.js:senecaEulerStepand confirm the three ODE equations match what the paper writes: - \(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\)
Confirm
SENECA_DEFAULTSmatches the canonical configuration the paper claims. - Bib audit — every cited bibkey present in
library/as a PDF. - 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 check — bash 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 matchengine/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
Worldlayer — 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$. Seefeedback_no_unicode_in_paper_qmd. - The
dtsensitivity 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. PollutionRegulatoris 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,bardi2018senecaare 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.qmdand03-results.qmd(and the OFAT in04-discussion.qmd/05-limitations.qmd). Do not descend tov11_s2/aggregate.jsonorv11_s3/aggregate.jsonbefore 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 isbdpd/.
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:
- Header (reviewer, mode, commit, date).
- 2×2 cell ledger —
(lever, trigger) → outcome, with directory + headline number per cell. - OFAT coverage matrix — one row per varied parameter (\(k_1, \text{baseFraction}, \text{linkRate}, dt\)), with the claim-B coverage fraction.
- Pareto-improving check — recovery percentages for
levy + C-triggervscap + C-trigger, with delta. - Substrate trace — ODE check,
SENECA_DEFAULTScheck. - Bib audit, Bardi spot-check, arXiv bundle, render notes.
- Round-2 audit tables — one per dimension.
- Name-drop audit — explicit statement that zero non-bibliographic mentions of any individual (Bardi or otherwise) were found (or list of any that were).
- 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 tagv1.1.2). Follow the playbook atmigration/docs/verification/verify_paper_03.mdfrom 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 inv11_s3/, the OFAT robustness sweep (including the \(dt\)-edge caveat in Limitations), the levy+C-trigger Pareto-improving cell, and thefinenegative control. Substrate description must matchengine/seneca.jsandSENECA_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 attmp/verification_round2/<reviewer>_paper_03_report.md. Time budget: roughly one and a half working days.