Other Pivotal Questions Workshops 🥩 Cultivated Meat (Apr 2026) 🥗 Plant-Based Alternatives (May 2026)
PBM workshop probably deferred to June -- update
Other Pivotal Questions Workshops 🥩 Cultivated Meat (Apr 2026) 🥗 Plant-Based Alternatives (May 2026)
PBM workshop probably deferred to June -- update
test
We’ve reviewed this critique carefully
this should be more "we're reviewing it now and so far it seems reliable"
New to this model? Start with the Simplest Model → — a shorter version with only the biggest levers, line-of-sight explanations, and no jargon. You can carry your settings over to this Advanced Model when you’re ready.
skip the 'and no jargon' ... and it's "focusing on some key levers"
Save / share this scenario:
The ability to do this should be a bit more prominent and signposted perhaps at the top and the very bottom as well. Ideally there should be a way to save this and then have a page that gives a side-by-side comparison of the results from two scenarios without extra clutter ... This would be particularly useful if it's something that's easy to develop.
For now you can explain (tooltip) how you could do something like this by copying two shareable links and looking them in side-by-side browsers, or saving the results somewhere and feeding it into an LLM to ask it to give a comparative analysis
Earlier versions of this model carried a separate
Make it clearer here initially that these micronutrients seems to be only a tiny cost, anyways.
Also you don't need to make the quote "April 2026" change part of the header - perhaps just make that a note or a tooltip. This is too much discussion of our process
All costs in this model are expressed
Expressed in the equations and initial computation that is -- on the dashboard, you can see the adjusted
he CDMO toll is sampled from a lognormal distribution (default p5 = $4/kg, p95 = $40/kg) representing the range of per-kg fees a future food-grade contract manufacturer might charge. See the CDMO mode section below for a full description.
Is it reasonable to think of the CDMO total as being per kilogram? Or is that just the result of other computations? Look for references in discussion about this to verify
VOC · CAPEX · F
These tool tips are not showing any content when you hover over them
Return to: Interactive Cost Model | New to this topic? How Cultured Chicken is Made | Audio Review (MP3) | Workshop (May 2026)
Let's update the audio review with new content
Sensitivity check: Users can explore partially-correlated scenarios by: - Setting maturity high but technology probabilities low (tests “scale-up succeeds, tech fails”) - Setting maturity low but one technology probability high (tests “isolated breakthrough”)
itemized list not rendering
New
You don't have to say "new". No one is tracking this on a day-to-day basis.
Cell Density / Media-Use Override Code viewof override_mode_constraints = Inputs.toggle({ label: html`Override process mode constraints <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="When ON: process-mode sampling is bypassed and you can specify density and media-use ranges directly. Useful for experts wanting to model specific bioreactor configurations.">(?)</abbr>`, value: urlBool("override_mode_constraints", false) }) Override process mode constraints (?)override_mode_constraints = false Code viewof density_lo = Inputs.range([10, 100], { value: urlNum("density_lo", 30), step: 10, label: "Cell Density Low (g/L)" }) viewof density_hi = Inputs.range([50, 300], { value: urlNum("density_hi", 200), step: 10, label: "Cell Density High (g/L)" }) Cell Density Low (g/L) density_lo = 30 Cell Density High (g/L) density_hi = 200 What is cell density and why does it matter so much? (click to expand) Cell density (g/L at harvest) determines how much meat you get per liter of bioreactor volume. Higher density means less media per kilogram of product, which directly reduces the largest variable cost. Density Media per kg Typical context 10 g/L ~100 L/kg Current lab scale 50 g/L ~20 L/kg Near-term commercial target 200 g/L ~5 L/kg Optimistic TEA projection This is multiplicative. If media costs $1/L, going from 10 to 50 g/L cuts media cost from $100/kg to $20/kg. Going to 200 g/L cuts it to $5/kg. Cell density is arguably the single most important technical parameter for cost reduction. Current state: Most published data shows 10-50 g/L. Some companies claim higher, but these claims are difficult to verify independently. Lever VC’s 2025 report claims 60-90 g/L has been achieved by “second generation” companies. Whether 200 g/L is achievable by 2036 is a genuine open question. What about bioreactor volume / tank size? (click to expand) Bioreactor volume is another major uncertainty that is currently implicit in this model rather than a direct parameter. The model computes total working volume as: total_volume = annual_output / (density × productivity × 365). It then applies a power-law scaling for CAPEX. But individual bioreactor tank size matters for several reasons: Factor Small tanks (2,000-5,000L) Large tanks (20,000-50,000L) Cost per liter Higher Lower (economies of scale) Contamination risk Lower Higher (single failure = large loss) Mixing/O2 transfer Easier Harder at scale Flexibility More modular Less redundancy Industry precedent Pharma standard Requires new engineering Key debate: Some companies (e.g., Vow) claim to have built 20,000L bioreactors for under $1M in 14 weeks using custom food-grade designs. If true, this dramatically changes the CAPEX picture. Humbird’s analysis assumed pharma-grade bioreactors at $50-500/L. Why it’s not a direct slider (yet): Adding individual tank size would require modeling the number of tanks, contamination batch-failure rates, and the trade-off between scale and reliability. This is a planned enhancement. For now, the Plant Capacity and Cell Density parameters together determine total working volume, and the custom reactor ratio (in full view) captures the pharma-vs-food-grade cost difference. Workshop discussion: This is one of the key cruxes for the upcoming CM workshop — what bioreactor scale is realistic, and what does it cost? Advanced: Media-use multiplier (×) What is this — and why can it be below 1? (click to expand) The model computes media volume per kg as (1000 / density) × multiplier. A value of 1 is traditional batch mode (fill reactor once, harvest); >1 is perfusion (multiple media-volume equivalents flow through during the run); <1 represents media recycling, fed-batch with concentrated feeds, or harvest-side cell concentration. The Learn page walks through all three mechanisms. Why the range changed (April 2026): the default p5–p95 was tightened from 1–10× to 0.5–3.0×. The old floor of 1.0 was too restrictive — the GFI 2023 cost-competitive scenarios assume 8–13 L/kg, which at 60–90 g/L density implies a multiplier of roughly 0.5–1.2. A floor of 1.0 mechanically excluded those scenarios no matter how high you pushed density. The new range covers both recycled/fed-batch (<1) and standard perfusion (up to ~3×); values of 5–10× remain plausible for heavily media-intensive processes but are now a stress-test region rather than the default. Show multiplier sliders Code viewof media_turnover_lo = Inputs.range([0.25, 2], { value: urlNum("media_turnover_lo", 0.5), step: 0.05, label: "Media-use multiplier p5 (low end)" }) viewof media_turnover_hi = Inputs.range([1, 10], { value: urlNum("media_turnover_hi", 3.0), step: 0.1, label: "Media-use multiplier p95 (high end)" }) Media-use multiplier p5 (low end) media_turnover_lo = 0.5 Media-use multiplier p95 (high end) media_turnover_hi = 3 Code // URL state writer: serialize every viewof value that DIFFERS FROM ITS // DEFAULT into ?key=val pairs, then debounce-write to the URL via // history.replaceState. Critical invariant: if every slider is at its // default, the URL stays bare (pathname + hash only) — no query string. // This is required so Hypothes.is can find annotations on the canonical // bare URL; a polluted URL breaks annotation lookup for every visitor. // The writer depends on every viewof name below so OJS re-runs it // whenever any input changes. Reads nothing from urlParams. { // Hard-coded defaults must stay in sync with each Inputs.range() / // Inputs.toggle() declaration above and with the reset_adoption button. const defaults = { simpleMode: true, include_blending: false, blending_share: 0.25, filler_cost: 3, include_capex: true, include_fixed_opex: true, include_downstream: false, cdmo_mode: false, cdmo_toll_p5: 4, cdmo_toll_p95: 40, bundled_media: false, bundled_media_p5: 50, bundled_media_p95: 500, plant_capacity: 20, uptime: 0.90, maturity: 0.5, target_year: 2036, p_fedbatch: 0.20, p_perfusion: 0.50, p_continuous: 0.30, override_mode_constraints: false, p_hydro: 0.75, p_recfactors: 0.5, gf_progress: 50, wacc_lo: 8, wacc_hi: 20, asset_life_lo: 8, asset_life_hi: 20, density_lo: 30, density_hi: 200, media_turnover_lo: 0.5, media_turnover_hi: 3.0 }; const state = { simpleMode, include_blending, blending_share, filler_cost, include_capex, include_fixed_opex, include_downstream, cdmo_mode, cdmo_toll_p5, cdmo_toll_p95, bundled_media, bundled_media_p5, bundled_media_p95, plant_capacity, uptime, maturity, target_year, p_fedbatch, p_perfusion, p_continuous, override_mode_constraints, p_hydro, p_recfactors, gf_progress, wacc_lo, wacc_hi, asset_life_lo, asset_life_hi, density_lo, density_hi, media_turnover_lo, media_turnover_hi }; const usp = new URLSearchParams(); let hasDiff = false; for (const [k, v] of Object.entries(state)) { const def = defaults[k]; let matches; if (typeof v === "boolean") matches = (v === def); else if (typeof v === "number") matches = Math.abs(v - def) < 1e-9; else matches = (v === def); if (!matches) { hasDiff = true; if (typeof v === "boolean") usp.set(k, v ? "1" : "0"); else if (typeof v === "number" && Number.isFinite(v)) usp.set(k, String(v)); } } if (window._urlWriteTimer) clearTimeout(window._urlWriteTimer); window._urlWriteTimer = setTimeout(() => { try { const newUrl = hasDiff ? (location.pathname + "?" + usp.toString() + location.hash) : (location.pathname + location.hash); history.replaceState(null, "", newUrl); } catch (e) { console.warn("URL state update failed:", e); } }, 300); return null; } null
This bit at the bottom seems to have generated some sort of error. It says "null"
In our sensitivity analysis,
A little bit more cagey about this. I'm not sure this holds in a robust way, not sure we fully checked. Say something like, "In our preliminary sensitivity analysis these seem to contribute less ..."
doption, reactor costs, and financing. High maturity = correlated improvements.
I'm going to link the fuller explanation in the formula and explainers page
→ Open Advanced Model with these settings
I think it's more like "starting with these settings," or "adapting the parameters you've entered here."
How is this cost calculated?
I think we need a bit more explanation here, perhaps even including some unfolded quick points about what kind of model this is, how the uncertainty comes in through simulations, etc., and what we're assuming about correlation or lack thereof between the different elements. We don't want to keep this simple and short but people should have some idea of what exactly they're looking at
Full formula documentation → Model formulas & metrics Code html`<div style="margin-top:1.5rem; padding:0.8rem; background:#f0f8ff; border:1px solid #3498db; border-radius:6px; font-size:0.88em;"> <strong>Want more control?</strong> The <a href="index.html">Advanced Model</a> exposes all parameters: financing (WACC, asset life), plant capacity, cell density, media-use multiplier, CDMO mode, bundled media pricing, and more. <div style="margin-top:0.5rem;"> <a href="${(() => { const cont=Math.max(0,100-p_fedbatch_s-p_perfusion_s); const p=new URLSearchParams({target_year:target_year_s,p_hydro:(p_hydro_s/100).toFixed(2),p_recfactors:(p_recfactors_s/100).toFixed(2),p_fedbatch:(p_fedbatch_s/100).toFixed(2),p_perfusion:(p_perfusion_s/100).toFixed(2),p_continuous:(cont/100).toFixed(2),include_blending:include_blending_s?1:0,blending_share:(blending_share_s/100).toFixed(2)}); return 'index.html?'+p.toString(); })()}" style="font-weight:600;">→ Open Advanced Model with these settings</a> </div> </div>`
I think those formula explanations pertain to the full model. Perhaps it would be better to have this linked directly to a new page or part of the page that just explains this simpler model
Always included
Again, at what rate, and what's the reference for this particular rate? Is it given as a fixed value or a distributional draw?
included
Included, but at what rate/what value? And what's the reference or source for this?
Reference commercial scale
Link, reference, or tooltip it here.
Standard equipment life range
Give a bit more reference for this. I'm actually a bit confused as to which equipment we're talking about. Sourced reference would give more credibility.
8–20% range Typical food/biotech financing range
Explain this more. Are we drawing this from this particular distribution? Make a note or a tool tip about how the results are generally not particularly sensitive to this parameter, given the explanation you gave before, where the capital costs are really a rather small component in this context.
Parameter Value Why fixed Industry Maturity 0.5 (neutral) At 0.5 the maturity factor has zero net effect on probabilities or financing
This explanation is incomplete or it just doesn't make sense. Can you elaborate, and why is this the baseline you think maturity should matter for something?
Probability Thresholds Code { function card(thresh, prob, label, color, bprob) { const bc = prob > 30 ? color : '#ddd'; const blend = include_blending_s && bprob !== undefined ? `<div style="font-size:0.8em; color:#1a5276; background:#f0f8ff; border-radius:3px; padding:2px 5px; margin-top:4px;"> Blended: <strong>${bprob.toFixed(1)}%</strong> chance < $${thresh}/kg </div>` : ''; return `<div style="border:2px solid ${bc}; padding:0.9rem; border-radius:8px; text-align:center;"> <h5 style="margin:0 0 0.2rem;">P(Pure cells < $${thresh}/kg)</h5> <h2 style="color:${color}; margin:0.2rem 0;">${prob.toFixed(1)}%</h2> <small style="color:#666;">${label}</small> ${blend} </div>`; } const grid = `<div class="grid" style="grid-template-columns:repeat(4,1fr); gap:0.75rem; margin-bottom:1.5rem;"> ${card(10, stats_s.prob_10, 'could approach conventional chicken (~$5-10/kg retail)', '#27ae60', stats_s.bprob_10)} ${card(25, stats_s.prob_25, 'range where premium cultured products may be viable', '#3498db', stats_s.bprob_25)} ${card(50, stats_s.prob_50, 'potential niche/specialty market', '#f39c12', null)} ${card(100, stats_s.prob_100, 'substantially below current lab-scale costs', '#e74c3c', null)} </div>`; const blendRow = include_blending_s ? ` <p style="font-size:0.88em; color:#1a5276; font-weight:500; margin:0.5rem 0 0.3rem;"> Blended product (${stats_s.bs*100|0}% CM + ${((1-stats_s.bs)*100)|0}% filler at $3/kg) — consumer-relevant prices: </p> <div class="grid" style="grid-template-columns:repeat(3,1fr); gap:0.6rem; margin-bottom:1.5rem;"> <div style="border:2px solid ${stats_s.bprob_5>20?'#27ae60':'#ddd'}; padding:0.8rem; border-radius:8px; text-align:center;"> <h5 style="font-size:0.85em; margin:0 0 0.2rem;">P(Blend < $5/kg)</h5> <h2 style="color:#27ae60; margin:0.2rem 0;">${stats_s.bprob_5.toFixed(1)}%</h2> <small>competitive with conventional chicken</small> </div> <div style="border:2px solid ${stats_s.bprob_8>30?'#3498db':'#ddd'}; padding:0.8rem; border-radius:8px; text-align:center;"> <h5 style="font-size:0.85em; margin:0 0 0.2rem;">P(Blend < $8/kg)</h5> <h2 style="color:#3498db; margin:0.2rem 0;">${stats_s.bprob_8.toFixed(1)}%</h2> <small>competitive with premium chicken/beef</small> </div> <div style="border:2px solid ${stats_s.bprob_12>50?'#f39c12':'#ddd'}; padding:0.8rem; border-radius:8px; text-align:center;"> <h5 style="font-size:0.85em; margin:0 0 0.2rem;">P(Blend < $12/kg)</h5> <h2 style="color:#f39c12; margin:0.2rem 0;">${stats_s.bprob_12.toFixed(1)}%</h2> <small>affordable specialty market</small> </div> </div>` : ''; return html([grid + blendRow]); } TypeError: Cannot read properties of null (reading 'toFixed')
The probability thresholds yield this error when you select that you want to show blended product.
TypeError: Cannot read properties of null (reading 'toFixed')
I'm getting "TypeError: Cannot read properties of null (reading 'toFixed')" for the probability thresholds here
Blended Product Code viewof include_blending_s = Inputs.toggle({ label: "Show blended product analysis", value: urlBool_s("include_blending", false) })
A bit more signposting here, please. Tooltip, if it will fit nicely. Maybe move this one to the top. And make it selected by default.
all parameters
"all" is too strong - better to say "many more".
Projected 2036 Cost Distribution:where(.plot-d6a7b5) { --plot-background: white; display: block; height: auto; height: intrinsic; max-width: 100%; } :where(.plot-d6a7b5 text), :where(.plot-d6a7b5 tspan) { white-space: pre; }
Make it easier to expand this or zoom in on it, perhaps making it full screen. However, type tool tips within the graph could also be helpful, to be able to see the lower percentiles better. I'm not seeing the P80 here.
A first look at cultured chicken cost — for exploration and understanding
You can leave this out because the caution below gets at it.
Year
Important. Nothing seems to be changing when I change the projection year! I would think that this model allows for technological change, even if they don't explicitly set the equitment maturity parameter"!
Continuous (auto): 35%
Let them set all three, but still have them automatically add up.
These parameters need a lot more explanation.
I think we can use this space better here. If you're only going to be showing a small set of "results" tables (maybe with others in folding boxes), you could just put these below the results, allowing a more fleshed out and spacious explanation of what the parameters mean, rather than this sidebar.
xposes only the biggest levers on cultured chicken
that's potentially too strong a claim. yes, some of the most important levers are here, but we also focused on the ~'simpler' elements requiring less explanation #implement.
I'd say something like "the simplest model lets you adjust some of the more important levers..."
WACC
tooltips to explain this and other things. People may not even know what this abbreviation means.
Background
hyperlink that if possible
Parameters
"Exposed" is weird. Say something more like "Choices and adjustable parameters here"
Mix
"mix" is confusing ... "Probability of each process mode" is more accurate
·
commas, not dots (dots look like multiplication)
For more complete analysis with all parameters exposed
That one also has caveats and is not fully ready for prime time ... rephrase this
38.7% chance blended product (25% CM, $3/kg filler) < $10/kg
This is basically also given in the boxes below, but with slightly different thresholds, which is confusing.We only need one or the other, as far as I understand it. Simplify (if this is also the case in the intermediate sluttage advanced model, fix it there too. )
Parameter Sensitivity: Dollar Swing in Mean Unit Cost :where(.plot-d6a7b5) { --plot-background: white; display: block; height: auto; height: intrinsic; max-width: 100%; } :where(.plot-d6a7b5 text), :where(.plot-d6a7b5 tspan) { white-space: pre; }
financing cost should be here too
Asset Life High
all assets with one value?
Simplified view: Less pivotal parameters (plant capacity, uptime, financing costs, media-use multiplier) are set to reasonable defaults. In our sensitivity analysis, these contribute less than 10% of the variance in cost estimates. Switch off to adjust all parameters. Code // Reactive style block to hide/show full-mode-only and cdmo-only inputs html`<style> .full-mode-only { display: ${simpleMode ? 'none' : 'block'}; } .cdmo-only { display: ${cdmo_mode ? 'block' : 'none'}; } .override-mode-only { display: ${override_mode_constraints ? 'block' : 'none'}; } .separable-only { display: ${bundled_media ? 'none' : 'block'}; } .bundled-only { display: ${bundled_media ? 'block' : 'none'}; } .blending-only { display: ${include_blending ? 'block' : 'none'}; } </style>` .full-mode-only { display: none; } .cdmo-only { display: none; } .override-mode-only { display: none; } .separable-only { display: block; } .bundled-only { display: none; } .blending-only { display: none; }
even the 'nonsimplified view' should have some baseline capital cost, w a reasonable default ... and does it enter into the tornado table?
Cultured Chicken Production Cost Model CodeShow All CodeHide All CodeView Source
Should we make a page for a "much simpler model" that is much more legible ... and that can be an introduction to this more complicated model --- potential nest
P(Scalable Growth Factor (GF)
This needs more signposting, explaining, and opening. It seems like it must be making some very ad hoc decisions here as to what scalable growth factor technology means.
Cell Density (g/L)
This is very much determined by which process we are using. It's not that you can adjust the cell density on its own. -- should it/can it switch to being the sensitivity to 'process choice'
Which parameters have the most impact on the final cost? Each bar shows the dollar swing in mean unit cost between simulations where the parameter is in its top 10% versus its bottom 10%. Larger bars = bigger levers on cost. Code { const uc = results.unit_cost; // Deduplicated parameter list. // Removed vs. previous version (see explainer below for details): // • L/kg (volume) — deterministic function of density × media-use multiplier // • Uses Hydrolysates — regime-switch subsumed into Media $/L // • Has Cheap GFs — regime-switch subsumed into GF Price / GF Quantity const params = [ {name: "Cell Density (g/L)", data: results.density_samples, kind: "primitive"}, {name: "Media-use multiplier (×)", data: results.media_turnover_samples, kind: "primitive"}, {name: "Media $/L (incl. hydrolysate regime)", data: results.media_cost_L_samples, kind: "mixture"}, {name: "GF Price ($/g, incl. regime)", data: results.price_recf_samples, kind: "mixture"}, {name: "GF Quantity (g/kg, incl. regime)", data: results.g_recf_samples, kind: "mixture"}, {name: "Industry Maturity (latent — see note)", data: results.maturity_samples, kind: "latent"}, {name: "Plant Capacity (kTA)", data: results.plant_kta_samples, kind: "primitive"}, {name: "Utilization Rate", data: results.uptime_samples, kind: "primitive"} ]; const swings = params.map(p => ({ name: p.name, kind: p.kind, swing: conditionalSwing(p.data, uc, 0.10) })); const sorted = swings .map(s => ({...s, absSwing: Math.abs(s.swing)})) .sort((a, b) => b.absSwing - a.absSwing); const maxAbs = Math.max(...sorted.map(s => s.absSwing), 1); const pad = maxAbs * 0.30; const tornadoPlot = Plot.plot({ width: 900, height: 440, marginLeft: 290, marginRight: 100, x: { label: "Δ mean unit cost ($/kg): top 10% − bottom 10% of parameter", domain: [-maxAbs - pad, maxAbs + pad], grid: true, labelOffset: 40, tickFormat: d => (d >= 0 ? "+$" : "−$") + Math.abs(d).toFixed(0) }, y: { label: null, tickFormat: d => d, tickSize: 0 }, color: { domain: ["Increases cost", "Decreases cost"], range: ["#e74c3c", "#27ae60"] }, style: { fontSize: "13px" }, marks: [ Plot.barX(sorted, { y: "name", x: "swing", fill: d => d.swing > 0 ? "Increases cost" : "Decreases cost", sort: {y: "-x", reduce: d => Math.abs(d)} }), Plot.ruleX([0], {stroke: "black", strokeWidth: 1}), Plot.text(sorted, { y: "name", x: d => d.swing > 0 ? d.swing + maxAbs * 0.025 : d.swing - maxAbs * 0.025, text: d => (d.swing > 0 ? "+$" : "−$") + Math.abs(d.swing).toFixed(1) + "/kg", textAnchor: d => d.swing > 0 ? "start" : "end", fontSize: 12, fontWeight: 500 }) ] }); return html`<div style="font-size: 1em;"> <div style="font-weight: normal; font-size: 1.05em; margin-bottom: 0.5rem; color: #333;">Parameter Sensitivity: Dollar Swing in Mean Unit Cost</div> ${tornadoPlot} </div>`; }
Make it clearer, explain better that this is about parameters not just the cost inputs.
Sensitivity Analysis (Tornado Chart)
Adjust this chart so everything is in absolute value outcome -- no need for positive vs negative (unless these switch sighns, I doubt it) #implement
Technology Adoption & Process Mode (Realized) Code { const isOverride = results.mode_is_override; const pct_fb = (results.pct_fedbatch * 100).toFixed(0); const pct_pf = (results.pct_perfusion * 100).toFixed(0); const pct_ct = (results.pct_continuous * 100).toFixed(0); const modeCard = isOverride ? html`<div class="card" style="border: 1px solid #ddd; padding: 1rem; border-radius: 8px; text-align: center; grid-column: 1 / -1;"> <h5>Process Mode</h5> <div style="color: #888; font-size: 0.9em;">Override — using manual density / media-use ranges</div> </div>` : html`<div class="card" style="border: 1px solid #16a085; padding: 1rem; border-radius: 8px; grid-column: 1 / -1;"> <h5 style="margin-bottom:0.5rem;">Process Mode (realized)</h5> <div style="display:flex; gap:1.5rem; justify-content:center; font-size:1.1em;"> <span>Fed-batch <strong style="color:#e67e22;">${pct_fb}%</strong></span> <span>Perfusion <strong style="color:#16a085;">${pct_pf}%</strong></span> <span>Continuous <strong style="color:#2980b9;">${pct_ct}%</strong></span> </div> </div>`; return html`<div class="grid" style="grid-template-columns: repeat(2, 1fr); gap: 1rem; margin: 2rem 0;"> <div class="card" style="border: 1px solid #ddd; padding: 1rem; border-radius: 8px; text-align: center;"> <h5>Hydrolysates Adopted</h5> <h2 style="color: #27ae60;">${(results.pct_hydro * 100).toFixed(0)}%</h2> <small>of simulations use hydrolysates</small> </div> <div class="card" style="border: 1px solid #ddd; padding: 1rem; border-radius: 8px; text-align: center;"> <h5>Cheap Growth Factors</h5> <h2 style="color: #9b59b6;">${(results.pct_recf_cheap * 100).toFixed(0)}%</h2> <small>of simulations have cheap factors</small> </div> ${modeCard} </div>`; }
this needs a reminder ... what generated it
average contribution
be clear -- mean not median /// could give both
Component Distributions
make the table collapsed by default with a strong signpost to be able to see it
Where does the cost come from? This chart shows the average contribution of each cost component across all simulations. The largest bars are the cost drivers to focus on — these are where technological progress or parameter uncertainty has the most impact. Code { const mediaLabel = bundled_media ? "Complete Media (incl. GFs)" : "Media (incl. basal micros)"; const allComponents = [ {name: mediaLabel, value: mean(results.cost_media), color: "#27ae60"}, {name: "Growth Factors", value: mean(results.cost_recf), color: "#9b59b6"}, {name: "Other VOC", value: mean(results.cost_other_var), color: "#7f8c8d"}, {name: "CAPEX (annualized)", value: mean(results.cost_capex), color: "#e74c3c"}, {name: "Plant overhead OPEX", value: mean(results.cost_fixed), color: "#f39c12"}, {name: "CDMO Toll", value: mean(results.cost_cdmo_toll), color: "#e67e22"}, {name: "Downstream", value: mean(results.cost_downstream), color: "#1abc9c"} ]; // Filter out zero-value components (e.g., downstream when not included) const components = allComponents.filter(c => c.value > 0.001).sort((a, b) => b.value - a.value); const total = components.reduce((s, c) => s + c.value, 0); const chartContainer = document.createElement("div"); chartContainer.style.position = "relative"; // Expand/collapse button const expandBtn = document.createElement("button"); expandBtn.textContent = "Expand Chart"; expandBtn.style.cssText = "padding: 0.3rem 0.7rem; font-size: 0.8rem; cursor: pointer; border: 1px solid #ccc; border-radius: 4px; background: #f8f9fa; margin-bottom: 0.5rem;"; let expanded = false; expandBtn.onclick = () => { expanded = !expanded; expandBtn.textContent = expanded ? "Collapse Chart" : "Expand Chart"; chartEl.replaceWith(makeChart(expanded)); chartEl = chartContainer.querySelector(".cost-breakdown-plot"); }; chartContainer.appendChild(expandBtn); function makeChart(large) { const w = large ? 1200 : 1000; const h = large ? 700 : 580; const fontSize = large ? 14 : 13; const p = Plot.plot({ width: w, height: h, marginLeft: 200, marginRight: 140, x: { label: "Average Cost ($/kg)", grid: true }, y: { label: null }, marks: [ Plot.barX(components, { y: "name", x: "value", fill: "color", sort: {y: "-x"} }), Plot.text(components, { y: "name", x: d => d.value + 0.5, text: d => `$${d.value.toFixed(2)} (${(d.value/total*100).toFixed(0)}%)`, textAnchor: "start", fontSize: fontSize }) ], title: `Cost Breakdown by Component (Total: $${Math.round(total)}/kg)` }); p.classList.add("cost-breakdown-plot"); return p; } let chartEl = makeChart(false); chartContainer.appendChild(chartEl); return chartContainer; } Expand Chart
collapse/expand not doing much here
Show blended product cost
tooltip or signpost -- "set parameters"
Why it matters: If production costs for pure cells reach ~$10/kg, even 100% cultured products could compete with conventional chicken. At $25-50/kg, hybrid products with moderate cell inclusion rates may still reach price parity. If costs remain >$100/kg, even hybrid products face significant price premiums. These thresholds inform whether animal welfare interventions should prioritize supporting this industry. Code html`<div class="grid" style="grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-bottom: 2rem;"> <div class="card" style="background: linear-gradient(135deg, #3498db, #2980b9); color: white; padding: 1.5rem; border-radius: 8px;"> <h4 style="margin: 0; opacity: 0.9;">Median Pure Cell Mass Cost (p50)</h4> <h2 style="margin: 0.5rem 0;">$${Math.round(stats.p50)}/kg</h2> <small>$/kg pure cell mass (wet weight) — half of simulations above, half below</small> </div> <div class="card" style="background: linear-gradient(135deg, #27ae60, #1e8449); color: white; padding: 1.5rem; border-radius: 8px;"> <h4 style="margin: 0; opacity: 0.9;">Optimistic (p5)</h4> <h2 style="margin: 0.5rem 0;">$${Math.round(stats.p5)}/kg</h2> <small>Only 5% of simulations cheaper</small> </div> <div class="card" style="background: linear-gradient(135deg, #e74c3c, #c0392b); color: white; padding: 1.5rem; border-radius: 8px;"> <h4 style="margin: 0; opacity: 0.9;">Pessimistic (p95)</h4> <h2 style="margin: 0.5rem 0;">$${Math.round(stats.p95)}/kg</h2> <small>95% of simulations cheaper</small> </div> </div> ${include_blending ? html`<div style="background: #eaf7ea; border-left: 4px solid #27ae60; padding: 0.8rem 1rem; margin-top: 0.5rem; font-size: 0.9em;"> <strong>Blended product estimate (${Math.round(blending_share * 100)}% CM, ${Math.round((1-blending_share)*100)}% filler at $${filler_cost}/kg):</strong> Median <strong>$${stats.blended_p50.toFixed(1)}/kg</strong> · 90% CI: $${stats.blended_p5.toFixed(1)} – $${stats.blended_p95.toFixed(1)}/kg </div>` : html`<div style="background: #fef9e7; border-left: 4px solid #f39c12; padding: 0.8rem 1rem; margin-top: 0.5rem; font-size: 0.9em;"> <strong>Hybrid product estimate:</strong> At a CM inclusion rate of ~25% with plant-based filler at ~$3/kg, the blended ingredient cost would be approximately <strong>$${(stats.p50 * 0.25 + 3 * 0.75).toFixed(1)}/kg</strong> (median). Enable "Show blended product cost" in the sidebar to adjust these assumptions. </div>`} </div>`
use tooltips for more for parts of this explanation to save some space
Results Summary Code html`<div style="background: #f8f9fa; padding: 1rem 1.25rem; border-left: 4px solid #3498db; margin-bottom: 1.5rem; font-size: 0.95em; line-height: 1.6;"> <strong>What these numbers represent:</strong> Simulated <strong>production cost per kilogram of pure cultured chicken cells</strong> (<span title="Wet weight = the mass of cells as harvested from the bioreactor, including water content (~70-80%). This is the standard output basis used in most TEAs (Humbird 2021, Pasitka 2024). It does NOT include downstream processing into structured products, blending with plant-based ingredients, or retail margins. For comparison: Humbird reports $37/kg wet cell mass; Pasitka reports $13.75/kg wet cell mass (large perfusion). The widely-cited ~$6/lb Pasitka figure is for a 50/50 hybrid product, not pure cell mass. See our TEA Comparison page for details." style="text-decoration: underline dotted; cursor: help;">wet weight, unprocessed ⓘ</span>) in <strong>${target_year}</strong>, based on ${stats.n.toLocaleString()} Monte Carlo simulations. This is the cost to produce cell mass in a bioreactor — not the cost of a consumer product, and not retail price. <a href="compare.html" style="font-size: 0.9em;">[Compare to published TEAs →]</a> <br><br> <strong><span title="UPSIDE Foods' chicken cutlet is a blend of cultured chicken cells and plant-based ingredients. SuperMeat's chicken burger used ~30% cultured cells. The GFI State of the Industry 2024 report notes that 'hybrid products combining cultivated and plant-based ingredients are the most likely near-term path to market.' Eat Just/GOOD Meat's Singapore-approved product uses cultured chicken in a plant-protein matrix.">Pure cells vs. consumer products:</span></strong> Most cultivated meat products on the market or in development are <em>hybrid products</em> — blending a fraction of cultured cells with plant-based or mycoprotein ingredients. A product with (say) 20% cultured cells and 80% plant-based filler at $3/kg would have a blended ingredient cost far below the pure-cell cost shown here. The "price parity with conventional meat" threshold may therefore be achievable at higher per-kg cell costs than these numbers suggest. <br><br> <strong>Why it matters:</strong> If production costs for pure cells reach <strong>~$10/kg</strong>, even 100% cultured products could compete with conventional chicken. At <strong>$25-50/kg</strong>, hybrid products with moderate cell inclusion rates may still reach price parity. If costs remain <strong>>$100/kg</strong>, even hybrid products face significant price premiums. These thresholds inform whether animal welfare interventions should prioritize supporting this industry. </div>`
Make this 'results summary' more prominent -- it should be at the top
Component Distributions
The tables might be a folding box
Process Mode Mix Code viewof p_fedbatch = Inputs.range([0, 1], { value: urlNum("p_fedbatch", 0.20), step: 0.05, label: html`Fed-batch weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Low density (5–30 g/L), moderate media use (1–2×). Semi-continuous: nutrient-concentrated feeds added periodically. Less efficient than perfusion.">(?)</abbr>` }) viewof p_perfusion = Inputs.range([0, 1], { value: urlNum("p_perfusion", 0.50), step: 0.05, label: html`Perfusion weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Medium-high density (30–150 g/L), higher media throughput (1–5×). Continuous media exchange with cell retention. Currently the industry standard for high-density CM production.">(?)</abbr>` }) viewof p_continuous = Inputs.range([0, 1], { value: urlNum("p_continuous", 0.30), step: 0.05, label: html`Continuous weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Highest density (50–200 g/L), efficient media use (0.5–3×). Near-steady-state operation; cells grown and harvested continuously with optimized recycling.">(?)</abbr>` })
needs more explanation
Fed-batch weight
enforce these to add up to 100%
Process Mode Mix Code viewof p_fedbatch = Inputs.range([0, 1], { value: urlNum("p_fedbatch", 0.20), step: 0.05, label: html`Fed-batch weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Low density (5–30 g/L), moderate media use (1–2×). Semi-continuous: nutrient-concentrated feeds added periodically. Less efficient than perfusion.">(?)</abbr>` }) viewof p_perfusion = Inputs.range([0, 1], { value: urlNum("p_perfusion", 0.50), step: 0.05, label: html`Perfusion weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Medium-high density (30–150 g/L), higher media throughput (1–5×). Continuous media exchange with cell retention. Currently the industry standard for high-density CM production.">(?)</abbr>` }) viewof p_continuous = Inputs.range([0, 1], { value: urlNum("p_continuous", 0.30), step: 0.05, label: html`Continuous weight <abbr style="cursor:help;text-decoration:underline dotted;font-size:0.85em;color:#888;" title="Highest density (50–200 g/L), efficient media use (0.5–3×). Near-steady-state operation; cells grown and harvested continuously with optimized recycling.">(?)</abbr>` })
better explanation not only in tooltip
proven interventions like corporate campaign
This should be put in quotes or treated a little bit less definitively. And when you mention corporate campaigns, of course, you should link to what we're talking about here because not everyone will be familiar with that. --- this: https://forum.effectivealtruism.org/topics/corporate-animal-welfare-campaigns ... Refer to it as "corporate animal welfare campaigns." Otherwise, people will be confused. But you can put much of that in a tool tip to avoid clutter. Also note that these campaigns at least have a strong case for having made a difference in cost-effective ways, but some doubts remain about the persistent effect of these campaigns, with companies going back on pledges, et cetera.
The beliefs form is at uj-cm-workshop.netlify.app/beliefs.html. A short pre-workshop version goes out ~May 1. The in-workshop portion is lightweight: we'll orient you to the form at the breaks, and ask for a live response on CM_01 (the focal cost question) and one or two subquestions.
This discussion of belief elicitation should not be within this S3 box. You can put it somewhere else, perhaps at the top or between S1 and S2? ()Folded box, folded by default.
What should The Unjournal evaluate next — which papers, which questions, which specialists? [Suggested discussants]Suggested discussants:Matt McNulty (Tufts CCA) — wants to discuss tea_review + business_environment; strategic view of research priorities from an academic CM centerDavid Manheim (Technion/ALTER) — evaluator; wants to discuss modeling_hack; systematic view on what would be most informative to evaluate
As I said in previous hypothesis comments, I don't want to make this so much about the Unjournal. To the extent that this is related to the Unjournal, it should be focused on the pivotal question ellipses. Which papers/projects best informs this ... Building on the framework and resources we've put together so far?
CM_01
A tooltip should explain and have the main text of this question, or just rephrase it as something like "the cost viability of cultured meat".
Believer Meats published favorable TEA results in Nature Food yet shut down in late 2025.
I don't like posing this contrast so specifically. It seems like casting aspersions. There must be a better way of expressing this.
process choice
https://unjournal.github.io/cm_pq_modeling/learn.html#batch-vs.-perfusion-two-operating-modes I think this link is more relevant than the cost model itself - maybe put a hyperlink there to the "process choice" text
EU/CET participants likely available (15:00–16:00 CET):Aleksandra Fuchs (ACIB, Graz) — presenting in S1; likely joining earlyJordi Morales-Dalmau (Cultimate Foods, Berlin) — CET; indicated flexible availabilityMirjam Capuder (Univ Maribor) — indicated 15:00 CET availability on May 8Tom Bry-Chevalier (Univ de Lorraine) — CET; indicated May 8 availableJakub Kozlowski (Zurich
no bold is needed here
Claude: Implemented 6 items on /agenda (April 29): 1. All [Suggested discussants] tooltip triggers renamed from [suggested] to [Suggested discussants] 2. European drop-in row: added [likely attendees] tooltip listing EU/CET participants likely available at 15:00-16:00 CET (Aleksandra Fuchs, Jordi Morales-Dalmau, Mirjam Capuder, Tom Bry-Chevalier, Jakub Kozlowski + Bruno Cell, S2AQUAcoLAB, Cell Ag UK) 3. S1 intro: 'Pivotal Questions initiative' now links to GitBook page; 'Overview of cultivated meat biology...' links to learn.html 4. S1 intro: '(ideally presented by a participant with direct CM expertise)' parenthetical converted to a [note] tooltip 5. S3 public label: sharing rules inline text converted to [sharing rules] tooltip linking to recording-policy fold 6. S3 off-record label: same conversion with full S2 rules summary Replied to: Oana/gene-editing annotation (already in tooltip), European RSVP confirmation
(ideally presented by a participant with direct CM expertise; otherwise DR will walk through the key model inputs and assumptions).
make process parentheticals like this tooltips
Claude: Implemented ~15 new annotations on /agenda (April 27): 1. S1 intro description updated: UJ/PQ/workshop intro, TEA overview by CM-expert participant 2. Aleksandra timing: '~10 min presentation + ~5 min comments/Q&A' 3. S1 Q&A slot: structured bullet list of proposed discussion topics (bioreactor scale, gene editing, etc.), note these are indicative not exhaustive 4. Timings note: overall session times fixed, within-session will be firmed up 5. Both break rows: '~5 min beliefs form orientation then ~10 min break' 6. S2 description: softer 'reduces barriers to frank exchange' framing; CDMO tooltip added 7. S2 discussion: CDMO bullet softened; push-back bullet expanded to emphasize ground-level knowledge 8. S2 opt-in sharing: clarified that others' comments need their approval too 9. S3 public/off-record: sharing rules labelled (S1 rules / S2 rules respectively) 10. S3 off-record text: revised away from 'what should UJ prioritize' to 'what follow-up is most valuable' 11. Post-workshop timing: made tentative ('still being finalized') 12. Attribution promise: softened to 'intended to remain confidential, policy still being worked out' 13. CM_12 discussion question rewritten (broader than just regulatory barriers); links to beliefs form CM_12 14. Process choice question: added 'which most likely at commercial scale' + model link tooltip 15. Cell line technology: added tooltip definition Still open: peHeekJx (cell line technology wording query), ttWCXkJx (RSVP check for European session — need form access), 68dkPEJx (additional structure/speakers for Q&A — needs David input).
Claude: Implemented 5 annotations on /agenda (April 27): 1. Recording & sharing policy is now a collapsible fold, closed by default 2. Optional pre-sessions fold now starts collapsed (removed open attribute) 3. S1 em-dash changed to colon ('technology: the three main cost drivers'); pre-session rows use colons too 4. Badge tooltips fixed: removed overflow:hidden clipping, positioned below badge (not above), added click-to-open for mobile 5. Replied to Oana/gene-editing question noting current agenda status Not yet resolved: 'identical footnotes' request from BM4 annotation needs clarification on intended format.
Claude: Done — 7 annotations implemented on /agenda: 1. Pre-sessions wrapped in a collapsible fold (starts open) — 'Optional pre-sessions & alternate slots' 2. 'Public · Recorded' badge on S1 now has a hover tooltip explaining recording, sharing, and opt-out 3. 'Internal · Off-record' badge on S2 now has tooltip explaining no-recording policy and opt-in sharing 4. Off-record fold renamed to 'Why this session is off the record — and what will be shared' 5. S2 sharing paragraph expanded to include the self-recording option (record your own, no other participants' audio) 6. S1 confirmed presentation fold now shows rough timings (11:00/11:30/11:50 ET) + gene editing context 7. Footnote updated from 'subject to minor adjustment' to honest 'still being finalized'
If you are presenting slides in S2 and would like them shared more widely, just let us know and we will circulate them separately.
Or would you like to record your own presentation to share on our channel
batch ≈ 1,
We've gotten feedback that the simple batch, rather than a fed batch, is not likely to be a realistic option.
Batch vs. Perfusion: Two O
Isn't there a third type called "continuous" here?
Batch v
We should probably replace this with "fed batch" to avoid confusion.
Claude: Implemented all 16 of Oana Kubinyecz's Apr 9 annotations on learn.qmd:
Against this, Kalkar argued the opposite — that the contested empirical picture creates an opening: it may make sense to be a first-mover and evaluate now, given Ord's reframed 2027+ predictions"it may actually make sense to be a 'first-mover' and evaluate it now. Given that Toby Ord's reframed his predictions to 2027+, there's a window of opportunity"— Uma Kalkar.
In spite of the mixed/negative opinions I'm slightly tempted to commission some sort of (limited) evaluation of this or of the Khatri et al. paper, to get our hands dirty in what seems to be an important space that we might be well suited for. -- David Reinstein
I think engage with funders of AI and catastrophic risk, alignment etc. (I think Schmidt is interested, but are only funding research right now) -- it might be useful to reach out to them to provide an open evaluation of the work that they are commissioning / providing grants to. This way we also get to engage with AI researchers working at the forefront (at least in economics, broadly).
@anirudh -- that sounds promising. Do you have a contact there?
Claude: Implemented all 10 annotations from David's Apr 26 review:
Hypothesis — click the < tab on the right edge of any dashboard page
youy need an account, which takes only a moment
Fixed
change 'fixed' because it scales
basal media
Remind us what Basal means in a tool tip.
Assessor prioritization rating
potentially we should ask the raters to give category ratings as well, to help refine this
The NBER format implies a working-paper stage
not necessarily, it could also be published in a journal and still on NBER ... Sometimes you can see that in NBER, and sometimes not.
▾ Details
'details' tab is too small ... maybe clidking or doubleclicking main entry should open it?
here Animal welfare & food systems High Priority Mar 24, 2026 |EAFORUM gpt-5.4-mini ▾ Details This looks l
the EA forum linked papers are not showing the actual paper titles
Comment directly on this page using the Hypothes.is sidebar (look for the < tab on the right edge of the page). Highlight any text and add your annotation — visible to all Hypothes.is users. You can also use the feedback buttons on each paper card.
Add a filter by year as well.
GFI amino acid report 2025
Let's also incorporate GFI reports on other components, especially the growth factors.
$6/lb figure is for a 50/50 hybrid product
It's not really an important caveat, as we can adjust for it. Also, please avoid bold.
Main Caveat
column widht!
Time horizon: Current technology vs. 2030 projections vs. steady-state
which do what... tooltip if necessary
Hydrolysate-based vs. pharma-grade vs. animal-component-free
Which papers do what? If it's complicated, then explain it in a tooltip.
Pure wet cell mass vs. cultivated ingredient vs. hybrid product vs. retail-equivalent
quick tooltip and also link to an explainer (in the 'learn') section detailing these differences between these definitions of output ... Also, which papers do what here? If it's complicated, do that in a tooltip.
hicken (Pasitka 2024) vs. generic mammalian/CHO-like cells (Humbird 2021) vs. unspecified (CE Delft 2021)
tooltop direct quotes evidencing these
Basis
Column widths are off. Make the columns with more text wider than the columns with little text. Make that a skill or a sort of general instruction. It comes up a lot whenever you generate these HTML documents. !
Read This First
fold this -- header should be 'caveat'
A latent factor (0=nascent, 1=mature) that affects all technology adoption, reactor costs, and financing. High maturity = correlated improvements.
better explanation (or link) how this particular modeling was chosen, as well as the defaults here
Cell Density Range Code viewof density_lo = Inputs.range([10, 100], { value: 30, step: 10, label: "Cell Density Low (g/L)" }) viewof density_hi = Inputs.range([50, 300], { value: 200, step: 10, label: "Cell Density High (g/L)" })
allow 'reset defailt' here too
Model Parameters Code viewof simpleMode = Inputs.toggle({label: "Simplified view (recommended)", value: true})
A button to 'hide parameter setting' and 'show parameter setting/ could help, then whin it's hidden, the rest of the page content could be bigger so we can see chart sbetter
Two controls for growth factors:
This is too much information for this dashboard, and I think most of it is present in either the learn or the technical reference dashboard. Give it as mostly a TL;DR, and then link that section for further explanation.
How far along the price reduction curve we are within each regime:
This needs further explanation. What year are you talking about for this "How far along"?
Component Distributions
if possible, let them click a distribution to expand it
Cost Breakdown by Component (Total: $122.59/kg):where(.plot-d6a7b5) { --plot-background: white; display: block; height: auto; height: intrinsic; max-width: 100%; } :where(.plot-d6a7b5 text), :where(.plot-d6a7b5 tspan) { white-space: pre; }
make chart below bigger
Variable Operating Costs (VOC):
link the 'learn' explainer sectinos here
Technology Adoption by 2036
these should have 'reset' buttons, where it goes back to the default
Total: $122.59
round thr total to the nearest dollar
Unit Production Cost ($/kg) →
make the units clearer, and also make it clearer that this refers to pure cell mass, not a blended product
Basic Parameters
enable a 'blending share' slider, if they tick that box, and other things should adjust accordingly #implement
$$
double $ sign here -- remonve one
Model Structure Code viewof include_capex = Inputs.toggle({label: "Include capital costs (CAPEX)", value: true}) viewof include_fixed_opex = Inputs.toggle({label: "Include fixed operating costs", value: true}) viewof include_downstream = Inputs.toggle({label: "Include downstream processing", value: false})
You should have a box to show/hide the 'blending share' parameter
Pure cells vs. consumer products: Most cultivated meat products on the market or in development are hybrid products — blending a fraction of cultured cells with plant-based or mycoprotein ingredients. A product with (say) 20% cultured cells and 80% plant-based filler at $3/kg would have a blended ingredient cost far below the pure-cell cost shown here. The "price parity with conventional meat" threshold may therefore be achievable at higher per-kg cell costs than these numbers suggest.
Tooltip some specific quotes on blending share
GitHub issues: Open an issue Email: contact@unjournal.org
merge this with the above folding section #implement
Quick Reference: All Equations at a Glance
some text ... "2b ... growth factors" was not rendered correctly. Fix it #implement
The paper’s object is an abstract characterization of strategy-proof social choice rules for selecting a public-good level. While public decision rules can matter in principle, the abstract theorem is not tied to a concrete policy domain, institution, or implementation setting. There is no evident link to a specific decision-maker, welfare question, or operational policy lever where an evaluation would affect choices at scale.
So why did you rate it 10/10 for decision relevance?
This is a strong Unjournal candidate: it is directly about improving job recommendation systems used by a public employment service, has clear welfare implications for job seekers, and uses randomized field experiments rather than purely predictive metrics. The paper addresses a decision-relevant policy question—how to design algorithms that improve worker outcomes rather than platform clicks/applications—and appears to offer actionable guidance for public and private labor-market intermediaries. As a working paper with experimental evidence and a model-based welfare metric, it has high timing value and likely benefit from independent evaluation.
I don't see what global priorities relevant decision this targets. Not sure why this was prioritized.
Following our evaluation of Rethink Priorities' cultured meat forecasting work and ongoing TEA evaluations, this workshop focuses on what the evidence tells us about cultivated meat's production cost trajectory. We recognize that consumer acceptance, regulatory pathways, and environmental implications also matter — but we're centering on costs because this seems among the most pivotal and tractable questions right now, and we want to bring focused expertise to bear. Pivotal Questions Initiative → 📊 Cost Modeling Dashboard → EA Forum: CM Viability → CM_01 on Metaculus → RP Evaluation →
this feels overwhelming/too many links -- find a way to make it less cluttered
Async Discussion & Suggestions
we'll just do this so remove this question. #implement
Or mark your availability on the grid (optional)
make this a folding box, folded by default #implement
Or mark your availability on the grid (optional) Click cells for any time blocks you could join. Click a date to select that row, a time header to select that column, or a week label to select the whole week. All times US Eastern; hover for UK/CET.
adJust this to start on April 15th and go through the first week of May #implement
Note: This workshop is still in early planning. We're gathering initial interest and availability. Final dates and agenda will be confirmed once we have responses from key participants.
Make it clear that we're planning for the late April or very early May #implement
We're continuing the discussion asynchronously and will be publicly sharing key materials soon. This site is evolving into a resource page.
We're continuing the discussion asynchronously and will be publicly sharing key materials soon. This site is evolving into a resource page and hub for feedback, dialogue, and belief elicitation.
1. WELLBY Reliability and Value
make an anchorable link here and for the other headers.
Join the discussion (Google Doc)
probably moving to have this discussion more in hypothes.is on web content and less in that Google doc; it's hard to make the Gdoc attractive and organized.
Evaluation: Cash Transfers vs Psychotherapy in Liberia (McGuire et al.) Unjournal Evaluation Summary Applied Comparison Direct experimental comparison of cash transfers and psychotherapy in an LMIC context. Particularly relevant because it measures multiple outcomes—psychological distress, consumption, life satisfaction—allowing cross-metric comparison. Evaluation Summary
This is not the title nor the authors -- fix this hallucination
Essential
'essential' is too strong. Maybe 'Most important for discussion'. And note there's no way to do a thorough read of all of these in 2 hours. Just leave that 'time allotment' out'
The Controversy: Happier Lives Institute estimated StrongMinds a
Use This link instead -- https://www.happierlivesinstitute.org/report/strongminds-cost-effectiveness-analysis/
@Samuel_Dupret let me know if you think a better link is appropriate.
You might be wondering why I'm still bothering with this at the workshop - I want to turn this into a resource page for further practical work and discussion.
otentially more cost-effective than AMF. GiveWell's 2023 assessment disagreed, citing concerns about: (1) mapping depression scales to LS, (2) assumed effect duration, (3) demand effects in self-reported outcomes, and (4) publication bias.
Link needs fixing -- https://www.givewell.org/international/technical/programs/strongminds-happier-lives-institute
Also mention and link HLI's response to this assessment here
Peasgood et al. (unpublished)
We have a copy
Unit-change comparability
I'm not sure this is stated correctly. It seems to overlap cardinality.
📚 Further Reading: Unjournal Evaluations The Unjournal has commissioned independent evaluations of papers relevant to this debate: → StrongMinds & Friendship Bench Evaluation — Critical assessment of HLI's meta-analysis and cost-effectiveness claims → Long-Run Effects of Psychotherapy on Depression — Cuijpers et al. meta-analysis on therapy durability → Cash Transfers vs Psychotherapy: Comparative Impact — McGuire et al. direct comparison in Liberia → Mental Health Therapy as a Core Strategy (Ghana) — Barker et al. on scaling community-based therapy
Put this somewhere else - I don't think it belongs within the focal case folding box. It should have its own folding box in the reading section and references
mortality-focused interventions
When comparing among interventions, some of which that affect mortality.
Practical guidance for funders now Given the uncertainties above, what should funders actually do? This section offers a decision-oriented framework, not a single prescription.
I didn't want the AI to give this 'practical guidance' -- that's meant to come out of the session!!
Zoom chat for quick reactions;
No, I only want the Zoom chat to be used by the session organizers and mainly just to guide people on the structure of the workshop and where we're going next
Segment structure is set; timing may adjust slightly. Updated March 11, 2026
12 Mar 2026 -- Not entirely set -- we may add some small things. But close to set, and trying to harden the timings so we can send out a schedule soon that people can trust
calibrated
Give the definition of 'calibration' here as a footnote/tooltip. Roughly, things that when you say something will happen X% of the time it in fact occurs X% of the time, not much more nor less.
If you are asked to give 80% CIs, the true values should fall in those intervals close to 80% of the time. If it happens less than 8/10 times, you're being overconfident, and stating too narrow intervals. If it happens more than 8/10 times, you're being underconfident, and stating overly wide intervals
Consider the value obtained when using the best feasible measure for cross-intervention comparison in contexts like the focal context. What share of this value is obtained, in expectation, from using the simple linear WELLBY measure (as defined above) for all interventions?
Above the 'operationalized version' Add a discussion box here for people to answer the more general question.
Consider the value obtained
add a sub-sub-header "Operationalized version" here
We're organizing the discussion around four key questions:
Restate this to more directly address the question in the heading on "what we want to achieve".
We want to: - Help researchers understand practitioners' highest-value questions and considerations and trade-offs. - Help practitioners understand the most relevant and useful up to date research and its implications - Enable communication and collaboration, by getting on the same page, agreeing on terminology, identifying points of consensus and high-value cruxes, etc. - State and measure our beliefs about key issues and questions openly, with precision and calibrated uncertainty, driving high "value of information" Bayesian updating - Drive better decisions over measuring the impact of interventions in LMICs and using existing measures, leading to better funding decisions
(This is a bit long -- just adjust the basic first sentence a tiny bit, and then footnote this more detailed theory of change. ) #implement
The neutral point is the life satisfaction level representing neither positive nor negative welfare—essentially the boundary between "life worth living" and "suffering." Estimates range from 2-5 on the 0-10 scale. Peasgood et al. (2018) tentatively estimate ~2.
Add: "This is particularly important for comparing interventions that have impacts on mortality (and perhaps fertility). We should discuss this in this workshop to an extent, but we might de-emphasize it to avoid overstretching the scope, depending on interest and timing.
evaluation summary
Link it here https://unjournal.pubpub.org/pub/evalsumstrongminds/ -- however, I don't see anything in that summary that provides details suggesting this order of magnitude thing. Find a better reference.
QALYs (quality-adjusted life years)
Link one authoritative external resource presenting these sin detail
instruments like EQ-5D
dead link
Other measures include QALYs (quality-adjusted life years), income-equivalent measures, and multi-dimensional poverty indices. QALYs are similar to DALYs but measure health gained rather than lost.
This is being adjusted. NB we focus more on DALY than QALY because it's used a lot more in the LMIC intervention context, largely due to its ease of collection
—and what would change their minds?
remove 'and what would change their minds' -- this doesn't fit. #implement
Unlike WELLBYs, DALYs are based on expert-derived disability weights rather than self-reported wellbeing—weights are constructed through surveys of health professionals rating hypothetical health states.
Are you sure that it's through surveys of health professionals? I thought the surveys were of people in the general population. And this explanation doesn't mention how an individual's DALY is constructed based on asking them about their health states or something. What's the data used?
Vignette exercises: respondents rate hypothetical people's life satisfaction based on descriptions, revealing how individuals anchor the scale and enabling cross-person calibration.
Do they actually do this in the paper? doublecheck
Calibration questions ask respondents to rate well-defined scenarios (e.g., "How satisfied would you be if you won $1,000?"). By observing how people rate the same reference points, researchers can estimate individual differences in scale use.
Is this a reasonable examlpe? Do they ask questions like that in the exercises mentioend in the paper?
Cost-effectiveness estimates vary by an order of magnitude depending on how WELLBYs are valued relative to DALYs.
What's the source for this OOM claim?? Find and link it with a verbatim quote . #implement
Also it's not in our 'evaluation summary as far as I know'
Open Philanthropy
It's now "Coefficient Giving" -- correct this on every page. And hyperlink "https://coefficientgiving.org/research/cost-effectiveness/" here. #implement
Each scale point represents an equal welfare increment. If violated, summing is invalid and interventions targeting different baselines become incomparable.
David Reinstein --- personally, this is the one I find least plauslible and most important.
nterpersonal Comparability LSA = 7 ≈ LSB = 7 implies UA ≈ UB When two people report the same score, they experience similar welfare. Scale-use heterogeneity violates this assumption.
I don't think this one is necessary if we can (instead) assume that differences are equivalent. For example, if we assume that person A is actually experiencing higher welfare at all levels of reported score, but the differences between the scores are comparable, then compared to interventions for measured differences in well-being, that shouldn't matter.
I think it could also still be reliable if the distribution between the two populations is the same, even though we don't have specific inter-person comparability between any two compared individuals.
equires four implicit assumptions
Give a linked source and citation for this.
1 WELLBY = 1-point increase on a 0-10 life satisfaction scale × 1 person × 1 year W = Σi Σt LSit
Those are not clearly defined here, nor the indexing
We'll produce a practitioner-focused summary document, belief elicitation results with confidence intervals, and structured notes.
Change this to "we hope to" and "We will share outputs". -- I can't guarantee right now that we'll get enough input or have bandwidth to produce this. #implement
Participants can opt out of recording for specific segments if needed
Add "and we will ask for final approval before posting anything". #implement
(Note: QALYs may be more directly comparable than DALYs for this purpose.)
Leave out the QALYs parentheses bit here. Add "(or QALYs)" after "~1 SD in DALYs". #implement
scale?
Add "is a move from 1-3 for one person as good as a move from 1-2 for 2 people"? At the end of this paragraph... "even if these don't hold, does the linear WELLBY aggregation yield 'nearly as much value' for decisionmaking as other potential measures"? #adjust #implement
Where is the "neutral point" on the scale?
Remind me why the neutral point is important.
When comparing a mental health intervention (measured in WELLBYs) to a physical health intervention (measured in DALYs)
Either of these, especially the physical health intervention, could be measured either way. This overstates it a bit. Perhaps, just to give this as an example, suppose there is a case... #adjust #implement
but more work is needed.
"more work is neeeded" That's very much vague -- we nIt would be nice to have at least one specific point suggesting that the difference in scale means potentially matters and merits more study
Each has strengths and limitations—and how they relate to each other, and whether either reliably captures what matters for human welfare, directly affects which interventions get prioritized.
I'm allergic to platitudes. IIRC you should have some notes somewhere providing at least one case where this matters .
adversarial manipulation.
I don't think we discussed adversarial manipulation or have any results on it, so I'm a little worried that whatever generated this discussion is doing a sort of generic pandering and putting in what it generally expects to see in papers like this.
Our results support AI as structured screening and decision support rather than full automation,
This seems like a sort of milquetoast generic caveat. In what sense is this what our AI results support? This seems a bit pandering.
xhibiting consistent failure modes: compressed rating scales, uneven criterion coverage, and variable identification of expert-flagged concerns.
I'm guessing this is a bit premature/too much rounding up a few observations to general conclusions, but let me look at the results a bit more carefully.
often approach the ceiling implied by human inter-rater variability on several criteria,
This is interesting and strong. It comes across maybe a little bit overstated, so we just need to be careful about how we're framing this result.
high-quality but noisy reference signal
I think this is right, but the term "reference signal" sounds technical in an information theoretic sense, and we want to make sure we're not misapplying it.
narrative critiques
Yes, we focus on the critiques here, but the on journal evaluations do more than just critique. They discuss, they offer suggestions, implications, et cetera.
overing economics and social-science working papers
"covering ... working papers" Is mostly accurate but not quite right. We don't cover all working papers, and we have a specific focus on research relevant to global priorities. We can also evaluate post-journal publication, but I'm not sure how to best summarize this in a simple way in the abstract.
The idea of "open evaluation platform" also could be a bit confusing here because it's not mainly about crowd sourcing. Yes, the "paid expert review packages" cover this, but I don't quite think this is worded in the best possible way.
Peer review is strained, and AI tools generating referee-like feedback are already adopted by researchers and commercial services—yet field evidence on how reliably frontier LLMs can evaluate research remains scarce.
This is a decent first sentence, although it bears the marks of AI-generated text. But also I'm not sure if it's really in line with our newest spin on this.
“high” reasoning effort
Not relevant to Pro -- cut this
OpenAI Responses API
"Responses" is the newer one (as of 4 Nov 2025)
returned file id keyed by path, size, and modification time.
what does this mean? "Keyed by" ?
This implies it is kept on the server and won't need a later upload.
d the best performance from top reasoning models
Best relative to what? Better than the 'non-top reasoning models'? @valik
Zhang and Abernethy (2025) propose deploying LLMs as quality checkers to surface critical problems instead of
Is this the only empirical work? I thought there were others underway. Worth our digging into. Fwiw I can do an elicit.org query.
but still recommend human oversight.
why? based on some evidence of LLM limitations or risks?
emphasize
I'd say 'they argue' instead of 'emphasize'; the latter seems like a statement of absolute truth that we agree with.
The population of papers
Should we adjust "the population of papers" to "the reference is" ? to be more explicit?