Research: estate tally adds bloc-parliament-at-threshold and operator influence cap (Fork Desk 41)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-29 22:15:38 +01:00
commit 18bbe6c312
7 changed files with 712 additions and 0 deletions

View file

@ -172,3 +172,159 @@ S2 logrolling (6-motion agendas, 1500 each, greedy mutually profitable pairwise
- Individual equality cuts the other way. WTA two-tier is Penrose-equalizable with sqrt weights; prop needs headcount weights. Gelman et al. and Kirsch argue that correlation pulls the fair weights back toward proportional.
- Operator dominance. Under WTA her ceiling is the Members bloc's council power (.42 equal, .84 members-heavy). Under prop at q=.5 her influence has no such ceiling. Her internal dictatorship of Members ends at the n shown in the section 5 table.
- Renormalization with no quorum: participation-safe in every exhaustive probe. Adding any quorum floor while estates are empty hands the sole Member, or the Minds estate, a stay-home veto. The two-estates floor conflicts with the "decide without me" ruling today. The bounds that remain on a lone Minds estate are a headcount floor <= .889, category thresholds (binding only under prop, and void at ICC 1), and a delay window whose cancel opportunity depends on her absence length (section 5b).
## 9. Third rule: `bloc-parliament-at-threshold` (bpt)
Each live bloc casts its whole weight For iff its internal For share (abstain excluded) >= the category threshold q, else Against. The council then needs weighted For >= q over live estates (renormalized). Code `estate-sims\third.py` (out `third.out.md`) and `estate-sims\bounds.py` (out `bounds.out.md`). The model and draws are the same as sections 3-6 (Minds ICC .44, sizes 8/15/30/4).
- **bpt vs WTA at q=.5:** these differ only at exact internal ties. A 4/8 Minds split casts For under bpt (.5 >= .5) and nothing under WTA. With continuous shares (logrolling) the two are identical.
**Aggregate bounds** (all four estates live; lowest weighted popular For share that can pass / highest that can fail; prop is exactly q / just under q). bpt applies q twice, so it widens the band on both sides:
| seed | q | WTA | bpt |
|---|---|---|---|
| equal | .15 | .125 / .500 | .037 / .150 |
| equal | .5 | .250 / .625 | .250 / .625 |
| equal | .66 | .375 / .750 | .495 / .830 |
| minds-heavy | .66 | .350 / .800 | .462 / .864 |
| members-heavy | .66 | .400 / .825 | .528 / .881 |
- Equal seed, q=.15: one bloc with 15% internal For passes the motion, so 3.7% weighted support suffices.
- Equal seed, q=.66: three blocs at 66% pass with 49.5% support, while four blocs at 65.9% fail with 65.9% support.
**Outcomes** (T1): P(pass) prop / WTA / bpt, then P(outcomes differ) bpt-prop / bpt-WTA / prop-WTA:
| seed | q | P(pass) | differ |
|---|---|---|---|
| equal | .15 | .934 / .838 / .985 | .050 / .147 / .098 |
| equal | .5 | .502 / .594 / .676 | .179 / .082 / .119 |
| equal | .66 | .265 / .405 / .233 | .080 / .171 / .148 |
| minds-heavy | .5 | .502 / .537 / .575 | .126 / .038 / .117 |
| members-heavy | .66 | .271 / .343 / .194 | .099 / .149 / .113 |
- bpt is the most permissive rule at .15 and the strictest at .66. At .5 it passes more than WTA because internal ties count For.
**Pivots and correlation** (T2, T3; equal seed):
- Single-voter pivot M/Me/U/P under bpt:
- q=.15: .002/.004/.002/.017
- q=.5: .018/.019/.010/.082
- q=.66: .018/.018/.010/.068
- For comparison at q=.5: prop .050/.026/.014/.102; WTA .020/.023/.011/.076.
- Single-Persona pivot by Minds ICC 0 / .44 / .8 / 1:
| q | prop | WTA | bpt |
|---|---|---|---|
| .15 | .020 / .020 / .021 / .021 | .024 / .014 / .004 / 0 | .006 / .002 / .001 / 0 |
| .5 | .051 / .050 / .050 / .048 | .040 / .021 / .007 / 0 | .038 / .018 / .006 / 0 |
| .66 | .044 / .042 / .040 / .040 | .040 / .020 / .007 / 0 | .036 / .017 / .006 / 0 |
Under bpt, as under WTA, a correlated Minds bloc leaves one Persona almost no pivot; prop keeps a 1/8 slice at every correlation.
**Users faction capture** (T4; Users population support .3, 9 random voters + k coordinated For). P(Users bloc casts For):
| k (share of voters) | WTA | bpt .15 | bpt .5 | bpt .66 | prop share |
|---|---|---|---|---|---|
| 0 (0) | .10 | .80 | .10 | .03 | .30 |
| 1 (.10) | .10 | .96 | .27 | .03 | .37 |
| 2 (.18) | .27 | 1.00 | .27 | .03 | .43 |
| 3 (.25) | .27 | 1.00 | .54 | .10 | .48 |
| 6 (.40) | .81 | 1.00 | .81 | .27 | .58 |
| 9 (.50) | .96 | 1.00 | 1.00 | .54 | .65 |
| 12 (.57) | 1.00 | 1.00 | 1.00 | .80 | .70 |
- At q=.15 the bloc casts For with no faction at all 80% of the time (population support .3 > .15); a 2-voter faction (18%) makes it certain. This confirms the coordinator's note: at .15, about a 15% faction captures the bloc's whole weight.
- At .66 a faction needs roughly half the turnout to capture the bloc half the time.
**Logrolling** (T5; 800 agendas, 6 motions):
| seed | q | rule | P(>=1 trade) | mean welfare change | P(a non-trader loses) | P(a trader ends worse) |
|---|---|---|---|---|---|---|
| equal | .15 | WTA / bpt / prop .5 | .128 / .001 / .007 | +.56 / +.01 / +.05 | 0 / 0 / 0 | .007 / 0 / 0 |
| equal | .5 | WTA = bpt / prop .5 | .589 / .451 | +.14 / -.43 | .376 / .316 | .231 / .146 |
| equal | .66 | WTA / bpt / prop .5 | .614 / .367 / .245 | +.10 / +.60 / +.41 | .393 / .250 / .177 | .231 / .071 / .035 |
| minds-heavy | .5 | WTA = bpt / prop .5 | .608 / .330 | -.05 / -.26 | .490 / .282 | .176 / .071 |
| minds-heavy | .66 | WTA / bpt / prop .5 | .463 / .362 / .282 | +.17 / +.39 / +.37 | .375 / .289 / .206 | .095 / .031 / .043 |
- At .15, almost nothing is left to trade under bpt: nearly everything passes.
- At .66, bpt trades less than WTA, with higher mean welfare and less third-party harm. Most remaining trades build supermajorities for motions that a strongly-wanting minority of blocs care about.
**Lone Minds, she absent** (T6). P(pass) at Minds ICC 0 / .44 / 1:
| category | q | prop = bpt | WTA |
|---|---|---|---|
| Bugs | .15 | .77 / .65 / .50 | .45 / .47 / .50 |
| Cosmetics | .30 | .66 / .59 / .50 | .45 / .47 / .50 |
| Balance | .40 | .56 / .53 / .50 | .45 / .47 / .50 |
| Features / NewContent | .50 | .56 / .53 / .50 | .45 / .47 / .50 |
| FundamentalDesign | .66 | .34 / .42 / .50 | .45 / .47 / .50 |
- A lone estate under bpt behaves exactly as under prop: the internal threshold is the binding one, so categories bind. Under WTA they are inert.
**Present case** (T7; Minds 8 coin-flip, her alone, Users/Patrons empty). P(pass | she For / Against / home):
| seed | q | prop | WTA | bpt |
|---|---|---|---|---|
| equal | .15 | 1 / .855 / .965 | 1 / .363 / .363 | 1 / .965 / .965 |
| equal | .5 | 1 / .004 / .637 | 1 / .363 / .363 | 1 / .637 / .637 |
| equal | .66 | .855 / 0 / .145 | .637 / 0 / .363 | .145 / 0 / .145 |
| minds-heavy | .5 | .996 / .035 / .637 | .637 / .363 / .363 | .637 / .637 / .637 |
| members-heavy | any | For always passes, Against always fails, under all three rules | | |
- Under bpt with two equal live estates:
- At q <= .5 her For forces passage, and her Against has the same effect as staying home.
- At q=.66 her Against is a veto, and her For has the same effect as staying home.
- Minds-heavy q=.5 under bpt: her vote is irrelevant (.637 in every column), and the Minds alone decide.
**Operator's whole-tally pivot** (T8; coin voters, Users 10, Patrons 2 on log(1+d), her share of contribution S=.8). Values are prop / WTA / bpt:
| seed | q | alone | n=5 k=3 | n=20 k=3 | n=20 one-each |
|---|---|---|---|---|---|
| equal | .15 | .012 / .199 / 0 | .002 / .175 / 0 | 0 / .136 / 0 | 0 / .035 / 0 |
| equal | .5 | .723 / .429 / .300 | .308 / .376 / .263 | .159 / .293 / .206 | .042 / .076 / .053 |
| equal | .66 | .373 / .433 / .086 | .150 / .377 / .053 | .074 / .294 / .021 | .019 / .076 / .004 |
| members-heavy | .5 | 1 / .863 / .734 | .612 / .753 / .641 | .383 / .588 / .500 | .101 / .152 / .130 |
| members-heavy | .66 | .806 / .630 / .092 | .237 / .549 / .058 | .079 / .428 / .023 | .021 / .111 / .004 |
- At .15 under bpt, the coin-flip blocs almost always clear 15%, so no single voter matters, her included.
- At .66, bpt gives her the smallest pivot of the three rules at every Members size, because she can block her bloc but rarely flips the council.
**Strategic checks** (T9; exhaustive, renormalized, no quorum; sizes 8/1/0/0 and 3/3/2/2, all seeds and q): 0 profitable misreports, 0 profitable abstentions and 0 profitable estate stay-homes. bpt is monotone and participation-safe here, as prop and WTA were in sections 6 and N1.
## 10. Capping the operator: weight share vs decisiveness
Her words, relayed: "I would limit my influence by half, just so I'm not deciding everything". Code `estate-sims\cap.py` (out `cap.out.md`, full grid: 3 cases x 3 seeds x 3 q x 5 caps x 3 rules).
- **Weight share x:** her internal share of Members x Members weight / live weight (renormalized).
- **How the cap c works:** if she is the sole Member, the Members estate weight is cut to c/(1-c) x the other live weight. Otherwise her internal weight is cut until x = c.
- **Decisiveness:** her pivot rate, measured twice. Coin voters (Banzhaf) and the motion model (Minds ICC .44) give different numbers for the same rule.
- **Unilateral pass (U+):** her For passes with everyone else Against.
- **Unilateral block (U-):** her Against fails with everyone else For.
- Ties pass (>=).
**Present case** (Minds 8, her alone, two live estates). Cells: pivot coin / pivot motion, with U+U- flags:
| seed, q | cap (x) | prop | WTA | bpt |
|---|---|---|---|---|
| equal .15 | none = .5 (.50) | .14 / .42 YN | .64 / .53 YN | .03 / .35 YN |
| equal .15 | .33 | .03 / .35 YN | .64 / .53 YN | .03 / .35 YN |
| equal .5 | none = .5 (.50) | .996 / .73 YN | .64 / .53 YN | .36 / .47 YN |
| equal .5 | .49 | .992 / .46 NN | .27 / .06 NN | 0 / 0 NN |
| equal .5 | .33 | .71 / .17 NN | .27 / .06 NN | 0 / 0 NN |
| equal .66 | none / .49 / .40 | .86 / .58 to .64 / .53 NY | .64 / .53 NY | .14 / .42 NY |
| equal .66 | .33 | .64 / .25 NN | .27 / .06 NN | 0 / 0 NN |
| members-heavy .5 | none (.69) | 1 / 1 YY | 1 / 1 YY | 1 / 1 YY |
| members-heavy .5 | .5 / .49 | same as equal .5 at cap .5 / .49 | | |
- **A 50% cap with ties passing does not take away her unilateral power.**
- In the two-estate case: at q <= .5 her For alone passes; at q > .5 her Against alone blocks.
- Generally: U+ holds iff x >= q, and U- holds iff x > 1-q. Removing both needs x < min(q, 1-q):
- q=.5: any cap below .5 (.49 works).
- q=.66: below .34 (.40 and .49 still leave her the block).
- q=.15: below .15 (no tested cap removes U+).
- **Pivot at or below half, present case:**
- With cap .49 at q=.5: WTA .27 and bpt 0 on both measures (under bpt the Minds then decide alone).
- Prop stays at .99 on coin voters even at cap .49 (and .71 at .33). The motion model gives prop .46 at cap .49 and .17 at .33. One Persona For is enough to carry her 49% For past .5, and she loses only to a unanimous Against from the Minds.
- WTA at .15 stays at .64 / .53 under every cap. At .15, x >= .15 keeps U+, and the Minds estate casts all or nothing.
**Growth path** (S=.8, k=3, Users 10, Patrons 2). Her weight share is already below every tested cap, so no cap binds:
- x = .10 / .12 / .18 at n=5 for equal / minds-heavy / members-heavy.
- x = .05 / .06 / .09 at n=20.
Her decisiveness still exceeds half in some cells (coin / motion):
| case | prop | WTA | bpt |
|---|---|---|---|
| n=5, members-heavy, q=.5 (x=.18) | .61 / .31 | .76 / .42 | .64 / .39 |
| n=5, equal, q=.5 (x=.10) | .31 / .15 | .38 / .21 | .26 / .19 |
| n=20, members-heavy, q=.5 (x=.09) | .38 / .14 | .59 / .15 | .50 / .15 |
| n=5, members-heavy, q=.66 | .24 / .26 | .55 / .32 | .06 / .24 (U- under bpt) |
- Under WTA and bpt, her pivot comes from steering a bloc that carries 45% of the weight, not from her own 9-18% share. A cap on her personal weight share therefore leaves this channel open.
- Under bpt at .66 she gets a unilateral block at n=5 members-heavy with x=.18: her Against holds the Members internal For share under .66, so the whole 45% is cast Against.
**Distinction, as measured:**
- **Weight share is a rule parameter.** A cap on it is enforceable per tally (renormalized) and removes U+/U- only when x < min(q, 1-q) of the tally.
- **Decisiveness (pivot rate) is not a rule parameter.** It is a function of the rule, the threshold, the bloc structure and how everyone else votes. The same cap gives .99 or .46 (prop, q=.5, cap .49) depending on the voter model. No weight cap tested bounds it under every model.
- Holding her decisiveness at or below half under unitary rules (WTA, bpt) would need a cap on the weight of any bloc she can steer, or on her internal decisiveness in that bloc. A cap on her own share does not do it.
- Present case, equal seed: rule and cap combinations whose pivot is at or below .5 on both voter models.
- q=.15: prop at every cap (.14 / .42 uncapped); bpt at every cap (.03 / .35). WTA at no cap (.64 / .53).
- q=.5: WTA and bpt at cap .49 or lower. Prop at no tested cap (coin .71 even at .33).
- q=.66: bpt at every cap (.14 / .42), but U- survives until the cap is below .34. WTA at cap .33. Prop at no tested cap (coin .64 at .33).

View file

@ -0,0 +1,11 @@
| seed | q | prop min-pass / max-fail | wta min-pass / max-fail | bpt min-pass / max-fail |
|---|---|---|---|---|
| equal | 0.15 | 0.150 / <0.150 | 0.125 / 0.500 | 0.037 / 0.150 |
| equal | 0.5 | 0.500 / <0.500 | 0.250 / 0.625 | 0.250 / 0.625 |
| equal | 0.66 | 0.660 / <0.660 | 0.375 / 0.750 | 0.495 / 0.830 |
| minds-heavy | 0.15 | 0.150 / <0.150 | 0.100 / 0.550 | 0.030 / 0.235 |
| minds-heavy | 0.5 | 0.500 / <0.500 | 0.250 / 0.700 | 0.250 / 0.700 |
| minds-heavy | 0.66 | 0.660 / <0.660 | 0.350 / 0.800 | 0.462 / 0.864 |
| members-heavy | 0.15 | 0.150 / <0.150 | 0.075 / 0.500 | 0.022 / 0.150 |
| members-heavy | 0.5 | 0.500 / <0.500 | 0.275 / 0.725 | 0.275 / 0.725 |
| members-heavy | 0.66 | 0.660 / <0.660 | 0.400 / 0.825 | 0.528 / 0.881 |

View file

@ -0,0 +1,23 @@
"""Aggregate-support bounds for each rule, all four estates live: lowest weighted For share that can pass,
highest weighted For share that can fail (bloc shares free in [0,1]). Run: python -I bounds.py"""
import itertools
SEEDS = {"equal": [25, 25, 25, 25], "minds-heavy": [40, 30, 20, 10], "members-heavy": [20, 45, 20, 15]}
eps = 1e-6
print("| seed | q | prop min-pass / max-fail | wta min-pass / max-fail | bpt min-pass / max-fail |")
print("|---|---|---|---|---|")
for s, w in SEEDS.items():
W = sum(w)
for q in (0.15, 0.5, 0.66):
res = {}
for rule, t in (("wta", 0.5), ("bpt", q)):
mp, mf = 1.0, 0.0
for S in itertools.product((0, 1), repeat=4): # S = blocs casting For
ws = sum(wi for wi, x in zip(w, S) if x)
passes = ws >= q * W - 1e-9
# For-blocs need share > t (wta) or >= t (bpt); Against-blocs share < t (wta) or < t (bpt)
lo = sum(wi * (t + (eps if rule == "wta" else 0)) for wi, x in zip(w, S) if x) / W
hi = (ws + sum(wi * (t - eps) for wi, x in zip(w, S) if not x)) / W
if passes: mp = min(mp, lo)
else: mf = max(mf, hi)
res[rule] = f"{mp:.3f} / {mf:.3f}"
print(f"| {s} | {q} | {q:.3f} / <{q:.3f} | {res['wta']} | {res['bpt']} |")

View file

@ -0,0 +1,148 @@
Cells: pivot coin / pivot motion / U+ U- (unilateral pass, unilateral block; Y/N). Her weight share shown as x.
### present 8/1/0/0
| seed | q | cap | her share x | prop | wta | bpt |
|---|---|---|---|---|---|---|
| equal | 0.15 | none | 0.500 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| equal | 0.15 | 0.5 | 0.500 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| equal | 0.15 | 0.49 | 0.490 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| equal | 0.15 | 0.4 | 0.400 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| equal | 0.15 | 0.33 | 0.330 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| equal | 0.5 | none | 0.500 | 0.996 / 0.727 / YN | 0.635 / 0.528 / YN | 0.361 / 0.473 / YN |
| equal | 0.5 | 0.5 | 0.500 | 0.996 / 0.727 / YN | 0.635 / 0.528 / YN | 0.361 / 0.473 / YN |
| equal | 0.5 | 0.49 | 0.490 | 0.992 / 0.455 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| equal | 0.5 | 0.4 | 0.400 | 0.931 / 0.293 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| equal | 0.5 | 0.33 | 0.330 | 0.712 / 0.168 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| equal | 0.66 | none | 0.500 | 0.857 / 0.584 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| equal | 0.66 | 0.5 | 0.500 | 0.857 / 0.584 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| equal | 0.66 | 0.49 | 0.490 | 0.857 / 0.584 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| equal | 0.66 | 0.4 | 0.400 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| equal | 0.66 | 0.33 | 0.330 | 0.635 / 0.254 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.15 | none | 0.429 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| minds-heavy | 0.15 | 0.5 | 0.429 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| minds-heavy | 0.15 | 0.49 | 0.429 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| minds-heavy | 0.15 | 0.4 | 0.400 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| minds-heavy | 0.15 | 0.33 | 0.330 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| minds-heavy | 0.5 | none | 0.429 | 0.961 / 0.374 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.5 | 0.5 | 0.429 | 0.961 / 0.374 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.5 | 0.49 | 0.429 | 0.961 / 0.374 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.5 | 0.4 | 0.400 | 0.931 / 0.293 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.5 | 0.33 | 0.330 | 0.712 / 0.168 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| minds-heavy | 0.66 | none | 0.429 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| minds-heavy | 0.66 | 0.5 | 0.429 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| minds-heavy | 0.66 | 0.49 | 0.429 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| minds-heavy | 0.66 | 0.4 | 0.400 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| minds-heavy | 0.66 | 0.33 | 0.330 | 0.635 / 0.254 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| members-heavy | 0.15 | none | 0.692 | 0.361 / 0.473 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| members-heavy | 0.15 | 0.5 | 0.500 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| members-heavy | 0.15 | 0.49 | 0.490 | 0.143 / 0.416 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| members-heavy | 0.15 | 0.4 | 0.400 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| members-heavy | 0.15 | 0.33 | 0.330 | 0.034 / 0.354 / YN | 0.635 / 0.528 / YN | 0.034 / 0.354 / YN |
| members-heavy | 0.5 | none | 0.692 | 1.000 / 1.000 / YY | 1.000 / 1.000 / YY | 1.000 / 1.000 / YY |
| members-heavy | 0.5 | 0.5 | 0.500 | 0.996 / 0.727 / YN | 0.635 / 0.528 / YN | 0.361 / 0.473 / YN |
| members-heavy | 0.5 | 0.49 | 0.490 | 0.992 / 0.455 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| members-heavy | 0.5 | 0.4 | 0.400 | 0.931 / 0.293 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| members-heavy | 0.5 | 0.33 | 0.330 | 0.712 / 0.168 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
| members-heavy | 0.66 | none | 0.692 | 1.000 / 1.000 / YY | 1.000 / 1.000 / YY | 1.000 / 1.000 / YY |
| members-heavy | 0.66 | 0.5 | 0.500 | 0.857 / 0.584 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| members-heavy | 0.66 | 0.49 | 0.490 | 0.857 / 0.584 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| members-heavy | 0.66 | 0.4 | 0.400 | 0.639 / 0.527 / NY | 0.639 / 0.527 / NY | 0.144 / 0.416 / NY |
| members-heavy | 0.66 | 0.33 | 0.330 | 0.635 / 0.254 / NN | 0.274 / 0.055 / NN | 0.000 / 0.000 / NN |
### growth n=5 k=3 S=.8 +U10 P2
| seed | q | cap | her share x | prop | wta | bpt |
|---|---|---|---|---|---|---|
| equal | 0.15 | none | 0.098 | 0.001 / 0.065 / NN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| equal | 0.15 | 0.5 | 0.098 | 0.001 / 0.065 / NN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| equal | 0.15 | 0.49 | 0.098 | 0.001 / 0.065 / NN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| equal | 0.15 | 0.4 | 0.098 | 0.001 / 0.065 / NN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| equal | 0.15 | 0.33 | 0.098 | 0.001 / 0.065 / NN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| equal | 0.5 | none | 0.098 | 0.306 / 0.153 / NN | 0.376 / 0.205 / NN | 0.264 / 0.189 / NN |
| equal | 0.5 | 0.5 | 0.098 | 0.306 / 0.153 / NN | 0.376 / 0.205 / NN | 0.264 / 0.189 / NN |
| equal | 0.5 | 0.49 | 0.098 | 0.306 / 0.153 / NN | 0.376 / 0.205 / NN | 0.264 / 0.189 / NN |
| equal | 0.5 | 0.4 | 0.098 | 0.306 / 0.153 / NN | 0.376 / 0.205 / NN | 0.264 / 0.189 / NN |
| equal | 0.5 | 0.33 | 0.098 | 0.306 / 0.153 / NN | 0.376 / 0.205 / NN | 0.264 / 0.189 / NN |
| equal | 0.66 | none | 0.098 | 0.150 / 0.133 / NN | 0.378 / 0.202 / NN | 0.054 / 0.164 / NN |
| equal | 0.66 | 0.5 | 0.098 | 0.150 / 0.133 / NN | 0.378 / 0.202 / NN | 0.054 / 0.164 / NN |
| equal | 0.66 | 0.49 | 0.098 | 0.150 / 0.133 / NN | 0.378 / 0.202 / NN | 0.054 / 0.164 / NN |
| equal | 0.66 | 0.4 | 0.098 | 0.150 / 0.133 / NN | 0.378 / 0.202 / NN | 0.054 / 0.164 / NN |
| equal | 0.66 | 0.33 | 0.098 | 0.150 / 0.133 / NN | 0.378 / 0.202 / NN | 0.054 / 0.164 / NN |
| minds-heavy | 0.15 | none | 0.118 | 0.001 / 0.104 / NN | 0.274 / 0.186 / NN | 0.000 / 0.045 / YN |
| minds-heavy | 0.15 | 0.5 | 0.118 | 0.001 / 0.104 / NN | 0.274 / 0.186 / NN | 0.000 / 0.045 / YN |
| minds-heavy | 0.15 | 0.49 | 0.118 | 0.001 / 0.104 / NN | 0.274 / 0.186 / NN | 0.000 / 0.045 / YN |
| minds-heavy | 0.15 | 0.4 | 0.118 | 0.001 / 0.104 / NN | 0.274 / 0.186 / NN | 0.000 / 0.045 / YN |
| minds-heavy | 0.15 | 0.33 | 0.118 | 0.001 / 0.104 / NN | 0.274 / 0.186 / NN | 0.000 / 0.045 / YN |
| minds-heavy | 0.5 | none | 0.118 | 0.452 / 0.152 / NN | 0.412 / 0.200 / NN | 0.303 / 0.197 / NN |
| minds-heavy | 0.5 | 0.5 | 0.118 | 0.452 / 0.152 / NN | 0.412 / 0.200 / NN | 0.303 / 0.197 / NN |
| minds-heavy | 0.5 | 0.49 | 0.118 | 0.452 / 0.152 / NN | 0.412 / 0.200 / NN | 0.303 / 0.197 / NN |
| minds-heavy | 0.5 | 0.4 | 0.118 | 0.452 / 0.152 / NN | 0.412 / 0.200 / NN | 0.303 / 0.197 / NN |
| minds-heavy | 0.5 | 0.33 | 0.118 | 0.452 / 0.152 / NN | 0.412 / 0.200 / NN | 0.303 / 0.197 / NN |
| minds-heavy | 0.66 | none | 0.118 | 0.142 / 0.153 / NN | 0.453 / 0.215 / NN | 0.087 / 0.198 / NN |
| minds-heavy | 0.66 | 0.5 | 0.118 | 0.142 / 0.153 / NN | 0.453 / 0.215 / NN | 0.087 / 0.198 / NN |
| minds-heavy | 0.66 | 0.49 | 0.118 | 0.142 / 0.153 / NN | 0.453 / 0.215 / NN | 0.087 / 0.198 / NN |
| minds-heavy | 0.66 | 0.4 | 0.118 | 0.142 / 0.153 / NN | 0.453 / 0.215 / NN | 0.087 / 0.198 / NN |
| minds-heavy | 0.66 | 0.33 | 0.118 | 0.142 / 0.153 / NN | 0.453 / 0.215 / NN | 0.087 / 0.198 / NN |
| members-heavy | 0.15 | none | 0.176 | 0.003 / 0.103 / YN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| members-heavy | 0.15 | 0.5 | 0.176 | 0.003 / 0.103 / YN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| members-heavy | 0.15 | 0.49 | 0.176 | 0.003 / 0.103 / YN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| members-heavy | 0.15 | 0.4 | 0.176 | 0.003 / 0.103 / YN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| members-heavy | 0.15 | 0.33 | 0.176 | 0.003 / 0.103 / YN | 0.175 / 0.115 / NN | 0.000 / 0.027 / YN |
| members-heavy | 0.5 | none | 0.176 | 0.611 / 0.308 / NN | 0.755 / 0.415 / NN | 0.641 / 0.392 / NN |
| members-heavy | 0.5 | 0.5 | 0.176 | 0.611 / 0.308 / NN | 0.755 / 0.415 / NN | 0.641 / 0.392 / NN |
| members-heavy | 0.5 | 0.49 | 0.176 | 0.611 / 0.308 / NN | 0.755 / 0.415 / NN | 0.641 / 0.392 / NN |
| members-heavy | 0.5 | 0.4 | 0.176 | 0.611 / 0.308 / NN | 0.755 / 0.415 / NN | 0.641 / 0.392 / NN |
| members-heavy | 0.5 | 0.33 | 0.176 | 0.611 / 0.308 / NN | 0.755 / 0.415 / NN | 0.641 / 0.392 / NN |
| members-heavy | 0.66 | none | 0.176 | 0.237 / 0.255 / NN | 0.552 / 0.317 / NN | 0.058 / 0.238 / NY |
| members-heavy | 0.66 | 0.5 | 0.176 | 0.237 / 0.255 / NN | 0.552 / 0.317 / NN | 0.058 / 0.238 / NY |
| members-heavy | 0.66 | 0.49 | 0.176 | 0.237 / 0.255 / NN | 0.552 / 0.317 / NN | 0.058 / 0.238 / NY |
| members-heavy | 0.66 | 0.4 | 0.176 | 0.237 / 0.255 / NN | 0.552 / 0.317 / NN | 0.058 / 0.238 / NY |
| members-heavy | 0.66 | 0.33 | 0.176 | 0.237 / 0.255 / NN | 0.552 / 0.317 / NN | 0.058 / 0.238 / NY |
### growth n=20 k=3 S=.8 +U10 P2
| seed | q | cap | her share x | prop | wta | bpt |
|---|---|---|---|---|---|---|
| equal | 0.15 | none | 0.048 | 0.000 / 0.034 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| equal | 0.15 | 0.5 | 0.048 | 0.000 / 0.034 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| equal | 0.15 | 0.49 | 0.048 | 0.000 / 0.034 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| equal | 0.15 | 0.4 | 0.048 | 0.000 / 0.034 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| equal | 0.15 | 0.33 | 0.048 | 0.000 / 0.034 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| equal | 0.5 | none | 0.048 | 0.158 / 0.075 / NN | 0.294 / 0.076 / NN | 0.205 / 0.069 / NN |
| equal | 0.5 | 0.5 | 0.048 | 0.158 / 0.075 / NN | 0.294 / 0.076 / NN | 0.205 / 0.069 / NN |
| equal | 0.5 | 0.49 | 0.048 | 0.158 / 0.075 / NN | 0.294 / 0.076 / NN | 0.205 / 0.069 / NN |
| equal | 0.5 | 0.4 | 0.048 | 0.158 / 0.075 / NN | 0.294 / 0.076 / NN | 0.205 / 0.069 / NN |
| equal | 0.5 | 0.33 | 0.048 | 0.158 / 0.075 / NN | 0.294 / 0.076 / NN | 0.205 / 0.069 / NN |
| equal | 0.66 | none | 0.048 | 0.074 / 0.064 / NN | 0.294 / 0.076 / NN | 0.022 / 0.064 / NN |
| equal | 0.66 | 0.5 | 0.048 | 0.074 / 0.064 / NN | 0.294 / 0.076 / NN | 0.022 / 0.064 / NN |
| equal | 0.66 | 0.49 | 0.048 | 0.074 / 0.064 / NN | 0.294 / 0.076 / NN | 0.022 / 0.064 / NN |
| equal | 0.66 | 0.4 | 0.048 | 0.074 / 0.064 / NN | 0.294 / 0.076 / NN | 0.022 / 0.064 / NN |
| equal | 0.66 | 0.33 | 0.048 | 0.074 / 0.064 / NN | 0.294 / 0.076 / NN | 0.022 / 0.064 / NN |
| minds-heavy | 0.15 | none | 0.058 | 0.000 / 0.051 / NN | 0.209 / 0.067 / NN | 0.000 / 0.038 / YN |
| minds-heavy | 0.15 | 0.5 | 0.058 | 0.000 / 0.051 / NN | 0.209 / 0.067 / NN | 0.000 / 0.038 / YN |
| minds-heavy | 0.15 | 0.49 | 0.058 | 0.000 / 0.051 / NN | 0.209 / 0.067 / NN | 0.000 / 0.038 / YN |
| minds-heavy | 0.15 | 0.4 | 0.058 | 0.000 / 0.051 / NN | 0.209 / 0.067 / NN | 0.000 / 0.038 / YN |
| minds-heavy | 0.15 | 0.33 | 0.058 | 0.000 / 0.051 / NN | 0.209 / 0.067 / NN | 0.000 / 0.038 / YN |
| minds-heavy | 0.5 | none | 0.058 | 0.248 / 0.074 / NN | 0.321 / 0.074 / NN | 0.236 / 0.073 / NN |
| minds-heavy | 0.5 | 0.5 | 0.058 | 0.248 / 0.074 / NN | 0.321 / 0.074 / NN | 0.236 / 0.073 / NN |
| minds-heavy | 0.5 | 0.49 | 0.058 | 0.248 / 0.074 / NN | 0.321 / 0.074 / NN | 0.236 / 0.073 / NN |
| minds-heavy | 0.5 | 0.4 | 0.058 | 0.248 / 0.074 / NN | 0.321 / 0.074 / NN | 0.236 / 0.073 / NN |
| minds-heavy | 0.5 | 0.33 | 0.058 | 0.248 / 0.074 / NN | 0.321 / 0.074 / NN | 0.236 / 0.073 / NN |
| minds-heavy | 0.66 | none | 0.058 | 0.056 / 0.075 / NN | 0.353 / 0.079 / NN | 0.035 / 0.080 / NN |
| minds-heavy | 0.66 | 0.5 | 0.058 | 0.056 / 0.075 / NN | 0.353 / 0.079 / NN | 0.035 / 0.080 / NN |
| minds-heavy | 0.66 | 0.49 | 0.058 | 0.056 / 0.075 / NN | 0.353 / 0.079 / NN | 0.035 / 0.080 / NN |
| minds-heavy | 0.66 | 0.4 | 0.058 | 0.056 / 0.075 / NN | 0.353 / 0.079 / NN | 0.035 / 0.080 / NN |
| minds-heavy | 0.66 | 0.33 | 0.058 | 0.056 / 0.075 / NN | 0.353 / 0.079 / NN | 0.035 / 0.080 / NN |
| members-heavy | 0.15 | none | 0.087 | 0.000 / 0.057 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| members-heavy | 0.15 | 0.5 | 0.087 | 0.000 / 0.057 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| members-heavy | 0.15 | 0.49 | 0.087 | 0.000 / 0.057 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| members-heavy | 0.15 | 0.4 | 0.087 | 0.000 / 0.057 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| members-heavy | 0.15 | 0.33 | 0.087 | 0.000 / 0.057 / NN | 0.133 / 0.041 / NN | 0.000 / 0.022 / YN |
| members-heavy | 0.5 | none | 0.087 | 0.382 / 0.141 / NN | 0.586 / 0.153 / NN | 0.498 / 0.145 / NN |
| members-heavy | 0.5 | 0.5 | 0.087 | 0.382 / 0.141 / NN | 0.586 / 0.153 / NN | 0.498 / 0.145 / NN |
| members-heavy | 0.5 | 0.49 | 0.087 | 0.382 / 0.141 / NN | 0.586 / 0.153 / NN | 0.498 / 0.145 / NN |
| members-heavy | 0.5 | 0.4 | 0.087 | 0.382 / 0.141 / NN | 0.586 / 0.153 / NN | 0.498 / 0.145 / NN |
| members-heavy | 0.5 | 0.33 | 0.087 | 0.382 / 0.141 / NN | 0.586 / 0.153 / NN | 0.498 / 0.145 / NN |
| members-heavy | 0.66 | none | 0.087 | 0.079 / 0.121 / NN | 0.428 / 0.116 / NN | 0.024 / 0.089 / NN |
| members-heavy | 0.66 | 0.5 | 0.087 | 0.079 / 0.121 / NN | 0.428 / 0.116 / NN | 0.024 / 0.089 / NN |
| members-heavy | 0.66 | 0.49 | 0.087 | 0.079 / 0.121 / NN | 0.428 / 0.116 / NN | 0.024 / 0.089 / NN |
| members-heavy | 0.66 | 0.4 | 0.087 | 0.079 / 0.121 / NN | 0.428 / 0.116 / NN | 0.024 / 0.089 / NN |
| members-heavy | 0.66 | 0.33 | 0.087 | 0.079 / 0.121 / NN | 0.428 / 0.116 / NN | 0.024 / 0.089 / NN |

View file

@ -0,0 +1,75 @@
"""Operator cap (her words: "I would limit my influence by half, just so I'm not deciding everything").
Cap c on her WEIGHT SHARE of the renormalized tally: her share = (her internal share of Members) * W_Me / W_live.
If she is the sole Member, the cap shrinks the Members estate weight to c/(1-c) * (other live weight);
otherwise it shrinks her internal weight until her share = c. Then measure DECISIVENESS:
pivot rate (coin voters; and motion model, Minds ICC .44), unilateral pass (her For passes with everyone else
Against) and unilateral block (her Against fails with everyone else For). Ties pass (>=). Run: python -I cap.py
"""
import numpy as np
SEEDS = {"equal": [25, 25, 25, 25], "minds-heavy": [40, 30, 20, 10], "members-heavy": [20, 45, 20, 15]}
def tally(Wb, F, Tot, q, rule):
Wb = np.asarray(Wb, float); live = Tot > 0; sh = np.where(live, F / np.where(live, Tot, 1), 0)
if rule == "prop": f = (sh * Wb).sum(-1); den = (live * Wb).sum(-1)
elif rule == "wta":
st = np.where(live, np.sign(2 * F - Tot), 0); f = (st == 1) @ Wb; den = f + (st == -1) @ Wb
else: f = ((sh >= q - 1e-9) & live) @ Wb; den = live @ Wb
return (den > 0) & (f >= q * den - 1e-9)
def mweights(n, S=.8, k=3):
if n == 1: return np.ones(1)
tail = np.array([i ** (-1 / 1.16) for i in range(1, n)]); tail = tail / tail.sum() * (1 - S)
return np.concatenate([[S], tail]) ** (1 / k)
def apply_cap(Wb, wM, sizes, c):
Wb = np.array(Wb, float); wM = wM.copy(); live = np.array([s > 0 for s in sizes])
if c is None: return Wb, wM
L = (Wb * live).sum(); x = wM[0] / wM.sum()
if x * Wb[1] <= c * L + 1e-12: return Wb, wM
if len(wM) == 1:
Wb[1] = c / (1 - c) * (L - Wb[1])
else:
x_new = c * L / Wb[1]; o = wM[1:].sum(); wM[0] = x_new * o / (1 - x_new)
return Wb, wM
def run(Wb, wM, sizes, q, rule, model, T=100_000, seed=9):
r = np.random.default_rng(seed)
ws = [np.ones(sizes[0]), wM, np.ones(sizes[2]), np.log1p(np.array([50, 500.0])[:sizes[3]])]
if model == "coin": p = np.full((T, 4), .5)
else:
m = r.standard_normal(T); p = 1 / (1 + np.exp(-1.7 * (0.6 * m[:, None] + 0.8 * r.standard_normal((T, 4)))))
F = np.zeros((T, 4)); Tot = np.zeros((T, 4)); her = None
for b, w in enumerate(ws):
if len(w) == 0: continue
pb = p[:, b:b + 1]
if b == 0 and model == "motion":
a = p[:, 0] * .56 / .44; cc = (1 - p[:, 0]) * .56 / .44; pb = r.beta(a, cc)[:, None]
v = r.random((T, len(w))) < pb
if b == 1: her = v[:, 0]
F[:, b] = v @ w; Tot[:, b] = w.sum()
G = F.copy(); G[:, 1] += np.where(her, -wM[0], wM[0])
return np.mean(tally(Wb, F, Tot, q, rule) != tally(Wb, G, Tot, q, rule))
def unilateral(Wb, wM, sizes, q, rule):
ws = [np.ones(sizes[0]), wM, np.ones(sizes[2]), np.log1p(np.array([50, 500.0])[:sizes[3]])]
Tot = np.array([[w.sum() for w in ws]])
Fp = np.array([[0, wM[0], 0, 0]], float); Fb = np.array([[w.sum() for w in ws]], float); Fb[0, 1] -= wM[0]
return bool(tally(Wb, Fp, Tot, q, rule)[0]), not bool(tally(Wb, Fb, Tot, q, rule)[0])
CAPS = (None, .5, .49, .4, .33)
CASES = (("present 8/1/0/0", (8, 1, 0, 0)), ("growth n=5 k=3 S=.8 +U10 P2", (8, 5, 10, 2)), ("growth n=20 k=3 S=.8 +U10 P2", (8, 20, 10, 2)))
print("Cells: pivot coin / pivot motion / U+ U- (unilateral pass, unilateral block; Y/N). Her weight share shown as x.")
for cname, sizes in CASES:
print(f"\n### {cname}")
print("| seed | q | cap | her share x | prop | wta | bpt |"); print("|---|---|---|---|---|---|---|")
for s, W0 in SEEDS.items():
for q in (0.15, 0.5, 0.66):
for c in CAPS:
Wb, wM = apply_cap(W0, mweights(sizes[1]), sizes, c)
live = np.array([n > 0 for n in sizes]); x = wM[0] / wM.sum() * Wb[1] / (Wb * live).sum()
cells = []
for rule in ("prop", "wta", "bpt"):
pc = run(Wb, wM, sizes, q, rule, "coin"); pm = run(Wb, wM, sizes, q, rule, "motion")
up, ub = unilateral(Wb, wM, sizes, q, rule)
cells.append(f"{pc:.3f} / {pm:.3f} / {'Y' if up else 'N'}{'Y' if ub else 'N'}")
print(f"| {s} | {q} | {c if c else 'none'} | {x:.3f} | " + " | ".join(cells) + " |")

View file

@ -0,0 +1,146 @@
## T1. Motion model (Minds ICC .44; 8/15/30/4): P(pass) and pairwise P(outcomes differ)
| seed | q | P(pass) prop/wta/bpt | differ bpt-prop | differ bpt-wta | differ prop-wta |
|---|---|---|---|---|---|
| equal | 0.15 | 0.934/0.838/0.985 | 0.050 | 0.147 | 0.098 |
| equal | 0.5 | 0.502/0.594/0.676 | 0.179 | 0.082 | 0.119 |
| equal | 0.66 | 0.265/0.405/0.233 | 0.080 | 0.171 | 0.148 |
| minds-heavy | 0.15 | 0.913/0.796/0.966 | 0.056 | 0.170 | 0.122 |
| minds-heavy | 0.5 | 0.502/0.537/0.575 | 0.126 | 0.038 | 0.117 |
| minds-heavy | 0.66 | 0.298/0.357/0.236 | 0.091 | 0.121 | 0.092 |
| members-heavy | 0.15 | 0.932/0.838/0.985 | 0.053 | 0.147 | 0.100 |
| members-heavy | 0.5 | 0.500/0.499/0.528 | 0.106 | 0.029 | 0.111 |
| members-heavy | 0.66 | 0.271/0.343/0.194 | 0.099 | 0.149 | 0.113 |
## T2. Single-voter pivot M/Me/U/P (same draws), equal seed
| q | prop | wta | bpt |
|---|---|---|---|
| 0.15 | 0.0200/0.0118/0.0062/0.0425 | 0.0136/0.0136/0.0066/0.0402 | 0.0022/0.0041/0.0021/0.0173 |
| 0.5 | 0.0502/0.0259/0.0135/0.1016 | 0.0201/0.0226/0.0114/0.0760 | 0.0184/0.0193/0.0096/0.0816 |
| 0.66 | 0.0426/0.0227/0.0110/0.0873 | 0.0205/0.0225/0.0112/0.0755 | 0.0175/0.0182/0.0095/0.0676 |
## T3. Single-Persona pivot vs Minds ICC (equal seed)
| ICC | q=.15 prop/wta/bpt | q=.5 prop/wta/bpt | q=.66 prop/wta/bpt |
|---|---|---|---|
| 0 | 0.0198/0.0241/0.0057 | 0.0509/0.0397/0.0376 | 0.0443/0.0399/0.0361 |
| 0.44 | 0.0202/0.0143/0.0024 | 0.0502/0.0211/0.0181 | 0.0422/0.0204/0.0172 |
| 0.8 | 0.0206/0.0042/0.0008 | 0.0495/0.0065/0.0061 | 0.0403/0.0067/0.0061 |
| 1 | 0.0211/0.0000/0.0000 | 0.0481/0.0000/0.0000 | 0.0400/0.0000/0.0000 |
## T4. Users faction capture: population support .3, 9 random voters + k coordinated For
P(Users bloc casts For), wta vs bpt; prop share in brackets
| k | faction share of voters | wta | bpt q=.15 | bpt q=.5 | bpt q=.66 | prop share |
|---|---|---|---|---|---|---|
| 0 | 0.00 | 0.097 | 0.803 | 0.097 | 0.026 | 0.300 |
| 1 | 0.10 | 0.099 | 0.960 | 0.271 | 0.025 | 0.370 |
| 2 | 0.18 | 0.272 | 1.000 | 0.272 | 0.026 | 0.428 |
| 3 | 0.25 | 0.269 | 1.000 | 0.536 | 0.097 | 0.475 |
| 6 | 0.40 | 0.805 | 1.000 | 0.805 | 0.270 | 0.580 |
| 9 | 0.50 | 0.960 | 1.000 | 1.000 | 0.541 | 0.650 |
| 12 | 0.57 | 1.000 | 1.000 | 1.000 | 0.804 | 0.700 |
| 18 | 0.67 | 1.000 | 1.000 | 1.000 | 1.000 | 0.766 |
## T5. Logrolling (6 motions, 800 agendas, greedy mutually profitable pairwise trades, max 6)
| seed | q | rule | P(>=1 trade) | mean trades | mean welfare change | P(non-trader loses) | P(trader ends worse) |
|---|---|---|---|---|---|---|---|
| equal | 0.15 | wta | 0.128 | 0.14 | +0.559 | 0.000 | 0.007 |
| equal | 0.15 | bpt | 0.001 | 0.00 | +0.007 | 0.000 | 0.000 |
| equal | 0.15 | prop delta .5 | 0.007 | 0.01 | +0.047 | 0.000 | 0.000 |
| equal | 0.5 | wta | 0.589 | 0.99 | +0.143 | 0.376 | 0.231 |
| equal | 0.5 | bpt | 0.589 | 0.99 | +0.143 | 0.376 | 0.231 |
| equal | 0.5 | prop delta .5 | 0.451 | 0.72 | -0.432 | 0.316 | 0.146 |
| equal | 0.66 | wta | 0.614 | 1.03 | +0.097 | 0.393 | 0.231 |
| equal | 0.66 | bpt | 0.367 | 0.50 | +0.601 | 0.250 | 0.071 |
| equal | 0.66 | prop delta .5 | 0.245 | 0.30 | +0.414 | 0.177 | 0.035 |
| minds-heavy | 0.15 | wta | 0.249 | 0.27 | +0.730 | 0.130 | 0.013 |
| minds-heavy | 0.15 | bpt | 0.014 | 0.01 | +0.064 | 0.004 | 0.000 |
| minds-heavy | 0.15 | prop delta .5 | 0.010 | 0.01 | +0.064 | 0.000 | 0.000 |
| minds-heavy | 0.5 | wta | 0.608 | 0.87 | -0.052 | 0.490 | 0.176 |
| minds-heavy | 0.5 | bpt | 0.608 | 0.87 | -0.052 | 0.490 | 0.176 |
| minds-heavy | 0.5 | prop delta .5 | 0.330 | 0.43 | -0.263 | 0.282 | 0.071 |
| minds-heavy | 0.66 | wta | 0.463 | 0.61 | +0.166 | 0.375 | 0.095 |
| minds-heavy | 0.66 | bpt | 0.362 | 0.42 | +0.392 | 0.289 | 0.031 |
| minds-heavy | 0.66 | prop delta .5 | 0.282 | 0.35 | +0.374 | 0.206 | 0.043 |
## T6. Lone Minds (she absent) by category: P(pass), motion model, ICC 0/.44/1
| category | q | prop | wta | bpt |
|---|---|---|---|---|
| Bugs | 0.15 | 0.774/0.646/0.502 | 0.448/0.473/0.502 | 0.774/0.646/0.502 |
| Cosmetics | 0.3 | 0.663/0.585/0.502 | 0.448/0.473/0.502 | 0.663/0.585/0.502 |
| Balance | 0.4 | 0.556/0.528/0.502 | 0.448/0.473/0.502 | 0.556/0.528/0.502 |
| Features/NewContent | 0.5 | 0.556/0.528/0.502 | 0.448/0.473/0.502 | 0.556/0.528/0.502 |
| FundamentalDesign | 0.66 | 0.341/0.417/0.502 | 0.448/0.473/0.502 | 0.341/0.417/0.502 |
## T7. Present case (Minds 8 coin-flip, her alone in Members, Users/Patrons empty): P(pass | she For / Against / home)
| seed | q | prop | wta | bpt |
|---|---|---|---|---|
| equal | 0.15 | 1.000/0.855/0.965 | 1.000/0.363/0.363 | 1.000/0.965/0.965 |
| equal | 0.5 | 1.000/0.004/0.637 | 1.000/0.363/0.363 | 1.000/0.637/0.637 |
| equal | 0.66 | 0.855/0.000/0.145 | 0.637/0.000/0.363 | 0.145/0.000/0.145 |
| minds-heavy | 0.15 | 1.000/0.855/0.965 | 1.000/0.363/0.363 | 1.000/0.965/0.965 |
| minds-heavy | 0.5 | 0.996/0.035/0.637 | 0.637/0.363/0.363 | 0.637/0.637/0.637 |
| minds-heavy | 0.66 | 0.637/0.000/0.145 | 0.637/0.000/0.363 | 0.145/0.000/0.145 |
| members-heavy | 0.15 | 1.000/0.637/0.965 | 1.000/0.363/0.363 | 1.000/0.965/0.965 |
| members-heavy | 0.5 | 1.000/0.000/0.637 | 1.000/0.000/0.363 | 1.000/0.000/0.637 |
| members-heavy | 0.66 | 1.000/0.000/0.145 | 1.000/0.000/0.363 | 1.000/0.000/0.145 |
## T8. Operator pivot over the whole tally (coin voters, Users 10, Patrons [50,500] log), S=.8
| seed | q | n | curve | prop | wta | bpt |
|---|---|---|---|---|---|---|
| equal | 0.15 | 1 | alone | 0.012 | 0.199 | 0.000 |
| equal | 0.15 | 5 | one-each | 0.001 | 0.075 | 0.000 |
| equal | 0.15 | 5 | k=3 | 0.002 | 0.175 | 0.000 |
| equal | 0.15 | 20 | one-each | 0.000 | 0.035 | 0.000 |
| equal | 0.15 | 20 | k=3 | 0.000 | 0.136 | 0.000 |
| equal | 0.15 | 20 | k=5 | 0.000 | 0.082 | 0.000 |
| equal | 0.5 | 1 | alone | 0.723 | 0.429 | 0.300 |
| equal | 0.5 | 5 | one-each | 0.154 | 0.162 | 0.113 |
| equal | 0.5 | 5 | k=3 | 0.308 | 0.376 | 0.263 |
| equal | 0.5 | 20 | one-each | 0.042 | 0.076 | 0.053 |
| equal | 0.5 | 20 | k=3 | 0.159 | 0.293 | 0.206 |
| equal | 0.5 | 20 | k=5 | 0.097 | 0.180 | 0.126 |
| equal | 0.66 | 1 | alone | 0.373 | 0.433 | 0.086 |
| equal | 0.66 | 5 | one-each | 0.075 | 0.162 | 0.021 |
| equal | 0.66 | 5 | k=3 | 0.150 | 0.377 | 0.053 |
| equal | 0.66 | 20 | one-each | 0.019 | 0.076 | 0.004 |
| equal | 0.66 | 20 | k=3 | 0.074 | 0.294 | 0.021 |
| equal | 0.66 | 20 | k=5 | 0.044 | 0.180 | 0.012 |
| members-heavy | 0.15 | 1 | alone | 0.035 | 0.199 | 0.000 |
| members-heavy | 0.15 | 5 | one-each | 0.002 | 0.075 | 0.000 |
| members-heavy | 0.15 | 5 | k=3 | 0.003 | 0.175 | 0.000 |
| members-heavy | 0.15 | 20 | one-each | 0.000 | 0.035 | 0.000 |
| members-heavy | 0.15 | 20 | k=3 | 0.000 | 0.136 | 0.000 |
| members-heavy | 0.15 | 20 | k=5 | 0.000 | 0.082 | 0.000 |
| members-heavy | 0.5 | 1 | alone | 1.000 | 0.863 | 0.734 |
| members-heavy | 0.5 | 5 | one-each | 0.294 | 0.325 | 0.276 |
| members-heavy | 0.5 | 5 | k=3 | 0.612 | 0.753 | 0.641 |
| members-heavy | 0.5 | 20 | one-each | 0.101 | 0.152 | 0.130 |
| members-heavy | 0.5 | 20 | k=3 | 0.383 | 0.588 | 0.500 |
| members-heavy | 0.5 | 20 | k=5 | 0.235 | 0.360 | 0.306 |
| members-heavy | 0.66 | 1 | alone | 0.806 | 0.630 | 0.092 |
| members-heavy | 0.66 | 5 | one-each | 0.128 | 0.237 | 0.023 |
| members-heavy | 0.66 | 5 | k=3 | 0.237 | 0.549 | 0.058 |
| members-heavy | 0.66 | 20 | one-each | 0.021 | 0.111 | 0.004 |
| members-heavy | 0.66 | 20 | k=3 | 0.079 | 0.428 | 0.023 |
| members-heavy | 0.66 | 20 | k=5 | 0.046 | 0.262 | 0.013 |
## T9. Exhaustive profitable misreport/abstention/stay-home under bpt (renormalized, no quorum)
| sizes | seed | q | profiles | profitable indiv deviations | estate stay-home profitable |
|---|---|---|---|---|---|
| 8/1/0/0 | equal | 0.15 | 512 | 0 | 0 |
| 8/1/0/0 | equal | 0.5 | 512 | 0 | 0 |
| 8/1/0/0 | equal | 0.66 | 512 | 0 | 0 |
| 8/1/0/0 | minds-heavy | 0.15 | 512 | 0 | 0 |
| 8/1/0/0 | minds-heavy | 0.5 | 512 | 0 | 0 |
| 8/1/0/0 | minds-heavy | 0.66 | 512 | 0 | 0 |
| 8/1/0/0 | members-heavy | 0.15 | 512 | 0 | 0 |
| 8/1/0/0 | members-heavy | 0.5 | 512 | 0 | 0 |
| 8/1/0/0 | members-heavy | 0.66 | 512 | 0 | 0 |
| 3/3/2/2 | equal | 0.15 | 1024 | 0 | 0 |
| 3/3/2/2 | equal | 0.5 | 1024 | 0 | 0 |
| 3/3/2/2 | equal | 0.66 | 1024 | 0 | 0 |
| 3/3/2/2 | minds-heavy | 0.15 | 1024 | 0 | 0 |
| 3/3/2/2 | minds-heavy | 0.5 | 1024 | 0 | 0 |
| 3/3/2/2 | minds-heavy | 0.66 | 1024 | 0 | 0 |
| 3/3/2/2 | members-heavy | 0.15 | 1024 | 0 | 0 |
| 3/3/2/2 | members-heavy | 0.5 | 1024 | 0 | 0 |
| 3/3/2/2 | members-heavy | 0.66 | 1024 | 0 | 0 |

View file

@ -0,0 +1,153 @@
"""Third rule `bpt` (bloc-parliament-at-threshold): a live bloc casts its whole weight For iff its internal
weighted For share (abstain excluded) >= q, else Against. Council: For weight / live weight >= q (renormalized).
Compared with prop and wta (wta: internal majority, tie casts nothing). Run: python -I third.py
"""
import itertools, math
import numpy as np
SEEDS = {"equal": [25, 25, 25, 25], "minds-heavy": [40, 30, 20, 10], "members-heavy": [20, 45, 20, 15]}
QS = (0.15, 0.5, 0.66)
def tally(Wb, F, Tot, q, rule):
Wb = np.array(Wb, float); live = Tot > 0; sh = np.divide(F, np.where(live, Tot, 1)); sh = np.where(live, sh, 0)
if rule == "prop": f = (sh * Wb).sum(-1); den = (live * Wb).sum(-1)
elif rule == "wta":
st = np.where(live, np.sign(2 * F - Tot), 0); f = (st == 1) @ Wb; den = f + (st == -1) @ Wb
else: f = ((sh >= q - 1e-9) & live) @ Wb; den = live @ Wb
return (den > 0) & (f >= q * den - 1e-9)
def motion(T, sizes, minds_r, seed, coin=False, wvec=None):
r = np.random.default_rng(seed)
if coin: p = np.full((T, 4), .5)
else:
m = r.standard_normal(T); p = 1 / (1 + np.exp(-1.7 * (0.6 * m[:, None] + 0.8 * r.standard_normal((T, 4)))))
ws = wvec or [np.ones(n) for n in sizes]; F = np.zeros((T, 4)); Tot = np.zeros((T, 4)); V = []
for b, w in enumerate(ws):
if len(w) == 0: V.append(np.zeros((T, 0), bool)); continue
pb = p[:, b:b + 1]
if b == 0 and minds_r >= 1: pb = (r.random((T, 1)) < pb).astype(float)
elif b == 0 and minds_r > 0:
a = p[:, 0] * (1 - minds_r) / minds_r; c = (1 - p[:, 0]) * (1 - minds_r) / minds_r; pb = r.beta(a, c)[:, None]
v = r.random((T, len(w))) < pb; V.append(v); F[:, b] = v @ w; Tot[:, b] = w.sum()
return ws, V, F, Tot
def piv(ws, V, F, Tot, b, Wb, q, rule):
G = F.copy(); G[:, b] += np.where(V[b][:, 0], -ws[b][0], ws[b][0])
return np.mean(tally(Wb, F, Tot, q, rule) != tally(Wb, G, Tot, q, rule))
R = ("prop", "wta", "bpt")
print("## T1. Motion model (Minds ICC .44; 8/15/30/4): P(pass) and pairwise P(outcomes differ)")
print("| seed | q | P(pass) prop/wta/bpt | differ bpt-prop | differ bpt-wta | differ prop-wta |")
print("|---|---|---|---|---|---|")
ws, V, F, Tot = motion(200_000, (8, 15, 30, 4), .44, 1)
for s, Wb in SEEDS.items():
for q in QS:
o = {r: tally(Wb, F, Tot, q, r) for r in R}
print(f"| {s} | {q} | " + "/".join(f"{o[r].mean():.3f}" for r in R) +
f" | {np.mean(o['bpt'] != o['prop']):.3f} | {np.mean(o['bpt'] != o['wta']):.3f} | {np.mean(o['prop'] != o['wta']):.3f} |")
print("\n## T2. Single-voter pivot M/Me/U/P (same draws), equal seed")
print("| q | prop | wta | bpt |"); print("|---|---|---|---|")
for q in QS:
print(f"| {q} | " + " | ".join("/".join(f"{piv(ws, V, F, Tot, b, SEEDS['equal'], q, r):.4f}" for b in range(4)) for r in R) + " |")
print("\n## T3. Single-Persona pivot vs Minds ICC (equal seed)")
print("| ICC | q=.15 prop/wta/bpt | q=.5 prop/wta/bpt | q=.66 prop/wta/bpt |"); print("|---|---|---|---|")
for icc in (0, .44, .8, 1):
w2, V2, F2, T2 = motion(100_000, (8, 15, 30, 4), icc, 2)
print(f"| {icc} | " + " | ".join("/".join(f"{piv(w2, V2, F2, T2, 0, SEEDS['equal'], q, r):.4f}" for r in R) for q in QS) + " |")
print("\n## T4. Users faction capture: population support .3, 9 random voters + k coordinated For")
print("P(Users bloc casts For), wta vs bpt; prop share in brackets")
print("| k | faction share of voters | wta | bpt q=.15 | bpt q=.5 | bpt q=.66 | prop share |"); print("|---|---|---|---|---|---|---|")
rr = np.random.default_rng(4)
for k in (0, 1, 2, 3, 6, 9, 12, 18):
f = (rr.random((100_000, 9)) < .3).sum(1) + k; n = 9 + k; sh = f / n
print(f"| {k} | {k / n:.2f} | {np.mean(2 * f > n):.3f} | " + " | ".join(f"{np.mean(sh >= q - 1e-9):.3f}" for q in QS) + f" | {sh.mean():.3f} |")
print("\n## T5. Logrolling (6 motions, 800 agendas, greedy mutually profitable pairwise trades, max 6)")
print("| seed | q | rule | P(>=1 trade) | mean trades | mean welfare change | P(non-trader loses) | P(trader ends worse) |")
print("|---|---|---|---|---|---|---|---|")
def logroll(Wb, q, kind, T=800, M=6, seed=3):
rng = np.random.default_rng(seed); W = np.array(Wb, float); st = np.zeros(5)
for _ in range(T):
u = rng.standard_normal((4, M)); share = 1 / (1 + np.exp(-2 * u))
base = {"wta": (u > 0).astype(float), "bpt": (share >= q).astype(float), "prop": share}[kind]
cast = base.copy()
def out(c): return (W @ c) >= q * W.sum() - 1e-9
U0 = u @ out(cast); cur = U0.copy(); used = set(); n = 0; traders = set()
while n < 6:
best = None
for A, B in itertools.combinations(range(4), 2):
for x, y in itertools.permutations(range(M), 2):
if (A, x) in used or (B, y) in used: continue
c2 = cast.copy()
for b, mm in ((A, x), (B, y)):
c2[b, mm] = (0.0 if u[b, mm] > 0 else 1.0) if kind != "prop" else np.clip(base[b, mm] - np.sign(u[b, mm]) * .5, 0, 1)
g = u @ out(c2) - cur
if g[A] > 1e-9 and g[B] > 1e-9 and (best is None or g[A] + g[B] > best[0]): best = (g[A] + g[B], c2, A, B, x, y)
if best is None: break
_, cast, A, B, x, y = best; used |= {(A, x), (B, y)}; traders |= {A, B}; n += 1; cur = u @ out(cast)
non = [b for b in range(4) if b not in traders]
st += [n > 0, n, cur.sum() - U0.sum(), any(cur[b] < U0[b] - 1e-9 for b in non), any(cur[b] < U0[b] - 1e-9 for b in traders)]
return st / T
for s in ("equal", "minds-heavy"):
for q in (0.15, 0.5, 0.66):
for kind in ("wta", "bpt", "prop"):
v = logroll(SEEDS[s], q, kind)
print(f"| {s} | {q} | {kind if kind != 'prop' else 'prop delta .5'} | {v[0]:.3f} | {v[1]:.2f} | {v[2]:+.3f} | {v[3]:.3f} | {v[4]:.3f} |")
print("\n## T6. Lone Minds (she absent) by category: P(pass), motion model, ICC 0/.44/1")
print("| category | q | prop | wta | bpt |"); print("|---|---|---|---|---|")
lone = {icc: motion(200_000, (8, 0, 0, 0), icc, 5) for icc in (0, .44, 1)}
for c, q in {"Bugs": .15, "Cosmetics": .30, "Balance": .40, "Features/NewContent": .50, "FundamentalDesign": .66}.items():
print(f"| {c} | {q} | " + " | ".join("/".join(f"{tally(SEEDS['equal'], lone[i][2], lone[i][3], q, r).mean():.3f}" for i in (0, .44, 1)) for r in R) + " |")
print("\n## T7. Present case (Minds 8 coin-flip, her alone in Members, Users/Patrons empty): P(pass | she For / Against / home)")
print("| seed | q | prop | wta | bpt |"); print("|---|---|---|---|---|")
from math import comb
for s, Wb in SEEDS.items():
for q in QS:
cells = []
for r in R:
vals = []
for hv in (1, -1, 0):
F_ = np.array([[k, 1.0 if hv == 1 else 0, 0, 0] for k in range(9)]); T_ = np.array([[8, 1.0 if hv else 0, 0, 0]] * 9)
pk = np.array([comb(8, k) / 256 for k in range(9)]); vals.append(float(pk @ tally(Wb, F_, T_, q, r)))
cells.append("/".join(f"{x:.3f}" for x in vals))
print(f"| {s} | {q} | " + " | ".join(cells) + " |")
print("\n## T8. Operator pivot over the whole tally (coin voters, Users 10, Patrons [50,500] log), S=.8")
def mweights(n, S, k):
if n == 1: return np.ones(1)
tail = np.array([i ** (-1 / 1.16) for i in range(1, n)]); tail = tail / tail.sum() * (1 - S)
c = np.concatenate([[S], tail]); return np.ones(n) if k is None else c ** (1 / k)
print("| seed | q | n | curve | prop | wta | bpt |"); print("|---|---|---|---|---|---|---|")
for s in ("equal", "members-heavy"):
for q in QS:
for n, kn, k in ((1, "alone", None), (5, "one-each", None), (5, "k=3", 3), (20, "one-each", None), (20, "k=3", 3), (20, "k=5", 5)):
wv = [np.ones(8), mweights(n, .8, k), np.ones(10), np.log1p(np.array([50, 500.0]))]
w8, V8, F8, T8 = motion(100_000, None, 0, 6, coin=True, wvec=wv)
print(f"| {s} | {q} | {n} | {kn} | " + " | ".join(f"{piv(w8, V8, F8, T8, 1, SEEDS[s], q, r):.3f}" for r in R) + " |")
print("\n## T9. Exhaustive profitable misreport/abstention/stay-home under bpt (renormalized, no quorum)")
def tl(ws_, sizes, bal, q):
F = [0] * 4; A = [0] * 4; i = 0
for b, n in enumerate(sizes):
for v in bal[i:i + n]: F[b] += v == 1; A[b] += v == -1
i += n
live = [b for b in range(4) if F[b] + A[b]]; f = sum(ws_[b] for b in live if F[b] / (F[b] + A[b]) >= q - 1e-9)
den = sum(ws_[b] for b in live); return den > 0 and f >= q * den - 1e-9
print("| sizes | seed | q | profiles | profitable indiv deviations | estate stay-home profitable |"); print("|---|---|---|---|---|---|")
for sizes in ((8, 1, 0, 0), (3, 3, 2, 2)):
for s, Wb in SEEDS.items():
for q in QS:
st = [sum(sizes[:b]) for b in range(4)]; ind = est = n = 0
for bal in itertools.product((1, -1), repeat=sum(sizes)):
n += 1; o = tl(Wb, sizes, bal, q)
for i, v in enumerate(bal):
if o != (v == 1) and any(tl(Wb, sizes, bal[:i] + (d,) + bal[i + 1:], q) == (v == 1) for d in (-v, 0)): ind += 1
for b in range(4):
if not sizes[b]: continue
seg = bal[st[b]:st[b] + sizes[b]]; pref = seg.count(1) / len(seg) >= q # bloc's own position under bpt
if o != pref and tl(Wb, sizes, bal[:st[b]] + (0,) * sizes[b] + bal[st[b] + sizes[b]:], q) == pref: est += 1
print(f"| {'/'.join(map(str, sizes))} | {s} | {q} | {n} | {ind} | {est} |")