diff --git a/AGENTS.md b/AGENTS.md index 75888e6..33f9eb5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,6 +42,7 @@ cd simulations/gadm02 && python3 -B exports.py # export channel and the "Argen cd simulations/gadm02 && python3 -B nonrival.py # GADM-0.5-dev rival vs. non-rival output across the band cd simulations/gadm02 && python3 -B eco_classes.py # GADM-0.5-dev ecological resource classes cd simulations/gadm02 && python3 -B selection.py # GADM-0.5-dev endogenous selection weights +cd simulations/gadm02 && python3 -B demand.py # GADM-0.5-dev two-good demand split (dematerialization) cd simulations/gadm02 && python3 -B matching.py && python3 -B matching.py --imm # model matching; IMM flip-detection acceptance test (~6 min) ``` diff --git a/models/GADM-0.5.md b/models/GADM-0.5.md index 3218467..7cbe2b2 100644 --- a/models/GADM-0.5.md +++ b/models/GADM-0.5.md @@ -157,11 +157,52 @@ Readings: candidate change. It is recorded here and not implemented, because no reading depends on it yet. -## 4. Open: demand composition (T04, refined) +## 4. Two-good demand split: dematerialization (T04) -T01 found no genuine decoupling, because non-rival output only adds to rival -consumption (BR-010). T02 locates the generative regime's ecological cost in -the sinks. Both point to the same missing structure: a **two-good demand -split**, rival and non-rival consumption, with substitution between them -(dematerialization). This is narrower than the four-sector option in the scope -note, and it is the question that opens T04. +### 4.1 Structure + +`gadm05.simulate_eco(..., demand=...)` adds a slow state Cr, the rival share +of demand relative to its start (Cr0 = 1). Cr relaxes (rate `dm_lam`) toward +`1 − dm_eps · (qn − qn0)`, where `qn = (Y_n / Y*) · √(X Q)` is the +quality-weighted non-rival offer. Physical throughput intensity `thr` and +physical investment `aK` scale with Cr. The same capital then serves +dematerialized demand with less physical load. `dm_lam = 0` switches it off. +Priors: λ 0.05 per year, ε 2; strong case λ 0.1, ε 4. + +### 4.2 Results (`demand.py`, `results/demand.md`; material replenishment at rest) + +| Generative regime | B1 | B2 | B3 | B4 | +|---|---|---|---|---| +| decoupled decades, no split → split → strong | 0 → 0 → 0 | 0 → 0.45 → 0.89 | 0 → 0.71 → 0.75 | 0 → 0.22 → 0.34 | +| sinks breach, no split → split → strong | t 83 → none → none | t 49 → 98 → none | t 37 → 61 → none | t 29 → 40 → none | +| VFAC t 100, no split → split | 0.607 → 0.613 | 0.583 → 0.598 | 0.564 → 0.585 | 0.509 → 0.533 | + +A *decoupled decade* has VFAC rising, physical throughput falling and K_Ω not +falling, which excludes the artifact of § 1.3. Baseline: decoupled decades +0–0.09, and no sinks breach with or without the split. + +Calibration check: throughput per unit of output falls by 0.1–0.5 % per year +in the first decade (split cases included). Observed EU dematerialization is +about 1.6 % per year (resource productivity, 2000–2022). The observed trend +includes efficiency gains that GADM does not model. + +### 4.3 Readings + +1. **Genuine decoupling needs demand composition.** With the split, the + generative regime decouples welfare from throughput in most decades at + B2–B3, while organism capability keeps growing. BR-010 is resolved + structurally: non-rival output must replace rival consumption, not only add + to it. +2. **Decoupling is band-dependent (qualitative break).** It needs a non-rival + offer of sufficient quality, which B1 adoption does not build. At B4, + physical and compute growth outpace substitution, and decoupling is rarer + (22 %). +3. **The generative regime's sinks breach becomes avoidable.** The default + split moves it 15–50 years later. The strong split removes it within the + horizon at every anchor. Together with low-carbon electricity (§ 2.3), this + is the second lever on the regime's ecological cost. +4. **The readings are conservative against data.** Observed + dematerialization (−1.6 % per year) is three to sixteen times the modeled + intensity decline, because GADM has no autonomous efficiency trend. + Calibrating ε, λ and an efficiency trend to the observed series is the next + step (ASSEMBLY-WP-0018). diff --git a/research/BreakRegister.md b/research/BreakRegister.md index 8ac539a..b42ee57 100644 --- a/research/BreakRegister.md +++ b/research/BreakRegister.md @@ -22,4 +22,4 @@ that part of the band. | BR-007 | 2026-10-13 (WP-0013-T04) | Rights-first levers bound domination | holds when switching to J1 levers (US: P 0.64 → 0.54) → fails for a jurisdiction already at J1 levers (EU: P 0.65 → 0.77) | calibrated domination comes from levels set abroad that local levers cannot reach | **structural:** cross-border coupling (ASSEMBLY-WP-0011) | open | | BR-008 | 2026-10-13 (WP-0011-T05) | Which levers bound domination (BR-007 follow-up) | closed model: host rights levers → coupled model: only host access rules on foreign operators and the home's levers reach the foreign-run channels | measured channels (Pd, Pmem, Plin, Pi) are operated from the US for EU and AR hosts | **structural, implemented:** cross-border coupling (`world.py`); observed DMA effect on search ≈ 0 (at most a 0.006/yr) | update 2026-10-13 (WP-0016-T01): a host lineage access rule does reach imported-lineage concentration (EU Plin 0.91 → 0.19 at a 0.15); portability needs the domestic lineage market's concentration (CB3) | | BR-009 | 2026-10-13 (WP-0012) | Sentiment dynamics of the legitimacy loop | Σ relaxes toward 0.5 + gain × Δ(perceived benefit), so from the measured US Σ 0.285 it rises → measured US sentiment fell 2021–2026 (0.405 → 0.285) while adoption grew fast | the neutral reference 0.5 is an assumption; US adoption also shows no braking by low sentiment (all loop-on candidates fail the US match) | **resolved 2026-10-13 (WP-0017-T01):** parameter `sig_ref`; calibrated runs anchor Σ at its measured level, and adoption and legislation respond to changes relative to it. Default (None = 0.5) keeps earlier results. R1–R4 and H1/H2 verdicts unchanged; the matching loop weights become ≈ 0.5 | resolved; `sig_adopt` not yet identified | -| BR-010 | 2026-10-13 (WP-0007-T01) | Non-rival growth decouples welfare from throughput (core hypothesis, GADM-0.1 § 14) | output split rival / non-rival (GADM-0.5-dev): no genuine decoupling in any anchor; the generative regime's ecological cost unchanged | GADM has no demand composition: non-rival output adds to, but never replaces, rival consumption | **structural candidate:** demand substitution (dematerialization) and ecological classes (WP-0007-T02, T04) | open | +| BR-010 | 2026-10-13 (WP-0007-T01) | Non-rival growth decouples welfare from throughput (core hypothesis, GADM-0.1 § 14) | output split rival / non-rival (GADM-0.5-dev): no genuine decoupling in any anchor; the generative regime's ecological cost unchanged | GADM has no demand composition: non-rival output adds to, but never replaces, rival consumption | **resolved 2026-10-13 (WP-0007-T04):** two-good demand split; the generative regime decouples in 45–71 % of decades at B2–B3, and its sinks breach moves 15–50 years later; band-dependent (none at B1) | resolved; calibration to observed dematerialization open (WP-0018) | diff --git a/simulations/gadm02/demand.py b/simulations/gadm02/demand.py new file mode 100644 index 0000000..5eba303 --- /dev/null +++ b/simulations/gadm02/demand.py @@ -0,0 +1,93 @@ +"""Two-good demand split: dematerialization and decoupling (ASSEMBLY-WP-0007-T04). + +Tests (workplan T04): + 1. Can VFAC rise while physical throughput falls, for reasons other than organism decline? + 2. Does the generative regime's sink breach move out of the 100-year horizon? +Calibration check: throughput intensity per unit of output should fall by roughly the observed +dematerialization (EU resource productivity +1.6 %/year, 2000-2022, Eurostat). + +Usage: python3 -B simulations/gadm02/demand.py +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +sys.dont_write_bytecode = True + +import band_probe as bp # noqa: E402 +import gadm05 as g5 # noqa: E402 +import grounding as gr # noqa: E402 +from scenarios import load_all # noqa: E402 + +OUT = Path(__file__).resolve().parent / "results" +ANCHORS = list(gr.BAND) +CASES = {"no demand split": {"dm_lam": 0.0}, "split (λ 0.05, ε 2)": {"dm_lam": 0.05, "dm_eps": 2.0}, + "split, strong (λ 0.1, ε 4)": {"dm_lam": 0.1, "dm_eps": 4.0}} + + +def decoupled_windows(rows: list[dict], step: int = 1) -> float: + """Share of 10-year windows with VFAC up, throughput down and K_Omega not falling.""" + hits = n = 0 + for i in range(0, len(rows) - step, step): + a, b = rows[i], rows[i + step] + n += 1 + hits += b["VFAC"] > a["VFAC"] and b["thru"] < a["thru"] and b["Ko"] >= a["Ko"] - 1e-6 + return hits / n + + +def intensity_trend(rows: list[dict], years: int = 10) -> float: + """Average yearly change of throughput per unit of output over the first `years`.""" + a, b = rows[0], rows[years // 10] + ia, ib = a["thru"] / a["Ystar"], b["thru"] / b["Ystar"] + return (ib / ia) ** (1 / years) - 1 + + +def main() -> None: + OUT.mkdir(exist_ok=True) + scs = load_all() + var = {a: gr.variant(gr.BAND[a]) for a in ANCHORS} + res = {} + for sc in ("baseline", "generative_regime"): + for a in ANCHORS: + for cn, cd in CASES.items(): + rows = g5.simulate_eco({**scs[sc]["params"], **var[a][0]}, {**scs[sc]["init"], **var[a][1]}, + eco={"rm": "rest"}, demand=cd) + sink = next((r["t"] for r in rows if r["Es"] < g5.ECO_PARAMS["eco_floor"]), None) + res[(sc, a, cn)] = {"V": rows[-1]["VFAC"], "Cr": rows[-1]["Cr"], "dec": decoupled_windows(rows), + "sink": sink, "Es": rows[-1]["Es"], "it": intensity_trend(rows), + "thru": rows[-1]["thru"]} + lines = ["# GADM-0.5-dev: two-good demand split (dematerialization)", "", + "Generated by `simulations/gadm02/demand.py` (ASSEMBLY-WP-0007-T04). Ecological classes with", + "material replenishment at rest. Decoupled windows: 10-year windows with VFAC rising, throughput", + "falling and K_Ω not falling. Intensity trend: yearly change of throughput per unit of output,", + "years 0–10 (observed EU dematerialization ≈ −1.6 %/year).", "", + "| Scenario | Anchor | Case | VFAC t100 | rival demand share Cr t100 | intensity trend | decoupled windows | sinks breach | Es t100 |", + "|---|---|---|---|---|---|---|---|---|"] + for sc in ("baseline", "generative_regime"): + for a in ANCHORS: + for cn in CASES: + r = res[(sc, a, cn)] + lines.append(f"| {scs[sc]['title']} | {a} | {cn} | {r['V']:.3f} | {r['Cr']:.2f} | {100 * r['it']:+.1f} % | " + f"{r['dec']:.2f} | {('t ' + format(r['sink'], '.0f')) if r['sink'] is not None else '—'} | {r['Es']:.2f} |") + readings = [] + for sc in ("baseline", "generative_regime"): + t = scs[sc]["title"] + readings.append((f"decoupled windows, split − none: {t}", + [res[(sc, a, 'split (λ 0.05, ε 2)')]["dec"] - res[(sc, a, 'no demand split')]["dec"] for a in ANCHORS])) + readings.append((f"ΔVFAC split − none: {t}", + [res[(sc, a, 'split (λ 0.05, ε 2)')]["V"] - res[(sc, a, 'no demand split')]["V"] for a in ANCHORS])) + readings.append((f"ΔEs t100 split − none: {t}", + [res[(sc, a, 'split (λ 0.05, ε 2)')]["Es"] - res[(sc, a, 'no demand split')]["Es"] for a in ANCHORS])) + lines += ["", "## Readings and robustness class", "", "| Reading | " + " | ".join(ANCHORS) + " | class |", + "|---|" + "---|" * (len(ANCHORS) + 1)] + for name, vals in readings: + lines.append(f"| {name} | " + " | ".join(f"{v:+.3f}" for v in vals) + f" | {bp.classify(vals, 'sign')} |") + lines.append("") + (OUT / "demand.md").write_text("\n".join(lines)) + print("\n".join(lines)) + + +if __name__ == "__main__": + main() diff --git a/simulations/gadm02/gadm05.py b/simulations/gadm02/gadm05.py index dda19f1..2ec9f1e 100644 --- a/simulations/gadm02/gadm05.py +++ b/simulations/gadm02/gadm05.py @@ -79,9 +79,21 @@ def _draws(s: dict, a: dict, p: dict, q: dict) -> tuple[float, float, float]: return dr, dm, ds +# --- ASSEMBLY-WP-0007-T04: two-good demand split (dematerialization) ------------------------------- +# Cr = rival share of demand, relative to its start (Cr0 = 1). It relaxes at dm_lam toward +# 1 - dm_eps * (qn - qn0), where qn = (Y_n / Y*) * sqrt(X * Q) is the quality-weighted non-rival +# offer. Physical throughput intensity thr and physical investment aK scale with Cr: the same +# capital stock serves dematerialized demand with less physical load. dm_lam = 0 switches it off. +DEM_PARAMS = {"dm_lam": 0.0, "dm_eps": 2.0} + + +def nonrival_quality(s: dict, a: dict) -> float: + return (a["Yn"] / a["Ystar"] if a["Ystar"] else 0.0) * (max(0.0, s["X"]) * max(0.0, s["Q"])) ** 0.5 + + def simulate_eco(params: dict | None = None, init: dict | None = None, eco: dict | None = None, - T: float = 100.0, dt: float = 0.1, record_every: int = 10) -> list[dict]: - """GADM-0.5 with ecological classes. Same loop as gadm04.simulate; E follows the classes.""" + T: float = 100.0, dt: float = 0.1, record_every: int = 10, demand: dict | None = None) -> list[dict]: + """GADM-0.5 with ecological classes (and optionally the demand split). E follows the classes.""" q = {**ECO_PARAMS, **(eco or {})} p = {**PARAMS, **(params or {})} s = {**g4.INIT, **(init or {})} @@ -95,9 +107,14 @@ def simulate_eco(params: dict | None = None, init: dict | None = None, eco: dict rr = q["rr"] if q["rr"] is not None else dr0 * s["Er"] / (1 - s["Er"]) rs = q["rs"] if q["rs"] is not None else ds0 * s["Es"] / (1 - s["Es"]) rm = _dm0 * s["Ed"] / (1 - s["Ed"]) if q["rm"] == "rest" else q["rm"] + qd = {**DEM_PARAMS, **(demand or {})} + thr0, aK0, cr = p["thr"], p["aK"], 1.0 + qn0 = nonrival_quality(s, a0) rows = [] steps = int(round(T / dt)) for i in range(steps + 1): + if qd["dm_lam"]: + p = {**p, "thr": thr0 * cr, "aK": aK0 * cr} d, a = g4.derivatives(s, p) dr, dm, ds = _draws(s, a, p, q) d["Er"] = rr * (1 - s["Er"]) - dr * s["Er"] @@ -106,10 +123,14 @@ def simulate_eco(params: dict | None = None, init: dict | None = None, eco: dict d["E"] = 0.0 if i % record_every == 0: row = {"t": round(i * dt, 6), **s, "P": g4.g3.total_p(s), "G": a["Gagg"], - **{k: a[k] for k in ("H", "A", "Ystar", "Yr", "Yn", "dem", "B", "V", "Vsel")}} + **{k: a[k] for k in ("H", "A", "Ystar", "Yr", "Yn", "dem", "B", "V", "Vsel")}, "Cr": cr, + "thru": p["e1"] * s["Kp"] * a["dem"] * p["thr"] + p["e2"] * s["Ko"]} row["VFAC"] = g4.g2.vfac(row) rows.append(row) if i < steps: + if qd["dm_lam"]: + target = max(0.05, 1 - qd["dm_eps"] * (nonrival_quality(s, a) - qn0)) + cr += dt * qd["dm_lam"] * (target - cr) s = {k: (max(0.0, s[k] + dt * d[k]) if k.startswith("N") else min(1.0, max(0.0, s[k] + dt * d[k]))) for k in STOCKS_ECO} s["E"] = eco_E(s) diff --git a/simulations/gadm02/results/demand.md b/simulations/gadm02/results/demand.md new file mode 100644 index 0000000..bf21528 --- /dev/null +++ b/simulations/gadm02/results/demand.md @@ -0,0 +1,44 @@ +# GADM-0.5-dev: two-good demand split (dematerialization) + +Generated by `simulations/gadm02/demand.py` (ASSEMBLY-WP-0007-T04). Ecological classes with +material replenishment at rest. Decoupled windows: 10-year windows with VFAC rising, throughput +falling and K_Ω not falling. Intensity trend: yearly change of throughput per unit of output, +years 0–10 (observed EU dematerialization ≈ −1.6 %/year). + +| Scenario | Anchor | Case | VFAC t100 | rival demand share Cr t100 | intensity trend | decoupled windows | sinks breach | Es t100 | +|---|---|---|---|---|---|---|---|---| +| Baseline (current trends) | B1 | no demand split | 0.377 | 1.00 | +0.0 % | 0.00 | — | 0.32 | +| Baseline (current trends) | B1 | split (λ 0.05, ε 2) | 0.381 | 0.93 | +0.0 % | 0.28 | — | 0.34 | +| Baseline (current trends) | B1 | split, strong (λ 0.1, ε 4) | 0.387 | 0.84 | +0.0 % | 0.44 | — | 0.36 | +| Baseline (current trends) | B2 | no demand split | 0.321 | 1.00 | -0.1 % | 0.00 | — | 0.35 | +| Baseline (current trends) | B2 | split (λ 0.05, ε 2) | 0.326 | 0.73 | -0.1 % | 0.00 | — | 0.37 | +| Baseline (current trends) | B2 | split, strong (λ 0.1, ε 4) | 0.333 | 0.29 | -0.1 % | 0.00 | — | 0.41 | +| Baseline (current trends) | B3 | no demand split | 0.305 | 1.00 | -0.2 % | 0.04 | — | 0.29 | +| Baseline (current trends) | B3 | split (λ 0.05, ε 2) | 0.311 | 0.56 | -0.2 % | 0.09 | — | 0.31 | +| Baseline (current trends) | B3 | split, strong (λ 0.1, ε 4) | 0.319 | 0.05 | -0.3 % | 0.08 | — | 0.34 | +| Baseline (current trends) | B4 | no demand split | 0.278 | 1.00 | -0.3 % | 0.34 | — | 0.21 | +| Baseline (current trends) | B4 | split (λ 0.05, ε 2) | 0.285 | 0.45 | -0.3 % | 0.37 | — | 0.23 | +| Baseline (current trends) | B4 | split, strong (λ 0.1, ε 4) | 0.290 | 0.05 | -0.3 % | 0.17 | — | 0.24 | +| Generative regime | B1 | no demand split | 0.607 | 1.00 | +0.1 % | 0.00 | t 83 | 0.19 | +| Generative regime | B1 | split (λ 0.05, ε 2) | 0.613 | 0.89 | +0.0 % | 0.00 | — | 0.21 | +| Generative regime | B1 | split, strong (λ 0.1, ε 4) | 0.622 | 0.74 | +0.0 % | 0.00 | — | 0.23 | +| Generative regime | B2 | no demand split | 0.583 | 1.00 | -0.1 % | 0.00 | t 49 | 0.17 | +| Generative regime | B2 | split (λ 0.05, ε 2) | 0.598 | 0.70 | -0.1 % | 0.45 | t 98 | 0.20 | +| Generative regime | B2 | split, strong (λ 0.1, ε 4) | 0.640 | 0.05 | -0.1 % | 0.89 | — | 0.30 | +| Generative regime | B3 | no demand split | 0.564 | 1.00 | -0.3 % | 0.00 | t 37 | 0.15 | +| Generative regime | B3 | split (λ 0.05, ε 2) | 0.585 | 0.53 | -0.3 % | 0.71 | t 61 | 0.19 | +| Generative regime | B3 | split, strong (λ 0.1, ε 4) | 0.614 | 0.05 | -0.4 % | 0.75 | — | 0.25 | +| Generative regime | B4 | no demand split | 0.509 | 1.00 | -0.4 % | 0.00 | t 29 | 0.14 | +| Generative regime | B4 | split (λ 0.05, ε 2) | 0.533 | 0.31 | -0.4 % | 0.22 | t 40 | 0.19 | +| Generative regime | B4 | split, strong (λ 0.1, ε 4) | 0.546 | 0.05 | -0.5 % | 0.34 | — | 0.21 | + +## Readings and robustness class + +| Reading | B1 | B2 | B3 | B4 | class | +|---|---|---|---|---|---| +| decoupled windows, split − none: Baseline (current trends) | +0.280 | +0.000 | +0.050 | +0.030 | QUALITATIVE BREAK | +| ΔVFAC split − none: Baseline (current trends) | +0.004 | +0.005 | +0.006 | +0.006 | quantitative shift | +| ΔEs t100 split − none: Baseline (current trends) | +0.014 | +0.026 | +0.025 | +0.017 | quantitative shift | +| decoupled windows, split − none: Generative regime | +0.000 | +0.450 | +0.710 | +0.220 | QUALITATIVE BREAK | +| ΔVFAC split − none: Generative regime | +0.006 | +0.015 | +0.021 | +0.024 | quantitative shift | +| ΔEs t100 split − none: Generative regime | +0.015 | +0.032 | +0.041 | +0.045 | quantitative shift | diff --git a/workplans/ASSEMBLY-WP-0007-gadm-sectors-goods.md b/workplans/ASSEMBLY-WP-0007-gadm-sectors-goods.md index f752696..33ba2e6 100644 --- a/workplans/ASSEMBLY-WP-0007-gadm-sectors-goods.md +++ b/workplans/ASSEMBLY-WP-0007-gadm-sectors-goods.md @@ -4,7 +4,7 @@ type: workplan title: "GADM: rival/non-rival goods, ecological classes, selection mechanisms" domain: communication repo: assembly-economics -status: active +status: finished flavor: implementation depends_on: [ASSEMBLY-WP-0006, ASSEMBLY-WP-0009] owner: claude-code @@ -84,11 +84,17 @@ and governance levers. Test capture of selection (scoping note § 4). ```task id: ASSEMBLY-WP-0007-T04 -status: todo +status: done priority: low state_hub_task_id: "c3dbbe24-4378-55cf-91c1-9e2788646728" ``` +**Done 2026-10-13:** two-good demand split (`gadm05`, `demand.py`, +`models/GADM-0.5.md` § 4). The generative regime decouples in 45–71 % of +decades at B2–B3, and its sinks breach moves 15–50 years later (strong case: +none). BR-010 resolved. The readings are conservative against observed +dematerialization, so calibration goes to WP-0018. + Only if T01–T03 raise a question that needs sector composition (scoping note § 3). @@ -106,3 +112,12 @@ implement the full four-sector model. Tests: Ground the elasticity in dematerialization evidence, for example the material footprint per unit of GDP over time (Eurostat env_ac_rme, UNEP IRP). + +## Close-out 2026-10-13 + +T01–T04 are done: GADM-0.5-dev (`gadm05.py`, `models/GADM-0.5.md`). All three +grounding tests in `ParameterGrounding.md` § 3 passed. BR-010 was raised and +resolved structurally. The residuals are handed off to ASSEMBLY-WP-0018: +calibrating dematerialization and the efficiency trend, grounding the +ecological classes, the non-rival parameters and the selection weights, and +deciding whether GADM-0.5 becomes the reference model. diff --git a/workplans/ASSEMBLY-WP-0018-gadm05-grounding.md b/workplans/ASSEMBLY-WP-0018-gadm05-grounding.md new file mode 100644 index 0000000..f58078f --- /dev/null +++ b/workplans/ASSEMBLY-WP-0018-gadm05-grounding.md @@ -0,0 +1,88 @@ +--- +id: ASSEMBLY-WP-0018 +type: workplan +title: "GADM-0.5 grounding: dematerialization, ecological classes, non-rival output" +domain: communication +repo: assembly-economics +status: proposed +flavor: residual +depends_on: [ASSEMBLY-WP-0007] +owner: claude-code +topic_slug: coulomb-social +created: "2026-10-13" +updated: "2026-10-13" +--- + +# GADM-0.5 grounding + +Residuals of ASSEMBLY-WP-0007 (`models/GADM-0.5.md`). The structural +extensions work and pass their grounding tests, but most of their parameters +are priors. This workplan grounds them in data, and then decides whether +GADM-0.5 replaces GADM-0.4 as the reference model. + +## Dematerialization: demand split and efficiency trend + +```task +id: ASSEMBLY-WP-0018-T01 +status: todo +priority: high +``` + +Modeled throughput intensity falls 0.1–0.5 % per year; observed EU +dematerialization is about 1.6 % per year (resource productivity, Eurostat +env_ac_rp / env_ac_mfa, 2000–2022; UNEP IRP for US and AR). Add an autonomous +efficiency trend for `thr`, and fit it with `dm_eps` and `dm_lam` to the +observed intensity series per jurisdiction. Re-run `demand.py`. Do the +decoupling and sinks-breach readings survive? + +## Ecological classes: starting levels, loads, replenishment + +```task +id: ASSEMBLY-WP-0018-T02 +status: todo +priority: high +``` + +Ground the class starting levels (per-boundary control variables, Planetary +Health Check), the load shares by class (energy, material and emission +intensities of physical capital vs. compute; IEA for data centers), and +material replenishment (reserve-to-production ratios over time, USGS). Which +class binds next depends on the replenishment. + +## Non-rival output parameters + +```task +id: ASSEMBLY-WP-0018-T03 +status: todo +priority: medium +``` + +Ground φ_r (rival share of organism output; task-level data from the +Anthropic Economic Index, L4) and xn (commons feed; open-licensing shares of +AI-generated output, for example code on public repositories). + +## Selection weights: speed and links + +```task +id: ASSEMBLY-WP-0018-T04 +status: todo +priority: low +``` + +Ground the weight adjustment speed (0.05 per year) and the capture +strengths. Test the candidate link `O = Q (1 − Pd)` (organism selection +quality falls with discovery concentration). Only that would make capture of +selection material for VFAC. + +## GADM-0.5 as reference model + +```task +id: ASSEMBLY-WP-0018-T05 +status: todo +priority: medium +``` + +After T01–T03, decide whether GADM-0.5 (classes, demand split, non-rival +output) becomes the reference model for the band probe, the calibration +(WP-0013/0015) and the cross-border world (WP-0011/0016). Re-run the key +readings and record what changes in the break register.