Last active
December 19, 2025 19:43
-
-
Save kenwebb/4e01fe9d7a62b717fa3688038359db67 to your computer and use it in GitHub Desktop.
Abundance_v2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="UTF-8"?> | |
| <!--Xholon Workbook http://www.primordion.com/Xholon/gwt/ MIT License, Copyright (C) Ken Webb, Fri Dec 19 2025 14:43:14 GMT-0500 (Eastern Standard Time)--> | |
| <XholonWorkbook> | |
| <Notes><![CDATA[ | |
| Xholon | |
| ------ | |
| Title: Abundance_v2 | |
| Description: | |
| Url: http://www.primordion.com/Xholon/gwt/ | |
| InternalName: 4e01fe9d7a62b717fa3688038359db67 based on 2e8f1efa82c041af2a5bcdfa34f31ba6 | |
| Keywords: | |
| My Notes | |
| -------- | |
| 2025 Dec 19 | |
| A better implementation of the earlier Abundance model. | |
| - keep the two arrays, but never remove any nodes from the array or from the tree | |
| - still shuffle them | |
| - each Chair and Person has extensive behavior | |
| - Person - based on what person.parent() is | |
| - MusicalChairs has minimal if any behavior | |
| - scarcity/abundance is similar to homeostasis, just-in-time, good-enough? | |
| - both chairs and persons can move to Chairless | |
| - maybe MusicalChairs should decorate (or send msg, or call tick()) each Person with the next Chair they should move to | |
| - make better use of Person preAct() act() postAct() tick() | |
| - each Chair should have an individual behavior, maybe just including tick() or processReceived...() | |
| - its one action would be to move to Chairless when instructed to do so, at which point it is completely out of play | |
| - don't directly invoke any node within Chairless | |
| - including Chair and Person nodes | |
| - Xholon already has a way to do this | |
| - OR have Chair and Person always check to see if their parent() is Chairless | |
| - TODO work out the entire process of the game; all the steps - overall in the game, and in each timestep | |
| - music starts, everyone stands up, and one chair is removed | |
| - when music stops every tries to sit on a chair | |
| - one person who is still standing is eliminated | |
| - see refs 9+ | |
| 2025 Dec 17 | |
| 2025 Dec 18 FIXED | |
| - I somehow lost the changes I made locally | |
| - I am recreating those changes fomr the latest github version, and from the local running model that I had that included those changes | |
| - it works on Chrome | |
| - and it works on Firefox | |
| A model of abundance and scarcity. | |
| The concept of "abundance" is related to my concept of "possible worlds". | |
| The "abundance world" presented in the story at the start of the book's Introduction "Beyond Scarcity", is one of many possible worlds. | |
| This model can apply to many facets of society: Housing, Health (everyone has an assigned health provider (doctor, nurse, clinic, etc.), Food, COVID shots, ... | |
| To run: | |
| http://127.0.0.1:8080/Xholon.html?app=Abundance_v2&src=lstr&gui=clsc&chairs=9&persons=10 scarcity | |
| http://127.0.0.1:8080/Xholon.html?app=Abundance_v2&src=lstr&gui=clsc&chairs=10&persons=10 just enough | |
| http://127.0.0.1:8080/Xholon.html?app=Abundance_v2&src=lstr&gui=clsc&chairs=11&persons=10 abundance | |
| Chrome: | |
| https://www.primordion.com/Xholon/gwt/Xholon.html?app=AbundanceFIXED&src=lstr&gui=clsc&chairs=10&persons=10 | |
| - &chairs=10 has no effect in Chrome ??? | |
| ### TODO | |
| - DONE: | |
| - **MusicalChairs** is a script that manages and randomly shuffles an array of Person | |
| - each Person is invoked in their order in the array to take the next chair | |
| - I have used a similar approach in much earlier models (Stupid Models?) | |
| - MusicalChairs would call tick() on the Person | |
| - DONE how do I sort the array of Person? | |
| - model **Scarcity** by always having one less chair than there are people | |
| - model **Abundance** by always having one more chair than there are people | |
| - be able to append new Person nodes at runtime, and have them added to the persons array | |
| - enable setting number of persons and chairs as part of the URL. ex: &chairs=12&persons=13 | |
| ### References | |
| (1) Ezra Klein and Derek Thompson, Abundance, 2025 | |
| I've seen this new book in bookstores. | |
| For now, I borrowed it from the library. | |
| p. 41 | |
| The way to think about homelessness, they write, is to imagine a game of musical chairs. | |
| With ten chairs and ten people, everyone will find a chair when the music stops. | |
| That will be true even if one of the players is on crutches. | |
| With nine chairs, someone will inevitably be left out. | |
| (2) https://www.theatlantic.com/ideas/archive/2022/01/scarcity-crisis-college-housing-health-care/621221/ | |
| A Simple Plan to Solve All of America’s Problems | |
| The U.S. doesn’t have enough COVID tests—or houses, immigrants, physicians, or solar panels. We need an abundance agenda. | |
| Derek ThompsonJanuary 12, 2022 | |
| - is this the article that planted the seed for the book? | |
| During the holiday week, I spent a frigid afternoon standing in a long line outside the local library to pick up a rapid COVID test. | |
| Lines for essential goods are a pretty good sign of failed public policy. | |
| When food runs low, there are bread lines. | |
| Where gasoline is in short supply, there are gas lines. | |
| But there I stood, nearly two years into a pandemic, shivering inside a depressing metaphor of state failure. | |
| As I bounced from foot to foot to stay warm, I asked myself: How on earth did this happen? | |
| America’s miserable—and miserably timed—testing shortage was a policy choice. | |
| The FDA has continually slow-walked the approval of rapid tests for development. | |
| The Trump administration was utterly uninterested in any COVID policy outside the vaccines. | |
| The Biden administration and Democrats didn’t announce bulk orders of rapid tests until the Omicron wave had already swept through the country. | |
| Other countries, including the United Kingdom and Canada, approved more kits and prioritized their manufacture and distribution, | |
| giving their citizens access to millions of free tests throughout the past year. | |
| America lacks the test abundance of the U.K. and Canada because instead of choosing abundance, we chose scarcity. | |
| Zoom out, and you can see that scarcity has been the story of the whole pandemic response. | |
| In early 2020, Americans were told to not wear masks, because we apparently didn’t have enough to go around. | |
| (3) https://www.nytimes.com/2025/11/23/opinion/housing-crisis-america.html | |
| Opinion, NYTimes | |
| Ezra Klein, America’s Housing Crisis, in One Chart, Nov. 23, 2025 | |
| The housing market keeps getting worse. | |
| Home prices have risen more than 50 percent since the start of the pandemic. | |
| About a third of Americans households now spend more than 30 percent of their income on housing. | |
| The core of the problem is simple: Too much money chasing too few homes. How many more homes does America need? | |
| If you wanted to encapsulate the entire problem in a single chart, here it is: | |
| America is still building fewer homes than it was before 2008 | |
| Total housing units built per 100,000 people per year | |
| (4) https://en.wikipedia.org/wiki/Abundance_(Klein_and_Thompson_book) | |
| Abundance is a nonfiction book by Ezra Klein and Derek Thompson published by Avid Reader Press in March 2025. | |
| The book examines the reasons behind the lack of progress on ambitious projects in the United States, | |
| including those related to affordable housing, infrastructure, and climate change. | |
| It became a New York Times Bestseller. | |
| The "abundance movement" | |
| A political movement oriented around the themes in Abundance began to emerge in 2024. | |
| The movement aims to reduce what it sees as regulatory obstacles to its growth targets in the areas of | |
| affordable housing, improved healthcare for the middle class, and improved public works and public infrastructure. | |
| The movement includes conferences and policy workshops, and seeks to gain traction among | |
| lawmakers, activists, and political candidates. | |
| (5) https://www.semafor.com/article/09/08/2025/the-a-word-abundance-acolytes-debate-their-own-appeal | |
| The A-word: Abundance acolytes debate their own appeal | |
| David Weigel, Politics Reporter, Semafor, Sep 8, 2025 | |
| At the Abundance movement’s largest-ever gathering, with its manifesto still on the best-seller lists, | |
| its biggest champions wrestled openly with its status as a dirty word in US politics. | |
| Wherever the emerging Abundance coalition of yes-in-my-backyard liberals and deregulatory libertarians organized — slow-growing blue states, | |
| small booming cities in Utah and Montana — they would win. | |
| Yet when they talked out loud about “abundance,” protesters denounced them, and ordinary voters were left confused. | |
| “I never use the word ‘abundance’ in the South Bronx,” said New York Democratic Rep. Ritchie Torres. | |
| “I don’t use the word ‘abundance,’ either,” said Republican Utah Rep. Celeste Maloy. | |
| Instead, Torres talked about a “build-housing” agenda and she talked about a “liberty” agenda. | |
| “We now have a federal administration that appears to be very much pro-scarcity,” said California state Sen. Scott Weiner, | |
| a Democratic leader in the movement to roll back parts of his state’s Environmental Quality Act, which had hobbled new housing development. | |
| To win, Abundance thinkers said they needed to be realistic about what voters wanted, and | |
| how the perception of too much growth — especially in immigration — could backfire. | |
| They needed to figure that out, because the idea of building more housing to make life cheaper has been a winner for whoever’s run on it. | |
| The biggest evidence of that remains Zohran Mamdani in New York — and he is not part of this team. | |
| (6) https://www.abundancenetwork.com/ | |
| What is Abundance? | |
| Abundance aims to center politics around this question: what do we want more of, and how do we get it? | |
| Americans today struggle with shortages of things they need most—housing, transportation, energy, education, etc. | |
| Abundance promotes competition that creates more choices for people and drives down costs. | |
| Our Mission | |
| Abundance Network is organizing a new generation of civic leaders to build a 21st century government. | |
| Team - KSW this looks impressive | |
| (7) https://www.theguardian.com/australia-news/2025/jul/13/abundance-the-us-book-is-a-sensation-among-our-progressive-mps-but-can-it-spur-action-in-canberra | |
| (8) https://reclimate.ca/is-abundance-the-future-of-climate-action-in-canada/ | |
| Is “Abundance” the Future of Climate Action in Canada? Inside the Debate on Building, Growth and Clean Energy | |
| As Canada retreats from key climate policies, a new “abundance” narrative is gaining traction—promising growth and optimism, | |
| but raising tough questions about regulation, equity and who really benefits. | |
| Canada is currently experiencing a climate policy backlash. | |
| Across the country, political leaders have abandoned the carbon tax—once considered a common-sense policy with bipartisan support—while nationally, | |
| policies such as the Greener Homes Loan and the EV mandate have been put on hold. | |
| Meanwhile, Canadian banks and the Canada Pension Plan have abandoned their net-zero targets. | |
| This is perhaps why the March 2025 release of the book Abundance by American journalists Ezra Klein and Derek Thompson has caused such a stir among progressives. | |
| Because at a moment when climate action seems politically unpopular, Klein and Thompson are offering an answer. | |
| Prime Minister Mark Carney appears to have adopted the “abundance” framework, | |
| as evidenced by his “build, baby, build” slogan and an emphasis on building housing and fostering economic growth. | |
| Carleton University | |
| 1125 Colonel By Drive | |
| Ottawa, Ontario | |
| K1S 5B6 | |
| Canada | |
| Re.Climate is a non-partisan public institution housed at Carleton University’s Sustainable Energy Research Centre. | |
| We are connected directly to both the Faculty of Arts and Social Sciences and the Faculty of Public Affairs, | |
| the Carleton Climate Commons, and researchers across the university. | |
| (9) search: abundance economics | |
| - there are lots of good-looking hits | |
| (10) https://en.wikipedia.org/wiki/Musical_chairs | |
| A set of chairs is arranged in a circle with one fewer chair than the number of players (i.e. nine players would use eight chairs). | |
| While music plays, | |
| the contestants walk around the set of chairs. | |
| When the music stops abruptly, | |
| all players must find their own individual chair to sit on. | |
| The player who fails to sit on a chair is eliminated. | |
| One chair is then removed for the next round, and | |
| the process repeats until only one player remains and is declared the winner. | |
| (11) https://www.wikihow.com/Play-Musical-Chairs | |
| Count how many players you have and subtract 1. | |
| Then, group that many chairs together in a circle in a large space with the seats facing outward. | |
| Play music and have the players move around the chairs. | |
| When the music stops, players must sit in a chair and the player left standing is out. | |
| Continue playing music and removing a chair each round until only 1 player remains. | |
| () | |
| ]]></Notes> | |
| <_-.XholonClass> | |
| <PhysicalSystem/> | |
| <MusicalChairs superClass="Script"/> | |
| <Chair superClass="Script"/> | |
| <Person superClass="Script"/> | |
| <Chairless/> | |
| </_-.XholonClass> | |
| <xholonClassDetails> | |
| <MusicalChairs><DefaultContent><![CDATA[ | |
| var me, persons, chairs, beh = { | |
| postConfigure: function() { | |
| me = this.cnode; | |
| me.println(me.name()); | |
| this.buildChairs(); | |
| this.buildPersons(); | |
| persons = []; | |
| chairs = []; | |
| const roleNames = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""); | |
| var rnix = 0; | |
| var node = me.first(); | |
| while (node) { | |
| if (node.xhc().name() === "Person") { | |
| node.role(roleNames[rnix++]); | |
| persons.push(node); | |
| } | |
| else if (node.xhc().name() === "Chair") { | |
| chairs.push(node); | |
| } | |
| node = node.next(); | |
| } | |
| //me.println(`length of Person array: ${persons.length} ${persons[0].name()}`); | |
| //this.shuffle(persons); // test | |
| }, | |
| preAct: function() { | |
| //persons = this.shuffle(persons); | |
| }, | |
| act: function() { | |
| }, | |
| postAct: function() { | |
| }, | |
| // OK | |
| buildChairs: function() { | |
| const params = new URLSearchParams(document.location.search); | |
| const quan = Number(params.get("chairs")); // | 10; // params. ... does not work in Chrome | |
| const str = "<Chair/>"; | |
| for (var i = 0; i < quan; i++) { | |
| me.append(str); | |
| } | |
| }, | |
| // OK | |
| buildPersons: function() { | |
| const params = new URLSearchParams(document.location.search); | |
| const quan = Number(params.get("persons")); // | 10; // params. ... does not work in Chrome | |
| const str = "<Person/>"; | |
| for (let i = 0; i < quan; i++) { | |
| me.append(str); | |
| } | |
| }, | |
| // OK | |
| shuffle: function(array) { | |
| // Source - https://stackoverflow.com/a | |
| // Posted by ChristopheD, modified by community. See post 'Timeline' for change history | |
| // Retrieved 2025-12-17, License - CC BY-SA 4.0 | |
| function shuffl(array) { | |
| let currentIndex = array.length; | |
| // While there remain elements to shuffle... | |
| while (currentIndex != 0) { | |
| // Pick a remaining element... | |
| let randomIndex = Math.floor(Math.random() * currentIndex); | |
| currentIndex--; | |
| // And swap it with the current element. | |
| [array[currentIndex], array[randomIndex]] = [ | |
| array[randomIndex], array[currentIndex]]; | |
| } | |
| } | |
| let arr = array.slice(); | |
| shuffl(arr); | |
| //me.println(arr.map((item) => item.id(), [])); | |
| return arr; | |
| }, | |
| /* | |
| (10) https://en.wikipedia.org/wiki/Musical_chairs | |
| A set of chairs is arranged in a circle with one fewer chair than the number of players (i.e. nine players would use eight chairs). | |
| While music plays, | |
| the contestants walk around the set of chairs. | |
| When the music stops abruptly, | |
| all players must find their own individual chair to sit on. | |
| The player who fails to sit on a chair is eliminated. | |
| One chair is then removed for the next round, and | |
| the process repeats until only one player remains and is declared the winner. | |
| (11) https://www.wikihow.com/Play-Musical-Chairs | |
| Count how many players you have and subtract 1. | |
| Then, group that many chairs together in a circle in a large space with the seats facing outward. | |
| Play music and have the players move around the chairs. | |
| When the music stops, players must sit in a chair and the player left standing is out. | |
| Continue playing music and removing a chair each round until only 1 player remains. | |
| */ | |
| doSteps: function() { | |
| // do steps in wikipedia an and wikihow | |
| this.arrangeChairs(); | |
| this.playersWalkAround(); | |
| this.playersFindChairs(); | |
| this.eliminatePlayer(); | |
| this.removeChair(); | |
| // repeat | |
| }, | |
| arrangeChairs: function() { | |
| // if chairs are not arranged, then make them children of MusicalChairs | |
| }, | |
| playersWalkAround: function() { | |
| this.shuffle(persons); | |
| }, | |
| playersFindChairs: function() { | |
| // same code that I used in v.1 to assign players to chairs | |
| }, | |
| eliminatePlayer: function() { | |
| // eliminate the one player who is not in a seat | |
| }, | |
| removeChair: function() { | |
| // all players stand up (become children of MusicalChairs | |
| // remove last chair | |
| } | |
| } | |
| //# sourceURL=MusicalChairs.js | |
| ]]></DefaultContent><Color>indigo</Color></MusicalChairs> | |
| <Chair><DefaultContent><![CDATA[ | |
| var me, beh = { | |
| postConfigure: function() { | |
| me = this.cnode; | |
| me.println(me.name()); | |
| }, | |
| postAct: function() { | |
| const prnt = me.parent(); | |
| console.log(me.name() + " prnt: " + prnt.name()); | |
| // TODO use switch (prnt.xhc().name()) | |
| if (prnt.xhc().name() !== "Chairless") { | |
| if ((me.next().xhc().name() === "Person")) { | |
| // this is the last Chair | |
| console.log("about to append Chair to Chairless ..."); | |
| console.log(prnt.next()); | |
| prnt.next().append(me.remove()); | |
| } | |
| } | |
| } | |
| } | |
| //# sourceURL=Chair.js | |
| ]]></DefaultContent><Color>green</Color></Chair> | |
| <Person><DefaultContent><![CDATA[ | |
| var me, beh = { | |
| postConfigure: function() { | |
| me = this.cnode; | |
| //me.println(me.name()); | |
| }, | |
| preAct: function() { | |
| //me.parent().xhc().name() === "Chair" ? me.parent().parent().append(me.remove()) : null; | |
| }, | |
| act: function() { | |
| }, | |
| tick: function(thing) { | |
| //console.log(thing); | |
| //thing.chair ? thing.chair.append(me.remove()) : me.xpath("../../Chairless").append(me.remove()); | |
| } | |
| } | |
| //# sourceURL=Person.js | |
| ]]></DefaultContent><Color>orange</Color></Person> | |
| <Avatar><Color>red</Color></Avatar> | |
| </xholonClassDetails> | |
| <PhysicalSystem> | |
| <MusicalChairs> | |
| <!-- Chair and Person nodes will be added here --> | |
| </MusicalChairs> | |
| <Chairless/> | |
| </PhysicalSystem> | |
| <SvgClient><Attribute_String roleName="svgUri"><![CDATA[data:image/svg+xml, | |
| <svg width="100" height="50" xmlns="http://www.w3.org/2000/svg"> | |
| <g> | |
| <title>MusicalChairs</title> | |
| <rect id="PhysicalSystem/MusicalChairs" fill="#98FB98" height="50" width="50" x="25" y="0"/> | |
| <g> | |
| <title>Chair</Chair> | |
| <rect id="PhysicalSystem/MusicalChairs/Chair" fill="#6AB06A" height="50" width="10" x="80" y="0"/> | |
| </g> | |
| </g> | |
| </svg> | |
| ]]></Attribute_String><Attribute_String roleName="setup">${MODELNAME_DEFAULT},${SVGURI_DEFAULT}</Attribute_String></SvgClient> | |
| </XholonWorkbook> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment