diff --git a/models/AdoptionBand.md b/models/AdoptionBand.md index 98932ef..0923244 100644 --- a/models/AdoptionBand.md +++ b/models/AdoptionBand.md @@ -156,6 +156,12 @@ peak (0.40 at year 10). this loop, "lagging" is not worse in the long run. This depends on the closed-economy assumption (§ 2.4, reading 2). +**Update 2026-10-13 (BR-009):** the loop as specified here relaxes Σ toward +the neutral 0.5. The uncalibrated results in this section keep that default. +Calibrated runs anchor Σ at its measured level (`sig_ref`, +`models/Calibration.md`), so measured low sentiment does not pull toward 0.5 +and does not brake adoption by its level alone. + ### 3.4 Limitations - Σ is a single national mood. There is no polarization, no split by cohort diff --git a/models/CrossBorder.md b/models/CrossBorder.md index c958f41..d1384ed 100644 --- a/models/CrossBorder.md +++ b/models/CrossBorder.md @@ -198,6 +198,11 @@ output levels are normalized and not comparable across jurisdictions. | EU − US relative output, years 0–25 | −0.03 to −0.24 (largest when the frontier accelerates) | −0.04 to +0.08 | | EU − US VFAC at t 100 | +0.03 to +0.05, except open-lineage world −0.02 | +0.01 to +0.02, except open-lineage world −0.02 | +After the BR-009 fix (sentiment anchored at measured levels), the verdicts +stay the same. With the loop on, EU and US adoption at t 10 are now equal in +X1 and X4 (0.27 / 0.26–0.27), and in X2 and X3 the US leads (0.44). The +relative-output differences with the loop on become −0.09 to +0.05. + Reading: Europe lags in adoption **only if sentiment does not matter**. With the measured sentiment levels (US Σ 0.29, EU 0.54) and the legitimacy loop, US adoption brakes and the EU no longer lags. Lagging costs output early, diff --git a/research/BreakRegister.md b/research/BreakRegister.md index 90afa7b..f0001ad 100644 --- a/research/BreakRegister.md +++ b/research/BreakRegister.md @@ -21,4 +21,4 @@ that part of the band. | BR-006 | 2026-10-13 (WP-0013-T04) | Legitimacy loop damps adoption (BR-005, AdoptionBand § 3.3) | damping under extractive regimes → amplifying under rights-first levers from the calibrated start (US, AR) | when adoption lowers domination, perceived benefit rises and sentiment accelerates adoption | none structural; the reading is regime-dependent | open: state the loop's effect per regime | | 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) | open: lineage access rules (BR-003) | -| 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) | **structural candidate:** sentiment reference anchored to the observed level and a small or lagged adoption elasticity | open: ASSEMBLY-WP-0017 | +| 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 | diff --git a/research/ModelMatching.md b/research/ModelMatching.md index cea98c5..a73fb9d 100644 --- a/research/ModelMatching.md +++ b/research/ModelMatching.md @@ -30,20 +30,26 @@ points after checkpoint 0. | Jurisdiction | Data | Anchor weights | Loop weights | Best | |---|---|---|---|---| -| US | BTOS, 23 biweekly points 2025–2026 | B1 0.00 · B2 0.38 · B3 0.44 · B4 0.18 | off 1.00 · on 0.00 | B3 / loop off (0.44) | -| EU | Eurostat 2023–2025 | B1 0.00 · B2 0.38 · B3 0.62 · B4 0.00 | off 0.47 · on 0.53 | B3 / loop off (0.46) | -| DE | Eurostat 2023–2025 | B1 0.00 · B2 0.73 · B3 0.27 · B4 0.00 | off 0.33 · on 0.67 | B2 / loop on (0.57) | +| US | BTOS, 23 biweekly points 2025–2026 | B1 0.00 · B2 0.38 · B3 0.40 · B4 0.21 | off 0.52 · on 0.48 | B3 / loop off (0.23) | +| EU | Eurostat 2023–2025 | B1 0.00 · B2 0.03 · B3 0.96 · B4 0.01 | off 0.48 · on 0.52 | B3 / loop on (0.50) | +| DE | Eurostat 2023–2025 | B1 0.00 · B2 0.44 · B3 0.56 · B4 0.00 | off 0.49 · on 0.51 | B3 / loop on (0.29) | + +Weights after the BR-009 fix (sentiment anchored at its measured level, +WP-0017-T01). Before the fix: US B3 0.44 / B2 0.38 with loop off 1.00; EU B3 +0.62; DE B2 0.73. Readings: 1. **The data rule out B1 everywhere, and B4 for the EU and DE.** The present is B2–B3, consistent with the calibration (`models/Calibration.md` § 3). -2. **US adoption is not braked by its low sentiment.** Every loop-on - candidate fails for the US, because with measured US sentiment (Σ 0.285) - the loop slows adoption far below the observed growth. Either adoption's - elasticity to sentiment (`sig_adopt`) is much smaller than 1, or - sentiment acts on adoption with a long lag. This is the first data-based - constraint on the legitimacy loop. +2. **The adoption data cannot yet tell the loop on from off.** Before the + BR-009 fix, every US loop-on candidate failed. The neutral reference made + the measured low sentiment (Σ 0.285) brake adoption from the first day. + With sentiment anchored at its measured level, today's level is part of + the fitted speed, and only *changes* in sentiment act. The loop weights are + then about 0.5 everywhere. The loop becomes identifiable with sentiment + observations after checkpoint 0. `sig_adopt` stays at 1 and is not yet + identified. 3. **No regime is established yet.** No candidate reaches weight 0.75. Predictions v1 (P-2026-001 … 004) assume growth alignment between B2 and B3, which the matched weights bracket. No predictions v2 are needed (T04). diff --git a/simulations/gadm02/calibrate_data.py b/simulations/gadm02/calibrate_data.py index 3d8e46c..d38658b 100644 --- a/simulations/gadm02/calibrate_data.py +++ b/simulations/gadm02/calibrate_data.py @@ -88,6 +88,7 @@ def start_state(jur: str, anchor: str, auto: float | None = None) -> tuple[dict, s["E"] = centre(t["E"]) if "Sig" in t: s["Sig"] = s["Lg"] = centre(t["Sig"]) + p["sig_ref"] = s["Sig"] # BR-009: sentiment anchored at its measured level for _ in range(2): if "B" in t: # base labour share so that B(t0) is on target c = p["dshare"] + p["cp"] diff --git a/simulations/gadm02/gadm04.py b/simulations/gadm02/gadm04.py index 2748ba6..4372289 100644 --- a/simulations/gadm02/gadm04.py +++ b/simulations/gadm02/gadm04.py @@ -83,6 +83,11 @@ PARAMS.update({ "leg_m": 0.5, # membrane rights tightening per unit of stance below neutral "leg_expl": 0.5, # explainability tightening per unit of stance below neutral "sig_pb0": None, # reference perceived benefit; None = value at the initial state + # WP-0017-T01 (BR-009): sentiment reference level. None = neutral 0.5 (GADM-0.4 as + # first specified). A number (calibrated runs: the measured Sigma) is the level Sigma + # relaxes to when perceived benefit is unchanged; adoption and legislation then respond + # to Sigma and Lg relative to it, because today's level is already in the fitted speed. + "sig_ref": None, # WP-0009-T04: deployment permissiveness of a jurisdiction; scales the organism # inflow (investment, learning, seeding) like the legislative stance. 1 = neutral. "perm": 1.0, @@ -131,7 +136,8 @@ def legislated(s: dict, p: dict) -> dict: """Parameters with legislation levers shifted by the legislative stance Lg.""" if not p["sent"]: return p - gap = 0.5 - s["Lg"] # > 0: tightening after negative sentiment + ref = 0.5 if p["sig_ref"] is None else p["sig_ref"] + gap = ref - s["Lg"] # > 0: tightening after negative sentiment clip = lambda v: min(1.0, max(0.0, v)) # noqa: E731 return {**p, "m": clip(p["m"] + p["leg_m"] * gap), "expl": clip(p["expl"] + p["leg_expl"] * gap)} @@ -158,14 +164,15 @@ def derivatives(s: dict, p: dict) -> tuple[dict, dict]: # permissiveness, sentiment and stance scale the organism inflow, not its depreciation scale = p["perm"] if p["sent"]: - scale *= max(0.0, 1 + p["sig_adopt"] * 2 * (s["Sig"] - 0.5)) \ - * max(0.0, 1 + p["leg_perm"] * 2 * (s["Lg"] - 0.5)) + ref = 0.5 if p["sig_ref"] is None else p["sig_ref"] + scale *= max(0.0, 1 + p["sig_adopt"] * 2 * (s["Sig"] - ref)) \ + * max(0.0, 1 + p["leg_perm"] * 2 * (s["Lg"] - ref)) inflow = d["Ko"] + p["dO"] * s["Ko"] d["Ko"] = scale * inflow - p["dO"] * s["Ko"] if p["sent"]: pb = perceived_benefit(s, a, p) pb0 = pb if p["sig_pb0"] is None else p["sig_pb0"] - target = min(1.0, max(0.0, 0.5 + p["sig_gain"] * (pb - pb0))) + target = min(1.0, max(0.0, (0.5 if p["sig_ref"] is None else p["sig_ref"]) + p["sig_gain"] * (pb - pb0))) d["Sig"] = p["sent"] * p["sig_rate"] * (target - s["Sig"]) d["Lg"] = p["sent"] * (s["Sig"] - s["Lg"]) / p["leg_lag"] else: diff --git a/simulations/gadm02/results/calibrated_readings.md b/simulations/gadm02/results/calibrated_readings.md index 9697ec4..a34f33b 100644 --- a/simulations/gadm02/results/calibrated_readings.md +++ b/simulations/gadm02/results/calibrated_readings.md @@ -10,39 +10,39 @@ already contains today's permissiveness). | Regime | Loop | K_Ω t5 / t25 / peak | Ȳ 0–25 | VFAC t100 | G | A | P t0 → t100 | floors broken | |---|---|---|---|---|---|---|---|---| | J1 | off | 0.18 / 0.23 / 0.23 | 0.253 | 0.419 | 0.48 | 0.56 | 0.68 → 0.54 | none | -| J1 | on | 0.11 / 0.29 / 0.29 | 0.252 | 0.413 | 0.48 | 0.54 | 0.68 → 0.55 | none | +| J1 | on | 0.18 / 0.28 / 0.29 | 0.261 | 0.411 | 0.47 | 0.54 | 0.68 → 0.55 | none | | J2 | off | 0.38 / 0.41 / 0.44 | 0.289 | 0.268 | 0.37 | 0.33 | 0.68 → 0.78 | P | -| J2 | on | 0.19 / 0.23 / 0.27 | 0.247 | 0.301 | 0.40 | 0.41 | 0.68 → 0.75 | P | +| J2 | on | 0.34 / 0.22 / 0.35 | 0.252 | 0.299 | 0.40 | 0.40 | 0.68 → 0.76 | P | | J3 | off | 0.33 / 0.36 / 0.39 | 0.277 | 0.253 | 0.36 | 0.32 | 0.68 → 0.82 | P | -| J3 | on | 0.16 / 0.19 / 0.22 | 0.235 | 0.295 | 0.39 | 0.39 | 0.68 → 0.77 | P | +| J3 | on | 0.30 / 0.18 / 0.30 | 0.240 | 0.293 | 0.39 | 0.39 | 0.68 → 0.77 | P | | J4 | off | 0.34 / 0.39 / 0.41 | 0.284 | 0.285 | 0.38 | 0.41 | 0.68 → 0.77 | P | -| J4 | on | 0.17 / 0.31 / 0.31 | 0.254 | 0.297 | 0.39 | 0.43 | 0.68 → 0.76 | P | +| J4 | on | 0.33 / 0.32 / 0.38 | 0.274 | 0.296 | 0.39 | 0.43 | 0.68 → 0.76 | P | ## EU (current regime ≈ J1) | Regime | Loop | K_Ω t5 / t25 / peak | Ȳ 0–25 | VFAC t100 | G | A | P t0 → t100 | floors broken | |---|---|---|---|---|---|---|---|---| | J1 | off | 0.25 / 0.30 / 0.31 | 0.261 | 0.289 | 0.41 | 0.41 | 0.72 → 0.82 | P | -| J1 | on | 0.26 / 0.18 / 0.28 | 0.244 | 0.306 | 0.41 | 0.47 | 0.72 → 0.80 | P | +| J1 | on | 0.24 / 0.18 / 0.26 | 0.242 | 0.306 | 0.41 | 0.47 | 0.72 → 0.80 | P | | J2 | off | 0.55 / 0.52 / 0.59 | 0.318 | 0.193 | 0.33 | 0.18 | 0.72 → 0.91 | P,A | -| J2 | on | 0.46 / 0.14 / 0.47 | 0.234 | 0.245 | 0.38 | 0.31 | 0.72 → 0.88 | P | +| J2 | on | 0.43 / 0.14 / 0.43 | 0.233 | 0.246 | 0.38 | 0.31 | 0.72 → 0.88 | P | | J3 | off | 0.49 / 0.49 / 0.54 | 0.308 | 0.186 | 0.32 | 0.17 | 0.72 → 0.92 | P,A | -| J3 | on | 0.41 / 0.11 / 0.41 | 0.224 | 0.237 | 0.38 | 0.30 | 0.72 → 0.90 | P | +| J3 | on | 0.38 / 0.11 / 0.38 | 0.223 | 0.237 | 0.38 | 0.30 | 0.72 → 0.90 | P | | J4 | off | 0.50 / 0.51 / 0.55 | 0.313 | 0.207 | 0.33 | 0.24 | 0.72 → 0.90 | P | -| J4 | on | 0.51 / 0.35 / 0.53 | 0.290 | 0.228 | 0.36 | 0.29 | 0.72 → 0.89 | P | +| J4 | on | 0.47 / 0.35 / 0.50 | 0.287 | 0.228 | 0.36 | 0.29 | 0.72 → 0.89 | P | ## AR (current regime ≈ J2) | Regime | Loop | K_Ω t5 / t25 / peak | Ȳ 0–25 | VFAC t100 | G | A | P t0 → t100 | floors broken | |---|---|---|---|---|---|---|---|---| | J1 | off | 0.13 / 0.14 / 0.14 | 0.219 | 0.342 | 0.41 | 0.52 | 0.75 → 0.71 | P | -| J1 | on | 0.12 / 0.18 / 0.18 | 0.223 | 0.338 | 0.41 | 0.51 | 0.75 → 0.72 | P | +| J1 | on | 0.14 / 0.18 / 0.18 | 0.225 | 0.337 | 0.41 | 0.51 | 0.75 → 0.72 | P | | J2 | off | 0.29 / 0.31 / 0.34 | 0.256 | 0.229 | 0.34 | 0.27 | 0.75 → 0.86 | P | -| J2 | on | 0.22 / 0.16 / 0.23 | 0.224 | 0.253 | 0.36 | 0.33 | 0.75 → 0.85 | P | +| J2 | on | 0.26 / 0.16 / 0.27 | 0.226 | 0.253 | 0.36 | 0.33 | 0.75 → 0.85 | P | | J3 | off | 0.25 / 0.27 / 0.29 | 0.243 | 0.220 | 0.33 | 0.26 | 0.75 → 0.89 | P | -| J3 | on | 0.19 / 0.13 / 0.20 | 0.212 | 0.242 | 0.35 | 0.32 | 0.75 → 0.88 | P | +| J3 | on | 0.23 / 0.13 / 0.23 | 0.214 | 0.241 | 0.35 | 0.32 | 0.75 → 0.88 | P | | J4 | off | 0.25 / 0.28 / 0.30 | 0.249 | 0.243 | 0.34 | 0.35 | 0.75 → 0.86 | P | -| J4 | on | 0.20 / 0.23 / 0.25 | 0.235 | 0.251 | 0.35 | 0.37 | 0.75 → 0.85 | P | +| J4 | on | 0.25 / 0.24 / 0.28 | 0.242 | 0.251 | 0.35 | 0.37 | 0.75 → 0.85 | P | ## Readings check diff --git a/simulations/gadm02/results/calibrated_starts.json b/simulations/gadm02/results/calibrated_starts.json index cbd0eb8..31e5961 100644 --- a/simulations/gadm02/results/calibrated_starts.json +++ b/simulations/gadm02/results/calibrated_starts.json @@ -55,6 +55,7 @@ "r_i": 0.45, "r_lin": 0.45, "r_mem": 0.45, + "sig_ref": 0.43, "wL0": 0.38659793814432997, "x_att": 0.7 }, @@ -119,6 +120,7 @@ "r_i": 0.45, "r_lin": 0.45, "r_mem": 0.45, + "sig_ref": 0.535, "std": 0.6, "wL0": 0.6156930126002291, "x_att": 0.3 @@ -184,6 +186,7 @@ "r_i": 0.45, "r_lin": 0.45, "r_mem": 0.45, + "sig_ref": 0.535, "std": 0.6, "wL0": 0.5226231386025201, "x_att": 0.3 @@ -247,6 +250,7 @@ "r_i": 0.45, "r_lin": 0.45, "r_mem": 0.45, + "sig_ref": 0.285, "wL0": 0.47841498652534076, "x_att": 0.8 }, diff --git a/simulations/gadm02/results/matching.md b/simulations/gadm02/results/matching.md index c610507..3c3c39b 100644 --- a/simulations/gadm02/results/matching.md +++ b/simulations/gadm02/results/matching.md @@ -12,16 +12,16 @@ Series: U.S. Census Bureau BTOS Q7 (National.xlsx), periods 2025-24 to 2026-20 ( | Candidate | log-likelihood | weight | t0 | K_Ω at window end | |---|---|---|---|---| -| B3/loop off | -8.3 | 0.443 | 1.20 | 0.172 | -| B2/loop off | -8.5 | 0.376 | 0.20 | 0.077 | -| B4/loop off | -9.2 | 0.176 | 1.90 | 0.278 | -| B4/loop on | -12.8 | 0.005 | 0.00 | 0.065 | -| B3/loop on | -19.4 | 0.000 | 0.00 | 0.062 | +| B3/loop off | -8.3 | 0.230 | 1.20 | 0.172 | +| B2/loop off | -8.5 | 0.195 | 0.20 | 0.077 | +| B2/loop on | -8.5 | 0.187 | 0.20 | 0.077 | +| B3/loop on | -8.6 | 0.174 | 1.15 | 0.167 | +| B4/loop on | -9.0 | 0.122 | 1.65 | 0.244 | +| B4/loop off | -9.2 | 0.092 | 1.90 | 0.278 | | B1/loop off | -80.7 | 0.000 | 0.00 | 0.054 | -| B2/loop on | -82.7 | 0.000 | 3.70 | 0.069 | -| B1/loop on | -110.1 | 0.000 | 9.60 | 0.045 | +| B1/loop on | -80.8 | 0.000 | 0.00 | 0.054 | -**Best:** B3/loop off (weight 0.44). Anchor weights: B1 0.00, B2 0.38, B3 0.44, B4 0.18. Loop weights: off 1.00, on 0.00. +**Best:** B3/loop off (weight 0.23). Anchor weights: B1 0.00, B2 0.38, B3 0.40, B4 0.21. Loop weights: off 0.52, on 0.48. ## EU @@ -29,16 +29,16 @@ Series: Eurostat isoc_eb_ai, EU27_2020, reference years 2023-2025 (2021: 7.65, b | Candidate | log-likelihood | weight | t0 | K_Ω at window end | |---|---|---|---|---| -| B3/loop off | -2.2 | 0.456 | 0.50 | 0.198 | -| B2/loop on | -2.4 | 0.366 | 0.00 | 0.107 | -| B3/loop on | -3.3 | 0.159 | 0.55 | 0.222 | +| B3/loop on | -2.1 | 0.501 | 0.45 | 0.193 | +| B3/loop off | -2.2 | 0.458 | 0.50 | 0.198 | | B2/loop off | -5.6 | 0.016 | 0.00 | 0.098 | +| B2/loop on | -5.7 | 0.015 | 0.00 | 0.098 | +| B4/loop on | -6.4 | 0.007 | 0.90 | 0.290 | | B4/loop off | -7.5 | 0.002 | 1.00 | 0.308 | -| B4/loop on | -11.4 | 0.000 | 1.05 | 0.356 | -| B1/loop on | -49.8 | 0.000 | 0.00 | 0.061 | | B1/loop off | -58.0 | 0.000 | 0.00 | 0.058 | +| B1/loop on | -58.0 | 0.000 | 0.00 | 0.058 | -**Best:** B3/loop off (weight 0.46). Anchor weights: B1 0.00, B2 0.38, B3 0.62, B4 0.00. Loop weights: off 0.47, on 0.53. +**Best:** B3/loop on (weight 0.50). Anchor weights: B1 0.00, B2 0.03, B3 0.96, B4 0.01. Loop weights: off 0.48, on 0.52. ## DE @@ -46,13 +46,13 @@ Series: Eurostat isoc_eb_ai, DE, reference years 2023-2025 (2021: 10.56, exclude | Candidate | log-likelihood | weight | t0 | K_Ω at window end | |---|---|---|---|---| -| B2/loop on | -0.1 | 0.573 | 0.00 | 0.110 | -| B3/loop off | -1.3 | 0.178 | 0.65 | 0.214 | -| B2/loop off | -1.4 | 0.152 | 0.00 | 0.101 | -| B3/loop on | -1.9 | 0.097 | 0.70 | 0.240 | +| B3/loop on | -1.2 | 0.295 | 0.65 | 0.211 | +| B3/loop off | -1.3 | 0.263 | 0.65 | 0.214 | +| B2/loop off | -1.4 | 0.225 | 0.00 | 0.101 | +| B2/loop on | -1.5 | 0.216 | 0.00 | 0.101 | +| B4/loop on | -6.7 | 0.001 | 1.25 | 0.344 | | B4/loop off | -8.3 | 0.000 | 1.35 | 0.370 | -| B4/loop on | -11.0 | 0.000 | 1.35 | 0.415 | -| B1/loop on | -36.2 | 0.000 | 0.00 | 0.063 | | B1/loop off | -43.4 | 0.000 | 0.00 | 0.059 | +| B1/loop on | -43.5 | 0.000 | 0.00 | 0.059 | -**Best:** B2/loop on (weight 0.57). Anchor weights: B1 0.00, B2 0.73, B3 0.27, B4 0.00. Loop weights: off 0.33, on 0.67. +**Best:** B3/loop on (weight 0.29). Anchor weights: B1 0.00, B2 0.44, B3 0.56, B4 0.00. Loop weights: off 0.49, on 0.51. diff --git a/simulations/gadm02/results/world_scenarios.md b/simulations/gadm02/results/world_scenarios.md index 4c7004a..661e274 100644 --- a/simulations/gadm02/results/world_scenarios.md +++ b/simulations/gadm02/results/world_scenarios.md @@ -13,10 +13,10 @@ output levels are normalized model units and not comparable across jurisdictions | off | EU | 0.31 | 1.01 / 0.85 | 0.281 | 0.82 | 0.41 | 0.41 | 0.54 | | off | AR | 0.34 | 0.99 / 0.81 | 0.241 | 0.83 | 0.35 | 0.27 | 0.43 | | off | J4 | 0.40 | 1.07 / 0.92 | 0.285 | 0.77 | 0.38 | 0.41 | 0.28 | -| on | US | 0.21 | 0.88 / 0.68 | 0.295 | 0.77 | 0.39 | 0.39 | 0.37 | -| on | EU | 0.28 | 0.96 / 0.76 | 0.311 | 0.77 | 0.42 | 0.46 | 0.40 | -| on | AR | 0.25 | 0.89 / 0.68 | 0.275 | 0.78 | 0.37 | 0.31 | 0.38 | -| on | J4 | 0.23 | 0.96 / 0.84 | 0.297 | 0.76 | 0.39 | 0.43 | 0.45 | +| on | US | 0.27 | 0.90 / 0.69 | 0.293 | 0.77 | 0.39 | 0.39 | 0.16 | +| on | EU | 0.27 | 0.95 / 0.76 | 0.310 | 0.77 | 0.42 | 0.46 | 0.44 | +| on | AR | 0.27 | 0.90 / 0.68 | 0.274 | 0.78 | 0.37 | 0.31 | 0.31 | +| on | J4 | 0.38 | 1.03 / 0.85 | 0.296 | 0.76 | 0.39 | 0.43 | 0.24 | ## X2 open-lineage world @@ -26,10 +26,10 @@ output levels are normalized model units and not comparable across jurisdictions | off | EU | 0.34 | 1.09 / 1.01 | 0.359 | 0.63 | 0.45 | 0.38 | 0.54 | | off | AR | 0.37 | 1.06 / 0.93 | 0.303 | 0.66 | 0.37 | 0.25 | 0.43 | | off | J4 | 0.40 | 1.07 / 0.92 | 0.285 | 0.77 | 0.38 | 0.41 | 0.28 | -| on | US | 0.33 | 1.10 / 1.07 | 0.398 | 0.56 | 0.48 | 0.48 | 0.47 | -| on | EU | 0.33 | 1.06 / 0.97 | 0.379 | 0.60 | 0.46 | 0.40 | 0.43 | -| on | AR | 0.29 | 0.98 / 0.85 | 0.332 | 0.62 | 0.40 | 0.28 | 0.38 | -| on | J4 | 0.23 | 0.96 / 0.84 | 0.297 | 0.76 | 0.39 | 0.43 | 0.45 | +| on | US | 0.44 | 1.14 / 1.08 | 0.394 | 0.57 | 0.47 | 0.48 | 0.26 | +| on | EU | 0.32 | 1.05 / 0.96 | 0.378 | 0.60 | 0.46 | 0.40 | 0.46 | +| on | AR | 0.32 | 0.99 / 0.84 | 0.330 | 0.62 | 0.40 | 0.28 | 0.31 | +| on | J4 | 0.38 | 1.03 / 0.85 | 0.296 | 0.76 | 0.39 | 0.43 | 0.24 | ## X3 accelerating frontier @@ -39,10 +39,10 @@ output levels are normalized model units and not comparable across jurisdictions | off | EU | 0.39 | 1.08 / 0.95 | 0.267 | 0.84 | 0.40 | 0.38 | 0.54 | | off | AR | 0.41 | 1.06 / 0.89 | 0.226 | 0.85 | 0.34 | 0.24 | 0.43 | | off | J4 | 0.74 | 1.33 / 1.23 | 0.246 | 0.80 | 0.35 | 0.31 | 0.28 | -| on | US | 0.30 | 0.93 / 0.72 | 0.290 | 0.78 | 0.39 | 0.38 | 0.34 | -| on | EU | 0.28 | 0.99 / 0.82 | 0.306 | 0.78 | 0.42 | 0.43 | 0.38 | -| on | AR | 0.25 | 0.93 / 0.73 | 0.269 | 0.78 | 0.37 | 0.30 | 0.34 | -| on | J4 | 0.37 | 1.12 / 1.03 | 0.275 | 0.78 | 0.37 | 0.37 | 0.40 | +| on | US | 0.44 | 0.99 / 0.74 | 0.288 | 0.78 | 0.39 | 0.37 | 0.13 | +| on | EU | 0.34 | 1.01 / 0.82 | 0.305 | 0.78 | 0.42 | 0.43 | 0.41 | +| on | AR | 0.33 | 0.95 / 0.74 | 0.268 | 0.78 | 0.37 | 0.30 | 0.27 | +| on | J4 | 0.67 | 1.24 / 1.05 | 0.274 | 0.78 | 0.37 | 0.37 | 0.19 | ## X4 fragmented blocs @@ -52,23 +52,23 @@ output levels are normalized model units and not comparable across jurisdictions | off | EU | 0.30 | 1.00 / 0.84 | 0.282 | 0.83 | 0.41 | 0.42 | 0.54 | | off | AR | 0.34 | 0.99 / 0.80 | 0.235 | 0.85 | 0.34 | 0.27 | 0.43 | | off | J4 | 0.40 | 1.07 / 0.92 | 0.285 | 0.77 | 0.38 | 0.41 | 0.28 | -| on | US | 0.21 | 0.88 / 0.68 | 0.295 | 0.77 | 0.39 | 0.39 | 0.37 | -| on | EU | 0.27 | 0.94 / 0.72 | 0.307 | 0.79 | 0.42 | 0.47 | 0.41 | -| on | AR | 0.24 | 0.87 / 0.64 | 0.267 | 0.81 | 0.37 | 0.33 | 0.39 | -| on | J4 | 0.23 | 0.96 / 0.84 | 0.297 | 0.76 | 0.39 | 0.43 | 0.45 | +| on | US | 0.27 | 0.90 / 0.69 | 0.293 | 0.77 | 0.39 | 0.39 | 0.16 | +| on | EU | 0.26 | 0.93 / 0.71 | 0.307 | 0.79 | 0.42 | 0.47 | 0.44 | +| on | AR | 0.25 | 0.87 / 0.64 | 0.266 | 0.81 | 0.37 | 0.33 | 0.32 | +| on | J4 | 0.38 | 1.03 / 0.85 | 0.296 | 0.76 | 0.39 | 0.43 | 0.24 | ## Hypothesis re-test | Context | Loop | H1 EU adoption lags US and AR (K_Ω t10) | EU − US: ΔȲ 0–25 / ΔVFAC | H2 AR − EU: ΔȲ 0–25 / ΔȲ 0–100 / ΔVFAC | H2 holds? | |---|---|---|---|---|---| | X1 US-led concentrated frontier | off | yes (0.31 vs 0.39, 0.34) | -0.031 / +0.028 | -0.016 / -0.040 / -0.041 | no | -| X1 US-led concentrated frontier | on | no (0.28 vs 0.21, 0.25) | +0.075 / +0.016 | -0.066 / -0.079 / -0.036 | no | +| X1 US-led concentrated frontier | on | no (0.27 vs 0.27, 0.27) | +0.050 / +0.017 | -0.048 / -0.073 / -0.036 | no | | X2 open-lineage world | off | yes (0.34 vs 0.45, 0.37) | -0.074 / -0.020 | -0.028 / -0.083 / -0.055 | no | -| X2 open-lineage world | on | no (0.33 vs 0.33, 0.29) | -0.039 / -0.018 | -0.074 / -0.122 / -0.048 | no | +| X2 open-lineage world | on | no (0.32 vs 0.44, 0.32) | -0.093 / -0.017 | -0.060 / -0.117 / -0.048 | no | | X3 accelerating frontier | off | yes (0.39 vs 0.73, 0.41) | -0.235 / +0.049 | -0.024 / -0.052 / -0.041 | no | -| X3 accelerating frontier | on | no (0.28 vs 0.30, 0.25) | +0.058 / +0.016 | -0.063 / -0.086 / -0.037 | no | +| X3 accelerating frontier | on | no (0.34 vs 0.44, 0.33) | +0.022 / +0.017 | -0.053 / -0.082 / -0.037 | no | | X4 fragmented blocs | off | yes (0.30 vs 0.39, 0.34) | -0.038 / +0.029 | -0.016 / -0.044 / -0.047 | no | -| X4 fragmented blocs | on | no (0.27 vs 0.21, 0.24) | +0.060 / +0.012 | -0.073 / -0.080 / -0.040 | no | +| X4 fragmented blocs | on | no (0.26 vs 0.27, 0.25) | +0.027 / +0.013 | -0.055 / -0.073 / -0.040 | no | ## Local-in-context vs. global (EU, context X1, loop off) diff --git a/simulations/gadm02/test_gadm04.py b/simulations/gadm02/test_gadm04.py index 6780b3d..cf268bd 100644 --- a/simulations/gadm02/test_gadm04.py +++ b/simulations/gadm02/test_gadm04.py @@ -98,6 +98,13 @@ class TestGrounding(unittest.TestCase): self.assertEqual(ko, sorted(ko)) self.assertLess(ko[0], ko[1]) + def test_anchored_sentiment_stays_at_reference_without_response(self): + # BR-009: with sig_ref set to the starting level, an unchanged perceived benefit keeps Sigma there + r = g.simulate({"sent": 1.0, "sig_gain": 0.0, "sig_ref": 0.3}, {"Sig": 0.3, "Lg": 0.3}, T=20)[-1] + self.assertAlmostEqual(r["Sig"], 0.3, places=9) + free = g.simulate({"sent": 1.0, "sig_gain": 0.0}, {"Sig": 0.3, "Lg": 0.3}, T=20)[-1] + self.assertGreater(free["Sig"], 0.4) # neutral reference: reverts toward 0.5 + if __name__ == "__main__": unittest.main() diff --git a/workplans/ASSEMBLY-WP-0017-reliable-flip-detection.md b/workplans/ASSEMBLY-WP-0017-reliable-flip-detection.md index 46c3de5..9984479 100644 --- a/workplans/ASSEMBLY-WP-0017-reliable-flip-detection.md +++ b/workplans/ASSEMBLY-WP-0017-reliable-flip-detection.md @@ -4,7 +4,7 @@ type: workplan title: "Reliable flip detection: indicators, per-regime filter, sentiment equation" domain: communication repo: assembly-economics -status: proposed +status: active flavor: residual depends_on: [ASSEMBLY-WP-0012] owner: claude-code @@ -25,11 +25,17 @@ No flip may be recorded in `research/FlipRegister.md` until T04 passes. ```task id: ASSEMBLY-WP-0017-T01 -status: todo +status: done priority: high state_hub_task_id: "2d3c06d2-8788-5ed5-a68e-d648f61ef317" ``` +**Done 2026-10-13:** `sig_ref` in `gadm04` (default None = 0.5 keeps old +results; calibrated runs anchor at measured Σ), test added, pipeline re-run. +R1–R4 and H1/H2 verdicts unchanged; matching loop weights ≈ 0.5 (the earlier +"US not braked" reading was an artifact). `sig_adopt` is not identifiable +until sentiment points after checkpoint 0 exist (T02). + Σ relaxes toward 0.5 + gain × Δ(perceived benefit), so from the measured US level (0.285) it rises, while measured US sentiment fell 2021–2026. Add a sentiment reference parameter: neutral 0.5 (the default, keeps old results)