Where is everybody? · Working papers

Red team, round 1: the first model

These are the critics’ reports as filed. The critics were separate runs of Claude given opposing briefs; none is a human specialist. File names refer to the project’s working folder. Where a report cites a brief by subject, such as “the abiogenesis brief”, it means one of the project’s summaries of the published literature. Notes about where working files were stored have been removed; the findings are unedited.

Critic: an optimist about SETI (the search for extraterrestrial intelligence)

Verdict. The ranking survives but the stated logic does not. In the model as coded, the "Milky Way is not evidently settled" term (L1) and the technosignature search record (L3) do no work: deleting either changes no class probability at the third decimal. The whole non-timing update comes from one product, the G-HAT galaxy count times an assumed floor of 3% on the chance that a settled galaxy has at least 85% of its starlight reprocessed. With base biology priors, "alone in the Galaxy" goes from a prior of 0.51 to 0.75, a Bayes factor of 2.9. When I allow low-footprint settlement, non-evident local settlement and a will-to-expand prior without a floor at the observational bound, it falls to 0.52-0.64 and "independent restraint" rises from 0.01 to 0.10-0.19. I could not push "alone" below about 0.5 without changing the origin-of-life priors, so it remains the single most probable family. The most important change is to replace the L1/L2 pair with an explicit world-level model of whether settlement is evident (harvest regime plus local non-evidence), and to report the answer as Bayes factors per likelihood term, not as "0.76 alone".

Critic’s own estimate of each answer: alone in the universe 0.17, alone in the Galaxy 0.38, handful first 0.08, late filter 0.03, restraint 0.1, infeasible 0.1, hidden 0.03, other 0.11. What “other” covers: Settled, visited or explored but not evident, without deliberate hiding: low-footprint or probe-only presence, steady-state or stalled settlement that leaves the Solar System untouched, or a past wave that came and went. Includes a small residual for unlisted mechanisms.

Objections

  1. [major] integrate.py lines 162-163: L1 = exp(-mu) and L2 = exp(-N_surv * p_settled * p_harvest); headline logic step (1)

    • Argument: Headline step (1), that one persistent expander anywhere in the Galaxy would be evident, is not what drives the result. L2 dominates L1 everywhere: no prior sample has L1 < 0.5 while L2 > 0.01, and the prior mean of L1*L2 equals the prior mean of L2 alone (0.57604 against 0.57606). The posterior 95% limit on mu in feasible, non-stealth worlds is 6.6e-5, which is just the G-HAT limit divided by p_harvest; the Milky Way itself contributes nothing. So the result rests on the assumption that in every possible world at least 3% of settled galaxies reach >=85% warm reprocessing. That floor has no citation. It is also the monocultural fallacy in reverse: 85% of a galaxy's light needs nearly all luminosity-weighted systems to go Kardashev II, which is near-unanimity among settlements, not one defector. The SETI brief itself says occupation using under ~25% of starlight is unconstrained, and gaps section 7 asked for a covering-fraction curve that was not implemented. The sensitivity table hides this because it relaxes L1 and L2 only one at a time, or only down to p_harvest = 1e-4, where 1e5 * 1e-4 = 10 still kills.
    • Proposed change: Make the harvest regime a world-level variable: with prior 0.3-0.5 settlement is low-footprint and never dims a galaxy (L2 = 1); otherwise p_harvest is log-uniform 1e-3 to 1, applied through the covering-fraction curve in gaps section 7. Add a diagnostic table showing the posterior with each of L1, L2, L3 and timing removed in turn. Reword headline (1)-(2) to say the constraint is 'fewer than about 3e-5 Kardashev-III galaxies per galaxy, times the assumed chance that settlement produces one'.
    • Expected effect: P(alone in Galaxy) 0.75 -> 0.67 with a 0.5 low-footprint prior, or 0.65-0.66 with a p_harvest floor of 1e-8 to 1e-10. Restraint 0.01 -> 0.07-0.09; handful 0.05 -> 0.09-0.10; infeasible 0.15 -> 0.12.
    • Tested: Patched copy of the model (reproduces base to 4 decimals). Remove L1: every class unchanged at 3 decimals, ESS 320,911 against 320,900. Remove L2: alone 0.613, restraint 0.121. Remove both: alone 0.422, restraint 0.300. p_harvest floors 1e-4 / 1e-6 / 1e-8 / 1e-10 give alone 0.718 / 0.684 / 0.664 / 0.653. Low-footprint prior 0.25 / 0.5 / 0.75 gives alone 0.708 / 0.672 / 0.640. For the restraint class, mean L1 is 0.27 and mean L2 is 0.017.
  2. [major] p_will = log-uniform(1e-4, 1) (line 59) and headline (3): 'independent restraint is crushed by the numbers'

    • Argument: The floor's stated basis (expansion.md suggested-inputs table: 'Hanson et al. bound') is an observational upper limit: Hanson et al. find the quiet-to-loud chance must be below about 1e-4 for even one other quiet civilisation to have existed in the Galaxy. The model uses the value the data require as the lowest value the prior permits, so 'common but none expands' is excluded by construction. Also, p_will is labelled 'some faction ever launches', but mu treats it as launch AND supercritical spread AND persistence for a gigayear AND evident. Those are different things. Landis percolation is a threshold property of a world, not a per-civilisation coin flip; Carroll-Nellenback et al. find fill-in fails if launch intervals exceed 270 Myr; a product of three or four factors each uncertain over two decades has a tail to 1e-8. The longevity brief calls 1e-3 a 'defensible ignorance prior', which shows the floor is a judgment call.
    • Proposed change: Split into p_launch (log-uniform 1e-3 to 1), a world-level Bernoulli for supercritical, space-filling spread (prior 0.5-0.8), and a persistence factor; or at minimum use log-uniform 1e-8 to 1 as the base case, not a sensitivity row. Report restraint as a Bayes factor against its prior, not as 'crushed'.
    • Expected effect: Restraint 0.01 -> 0.10 from the floor alone (the project's own row), and 0.19-0.26 when combined with the harvest relaxation. Alone 0.75 -> 0.67 alone, 0.52-0.58 jointly. Headline (3) becomes 'disfavoured by a factor of about 2-3 relative to its prior of 0.25-0.3'.
    • Tested: p_will floor 1e-6: restraint 0.039, alone 0.717. Floor 1e-8 with no extragalactic term: restraint 0.264, alone 0.519. Floor 1e-8 with low-footprint prior 0.5: restraint 0.192, alone 0.582. Floor 1e-8 with p_harvest floor 1e-6: restraint 0.190, alone 0.584.
  3. [major] p_stealth = 0.03 as the only route to 'they are here and we have not noticed' (line 61); class 'hidden'; the binary treatment of the Milky Way as settled or not

    • Argument: The model allows non-evidence only as a deliberate, convergent policy. The optimist's case is the non-deliberate one: settlement that is low-footprint, prefers K and M dwarfs (Haqq-Misra & Fauchez 2022), leaves inhabited or unsettleable worlds alone (the Aurora effect in Carroll-Nellenback et al. 2019), sits in a steady state with unvisited pockets (their P of about 0.1 for Earth unvisited in the last Myr, 0.89 in one clustered run), or is present only as probes. The project's own briefs contradict 0.03. The behavioural scorecard gives zoo 0.10 (0.02-0.30) plus present-but-unnoticed 0.08 (0.01-0.30) given N >= 10; the SETI brief gives detection probability under 0.01 for a metre-scale probe in the Solar System; the behavioural brief says 'they are not here is an assumption for anything small and quiet' (Lazio 2026). Because 'infeasible' and 'hidden' both have likelihood 1, their posteriors are prior divided by evidence (0.063/0.426 = 0.148; 0.0078/0.426 = 0.018). The 8:1 ranking of 'infeasible' over 'hidden' is the modeller's prior ratio and nothing else.
    • Proposed change: Replace L1 with 1 - p_settled * (1 - q_ne), where q_ne is the probability that a settled Milky Way is not evident to 2026 searches and did not pre-empt Earth. Tie q_ne to the low-footprint regime of the first objection, with q_ne uniform 0-0.5 there and 0 in harvesting worlds. Raise deliberate stealth to about 0.10 to match the behavioural brief. Add an eighth class, 'settled or visited but not evident (not deliberate)'. State that the split among universal-barrier classes is prior-determined.
    • Expected effect: Base biology: here-or-hidden 0.018 -> 0.06-0.09, alone 0.75 -> 0.52-0.62. Optimist-biology camp: infeasible 0.63 -> 0.25-0.40 and here-or-hidden 0.10 -> 0.35-0.43. Under SIA: infeasible 0.82 -> 0.30-0.49 and here-or-hidden 0.14 -> 0.45-0.55.
    • Tested: q_ne of 0.03-0.5 with L2 unchanged has zero effect at 3 decimals, which confirms L1 is inert. p_stealth 0.18: hidden 0.095, alone 0.664. p_stealth 0.18 with q_feasible 0.75: hidden 0.077, infeasible 0.197, alone 0.618. Moderate package (low-footprint 0.3, q_ne U(0,0.5), p_will floor 1e-6, stealth 0.10): alone 0.615, restraint 0.105, infeasible 0.114, hidden 0.036, unnoticed 0.026 (stable to 0.001 over 4 seeds). Strong package (0.5, U(0,1), 1e-8, 0.18): alone 0.521, restraint 0.192, hidden 0.041, unnoticed 0.047.
  4. [major] The class 'alone in the Galaxy' (0.27 + 0.49) presented as a finding

    • Argument: The prior already puts 0.509 on Nciv < 1, because half the abiogenesis prior is spread over 5-100 decades and each hard step over 2-12 decades. The posterior of 0.752 is a Bayes factor of 2.9. Earth's timing alone moves 'alone' down, from 0.51 to 0.42. The expansion and harvest terms supply a factor of about 4.1, all of it from L2 as shown in the first objection. Across the project's own camps the answer runs from 0.21 to 0.94 with the same data. The split between alone-in-universe and alone-in-Galaxy (0.27 against 0.49) is touched by no observation: it moves from 0.16/0.57 to 0.40/0.38 with the width of the abiogenesis prior alone. A reader who sees '76% alone' will take it as what the silence implies, when the silence contributes about a factor of 3, and less than 2 under the optimist structure.
    • Proposed change: Lead with Bayes factors per class and per evidence term, with prior and posterior side by side. Report alone-in-universe and alone-in-Galaxy as one class with a prior-dependent split. Give the headline as a range across camps, with the 'agnostic mixture' as one camp among several, since its 0.51 prior is itself a position.
    • Expected effect: No change to the base number. The claim changes from 'P(alone) = 0.76' to 'the observations multiply the odds of being alone by about 3 under the base structure and 1.5-2.2 under the optimist structure, measured against the timing-only posterior'.
    • Tested: Prior alone 0.509; timing only 0.422; full 0.752. Bayes factor 2.92 against the prior and 4.15 against timing-only. Under the moderate optimist package the factor against timing-only is 2.2; under the strong package 1.5.
  5. [moderate] c_det = log-uniform(1e-10, 1e-6) and L3 (lines 68, 166-170); future observation 'techno_null_1e6'

    • Argument: The search record is in the model in name only. L3 removes 0.023% of prior weight, and only 0.24% of samples have L3 below 0.99. So the reported 0.07 chance of another civilisation in the Galaxy now owes nothing to fifty years of searching. That is the optimist's point, and the report should say it. The c_det range is also wrong on both ends for a single scalar. The SETI brief's own figures for an Earth twin (1e-9 to 1e-6 per observed star, 1e3-1e6 stars of about 2e11) give 1e-17 to 1e-11. The model's range matches a continuous isotropic beacon of about 1e16-1e17 W, some 1e3-1e4 times humanity's total power. For a 4e18 W beacon toward the Galactic Centre it would be about 1e-4. The null result for a million stars moves nothing because quiet and expanding populations share Nciv and are tied by p_will >= 1e-4, so L2 has already capped N_now; that is a structural artefact, not a finding.
    • Proposed change: Replace c_det with a mixture over transmitter classes: a beacon fraction log-uniform 1e-4 to 0.3 (the behavioural brief's range) with c of 1e-8 to 1e-4, and leakage-only civilisations with c of 1e-17 to 1e-11. State in the report that the technosignature record carries no weight in the result. Add future observations that would matter under the optimist structure: a Solar System artefact survey (co-orbitals, Lagrange points, lunar surface), and partial-coverage or cold waste-heat limits.
    • Expected effect: Class probabilities change by less than 0.005. The interpretation changes: 'no detections' should be removed from the list of evidence that drives the result.
    • Tested: Remove L3: every class unchanged at 3 decimals. c_det 1e-17 to 1e-11: unchanged. c_det 1e-6 to 1e-3: alone 0.756. Even c_det 1e-3 to 1 gives only 0.783.
  6. [moderate] mu = Nciv * phi * p_exp with immortal, space-filling expanders; p_settled = 1 - exp(-mu) for both the Milky Way and survey galaxies

    • Argument: An expander that arose more than one fill time ago is assumed to occupy the whole Galaxy today, forever. Quiet civilisations get a lifetime distribution (L_quiet); expanders do not. Carroll-Nellenback et al. give finite settlement lifetimes and steady states with occupancy between 0 and 1. Kipping & Lewis argue intermediate states need tuning, but 'full' in their sense means all settleable systems, not Earth. The expansion brief's own evidence horizon for a past visit is 1-10 Myr (Schmidt & Frank 2018). A wave that came and went leaves L1 and L2 satisfied, and the model has no place for it.
    • Proposed change: Multiply mu by min(1, L_exp / T_head), with L_exp log-uniform 1e6 to 1e10 yr (the expansion brief suggests 1e4 to 1e9 for single settlements), or sample an occupancy fraction from the Carroll-Nellenback steady state. Add 'came and went' to the new unnoticed class.
    • Expected effect: Alone 0.75 -> 0.71 for L_exp 1e6-1e10, or 0.67 for 1e4-1e10. Restraint 0.01 -> 0.04 or 0.085. Combined with the first and third objections: alone about 0.59.
    • Tested: L_exp 1e6-1e10: alone 0.713, restraint 0.041. L_exp 1e4-1e10: alone 0.665, restraint 0.085. With low-footprint prior 0.5 and q_ne 0.3: alone 0.585.
  7. [moderate] N_surveyed_cold = 2.0e3 (line 65), tagged [STUDY tf_kiii, fp_kiii]

    • Argument: The Tully-Fisher study's claimed result is a 95% upper limit of 1.8% for >=75% dimming, set by 20 unresolved candidates in an effective sample of 1,593. The model's exp(-2000 * p) is the likelihood of zero candidates in 2,000 galaxies, a limit of 0.15%. That matches the study's 'sensitivity floor if every unresolved candidate were natural (0.19%), NOT claimed as a result'. The model is therefore about 12 times stronger than the study it cites. The Fundamental-Plane study has not reported at all.
    • Proposed change: Use N_eff of about 3/0.018 = 167 until the candidates are resolved, or a Poisson likelihood for 20 observed candidates with an unknown natural background. Drop the fp_kiii tag until it reports.
    • Expected effect: Base: alone 0.752 -> 0.742, restraint 0.010 -> 0.018. In the 'all harvesters cold and partial' row: alone 0.728 -> 0.686, restraint 0.023 -> 0.055.
    • Tested: N_surveyed_cold 167: alone 0.742. With p_cold_only = 1: alone 0.686 against 0.728 at 2,000. With a p_harvest floor of 1e-4 as well: alone 0.645.
  8. [moderate] Classification block (lines 198-207) and the class labels

    • Argument: Several labels do not describe their contents. 'Handful; we are among the first' takes every world with 1-30 civilisations, including infeasible and stealth worlds. The late-filter/restraint split is only whether p_surv <= p_will; in non-doom worlds p_surv is 0.01-1, so 'nearly all die' is false for most of that class. Once non-evident settlement is allowed, worlds with mu >= 1 fall into 'late filter' or 'restraint', which say none expanded: 0.03-0.05 of posterior mass under base biology and 0.14-0.23 under optimist biology. There is no class for the classic SETI position of many quiet civilisations present now.
    • Proposed change: Classify on mechanism first (world-level switches: infeasible, universal doom, deliberate stealth, low-footprint or unnoticed), then on counts (Nciv, mu, N_now). Add 'settled or visited, not evident'. Define late filter as doom or p_surv < 0.01. Report P(N_now >= 1) within each class.
    • Expected effect: Relabelling only for the base run. Under the optimist structure 0.03-0.23 of mass moves out of mislabelled classes.
    • Tested: Unnoticed mass by assigned class in the patched runs: moderate package 0.026 and strong package 0.047 (base biology); 0.141 and 0.230 (optimist biology); all of it binned as late filter or restraint.
  9. [moderate] SIA headline: 'infeasible 0.82, hidden 0.14, late filter 0.04'

    • Argument: Under SIA the posterior is each likelihood-1 hatch's prior times its mean Nciv. The 0.82 for 'infeasible' reflects only that it was given a prior of 0.15 while non-evidence was given 0.03 and restraint was floored. The correct SIA statement is 'some universal mechanism of non-evidence', with the split set by prior. The effective sample is also thin: 2,300-2,500 of 4 million.
    • Proposed change: Report the SIA branch as 'common, and universally non-evident', with the sub-split shown as a function of the fate priors. Use importance sampling targeted at high Nciv, or more samples, for that branch.
    • Expected effect: SIA: infeasible 0.82 -> 0.49 (moderate package) or 0.30 (strong). Here-or-hidden 0.14 -> 0.45-0.55. Restraint 0.00 -> 0.01-0.11.
    • Tested: SIA base: 0.824 / 0.139 / 0.037, ESS 2,505; second seed 0.828 / 0.132 / 0.040, ESS 2,300. SIA with moderate package: infeasible 0.488, hidden 0.270, unnoticed 0.183, late 0.047, restraint 0.012. SIA with strong package: 0.301, 0.253, 0.300, 0.034, 0.112, ESS 6,642.
  10. [minor] Consistency between grabby.py and integrate.py on detection

Code errors

Claims that survive

Missing explanations

Presentation advice

Show a per-term ablation table (prior; plus timing; plus L1; plus L2; plus L3) before any headline number. It shows the reader that the Milky Way term and the search record are inert and that one assumption about harvesting carries the result. Give prior and posterior side by side for every class with Bayes factors, because the prior on 'alone' is already 0.51. Present alone-in-universe and alone-in-Galaxy as one class with a prior-dependent split. Reword headline (1) as an assumption ('if settlement is space-filling, persistent and evident') and headline (3) as 'independent restraint is disfavoured by a factor of N under prior X'. Say explicitly that the ranking among universal-barrier classes (infeasible, hidden, doom) equals the modeller's prior ranking. Add the future observations an optimist would fund: a Solar System artefact survey, partial-coverage and cold waste-heat limits, and resolution of the 20 Tully-Fisher candidates.

Critic: an astrobiologist

Verdict. From the biology side the headline "alone in the Galaxy 0.75" is not defensible as a finding: it is a prior of 0.51 moved by a Bayes factor of about 2.9, and the marginal likelihood differs by at most 3.4x across all seven camps. The base case departs from the project's own evidence in two opposite directions that roughly cancel. It is too pessimistic on evolution: posterior mean 2.64 hard steps and P(3 or more) = 0.55, against the convergence study's 0-3 with P(3 or more) = 0.06 and the evolution brief's 3 decades per step. It is too optimistic on abiogenesis: prior P(fast) = 0.5 is the abiogenesis brief's chemistry-optimist floor, giving posterior 0.69 against the brief's central 0.35. The evidence favours fewer and shallower evolutionary steps more strongly than it favours either abiogenesis camp. With priors a careful biologist would defend, I get alone 0.56 (range 0.39-0.71), infeasible 0.31, and the bottleneck moves from "evolution" (73%) to abiogenesis (73%). The most important change is to reset the hard-step prior to the convergence study and report the result as a 2x2 table (abiogenesis easy or hard, by evolution easy or hard), with "alone" split into a sterile Galaxy and a microbial one. The qualitative logic survives: late filter, restraint and hidden together stay below about 0.13 under every biological prior I tried.

Critic’s own estimate of each answer: alone in the universe 0.22, alone in the Galaxy 0.33, handful first 0.05, late filter 0.04, restraint 0.02, infeasible 0.27, hidden 0.03, other 0.04. What “other” covers: Outcomes outside the seven classes: settlement is feasible but slow, patchy or non-persistent so that unvisited pockets remain without any universal barrier; or civilisations change into forms that neither harvest starlight nor settle visibly without deliberately hiding; plus residual model error. The biological core is my composite run (prior P(fast abiogenesis) 0.40 with a rate-based likelihood, convergence-study step counts, 2-8 decades per step, f_c 0.03-0.9), which gives alone 0.56, infeasible 0.31, hidden 0.04; I shade infeasible and hidden down slightly because those priors are outside my lens.

Objections

  1. [major] integrate.py L48-52: w_pacing=0.3, hard_m_weights {1:.36,2:.28,3:.18,4:.11,5:.07}, hard_step_decades=(2,12); and the [STUDY convergence] tag on that block

    • Argument: The block is tagged as using the convergence study but does not. The study gives 0-3 genuine hard steps: P(0)=0.35, P(1)=0.39, P(2)=0.20, P(3 or more)=0.06, and says brain hardware is repeatable in 1-100 Myr, so intelligence is not a hard step. The model's prior has P(3 or more)=0.25 and allows 4-5 steps. Its depth prior, log-uniform 2-12 decades per step (median 4.9), is wider than the evolution brief's recommendation of 3 decades with 6 as the sensitivity case. The Fermi null then pushes further: posterior P(m>=3)=0.55, mean m=2.64, mean depth 6.4 decades, median f_i=10^-7.9. The modal world of the base case is therefore 'at least a million inhabited planets in the Galaxy, no other technological species ever' at 0.485 of the 0.75. That is the Ward-Brownlee world the project's own study argues against. Mills et al. 2025 would add that Kay et al. 2025 (a 1.1 Gyr stepwise eukaryote stem from an already complex archaeon) and the recurrence limits in the study (ancient singular and ancient repeated innovations indistinguishable at 0.3-1.8 per Gyr) remove the empirical case for depths of 6-12 decades. The Carter-side reply is fair and should be shown: the study's base-rate argument assumes era invariance and constrains the count, not the depth, and Snyder-Beattie et al. 2021 used 24 decades.
    • Proposed change: Base case: P(m=0,1,2,3)=(0.35,0.39,0.20,0.06), i.e. w_pacing=0.35 and hard_m_weights {1:0.60,2:0.31,3:0.09}; depth log-uniform 2-6 or 2-8 decades. Keep the current weights with depth 2-12 and 2-24 as a named 'Carter / Snyder-Beattie' camp. Set f_c to the study's 0.1-0.9 in the no-hard-step branch (at most 0.03-0.9 overall). Report 'alone' split by whether inhabited planets exceed 1e6.
    • Expected effect: Alone in Galaxy 0.75 -> about 0.46 (0.39 with depth 3; 0.58 with depth 2-12). Infeasible 0.15 -> 0.36 (0.28-0.42); infeasible becomes the largest single class. Alone-in-universe 0.27 -> about 0.19. 'Microbial galaxy, no technology' falls from 0.485 to about 0.12 in my composite. Opposite pole: depth 2-24 gives alone 0.82.
    • Tested: Ran a parametrised copy of run() (m2.py, n=1e6, base replicates to 3 decimals). Study weights alone: alone 0.60, infeasible 0.26. Plus depth 3: alone 0.39, infeasible 0.42. Plus depth 2-6: alone 0.46, infeasible 0.36. Plus depth 2-12 and f_c 0.1-0.9: alone 0.58. Depth 2-24 with model weights: alone 0.82. Model's own sensitivity rows: depth 3 -> 0.56, depth 12 -> 0.91.
  2. [major] Headline claim (3) and bottleneck_given_rare (integrate.py L221-232): 'an early filter is cheap from wide priors'; bottleneck = intelligence 0.73, abiogenesis 0.27, persistence 0.00, technology 0.00

    • Argument: The null result is being allocated to whichever link was given the heaviest tail. Evolution can span up to 60 decades (5 steps x 12) and abiogenesis up to 100; f_persist and f_c are capped at 2 decades and p_will at 4. The 'bottleneck' split therefore restates the prior ranges; persistence and technology score exactly zero because they cannot be the smallest term. The data add little: prior P(fewer than one civilisation per Galaxy) is 0.509 and the posterior is 0.752, an odds shift of 2.9. Marginal likelihoods across the seven camps run from 0.225 (optimist) to 0.755 (expansion sceptic), a factor of 3.4. A biologist reading '0.75 alone, mostly because intelligence is hard' would take it as a result; it is an assumption about tail width in the one place the project has its own data (the convergence study) saying the tail is thinner. The label is also wrong: the study says brains are not the hard part, so the 73% is about the microbe-to-animal transitions.
    • Proposed change: Print the prior next to every posterior in the headline table and state the odds shift (2.9). Replace the single base case with a 2x2 conditional table (abiogenesis fast or slow, by evolution gated or hard-stepped), with the prior weight on each cell shown as a reader-adjustable input. Rename the bottleneck 'evolutionary transitions between first life and animals'. Drop or caveat the bottleneck split.
    • Expected effect: No number changes, but the claim changes from 'we are probably alone' to 'we are probably alone if evolution has 2 or more deep hard steps or abiogenesis is slow; otherwise settlement is probably infeasible'. Conditional posteriors from the base run: fast abiogenesis and gated evolution (mass 0.066): infeasible 0.79, hidden 0.12, late filter 0.08, alone 0.00. Fast and hard steps (0.623): alone 0.74, infeasible 0.14. Slow and gated (0.065): alone 0.87. Slow and hard steps (0.245): alone 0.97.
    • Tested: Prior and posterior of Nciv<1 computed from the model (0.509, 0.752). Evidence values read from integrate_results.json (0.225 to 0.755). Conditional table computed from base-run samples.
  3. [major] integrate.py L40-42: w_easy=0.5, easy_fl=(0.1,1), hard_fl_decades=(5,100); label 'agnostic mixture'

    • Argument: This runs against the project's own abiogenesis brief and gaps item 7, in the optimistic direction. The brief's table shows that a prior P(fast)=0.50 is its chemistry-optimist floor (log10 rate floor -3, posterior 0.82). Its baseline floor of -30 gives prior 0.09 and posterior 0.33, and gaps section 7 instructs 'P(fast abiogenesis) 0.35 (0.14-0.86)'. The model's posterior is 0.69. Koonin and Totani would say half the prior mass in one decade of f_l is not agnostic. The opposing case (Sutherland, Szostak, Joyce; Mills and Frank) is that log-uniform to -30 hard-wires a random-assembly model that the 45-nt self-synthesising ribozyme (Gianni et al. 2026), RNA-catalysed evolution (2024) and Bennu feedstock undermine. My reading: neither extreme. No continuous prebiotic pathway exists, the LUCA date is contested (brief: P 0.5-0.7 that life existed by 4.1 Ga), and Kipping's own caveat that suitable sites may be rare is unmodelled. A defensible prior is 0.3-0.45, not 0.5. This error and the hard-step error offset, so 0.75 is roughly right for the wrong reasons and its composition is wrong.
    • Proposed change: Either set w_easy=0.35-0.40 as base, or keep 0.5 and relabel the base case 'chemistry-optimist on abiogenesis'. Show w_easy=0.2 (which reproduces the brief's 0.35 posterior) as a named row. Sample the rate itself in the fast branch (see the next objection) so the brief and the model use one definition.
    • Expected effect: w_easy=0.2 alone: alone 0.75 -> 0.85, alone-in-universe 0.27 -> 0.41, infeasible 0.15 -> 0.09. w_easy=0.35: alone 0.79, alone-in-universe 0.33, infeasible 0.12. Combined with the study's hard-step prior: alone 0.67 (depth 3), 0.70 (2-6), 0.76 (2-12), but with gated evolution at 0.30-0.35 instead of 0.13 and mean steps 1.2-1.3 instead of 2.6.
    • Tested: w_easy=0.2: posterior fast 0.36, alone 0.846 (matches the model's own sensitivity row). w_easy=0.2 plus study weights plus depth 3 / 2-6 / 2-12: alone 0.67 / 0.70 / 0.76, infeasible 0.21 / 0.19 / 0.15. My composite (w_easy 0.40, rate-based fast branch, study weights, depth 2-8, f_c 0.03-0.9): alone 0.56 (universe 0.24, Galaxy 0.32), infeasible 0.31, hidden 0.044, handful 0.05, late 0.03, restraint 0.012; bottleneck given rare flips to abiogenesis 0.73, evolution 0.27.
  4. [moderate] integrate.py L140-141: L_early = 1.0 for the whole easy branch, while easy_fl is log-uniform 0.1-1

    • Argument: The comment defines 'easy' as near-inevitable within about 1 Gyr, but 70% of the branch has f_l below 0.5. An f_l of 0.1-0.5 in 1 Gyr is a rate of 0.1-0.7 per Gyr. For that rate the chance that life starts within the observed 0.1-0.7 Gyr, given it must start early enough for observers, is 0.2-0.4, no better than the hard branch's (m+1)*tau of 0.2-0.35. The model gives those samples full credit, so the fast branch gets a likelihood bonus it has not earned. The brief's recipe avoids this: draw log10 rate uniform on [-0.5, 3] per Gyr and derive both f_l (about 1) and the timing likelihood from it.
    • Proposed change: In the fast branch draw the rate (log10 per Gyr uniform on [-0.5, 3]), set f_l = 1-exp(-rate x 1.5 Gyr) and L_early = (1-exp(-ratedt1))/(1-exp(-ratedt2)) with dt2 = 1.6-3.0 Gyr, as in the abiogenesis brief section 6.
    • Expected effect: Posterior P(fast) 0.69 -> 0.63 with the brief's range, 0.58 if the rate tops out at 30 per Gyr, 0.40 if the present f_l range is kept and mapped to a rate. Alone 0.75 -> 0.75-0.83; alone-in-universe 0.27 -> 0.29-0.39; infeasible 0.15 -> 0.10-0.15.
    • Tested: Brief recipe [-0.5,3]: fast 0.63, alone 0.75 (universe 0.288). [-0.5,1.5]: fast 0.58, alone 0.77. Present f_l range mapped to a rate with latest start 0.27-0.5 of the window: fast 0.40, alone 0.83 (universe 0.39), infeasible 0.097.
  5. [moderate] integrate.py L179-182: hwo_none / hwo_some likelihood p_bio = f_l * sqrt(f_persist) * 0.5; and the 'future observations' table built on it

    • Argument: Two errors. First, a Habitable Worlds Observatory target is a rocky habitable-zone planet, i.e. an eta-Earth planet. The model's f_l applies only to the fraction f_hz_habitable x f_rare_earth of those (median 0.11), which the likelihood omits. Second, the detectable biosignature is oxygen or ozone, which needs oxygenic photosynthesis and planetary oxygenation. In the hard-steps branch that is the first hard step; Watson 2025 and Mills et al. 2025 agree this is the decisive test between their views. As coded, a detection leaves the hard-step count untouched and slightly raises it (gated share 0.13 -> 0.10, mean steps 2.64 -> 2.74), the opposite of what both camps say it should do. A null on 25 planets is credited with cutting P(fast abiogenesis) from 0.69 to 0.43, which overstates its power several-fold.
    • Proposed change: p_bio = f_hz * f_rare * f_l * sqrt(f_persist) * p_oxygenic * q_detect, where p_oxygenic is the first hard-step probability in hard-step samples (with probability about 0.7 that oxygenic photosynthesis is one of the steps) and a gating factor in the no-hard-step branch. Report the implied forecast P(at least one detection) alongside.
    • Expected effect: Forecast that 25 planets yield at least one biosignature: 47% as coded -> 14% with the model's own planet factors -> 5% with the oxygen requirement. After a null: alone 0.84 as coded -> 0.76-0.77, P(fast) 0.43 -> 0.64-0.67, so a null is nearly uninformative. After a detection: alone 0.65 as coded -> 0.56, infeasible 0.21 -> 0.30. In my composite a detection takes alone to 0.10 and infeasible to 0.70.
    • Tested: Evidence ratios against the base run: hwo_some 0.471; with f_hz*f_rare 0.144; with the oxygen step 0.054. Null and detection posteriors as quoted. Composite: detection has probability 0.13 and gives alone 0.10, infeasible 0.70, gated share 0.54.
  6. [moderate] integrate.py L34-35, L46, L49, L52: f_hz_habitable x f_rare_earth x f_persist x pacing_fi x f_c multiplied as independent log-uniforms

    • Argument: Four of these five describe one thing: whether the planet stays clement long enough. f_hz_habitable is the Venus runaway. f_rare_earth lists plate tectonics and volatiles, i.e. the carbon-silicate thermostat. f_persist is anchored on Tyrrell 2020, whose random-feedback planets already are the question of whether a thermostat exists. The low end of pacing_fi is defined in the evolution brief as planets whose oxygenation time exceeds their habitable lifetime. Chopra and Lineweaver's Gaian bottleneck is an alternative to rare origin, not an extra multiplier on top of it. The product has a median of 2e-4 per inhabited rocky habitable-zone planet in the 'no hard steps' branch, and exceeds 0.1 with prior probability 0.2%. So the model contains no branch in which intelligence is actually easy, although Mills et al. predict technosignatures to be common on old enough planets and the convergence study puts the last link at 0.5 (0.1-0.9). In the hard-steps branch f_persist is mis-specified: under hard steps 4 Gyr is an outcome, not a requirement, and the right term is the mean of (window/Earth window)^n, which can exceed 1 for K-dwarf planets.
    • Proposed change: Collapse f_hz_habitable, f_rare_earth and f_persist into one planetary-suitability factor, log-uniform 0.003-1. In the gated branch drop f_persist (it is the gating failure) and use pacing_fi 0.1-1 with f_c 0.1-0.9. In the hard-steps branch replace f_persist by a window-length factor raised to the number of steps.
    • Expected effect: Small in the base case because heavy tails dominate: alone 0.75 -> 0.69-0.73, infeasible 0.15 -> 0.16-0.20. Larger once the hard-step prior is corrected, and it changes what the optimist camp means.
    • Tested: Prior quantiles of the product in the gated branch: 5/50/95% = 10^-5.5 / 10^-3.7 / 10^-2.0. No f_persist: alone 0.72, infeasible 0.18. No f_persist with f_rare 0.1-1 and f_c 0.1-0.9: alone 0.69, infeasible 0.20. Mills-style gated branch at fixed weight 0.3: alone 0.73.
  7. [moderate] integrate.py L53 and L129: x_now=(0.72,0.88); L_late = m x^(m-1) for hard steps and 1.0 for the gated branch; no hybrid branch

    • Argument: Three linked problems. (a) Giving the gated branch L_late=1 assumes gate-opening times are uniform over the window. Hanson's point, which the evolution brief calls the key unanswered objection to Mills, is that gating does not explain why the gate opens at 80% of the stellar window; with a log-uniform gate time the density is about 0.27. Conversely, if gate times are of order the window (Catling et al. 2005), late arrival is expected and L_late is about 2, and it should be tied to f_i: low f_i means most successes are late. (b) The evolution brief's own 'most defensible' reading is a hybrid of 1-3 hard steps plus about 1.5 Gyr of gated delay (Watson 2025). The model has only the two pure branches. In the hybrid the hard steps play out in a shorter effective window, x is 0.60-0.72, and the Carter likelihood penalises 4-5 steps instead of rewarding them. (c) The range 0.72-0.88 is shifted high against the brief's 0.70-0.85; 0.88 needs only 0.6 Gyr of habitable future, below every estimate cited.
    • Proposed change: Model the gate time as lognormal across planets (0.3-0.5 dex) with f_i = P(gate opens inside the window) and L_late = pdf(x)/f_i. Add a hybrid branch with a delay of 1-2 Gyr subtracted from the window before applying m x^(m-1). Set x_now to 0.70-0.85.
    • Expected effect: Gated-branch posterior share ranges 0.04-0.23 against 0.13 now; alone 0.71-0.79. Hybrid x: mean steps 2.64 -> 2.25, alone 0.75 -> 0.70, infeasible 0.15 -> 0.18. x_now 0.70-0.85 alone: under 0.01.
    • Tested: Gated L_late=0.27: gated share 0.04, alone 0.79. L_late=2: 0.23, alone 0.71. Lognormal gate tied to f_i: 0.21 (0.3 dex), 0.15 (0.5 dex). x_now 0.60-0.72: mean steps 2.25, alone 0.70. Changing the gated-branch abiogenesis window from 0.25 to 0.4 or 0.65 (planetary clock instead of a clock started by life) moves P(fast) by at most 0.03 and alone by 0.00.
  8. [moderate] The 0.27 for 'alone in the observable universe'; hard_fl_decades=(5,100) (L42); classification at L198

    • Argument: The split between alone-in-universe and alone-in-Galaxy is set by a hyperprior with no evidential content and by an unstated cosmological assumption. Nothing in the model distinguishes f_l=10^-15 from 10^-80. The upper bound of 100 decades is arbitrary from both sides: Totani 2020 gives 10^-39 per star for a 40-nt replicator and beyond 10^-160 for 100 nt; Koonin 2007 gives 10^-1018, which the model cannot represent, and Koonin explicitly needs an infinite multiverse to rescue it. That is the second point: with anthropic='none' the model never conditions on at least one civilisation existing, so samples with 10^-40 civilisations per observable universe keep full weight. That is legitimate only if the universe beyond the horizon is effectively infinite.
    • Proposed change: Headline the sum 'no other civilisation ever in the Galaxy'. Give alone-in-universe as a range with its two drivers stated: the depth hyperprior and the assumed size of the universe. Add a row that conditions on at least one civilisation in V times the observable volume.
    • Expected effect: Alone-in-universe is 0.16-0.40 across the depth hyperprior (10 to 100 decades) with the Galaxy-level sum nearly unchanged. Under existence conditioning: 0.01 (V=1), 0.08 (V=1e3), 0.17 (V=1e10), 0.24 (V=1e30), with alone-in-Galaxy rising to compensate and the total alone falling to 0.66-0.74.
    • Tested: Depth 5-40: universe 0.21, total alone 0.74. Depth 20-200: universe 0.36, total 0.77. Existence conditioning with weight 1-exp(-NcivGV): values as quoted; P(fast) rises to 0.72-0.81.
  9. [minor] integrate.py L119-123: log_fi = sum of per-step log p, no ordering factor

    • Argument: The evolution brief's formula (section 6) is f_i = (1/m!) x product of (T/tau_k): m sequential rare steps must all fall inside the window in order, which costs 1/m!. If the per-step p is T/tau, the model overstates f_i by m!, i.e. 6x for 3 steps and 120x for 5, and by (m+1)! when abiogenesis is also hard. If p means something else, it is undefined.
    • Proposed change: Subtract log10(m!) from log_fi in the hard-steps branch, and log10((m+1)!)-log10(m!) more when abiogenesis is hard, or state that p is defined net of ordering.
    • Expected effect: Alone 0.75 -> 0.78, infeasible 0.15 -> 0.13. In my composite: under 0.01.
    • Tested: With the 1/m! factor: alone 0.778 (universe 0.278, Galaxy 0.500), infeasible 0.132. Composite: alone 0.57 against 0.56.
  10. [minor] integrate.py L36-38 (p_M_class, f_M_planets) and L185-188 (mdwarf_alive / mdwarf_dead rows)

  1. [minor] integrate.py L51-52 and L129: 'hard' steps drawn on [10^-D, 1] with D as low as 2; f_c multiplied on top of the last hard step

Code errors

Claims that survive

Missing explanations

Presentation advice

Lead with a 2x2 table instead of one base case: abiogenesis fast or slow, by evolution gated or hard-stepped, giving each cell's prior weight, posterior weight and class probabilities. The cells disagree completely (fast and gated: infeasible 0.79, alone 0.00; slow and hard-stepped: alone 0.97), and readers should see that the weights on the cells are judgement.

Print the prior beside every posterior and say in one sentence that the observations shift the odds of 'alone in the Galaxy' by a factor of about 3 (0.51 to 0.75) and discriminate between camps by at most 3.4x.

Split 'alone' into 'no other life' and 'microbes common, no other technology'. The second is the base case's modal world at 0.485 and is the one the project's own convergence study argues against.

State the biological prior in plain terms so it can be challenged. As coded, P(technology | habitable planet) has a median of 10^-9, a 5-95% range of 10^-49 to 10^-2.5, and only a 2% chance of exceeding 1%. A careful biologist would defend something like this: P(technology | inhabited planet that stays habitable) median about 10^-3 with a 90% range of 10^-9 to 0.3 (the evolution brief's own f_i times f_c); P(life | habitable planet) bimodal with 35-45% near 1 and the rest spread over 5-40 decades or more; combined median 10^-6 to 10^-7, with a 14% chance of exceeding 1% and a 5% tail below 10^-45.

Do not call the bottleneck 'intelligence': the convergence study says brains recur in 1-100 Myr, and the weight sits on oxygenic photosynthesis and eukaryote-grade complexity.

Fix the Habitable Worlds Observatory rows before publishing them. As coded the model forecasts a 47% chance of a biosignature in 25 planets and treats a null as strong evidence; with its own planet factors and the oxygen requirement the forecast is 5-14% and a null is nearly uninformative, while a detection would be the single most diagnostic biological observation available.

Give alone-in-universe as a range with its two hidden assumptions named: the depth hyperprior and an effectively infinite universe.

Critic: a specialist in reasoning from our own existence

Verdict. From this lens the headline "probably alone in the Galaxy (0.76)" is not defensible as an unconditional base case. It is the answer of one anthropic school, and the mode labelled "no anthropic update" is in fact a hybrid that keeps the pre-emption penalty exp(-mu) but drops the matching existence weight. The numbers themselves are sturdier than the framing: dropping the Milky Way likelihood L1 entirely leaves the base posterior unchanged to three decimals, because the extragalactic survey term L2 does all the work, so the selection objection hurts the stated logic more than the result. The SIA numbers are the weak point: "infeasible 0.82 / hidden 0.14 / late filter 0.04" is the renormalised ratio of three prior switches (0.15 : 0.0255 : ~0.008), and I could make any of the four barrier classes the leader by moving one floor. What survives every school I ran is the dichotomy "rare, or a universal barrier" (independent-choice explanations stay at or below 0.10 unless a floor is pushed below 1e-12). The single most important change is to replace "base case plus an SIA sensitivity row" with an explicit school table (SSA-minimal, SSA-broad, SIA/FNC) collapsed to three super-classes, plus a credence-weighted blend; at 50% SIA the blend is alone 0.34, universal barrier 0.62, independent choice 0.03.

Critic’s own estimate of each answer: alone in the universe 0.09, alone in the Galaxy 0.23, handful first 0.04, late filter 0.13, restraint 0.08, infeasible 0.24, hidden 0.1, other 0.09. What “other” covers: Constructed observers (simulation or cultivated biosphere), which SIA-style reasoning favours, plus model misspecification such as correlated timing or a non-expander deadline. Derived from school credences of about 0.50 SIA-like (SIA, FNC, thirder, total-utilitarian ADT), 0.40 SSA-minimal, 0.10 SSA-broad, with the SIA branch's barrier split flattened because it is prior-determined and my prior that settlement is infeasible for everyone is below the model's 0.15.

Objections

  1. [major] BASE anthropic="none" (integrate.py line 71) presented as the base case, with SIA as one of 23 sensitivity rows (line 288); headline 'alone in Galaxy 0.76'

    • Argument: The "none" mode is not a recognised anthropic position. The timing terms L_early and L_late are densities conditional on our existence, yet L1 = exp(-mu) is treated as an unconditional fact about a randomly chosen galaxy. If settlement pre-empts later civilisations (the Hanson/Olson assumption, and the model's own implication, since only the stealth branch is defined as 'leaving young biospheres alone'), then P(Milky Way unsettled | we exist) = 1 and L1 is a selection effect (SSA, minimal reference class). If instead exp(-mu) is the chance our niche stayed open, it is one factor of an observer count and must come with the other factor, Nciv (SIA; Neal's full non-indexical conditioning gives the same in a non-huge universe). The model charges hypotheses for pre-emption without crediting them for producing us. The project's own brief warned against this (evidence/anthropics.md, 'Conditioning' (a) and (c): 'Run both branches. Do not mix them inside one chain'; 'under SSA it truncates the prior... it is not ordinary evidence'). Calling it 'no anthropic update' implies a neutral default exists; Bostrom, Olum, Carlsmith and Neal would all deny that. Sandberg-Drexler-Ord make the same move, which is the standard criticism of them (Finnveden 2019, cited in the brief).
    • Proposed change: Delete the label 'no anthropic update'. Run three named branches as co-equal results: (B) SSA-minimal: L1 replaced by a pre-emption-aware term (see objection 3), no Nciv weight, existence conditioned via P(at least one civilisation like us in a universe of size G_tot); (C) SSA-broad: weight by the fraction of all observers who are early and pre-expansion; (D) SIA/FNC: weight by Nciv*exp(-mu). Report each collapsed to three super-classes (alone / universal barrier / independent choice), then a blend at stated school credences of 30, 50 and 70% SIA.
    • Expected effect: Per school (alone / barrier / independent): SSA-minimal 0.75/0.18/0.06; SSA-broad 0.43/0.49/0.08; SIA 0.00/1.00/0.00. Blend at SSA-min 0.4, SSA-broad 0.1, SIA 0.5: alone 0.34 (universe 0.12, Galaxy 0.22), barrier 0.62, independent 0.03. At 30% SIA: 0.49/0.46/0.05. At 70% SIA: 0.21/0.77/0.02. The headline 'alone 0.76' becomes 'alone 0.2-0.5 depending on your credence in SIA'.
    • Tested: Re-ran the model from a scratch copy exposing samples (expF.py, n=2e6). School posteriors and blends as quoted. Base reproduction matched the JSON to 3 d.p.
  2. [major] The reported SIA result 'infeasible 0.82, hidden 0.14, late filter 0.04' (integrate.py lines 190-192 with q_feasible=0.85, p_stealth=0.03, q_doom=0.03, p_will floor 1e-4, p_surv floor 1e-2)

    • Argument: Under SIA the weight Ncivexp(-mu) pushes all mass to the ceiling of Nciv (posterior median 10^8.4 civilisations per galaxy), where the only survivors are samples with some switch that zeroes expansion. The split among those switches is therefore the prior ratio, not an inference: (1-q_feasible) : q_feasiblep_stealth : ~0.3q_feasibleq_doom = 0.15 : 0.0255 : 0.008 = 0.82 : 0.14 : 0.04. Those three inputs are judgement calls. 'Restraint' is zero only because p_will is floored at 1e-4; Olson and Ord's 1/q reweighting drives the posterior to whatever floor is set. The gaps brief (item 10) says the floor is decisive under self-indication, but the floor sensitivity was run only in the non-anthropic branch. A critic will dismantle the sentence in one line of arithmetic.
    • Proposed change: Under SIA publish only the robust statements: P(alone) approx 0 and P(some near-total barrier between technology and visible expansion) approx 1, with the split shown as a grid over the switches and floors and explicitly labelled as prior. Better: put hyperpriors on the floors (floor exponent log-uniform, e.g. 4 to 16 decades for p_will and 2 to 12 for p_surv) and on the three switches, marginalise, and report the resulting spread. Also run every sensitivity row in the SIA branch, not just the base.
    • Expected effect: SIA infeasible share ranges 0.35-0.97 and each of hidden, late filter and restraint can reach 0.4-0.6. The defensible SIA headline is 'universal barrier ~1.0, type undetermined', not 'infeasible 0.82'.
    • Tested: SIA runs at n=3e6 (expC.py): q_feasible=0.97 gives infeasible 0.44, hidden 0.43, late 0.13; q_feasible=0.5 gives 0.97/0.03/0.01; p_stealth=0.2 gives hidden 0.50; q_doom=0.2 gives late 0.22; p_will floor 1e-12 gives restraint 0.32, 1e-16 gives 0.61; p_surv floor 1e-12 gives late filter 0.47. Alone stayed 0.000 in all twelve variants.
  3. [major] L1 = exp(-mu) (integrate.py line 162) and headline logic step (1), 'one persistent expander anywhere in the Galaxy would be evident'

    • Argument: Two problems. First, observation selection: observers like us can only arise in an unsettled galaxy if settlement pre-empts, so an empty Milky Way is guaranteed, not evidence, under SSA with a minimal reference class. Second, in the model as built, L1 is numerically redundant: removing it changes no class probability at the third decimal, because L2 (1e5 surveyed galaxies times p_harvest of at least 0.03) already forces mu below about 1e-4, while L1 only requires mu below about 1. So the whole non-SIA inference rests on one extragalactic waste-heat survey and the p_harvest prior, not on Hart's Fact A. The existing sensitivity row 'no extragalactic constraint at all' keeps the hybrid L1 and so understates the exposure.
    • Proposed change: Add p_preempt = P(a settled galaxy precludes our evolving) and use L1_eff = e^-mu / (e^-mu + (1 - e^-mu)(1 - p_preempt)) in the SSA branch (equals 1 at p_preempt=1, exp(-mu) at 0). Rewrite the headline logic so step (2) carries the weight and step (1) is flagged as school-dependent. Re-run the three L2-weakening sensitivities with L1 off, and make L2 (Griffith et al. 2015 completeness, p_harvest, p_cold_only) the primary red-team target.
    • Expected effect: At base settings: none. With L2 removed, the hybrid gives alone 0.61, independent choice 0.24; the selection-correct version gives alone 0.42, independent choice 0.38, which is below the prior of 0.51 because Earth's timing data favour easy life. With 'all cold plus p_harvest down to 1e-4', alone 0.63 and independent 0.20 (hybrid: 0.68 and 0.16).
    • Tested: expA.py, n=1e6: base 0.266/0.486/0.054/0.018/0.010/0.148/0.018 with L1; identical without L1; identical for p_preempt 0, 0.5, 0.9, 0.99. 'Only L3 and timing': 0.134/0.288/0.084/0.112/0.300/0.075/0.009.
  4. [major] 'Alone in the observable universe 0.27' (classification alone_u = Nciv*G < 1, lines 197-198) with no conditioning on the fact that at least one civilisation exists

    • Argument: The base posterior has median log10 Nciv = -4.5 and a 5% quantile of -36. A hypothesis with Nciv = 1e-36 per galaxy predicts a 1e-25 chance that any civilisation, including us, exists in the observable universe. Any school that conditions on existence (SSA: at least one member of the reference class; Neal's FNC: someone with our data exists) multiplies by P(at least one) = 1 - exp(-Nciv * G_tot), which is proportional to Nciv until Nciv*G_tot reaches 1. The model implicitly assumes the universe beyond the horizon is large enough to make this factor 1 everywhere, which needs 1e40 to 1e60 Milky-Way equivalents. That may be true under eternal inflation but it is an unstated cosmological assumption carrying a quarter of the headline.
    • Proposed change: Add a hyperparameter G_tot (Milky-Way equivalents in the whole universe, not just the observable part) and apply 1 - exp(-Nciv*exp(-mu)*G_tot) in the SSA branch. Report 'alone in the observable universe' as a function of G_tot, and lead with the merged 'no other civilisation ever in the Galaxy' figure, which is stable.
    • Expected effect: Alone-in-observable-universe: 0.01 if the universe is only the observable part (G_tot=1e11), 0.06 at 1e13, 0.13 at 1e17, 0.19 at 1e25, 0.24 at 1e40, 0.27 only by about 1e60. Alone-in-Galaxy total moves only 0.66-0.75; infeasible rises from 0.15 to at most 0.20.
    • Tested: expB.py, n=2e6, G_tot from 1e11 to 1e100; numbers as quoted. Prior mass with log10 Nciv below -25 is 0.10 and below -40 is 0.05.
  5. [major] No SSA branch with a broad reference class; q_doom fixed at 0.03 and never updated anthropically; output 'p_filter_behind_us' = P(Nciv < 1) (line 239)

    • Argument: Under SSA with a reference class that includes the inhabitants of expanded civilisations (Leslie, Gott, Bostrom's original Doomsday argument; Gerig, Olum and Vilenkin 2013 'universal doomsday', listed in the gaps brief but not used), our being early and pre-expansion has probability about 1/(1 + p_exp*R), with R the ratio of observers in an expanded civilisation to one at our stage. This penalises every hypothesis in which civilisations like ours expand, including the 'alone' ones. The seven classes conflate two different questions, how many others there are and what lies ahead of us, and the label 'filter behind us 0.75' invites the reading that our future is open. Under this school it is not.
    • Proposed change: Add branch C with weight 1/(1 + p_quietL_q/L_us + p_expR), R as a hyperparameter (1e6 to 1e20). Add a second reported axis for every branch: P(expansion is open to a civilisation like ours) = P(feasible and no universal doom), and E[p_exp]. Rename p_filter_behind_us to p_fewer_than_one_other_in_galaxy.
    • Expected effect: SSA-broad at R=1e10: alone 0.43 (was 0.75), infeasible 0.40 (was 0.15), late filter 0.09 (was 0.02), hidden 0.00. P(feasible and no doom) falls from 0.66 to below 0.001 (0.06 at R=1e6, 0.50 at R=1e3). Conditional on being alone, P(settlement infeasible) rises from 0.17 to 0.81. Like SIA, this school converges on 'a universal barrier lies ahead', by a different route; it is also floor-sensitive in p_will.
    • Tested: expD.py, n=3e6, R = 1e3, 1e6, 1e10, 1e20; numbers as quoted.
  6. [major] SIA implementation counts only evolved civilisations (weight Nciv, line 192); no class for observers created by other civilisations; the SIA factor against 'alone' is accepted without the presumptuous-philosopher caveat

    • Argument: SIA weights by the number of observers in our exact epistemic situation, whoever made them. If any civilisations run ancestor simulations, or seed and shelter biospheres, simulated or cultivated copies of our situation can outnumber evolved ones by orders of magnitude, and the same logic that gives 'alone = 0.000' (a factor of 1e19 or more between alone-in-universe and common) gives near-certainty to those hypotheses. One cannot accept the first verdict and leave the second 'unquantified' as the brief recommends. In such worlds L2 and L3 are no longer trustworthy evidence. Separately, a Bostrom-style critic will call the SIA branch a reductio: it reaches certainty about cosmic demography from the armchair, and none of the project's eight data studies can move it except through the SETI term and the feasibility prior.
    • Proposed change: In the SIA branch add an explicit 'constructed observers (simulation / cultivated biosphere)' class with prior s and multiplicity K, reported as an 'other' column; show its share as a function of s*K. State in the text that the SIA factor is at least 1e11 per decade-free and overwhelms every empirical likelihood in the model (which total a factor of 10-1000), and name the presumptuous-philosopher objection as the reason a reader may discount the branch.
    • Expected effect: Under SIA, 'other' takes most of the mass whenever s*K exceeds about 1 (for example s=0.01, K=1000). In a 50%-SIA blend that puts 0.05-0.3 on 'other', taken mainly from infeasible.
    • Tested: Not run as a model variant (needs a new class). The 1e19 factor follows from the SIA posterior median Nciv of 10^8.4 against the alone-in-universe threshold of 1e-11 (expC.py).
  7. [moderate] SIA branch posterior sits at the prior ceiling and is held up only by L3 (c_det capped at 1e-6, L_quiet down to 100 yr); 'infeasible' label

    • Argument: Under SIA the model asserts about 10^8.4 technological civilisations per galaxy over history (5-95%: 10^6.7 to 10^9.6), a median of about 250 extant in the Milky Way now, 41% probability of more than 1,000 and 16% of more than 100,000, all undetected, with posterior c_det at 1e-8. The SETI null is then the single most important datum in the branch, yet it is modelled with one log-uniform scalar and the 'techno_null_1e6' future observation is evaluated only in the non-anthropic branch, where it does nothing. When L3 is strengthened the SIA posterior escapes through short detectable lifetime (L_q), so much of what is filed under 'infeasible' is really 'common but briefly detectable', a class the scheme does not have.
    • Proposed change: Feed the seti_meta study's unified limit into L3 as a function of N_now and lifetime rather than one scalar; add probe/artefact absence as a constraint that applies even when settlement is infeasible; split 'infeasible' into long-lived and short-lived (L_q below about 1e4 yr) sub-classes; run all future-observation rows under SIA. Use importance sampling tilted in log Nciv for the SIA branch (ESS is 2,200 of 3e6, and falls to about 550 for some variants).
    • Expected effect: The barrier total stays near 1.0; mass moves within it from 'infeasible, long-lived' towards 'short-lived / late filter'. Technosignature rows become the most informative future observations in the SIA column instead of the least.
    • Tested: expC.py: SIA posterior quantiles for Nciv, N_now, L_q (median 10^5.4 yr), c_det as quoted. Raising the c_det cap to 1e-3 left the class split unchanged (infeasible 0.815), confirming the escape through L_q. Four-seed spread at n=3e6: s.d. 0.004 on infeasible and hidden, so the base SIA numbers are stable despite low ESS.
  8. [moderate] grabby.py posterior_summary (lines 132-155): likelihood = like_time (our birth date's density among all civilisations ever, line 111); integrate.py future rows 'mdwarf_alive/dead' (lines 185-188)

    • Argument: The earliness inference is SSA with a reference class of every civilisation that will ever arise, including M-dwarf civilisations up to 100 or 1000 Gyr hence. The Bayes factor for expanders is therefore set by the reference class: it scales as T_M^n without bound (2.5e4 at 100 Gyr, 2.5e10 at 1000 Gyr, still 1.8e4 if M dwarfs are only 10% as habitable). Under SIA the normalisation by the total number of civilisations cancels (Olson and Ord; Cook 2022) and the effect vanishes. Under SSA restricted to Sun-like-host observers it also vanishes. The two models are also inconsistent with each other: integrate.py shows essentially no change when M-dwarf planets are 'shown habitable' (0.267/0.475/...), while grabby.py under its own school says that observation multiplies the odds of a cosmic deadline by 1e4 or more, which should cut 'alone in the observable universe' sharply.
    • Proposed change: Add an SIA variant to posterior_summary (replace like_time by S(T0) = exp(-x)) and report the Bayes factor in a table of school by reference class. State that earliness is evidence for expanders only under SSA with a universal reference class and habitable long-lived M dwarfs. In integrate.py, either add the earliness likelihood to the SSA-universal branch so that the M-dwarf future rows move, or state that those rows are computed under a school in which earliness carries no information.
    • Expected effect: Bayes factor for expanders, M dwarfs habitable, n=6: 25,000 under SSA-universal, 0.53 under SIA, 0.57 under SSA with Sun-like hosts only. P(more than 10% of volume occupied): 0.82 falls to 0.07. Mean occupied fraction 0.41 falls to 0.03.
    • Tested: Recomputed from the saved rows in grabby_results.json for all six scenarios; SIA Bayes factor is 0.53-0.57 in every scenario; SSA values reproduce the JSON.
  9. [moderate] L_early = 1 for the whole 'easy' abiogenesis branch (integrate.py lines 137-141), with easy_fl log-uniform 0.1-1

    • Argument: The selection-aware likelihood is P(life starts within tau | success). The model gives the easy branch the limiting value 1, which is the likelihood at infinite rate, while the hard branch gets the properly conditioned 1-(1-tau)^(m+1), about 0.2. But 'easy' includes f_l as low as 0.1; if f_l below 1 reflects a finite rate (f_l = 1 - exp(-lambda*T), the Spiegel-Turner and SDO form the abiogenesis brief recommends), then conditional on success the start time is nearly uniform and the likelihood is about 0.25, no better than hard. This free pass is what lifts P(easy) from 0.50 to 0.69 and is most of the 'timing data' effect.
    • Proposed change: In the easy branch draw lambda from f_l and compute P(t < tau | success) from the density lambdaexp(-lambdat)*(1-t)^m (truncated at 0.25 in the pacing camp); or define 'easy' by rate with an explicit prior over lambda and keep f_l as a separate suitability fraction.
    • Expected effect: Non-SIA branch: P(abiogenesis easy) 0.69 falls to 0.38 (fully rate-limited) or 0.53 (half-way); alone-in-Galaxy 0.75 rises to 0.85 or 0.81; alone-in-universe 0.27 rises to 0.41 or 0.34; infeasible 0.15 falls to 0.08 or 0.11. SIA branch: no change (infeasible 0.83 either way).
    • Tested: expE2.py, n=2e6. Mean easy-branch likelihood under the rate-limited reading is 0.25 (10-90%: 0.10-0.43) against 1.0 in the model and 0.23 for the hard branch.
  10. [moderate] 'evidence' output (line 242) and any comparison of camps or schools by marginal likelihood

  1. [minor] SIA weight uses Nciv = (N_sun + N_M) * f_l * f_it (lines 146, 192); no host-star likelihood in either mode
  1. [minor] Pre-emption is modelled within one galaxy only (mu, line 156); no intergalactic reach

Code errors

Claims that survive

Missing explanations

Presentation advice

  1. Lead with what does not depend on anthropics: visible expanders per galaxy are far below 1 (a survey result), and the answer is therefore either 'technological civilisations are rare' or 'something stops all of them'. Explanations that need each civilisation to choose independently stay at or below 0.10 in every school.

  2. State the fork as one question the reader can answer: 'Does the fact that you exist count as evidence that observers are common?' No (existence is a precondition, SSA-minimal): rare 0.75, barrier 0.18. Yes (SIA / full non-indexical conditioning): rare 0.00, barrier about 1.0. A third reading, 'I am a random draw from all observers including our descendants' (SSA-broad, the Doomsday argument): rare 0.43, barrier 0.49, and expansion is closed to us.

  3. Show one 3-by-3 table (school by alone / universal barrier / independent choice), then the blend at 30, 50 and 70% credence in SIA: alone 0.49 / 0.34 / 0.21; barrier 0.46 / 0.62 / 0.77. Give the 50% row as the project's all-things-considered figure and say that is what it is. Fix the school credences as inputs; do not update them with the model's evidence values.

  4. Do not print a seven-way split under SIA. Print 'universal barrier about 1.0; which barrier is set by the prior' and show the grid (infeasible 0.35-0.97 depending on three switches and two floors).

  5. Add a second axis for every school, 'is expansion open to a civilisation like ours?': 0.66 (SSA-minimal), 0.14 (SIA), about 0 (SSA-broad). Drop the phrase 'filter behind us'.

  6. Say which evidence moves which column. Biosignatures, a second genesis and galaxy surveys move the SSA column. Only technosignature limits and settlement-feasibility arguments move the SIA column. No astronomical observation moves the credence between columns.

  7. Two sentences of caveat on SIA: it reaches near-certainty from the armchair (the presumptuous-philosopher objection), and the same reasoning favours simulated or cultivated observers. Two sentences on SSA: its answer depends on the reference class, and 'alone in the observable universe' needs a universe vastly larger than the observable one.

  8. Retire the label 'no anthropic update'; call it 'existence treated as a precondition'. Demote the Milky Way argument in the headline logic: in the model it carries no weight beyond the galaxy surveys.

Citations given from memory, not re-checked for this review: Neal 2006 (full non-indexical conditioning), Carlsmith 2021 ('SIA > SSA' series), Bostrom 2002 (Anthropic Bias, presumptuous philosopher), and the PhilPapers 2020 survey split on Sleeping Beauty (roughly 28% thirder, 19% halfer, the rest undecided), which is my basis for putting SIA-like views near 50% rather than treating either school as the default.

Critic: a statistician

Verdict. The qualitative logic is defensible, but the numerical headline is not. Every class posterior is a prior mass multiplied by a Bayes factor that never exceeds about 3: the seven published camps differ in marginal likelihood by at most 3.4, and a 400-draw joint scan over the modeller's own sensitivity ranges moves "alone in the observable universe" from 0.004 to 0.70 and "infeasible" from 0.007 to 0.74. Three specific claims are artefacts. The SIA split (0.82 / 0.14 / 0.04) is the ratio of three unevidenced prior point masses. "Independent restraint is crushed" comes from a hard 1e-4 floor on p_will plus the galaxy-survey term alone; the Milky Way term can be deleted with no change to three decimals. The base case's 50/50 abiogenesis mixture is the project's own "chemistry-optimist" prior, not agnosticism. What survives is the disjunction: rarity or a common-cause barrier holds at least 0.63 of the posterior everywhere in the scan, and at least 0.75 in 95% of it. The single most important change is to stop publishing one posterior vector and instead publish the likelihood each class receives, plus a table of what prior a reader must hold to reach each answer. All scratch code is in the critic’s working folder (core.py reproduces integrate.py exactly and exposes every likelihood term).

Critic’s own estimate of each answer: alone in the universe 0.17, alone in the Galaxy 0.4, handful first 0.07, late filter 0.05, restraint 0.08, infeasible 0.07, hidden 0.04, other 0.12. What “other” covers: Mechanisms outside the seven-way partition: settlement that is neither evident at Earth nor galaxy-dimming, synchronised late emergence, simulation-type scenarios, and model misspecification. These are judgement numbers. The data constrain them only through the gain rule: about 2.3 times prior for N-immune explanations and 0.02-0.3 times for independent-choice ones. I would not defend any entry to better than a factor of 2.

Objections

  1. [fatal] The SIA headline (infeasible 0.82, hidden 0.14, late filter 0.04); integrate.py lines 190-192 and the 'anthropic: SIA' sensitivity row. Fatal for that claim only, not for the model.

    • Argument: Under SIA the weight is proportional to Nciv, so all mass goes to hypotheses whose likelihood does not fall with N. The model has exactly three: infeasible (prior 0.15), stealth (0.03) and doom (0.03). The published split is their prior ratio: 0.15/(0.15 + 0.03*0.85) = 0.855 before the small doom share, against 0.82 reported. No data enter beyond eliminating everything else. The posterior median log10 Nciv is 8.4, at the prior's 99.9th percentile (8.7), so the answer is also set by the upper bounds of eta_earth and f_M_planets. This is the failure the anthropics brief warned of (guidance (c): under SIA the floor on q sets the answer); the published SIA literature (Olson & Ord, as summarised in that brief) gets a 1/q late-filter answer instead, because it has no infeasibility point mass.
    • Proposed change: Do not report an SIA class split as a result. Report that SIA eliminates rarity (robust) and that the split among the remaining explanations equals the prior odds among N-immune hypotheses, with a table of that split against (q_feasible, p_stealth, q_doom, p_will floor). If a number is kept, sample the Nciv > 1e5 tail directly (stratified or conditional sampling) instead of reweighting a prior sample.
    • Expected effect: The SIA row changes from three numbers to a range: infeasible 0.46-0.90, hidden 0.06-0.43, late 0.02-0.16, restraint 0-0.32 across the modeller's own sensitivity values.
    • Tested: SIA at n = 2M. Four seeds: infeasible 0.805-0.831, hidden 0.135-0.157, ESS 1,100-2,040. Top 100 samples carry 20% of the weight, top 1,000 carry 52%. p_stealth = 0.15 gives 0.541 / 0.425 (prior-ratio prediction 0.541). q_feasible = 0.97 gives infeasible 0.46, hidden 0.42, late 0.12. p_will floor 1e-12 gives restraint 0.32, infeasible 0.585. q_doom = 0.15 gives late 0.16. Script e6_sia.py.
  2. [major] The headline vector (0.27, 0.49, 0.05, 0.02, 0.01, 0.15, 0.02) presented as 'the posterior probability of each explanation'.

    • Argument: The data are worth a Bayes factor of at most about 3 on anything. Posterior/prior ratios by class are 1.18, 1.71, 0.76, 0.19, 0.04, 2.34, 2.32. The last two equal 1/evidence = 2.35: any hypothesis immune to the likelihood has its prior multiplied by about 2.3, whatever it is. Bayes factors on the binary knobs are feasible 0.42, doom 1.8, stealth 2.05, easy abiogenesis 2.2, no hard steps 0.35. The prior has median Nciv of about 0.6 and P(Nciv < 1) = 0.51, so 'alone in the Galaxy 0.75' is 0.51 times a factor of 2.9 on the odds. A quantity whose prior uncertainty spans 46 decades (5%-95%) and whose update is under half a decade does not have a posterior worth quoting to two figures.
    • Proposed change: Lead with the class-averaged likelihoods, which are the data's contribution: infeasible 1.00, hidden 0.99, alone-galaxy 0.73, alone-universe 0.50 (the timing penalty), handful 0.32, late filter 0.08, restraint 0.017. Then give posteriors as a function of the reader's prior (see presentation advice), with the base case as one row labelled 'modeller's judgement'. State the gain rule explicitly: a common-cause explanation gets about 2.3 times its prior; an independent-choice one gets 0.02-0.3 times.
    • Expected effect: No number moves. The claim changes from 'P = 0.27 / 0.49' to 'the observations favour rarity and universal barriers over common-plus-independent-choice by factors of 10-60, and cannot separate rarity from universal barriers by more than about 2'.
    • Tested: Decomposed the base run (core.py): class-mean L1, L1*L2, L3 and timing terms as quoted. Evidence ratio across the seven published camps: max/min 3.36 (expansion sceptic 0.755 against optimist 0.225). Across the 400-draw scan: evidence 0.21-1.19, with 5%-95% of 0.32-0.91.
  3. [major] Headline (3), 'explanations that rely on each civilisation independently choosing restraint are crushed by the numbers'; p_will = (1e-4, 1) and p_surv = (1e-2, 1), integrate.py lines 58-59.

    • Argument: The prior widths are asymmetric. The early links get hierarchical lower bounds (abiogenesis up to 100 decades, five steps of up to 12 decades each); the late links get hard floors of 4 and 2 decades. The filter lands early largely because that is where the prior volume is. The 1e-4 floor is a judgment tag in the briefs, not a measurement, and gaps item 10 already flags it as decisive. A between-world spread in p_will is also the natural way to represent convergent restraint, which the iid floor rules out by construction.
    • Proposed change: Give p_will and p_surv the treatment given to f_l: log10 p ~ U(-B, 0) with B log-uniform, for example on (2, 30). Report restraint and late filter on a grid of (p_will floor, survey strength). Word the claim as conditional: 'if fewer than 9,999 in 10,000 civilisations abstain, then...'.
    • Expected effect: Restraint rises from 0.010 to 0.06-0.29; alone-in-Galaxy falls from 0.75 to 0.52-0.70; infeasible falls from 0.148 to 0.10-0.14. With both late links hierarchical on (2, 30): late 0.14, restraint 0.14, alone 0.53.
    • Tested: B ~ logU(2,12): restraint 0.061. (2,30): 0.166. (4,30): 0.206. (4,100): 0.286. Both links (2,30): alone-universe 0.174, alone-galaxy 0.360, handful 0.086, late 0.143, restraint 0.137, infeasible 0.097. Marginal likelihood rises from 0.43 to 0.54-0.66, so the data mildly prefer the wider late prior. Grid of p_will floor (1e-2 to 1e-12) by survey strength (0 to 1e5): restraint 0.001-0.32. Scripts e5_latewidth.py, e9.py.
  4. [major] L1 and L2, integrate.py lines 162-163; p_harvest = (0.03, 1) at line 62; N_surveyed_warm and N_surveyed_cold as hard numbers at lines 64-65.

    • Argument: Headline step (1), the Milky Way argument, does no numerical work. Because N_surveyed * p_harvest is at least 60 and usually above 3,000, exp(-S*mu) swamps exp(-mu); deleting L1 leaves every class unchanged to three decimals. The inference rests wholly on the survey term, which rests on p_harvest: the probability that a settled galaxy has at least 75-85% of its starlight intercepted, given a floor of 0.03 and median 0.17, with no source in any brief. A galaxy with a settlement at every star is not thereby a Kardashev-III galaxy. The counts are also zero-detection Poisson terms. N_surveyed_cold = 2,000 implies a 95% limit of 0.15%, but the tf_kiii study's stated limit is 1.8% (20 unresolved candidates of N_eff 1,593; it explicitly does not claim the 0.19% floor) and fp_kiii's is 0.29% for early-type galaxies with 23 unexplained outliers. The zero-count equivalents are about 170 and about 1,000. L1 also assumes a filled galaxy would be evident at Earth with probability exactly 1.
    • Proposed change: (a) Replace p_harvest with a prior over intercepted fraction f combined with the limit curve in gaps section 7 (1.2e-6 at full coverage, 3e-5 at 10%, 1e-3 at 1%), plus an explicit mass on 'settles but never harvests most starlight'. (b) Use binomial likelihoods with the unresolved candidates as unknown background; set N_cold to about 170 for discs. (c) Add p_evident to L1. (d) Report three columns: Milky Way only, plus warm surveys, plus cold.
    • Expected effect: Milky Way term only: alone 0.61, handful 0.114, restraint 0.121, infeasible 0.108. With survey strength S = N*p_harvest: restraint 0.108, 0.071, 0.035, 0.013, 0.006 at S = 1, 10, 100, 1e3, 1e4. Even with no galaxy surveys, alone-in-Galaxy stays at 0.61 and rarity plus universal barriers at 0.76.
    • Tested: 'L2 only' is identical to base to three decimals. 'L1 only': 0.194 / 0.418 / 0.114 / 0.031 / 0.121 / 0.108 / 0.013. Adding p_evident ~ logU(0.001,1) changes nothing with L2 present and raises restraint to 0.20 without it. N_cold = 170: restraint 0.017. p_cold_only = 1 with N_cold = 170: handful 0.100, restraint 0.054. Scripts e8.py, e9.py.
  5. [major] 'Base case (agnostic mixture)': w_easy = 0.5, w_pacing = 0.3, hard_step_decades = (2, 12), hard_m_weights; integrate.py lines 40-51.

    • Argument: A 50/50 two-point mixture is a strong informative prior, not agnosticism. w_easy = 0.5 puts half the mass on one decade of f_l (0.1 to 1) and the rest on up to 100 decades. The abiogenesis brief's baseline (log-uniform to 1e-30) has prior P(fast) = 0.09, and 0.5 corresponds to its 'chemistry-optimist' floor of 1e-3. That choice is worth roughly 10:1 in prior odds, more than all the data in the model. The base case then gives P(easy | timing) = 0.81 against the brief's posterior of 0.33 (0.13-0.82). The brief's 'central 0.35' is already a posterior after the early-life datum, so adopting anything near it as a prior and applying L_early double counts. The f_i prior also departs from the evolution brief without stated reason: that brief gives steps of U(0,3) dex with a 1/m! factor (sensitivity U(0,6)); the model uses up to 12 dex and no 1/m!. The two departures partly cancel, which makes the base case look more central than it is.
    • Proposed change: Rename the base case 'modeller's judgement'. Add named cases built from each brief's recipe. Publish the (w_easy, w_pacing) grid. Document the origin of each mixture weight and confirm none was derived from timing or the silence.
    • Expected effect: Abiogenesis-brief baseline (w_easy 0.106, A = 30): alone-universe 0.56, alone-galaxy 0.35, infeasible 0.05. Floor 1e-100: 0.86 / 0.11. Floor 1e-10: 0.18 / 0.61. Evolution-brief f_i recipe: alone-universe 0.18, alone-galaxy 0.46, infeasible 0.20; its 6-dex sensitivity: 0.22 / 0.63 / 0.08. Grid of w_easy (0.1-0.99) by w_pacing (0.1-0.9): alone-in-Galaxy 0.23-0.91, infeasible 0.05-0.58.
    • Tested: All runs in e10.py. Alone-in-Galaxy falls below 0.5 only when w_pacing is 0.7 or more and w_easy is about 0.7 or more, at q_feasible = 0.85.
  6. [major] The SENSITIVITY dictionary (one parameter at a time), integrate.py lines 265-289, and any statement of ranges drawn from it.

    • Argument: One-at-a-time variation understates the range by a large factor. The table shows alone-universe 0.16-0.50 and restraint at most 0.12; the joint space gives 0.004-0.70 and up to 0.31. Which class is modal changes across the space. The additive logit model fits well (R-squared 0.85-0.92) for every class except alone-galaxy (0.63), so the issue is compounding more than exotic interactions, but a reader shown only the one-at-a-time table would badly underestimate it.
    • Proposed change: Publish a global scan with quantile bands per class and a ranked driver table. Standardised logit coefficients from my scan: alone-universe on A +0.64, w_easy -0.64, D +0.57; infeasible on q_feasible -0.70, w_pacing +0.49, w_easy +0.38; restraint on p_will floor -1.43; hidden on p_stealth +1.32; late on q_doom +0.79, p_surv floor -0.53.
    • Expected effect: Ranges (minimum, 5%, median, 95%, maximum): alone-universe 0.004 / 0.02 / 0.20 / 0.57 / 0.70. Alone-galaxy 0.09 / 0.18 / 0.35 / 0.55 / 0.75. Alone total 0.14 / 0.27 / 0.60 / 0.87 / 0.97. Infeasible 0.007 / 0.04 / 0.22 / 0.56 / 0.74. Restraint up to 0.31, late up to 0.30, hidden up to 0.21. Modal class: alone-galaxy in 50% of draws, infeasible 27%, alone-universe 23%.
    • Tested: 400 joint draws at n = 150k (minimum ESS 29,500) over w_easy 0.1-0.9, A 10-100, w_pacing 0.1-0.9, D 3-12, q_feasible 0.3-0.97, q_doom and p_stealth 0.003-0.3, p_will floor 1e-8 to 1e-2, p_surv floor 1e-6 to 0.1, p_harvest floor 1e-4 to 0.3, p_cold_only 0-1, f_rare floor 1e-4 to 0.3; every range appears in the modeller's own camps or sensitivity list. Corners: A = 10, D = 3 gives alone-universe 0.006; A = 100, D = 12 gives 0.56; optimist biology with q_feasible 0.5 gives infeasible 0.76; optimist biology with q_feasible 0.97 and p_will floor 1e-8 gives restraint 0.325 (modal). Scripts e4_scan.py, e12.py.
  7. [major] The point masses q_feasible = 0.85, p_stealth = 0.03, q_doom = 0.03 (integrate.py lines 55-61) and the 'infeasible 0.15' result.

    • Argument: The largest non-alone class is a prior point mass times 2.3; its posterior is linear in the prior (0.034, 0.148, 0.35 at q_infeasible 0.03, 0.15, 0.5). Two coherence failures follow. First, the behavioural brief defines its weights as P(main reason for the silence | at least 10 civilisations), which is already conditioned on the Fermi observation; using them as priors and conditioning again double counts, and gaps item 12 says they apply only after computing P(N >= 10). Second, the model's implied shares given Nciv >= 10 and the data are infeasible 0.75, hidden 0.09, doom 0.09, independent choice 0.08, against the brief's 0.25 (0.08-0.50) for impractical, about 0.18 for zoo and lurkers, 0.15 for short lifetimes and 0.20 for convergent choice. The brief's 'impractical or uneconomic' also includes economic choice, which is not universal, and the expansion brief states that 'interstellar travel is impossible' fails at 1e-4 to 1e-2 c.
    • Proposed change: Treat the brief's shares as a posterior-predictive target and solve for priors that reproduce them; publish that calibration. Split infeasible into physically impossible (universal) and uneconomic (a p_will-type parameter). Replace 'infeasible 0.15' with 'posterior is about 2.3 times whatever prior you hold'.
    • Expected effect: With q_infeasible 0.08, p_stealth 0.06, q_doom 0.06 and p_will floor 1e-6, the conditional shares become 0.36 / 0.13 / 0.20 / 0.31, close to the brief, and the table becomes alone-universe 0.25, alone-galaxy 0.48, handful 0.08, late 0.04, restraint 0.05, infeasible 0.07, hidden 0.03. Infeasible halves and stops dominating the non-alone options.
    • Tested: Script e11.py: base conditional shares as quoted, plus four alternative calibrations.
  8. [moderate] anthropic = 'none' as the neutral baseline, and 'alone in the observable universe 0.27'.

    • Argument: 'None' is not neutral: it treats Earth as outside the process the model describes. Within the alone-universe class the posterior median expected number of civilisations in the observable universe is 10^-8.3, with a quarter of the mass below 10^-19 and 5% below 10^-50. The 0.27 therefore assumes, without saying so, a universe at least 10^8 to 10^50 times larger than the observable patch, or else our existence is a fluke of that size. Ordinary conditioning on 'at least one civilisation arose' in a stated volume is neither SIA nor 'none' and gives a different answer.
    • Proposed change: Replace the two-way none/SIA contrast with three columns: (i) condition on existence within volume V, for V from the observable universe to effectively infinite; (ii) SSA with stated reference class; (iii) SIA. State the cosmological assumption behind the 0.27.
    • Expected effect: Alone-universe is 0.011 conditioning on at least one civilisation in the observable universe, 0.12 at 1e5 times that volume, 0.17 at 1e10, 0.22 at 1e20, 0.25 at 1e40. The mass moves mainly to alone-galaxy (0.65 in the first case) and infeasible (0.20).
    • Tested: Reweighted the base sample by 1 - exp(-NcivG10^k) for k = 0, 5, 10, 20, 40 (e10.py).
  9. [moderate] Class definitions, integrate.py lines 198-207: the threshold of 30, the 'handful_first' label, the late/restraint split p_surv <= p_will, and the content of 'alone_galaxy'.

    • Argument: (a) 'We are among the first' is false by construction: phi_early is 0.5-0.9, the posterior mean within the class is 0.70, and 46% of the class is infeasible-settlement worlds that fall there only because Nciv < 30. (b) The threshold of 30 is arbitrary and moves mass. (c) 'Late filter' is 96% the q_doom point mass; the remainder has median p_surv 0.04, which is not 'nearly all die'. The split compares two log-uniform priors of different width. (d) 65% of the alone-galaxy mass has at least one expander origin somewhere in the observable universe and 43% has at least a thousand. Overall P(at least one expander origin in the observable universe) = 0.39. The class labelled 'alone in the Galaxy' is largely the expanders-elsewhere scenario, with no intergalactic term to test it.
    • Proposed change: Classify by binding mechanism: which factor, if removed, would push mu above 1. Assign infeasible worlds to infeasible at any Nciv >= 1. Rename the handful class 'few, and none happened to expand'. Report P(expanders exist elsewhere in the observable universe) as its own line and add an intergalactic-reach likelihood (the gaps brief gives 1e-6 to 4e-6 per galaxy at 0.1c).
    • Expected effect: Moving the threshold from 3 to 1e4 takes handful from 0.020 to 0.125, infeasible from 0.165 to 0.095, restraint from 0.023 to 0.001. The alone boundary itself is harmless.
    • Tested: e8.py for thresholds and class contents. P(Nciv < 1) = 0.752 against the Poisson-realised E[exp(-Nciv)] = 0.739; moving the alone threshold over 0.1-3 moves alone total by 0.70-0.77.
  10. [moderate] Hypothetical future observations, integrate.py lines 175-188.

  1. [minor] Timing likelihoods and the hard-step prior, integrate.py lines 116-129 and 140.
  1. [minor] grabby.py posterior_summary (lines 101-103 and 132-141), and consistency between the project's three models.

Code errors

Claims that survive

Missing explanations

Presentation advice

  1. Replace the single posterior vector with three exhibits. (a) A likelihood table, which is the data's whole contribution: infeasible 1.00, hidden 0.99, alone-galaxy 0.73, alone-universe 0.50, handful 0.32, late filter 0.08, restraint 0.017, with the statement that no camp is favoured over another by more than 3.4. (b) Quantile bands from a joint scan (5%-95%): alone-universe 0.02-0.57, alone-galaxy 0.18-0.55, infeasible 0.04-0.56, late 0.003-0.15, restraint 0.001-0.16, hidden 0.001-0.06. (c) A 'what you must believe' table:
  1. State the gain rule in the text: common-cause explanations get about 2.3 times prior; independent-choice ones 0.02-0.3 times.
  2. Say plainly that the galaxy-survey null, not the Milky Way argument, carries the inference in the model, and show Milky-Way-only results beside it (alone 0.61, restraint 0.12).
  3. Rename the base case 'modeller's judgement' and add rows built from each brief's own recipe.
  4. Give three anthropic columns (existence within a stated volume, SSA, SIA) and label the SIA split as prior odds, not a finding.
  5. Claims safe to make: the rarity-or-common-cause disjunction; fewer than about 1e-2 to 1e-5 visible expanders per galaxy, conditional on the harvest assumption; timing matters modestly; anthropics is the largest lever. Claims to withdraw or reword: any two-figure class probability; the ranking among alone-universe, alone-galaxy and infeasible; 'restraint is crushed'; the SIA split; 'we are among the first'.

Critic: an expansion sceptic

Verdict. The ordering (rarity first, expansion barriers second) is defensible from this lens, but the headline numbers and two of the five logic steps are not. Three things I measured carry the conclusion and none is disclosed: (a) the Milky Way "Fact A" term is inert (switching L1 off leaves every class unchanged to three decimals), so everything rests on galaxy surveys plus the assumption that at least 3% of settled galaxies get 75-85% shrouded; (b) "restraint is crushed" is an artefact of a 1e-4 floor on a shared expansion rate (restraint goes 0.01 -> 0.10 -> 0.22 -> 0.32 as the floor goes to 1e-8, 1e-12, 1e-20); (c) the infeasible posterior is exactly its prior divided by the evidence (0.063/0.426 = 0.148, mean likelihood in class 0.99), so 0.15 / 0.02 / 0.02 is the hand-entered 0.15 / 0.03 / 0.03 passed through. Under the priors I would defend, "alone in the Galaxy" falls from 0.75 to about 0.50-0.58 and expansion barriers of all kinds (hard, soft, unnoticed) rise from 0.16 to about 0.35. The single most important change is to replace the binary q_feasible and the floors on p_will and p_harvest with one explicit, continuous treatment of whether a settlement wave is self-sustaining, persistent and evident, split by mode (biological settlers versus machines), and to report an ablation table showing which likelihood term does the work.

Critic’s own estimate of each answer: alone in the universe 0.17, alone in the Galaxy 0.36, handful first 0.07, late filter 0.02, restraint 0.08, infeasible 0.22, hidden 0.01, other 0.07. What “other” covers: Settled or probed but unnoticed, not deliberately hidden: sparse machine presence, settlers that skip Sun-like stars or living planets, or a past wave that has gone. 'Infeasible' here means self-propagating, persistent, evident galaxy-filling is not achieved by anyone (hard or soft barrier), not that interstellar travel is impossible.

Objections

  1. [major] Headline claim (3) and integrate.py lines 58-59, 153-156: p_will=(1e-4,1), p_surv=(1e-2,1), and the statement that independent restraint is 'crushed by the numbers'

    • Argument: The model does not implement independent per-civilisation choice. p_will and p_surv are drawn once per sample and shared by every civilisation in that universe; they are common rates with hard floors. With phi>=0.5 the floor on the per-civilisation expansion probability is 5e-7, and the survey term then forces Nciv below roughly 1 at prior medians. So 'crushed' means 'we forbade the shared propensity to be below 1e-4'. That floor has to hold the whole chain a sceptic disputes: someone launches, the first daughters become self-sustaining, each generation relaunches through ~36 doublings, the wave persists for Gyr, and it stays evident. There is zero empirical handle on that product, exactly as for abiogenesis, yet abiogenesis gets 5-100 decades of prior range and each hard step 2-12, while expansion gets 4, survival 2 and harvesting 1.5. Rarity wins partly because it was given far more log-space to live in. The label 'restraint by choice' is also wrong for this mass: most of it is 'feasible in principle, almost never sustained' (Stross-style economics, Landis-style stalling), which is a common cause, not a coincidence of cultures.
    • Proposed change: Give the late-stage product the same ignorance structure as the early factors: log10 p_will ~ U(-W, 0) with W log-uniform over about 2-30 decades (mirroring hard_step_decades), or at minimum quote the floor at 1e-4, 1e-8 and 1e-12 side by side in the headline table. Rename the class 'expansion possible but almost never sustained'. Drop the sentence that restraint is crushed by the numbers; replace with the conditional: it is excluded only if at least 1 in 10,000 capable civilisations becomes a permanent, evident, galaxy-filling expander.
    • Expected effect: Restraint/soft-barrier class rises from 0.01 to 0.10-0.32; alone-in-Galaxy falls from 0.75 to 0.50-0.67; infeasible falls slightly (0.15 to 0.09-0.12) because it has to share.
    • Tested: Scratch copy of integrate.py, n=400k. p_will floor 1e-6: restraint 0.039, alone total 0.72. Floor 1e-8: 0.098, 0.67 (matches the project's own sensitivity row). Floor 1e-12: 0.220, 0.57. Floor 1e-20: 0.317, 0.50. Symmetric-ignorance form W~LU(2,30): restraint 0.166, alone 0.62; W~LU(4,40): 0.230, 0.57.
  2. [major] Headline logic (1)-(2) and integrate.py lines 62, 162-163: L1 = exp(-mu), L2 = exp(-N_surv * p_settled * p_harvest), p_harvest=(0.03,1)

    • Argument: Two unexamined 'evidentness' assumptions do all the work. First, L1 assumes a settled Galaxy is evident in the inner Solar System today with probability exactly 1. Second, L2 assumes every universe has at least a 3% chance per settled galaxy of 75-85% starlight interception, with no option that nobody builds galaxy-wide shrouds. I checked which one matters: with L1 switched off entirely the posterior is identical to three decimals. The Hart argument that the report leads with is decorative; the operative premise is 'settlement implies Kardashev-III harvesting at least 3% of the time', which is the most extravagant extrapolation in the chain (every daughter of every daughter, 1e11 times, builds a full swarm). The posterior demands mu below 1e-3 (P(mu>1e-3 | feasible, not stealth) = 0.011 against a prior 0.47), a thousand times stricter than Fact A. The sceptic's point is that feasibility and evidentness are anticorrelated across modes: biological settlers who claim habitable planets would be evident here but are the mode least likely to be feasible; machine probes or sparse outposts are the mode most likely to be feasible but would not harvest starlight and are not excluded locally (the project's own behavioral brief cites Lazio 2026 that artefact limits are 'extremely crude', Haqq-Misra & Fauchez 2022 on settlers skipping Sun-like stars, and Carroll-Nellenback 2019 on steady states with Earth unvisited). The model multiplies the favourable marginal of each (feasible 0.85, evident 1.0). The only home for 'present but not evident' is p_stealth, labelled 'deliberately hidden', which conflates a zoo with mundane non-detection.
    • Proposed change: (i) Add p_here = P(a settled Galaxy has an evident presence in the inner Solar System now); L1 = 1 - p_settled * p_here. (ii) Add a universal Bernoulli q_noharvest (nobody shrouds most of a galaxy) alongside the continuous p_harvest. (iii) Split feasibility by mode: q_bio (planet-claiming settlers, p_here = 1) and q_mach (machine expansion, p_here log-uniform 1e-3 to 0.3). (iv) Add an eighth class, 'settled or probed but unnoticed (not deliberate)'. (v) Publish the L1/L2 ablation.
    • Expected effect: A new class of 0.07-0.21 appears; alone-in-Galaxy falls to 0.50-0.66; P(another civilisation in the Galaxy now) rises from 0.07 to 0.14-0.26. p_here alone changes nothing; it only bites together with q_noharvest, which is itself the finding.
    • Tested: L1 off: 0.264/0.488/0.054/0.019/0.010/0.147/0.018, identical to base. L2 off, L1 on: alone 0.61, handful 0.113, restraint 0.115. Both off: alone 0.42, unnoticed 0.30. p_here LU(0.03,1) alone: no change. With q_noharvest 0.2 / 0.5 / 0.8: unnoticed 0.074 / 0.154 / 0.209, alone 0.66 / 0.565 / 0.50. Mode split (q_bio 0.3, q_mach 0.85) + q_noharvest 0.5: unnoticed 0.147, alone 0.59.
  3. [major] integrate.py line 55: q_feasible=0.85 tagged [STUDY flyby]; class 'infeasible'

    • Argument: 0.85 is not derived from anything and the data never touch it. The infeasible posterior equals prior class mass over evidence (0.0631/0.4255 = 0.148); mean likelihood inside the class is 0.992. The [STUDY flyby] tag is misleading: that study has no report, and its simulator (settle_sim.py) has no failure probability, no settlement mortality, no settleable fraction and unlimited launches, so the reproduction number is infinite by construction. It measures kinematics, not feasibility. Its fast cases also assume 30 km/s flights of 0.5-5 pc, i.e. missions of 16,000-163,000 years, against a demonstrated hardware life of about 50 years. What 'feasible' must mean is that a settlement produces more than one launch-capable daughter in its lifetime (R0 > 1), for dozens of generations. I built R0 from sub-factors using the flyby study's own encounter rates (0.0718 systems/pc3, 11.1 passages/Myr within 1 pc, 12% of flux below 30 km/s): P(R0>1) is 0.09 with sceptical priors for biological settlers, 0.05 for Voyager-speed-only, 0.47 for middling priors and 0.98 for Hart-Tipler machines. So 0.85 is the machine-optimist corner, and that is the mode with the weakest observability. The class label also contradicts the project's expansion brief, which says 'interstellar travel is impossible' fails at 1e-4 to 1e-2 c; what can be defended is 'self-propagating, persistent, evident galaxy-filling is not achieved by anyone'.
    • Proposed change: Remove the study tag. Either derive the prior from an explicit R0 decomposition (range, encounter rate, settleable fraction, mission success, relaunch probability, settlement lifetime) or state it as a judgement with range 0.3-0.9. The prior I would defend for 'evident, self-sustaining, galaxy-filling settlement is achievable': 0.5 (0.3-0.7) as a single number, or q_bio = 0.3 and q_mach = 0.85 if split by mode. Relabel the class.
    • Expected effect: q_feasible 0.7 / 0.5 / 0.3: infeasible 0.25 / 0.35 / 0.42, alone-in-Galaxy 0.65 / 0.56 / 0.49. Under SIA with 0.5: infeasible 0.96-0.97.
    • Tested: Runs above on the unmodified model. R0 Monte Carlo (2e6 draws) in t5.py: sceptic-biological median log10 R0 = -3.7 (sd 2.8), P(R0>1) = 0.09; middle -0.24, 0.47; Hart-Tipler machines +5.2, 0.98. The priors in that decomposition are my judgement, not literature values.
  4. [major] integrate.py lines 55-61: the three universal-barrier Bernoullis q_feasible (complement 0.15), q_doom=0.03, p_stealth=0.03, and the SIA headline 0.82 / 0.14 / 0.04

    • Argument: The split among universal barriers is input, not output. Late filter posterior 0.0189, of which 0.0183 (97%) is the doom Bernoulli; infeasible is prior/Z; hidden likewise. The base 0.15/0.02/0.02 and the SIA 0.82/0.14/0.04 are both the hand-entered 5:1:1 after normalisation. Presenting the SIA split as a result is misleading. Are the relative priors defensible? From this lens: an infeasibility or cost barrier needs no coordination and is shared by construction, so it deserves the most; a universal doom with survival 1e-12 to 1e-5 has no mechanism (the longevity brief finds human-calibrated risk supplies 0.1-1 dex and that a civilisation-ending AI would itself expand), so 0.03 is at the generous end; a universal convention of invisibility requires prior expansion plus a single permanent hegemon, which Forgan 2011/2017 (as cited in the behavioral brief) says usually fails, so 0.03 for the deliberate version is also generous. Missing entirely is a fourth universal term: expansion feasible but convergently not pursued (no trade, no return, sustainability limits, inward-turning post-biological optimisation). The behavioral brief gives sustainability 0.12 and inward turn 0.08 conditional on N>=10, and 'logistic' only 0.25, whereas the model conditional on Nciv>=30 puts 76% on infeasible and 5% on restraint. The model overrides its own evidence brief without saying so.
    • Proposed change: Priors I would defend: evident galaxy-filling settlement achievable 0.5; q_doom 0.02; deliberate stealth 0.02; add q_converge about 0.1-0.2 (or fold it into the continuous soft-barrier term). State in the report that universal-barrier shares are prior ratios times P(civilisations common), and present the SIA split as conditional on those ratios.
    • Expected effect: With 0.5 / 0.02 / 0.02: alone 0.19 + 0.37 = 0.56, handful 0.07, late 0.005, infeasible 0.35, hidden 0.005. Same under SIA: infeasible 0.97, hidden 0.02, late 0.005. Adding q_converge 0.1 or 0.2 to the base model instead: barrier class 0.21 or 0.26, alone 0.69 or 0.64.
    • Tested: All four runs done on the unmodified model (n=400k; SIA n=2e6, ESS about 3,000 so SIA figures are good to roughly +/-0.02). Class composition from a patched copy that exports the Bernoulli flags.
  5. [moderate] The binary treatment of feasibility (integrate.py line 150, p_exp = 0 or p_surv*p_will)

    • Argument: Between 'impossible for anyone' and 'at least 1 in 10,000 fill the Galaxy' there is nothing. The physically meaningful variable is continuous: the reproduction number of settlements and the reach of a wave that stalls. Sub-critical waves give bounded bubbles of perhaps 10-1e4 systems (Landis 1998; Galera et al. 2019 as cited in the expansion brief); the chance the Sun lies in one is Nciv * n_bubble / 1e11, negligible for most of the prior, so 'common but short-range' explains the silence without any impossibility claim and predicts something different from hard infeasibility (local technosignatures, probes). In fairness I tested whether a continuous version helps my camp automatically. It does not: with a universe-level log10 R0 ~ N(0.5, 1.5) and 0.5 dex scatter between civilisations, the barrier classes shrink and alone rises, because scatter lets the best civilisation be super-critical. The sceptic needs heavy lower tails (R0 below about 0.01 for everyone), which is what a product of five or six uncertain factors gives (sd 2.5-3.2 dex in my decomposition) but must be argued, not assumed.
    • Proposed change: Replace q_feasible by a sampled log10 R0 (universe-level, built from sub-factors) plus civilisation-level scatter; p_super = P(R_civ > 1) x branching-survival; add bubble reach for R0 < 1. Report P(R0 > 1) and the result for narrow and wide tails.
    • Expected effect: Depends on the tail: N(0.5,1.5): alone 0.80, soft barrier 0.06, hard infeasible 0.03 (residual 3%). N(0,2): alone 0.73, soft barrier 0.14. With the sceptic-biological decomposition (P(R0<1e-4) = 0.46) the barrier mass would exceed the current 0.15 by a factor of two to three.
    • Tested: run2.py options R0_prior=(0.5,1.5), (1,1.5), (0,2) with q_feasible raised to 0.97: results as quoted. The third case was not run through the integrator; it is inferred from the tail fractions.
  6. [moderate] Implicit permanence in L1 and L2: a galaxy filled once is evident for ever (integrate.py lines 156-163)

    • Argument: The same billions of years that give time to fill give time to vanish. mu counts every expander that ever had enough head start, with no term for whether its presence, or its shroud, still exists when we look. The expansion brief itself says Fact A properly reads 'no persistent settlement in 4.5 Gyr and no visit in the last roughly 1-10 Myr' (Schmidt & Frank 2018), and Kipping & Lewis 2024 frame occupation as a birth-death balance. The standard reply, that 1e11 independent settlements cannot all die, assumes independence that the model denies everywhere else (it treats will, survival and harvesting as shared). After the frontier closes there is no selection for relaunching, so recolonisation of dead systems is not guaranteed. Replicator fidelity matters here, over 1e3-1e6 generations, not during the 36-doubling fill.
    • Proposed change: Sample a persistence time T_p for the wave (log-uniform 1e6-1e10 yr) and multiply mu and p_settled by min(1, (T_p + 10 Myr)/T_head), with T_head the head start (1-5 Gyr).
    • Expected effect: Modest alone, larger in combination: handful 0.054 -> 0.078, restraint 0.010 -> 0.036, alone 0.75 -> 0.72. With T_p down to 1e4 yr: 0.085, 0.046, 0.71.
    • Tested: run2.py option T_persist=(1e6,1e10) and (1e4,1e10), n=400k.
  7. [moderate] integrate.py line 60: phi_early=(0.5,0.9) tagged [STUDY headstart], and headline phrase 'Galaxy fill times under 1 Gyr'

    • Argument: phi is fixed independent of how the wave travels, and the cited study has no report yet. The project's own flyby tables show the under-1-Gyr claim is conditional. For ships that can only match stars passing below 30 km/s, the growth-limited time to 1e11 systems is 83 Myr at a 0.5 pc hop, 515 Myr at 0.2 pc, 2.1 Gyr at 0.1 pc, 8.2 Gyr at 0.05 pc and 52 Gyr at 0.02 pc; a 100 Myr relaunch delay pushes even a 0.5 pc hop to 1.0 Gyr. The study's own threshold is 0.144 pc (29,600 au). A 0.1 pc hop at 30 km/s is already a 3,300-year flight. So Voyager-speed diffusion fills the Galaxy in time only for flights of several thousand years or more with perfect success and immortal settlements. From memory, Carroll-Nellenback et al. 2019 assume a probe range of about 10 light-years, i.e. roughly 100,000-year flights at 30 km/s; I did not re-verify that.
    • Proposed change: Sample hop range and relaunch delay, interpolate T_fill from the flyby kinetic table (rendezvous-limited case) plus about 300 Myr crossing, and set phi = P(head start > T_fill) from the head-start distribution. Report the hop range below which the time argument fails.
    • Expected effect: Hop prior LU(0.02,5) pc: 23% of worlds have phi < 0.05; restraint 0.01 -> 0.09, late 0.02 -> 0.04, alone 0.75 -> 0.66. Hop floor 0.05 pc: restraint 0.016, otherwise unchanged. Hop floor 0.2 pc: no change at all.
    • Tested: run2.py option phi_from_fill with the dv<30 km/s table transcribed from studies/flyby/data/report_tables.md; head starts taken as N(1.8, 1.9) Gyr, which is my assumption.
  8. [moderate] Classification and camps: integrate.py lines 198-210 and CAMPS 'Expansion sceptic'

    • Argument: (a) 'A handful; we are among the first' is 47% worlds where settlement is infeasible (0.025 of 0.054) and only 38% genuine firstborn worlds (feasible, no doom, no stealth: 0.020). The label tells the reader something the samples do not say. (b) The late/restraint split is p_surv <= p_will, a comparison of two unrelated continuous draws; it has no physical meaning and makes the 0.02 versus 0.01 split arbitrary. (c) The 'Expansion sceptic' camp changes q_feasible to 0.3 and also sets w_easy=0.8 and w_pacing=0.7, so its 0.69 for infeasible is mostly the biology optimism; with q_feasible=0.3 alone the answer is 0.42. Every late-stage camp is confounded the same way. (d) 'Infeasible' is applied only when Nciv >= 30, so the reader cannot recover P(settlement infeasible), which is 0.30 in the base case.
    • Proposed change: Classify by the binding cause, not by Nciv thresholds: for Nciv >= 1, assign to infeasible/doom/stealth whenever that flag is set, and reserve 'among the first' for worlds where none is. Merge late and restraint into one 'soft late barrier' class or split by which factor is below the 3/N threshold. Run each camp with only its own lever changed, and separately with the biology change.
    • Expected effect: Handful drops to about 0.02-0.03; infeasible rises to about 0.17-0.18; no change to the alone classes. The sceptic camp row should read infeasible 0.42, alone 0.49.
    • Tested: Patched copy exporting feasible/doom/stealth flags (t4.py); q_feasible=0.3 alone run in t1.py.
  9. [minor] integrate.py lines 63-65: N_surveyed_cold=2.0e3, p_cold_only=0.2, and the 85% versus 'most' threshold

    • Argument: exp(-2000 p) treats the temperature-independent searches as zero candidates in 2,000 galaxies. The Tully-Fisher study reports 20 unresolved candidates in N_eff 1,593 and a 95% limit of 1.8% at f >= 0.75, equivalent to a zero-count sample of about 170; its 0.19% floor is explicitly 'NOT claimed as a result'. The fundamental-plane study gives 0.29% (about 1,000 equivalent) but for early-type galaxies, with f above about 0.93 unconstrained. The Milky Way analogue is a disc. Also p_harvest is defined as 'most of its starlight intercepted' while the warm limit applies at 85% reprocessing; Griffith et al. found 50 galaxies above 50%.
    • Proposed change: Use about 170 for discs (or a Poisson term with the 20 candidates and an unknown background), keep about 1,000 only for early types, and define p_harvest at the survey threshold.
    • Expected effect: Small in the base case (restraint 0.010 -> 0.018, handful 0.054 -> 0.059); larger if harvesters are cold: with p_cold_only=1, handful 0.099, restraint 0.054, alone 0.69.
    • Tested: N_surveyed_cold=170 with p_cold_only 0.2 and 1.0, and with p_harvest floor 1e-4 (handful 0.108, restraint 0.089).
  10. [minor] The infeasible class has no observable consequence in the model (L3, lines 166-170, and the 'future' block)

Code errors

Claims that survive

Missing explanations

Presentation advice

Lead the barrier discussion with an ablation table, not the Hart argument: base; Milky Way term off (no change); galaxy-survey term off (alone 0.61); both off (alone 0.42). That tells the reader honestly that the conclusion rests on the absence of shrouded galaxies plus an assumption about how often settlement leads to shrouding. Say in plain words that the shares of the universal-barrier classes are the input priors divided by the evidence, and show them as a prior-to-posterior pair (0.063 -> 0.148 for infeasible, likelihood 0.99) so nobody reads 0.15 versus 0.02 as a finding; do the same for the SIA split. Replace 'crushed by the numbers' with the conditional statement and a one-line table of the will floor (1e-4, 1e-8, 1e-12 -> 0.01, 0.10, 0.22). Rename three classes: 'infeasible for anyone' to 'galaxy-filling settlement is not sustained by anyone'; 'restraint by choice' to 'possible but almost never sustained'; and split 'hidden' into deliberate and merely unnoticed. Report P(settlement infeasible) = 0.30 directly, since the class definition hides it behind an Nciv >= 30 cut. Give the reader one two-dimensional sensitivity figure: prior on the barrier (0.1 to 0.7) against the will floor (1e-4 to 1e-20), shaded by P(alone in Galaxy); from my runs it spans roughly 0.75 down to 0.45. Flag every parameter tagged with a study that has no report yet.

Critic: a believer in expanding aliens (Robin Hanson’s “grabby aliens”)

Verdict. Headline steps (1) and (3) survive and get stronger on a cosmological footing, but the class numbers do not. integrate.py only counts expanders born in the Milky Way; using grabby.py's own kernel, an expander born anywhere within about 2e5 galaxies (0.1c) to 3e7 galaxies (0.5c) would already be here, so 15-44% of the "alone in the Galaxy, not the universe" mass (0.49) sits in worlds that contradict our being unreached. The one world the expansionist school actually predicts (expanders en route, at least 1% of cosmic volume taken) has no class and is hidden inside that 0.49 at about 0.09 on the project's priors (0.15-0.4 under conditions below). Step (4) is wrong as stated: the strongest timing datum, our cosmic date and host star, is computed in grabby.py and never enters integrate.py; when it does, P(M-dwarf planets habitable) falls from 0.25 to 0.02, and a positive M-dwarf result would cut "alone in the universe" from 0.27 to about 0.03 instead of leaving it unchanged. The printed Bayes factor of 25,000 is not evidence for grabby aliens, and the split among infeasible / doom / hidden, including the whole SIA headline, reproduces three hand-set prior atoms. The single most important change is to merge the two scripts: give every sample a cosmic occupancy x and a birth-date likelihood, run two internally consistent anthropic branches, and redefine the classes by occupancy. All test scripts are in the critic’s working folder (ext.py reproduces the base case to four decimals).

Critic’s own estimate of each answer: alone in the universe 0.33, alone in the Galaxy 0.41, handful first 0.04, late filter 0.06, restraint 0.01, infeasible 0.07, hidden 0.04, other 0.04. What “other” covers: Outside the taxonomy (simulation, unknown physics, model misspecification). Note that about 0.15 of my alone_galaxy 0.41 is the grabby universe: expanders exist elsewhere, hold at least 1% of cosmic volume and are en route. It deserves its own class.

Objections

  1. [major] integrate.py lines 154-163 (mu, L1, L2) and the alone_galaxy class at 0.49: each galaxy is a closed system, intergalactic expansion is absent, and the 'Fast-expander origin rate' row in gaps_and_corrections.md section 7 was never implemented

    • Argument: Olson, Hanson et al. 2021, Kipping 2026 and Armstrong & Sandberg 2013 (the last from memory; the brief also marks it unverified) all treat expansion as not stopping at a galaxy's edge. L1 = exp(-mu) counts Milky-Way-born expanders only. With grabby.py's own occupancy kernel, the number of Milky-Way equivalents whose expanders would have reached us by now is 1.3e5-3.0e5 at 0.1c and 1.6e7-3.7e7 at 0.5c, which reproduces Kipping's half-fill rate of 1e-6 to 4e-6 per galaxy at 0.1c. So the real ceiling on expander origins per galaxy is about 1e-6 x (0.1c/v)^3, not 1 (L1) or 3e-5/p_harvest (L2). The class is therefore partly incoherent, and bimodal exactly as Kipping & Lewis argue: most of its mass is either an essentially empty universe or one already overrun.
    • Proposed change: Per sample, draw q_ig = P(intergalactic feasible | interstellar feasible), about 0.8, and v (uniform 0.1-0.99c, or log-uniform 0.01-0.99c). Compute x = Nciv x p_exp x N_reach(v), with N_reach = 2.88e5 galaxies/Gly^3 x v^3 x V_eff and V_eff = K0 / integral of g to date from grabby.occupancy_kernel (450-1040 Gly^3 for Sun-like hosts). Multiply the weight by the non-arrival term: exp(-x) in the model's own convention, or like_time(x)/like_time(0) under origin-date SSA. Let 'hidden' be satisfied by x >= 1, so stealth arrivals can come from another galaxy.
    • Expected effect: alone_universe 0.27 -> 0.32-0.34; alone_galaxy 0.49 -> 0.38-0.43, of which 0.07-0.10 is a universe already at least 1% occupied; handful_first 0.054 -> 0.04; restraint 0.010 -> 0.002; hidden 0.018 -> 0.035-0.047. 'Filter behind us' (0.75) overstates: the past filter alone suffices in only 0.46 (0.1c) or 0.37 (0.5c) of the posterior.
    • Tested: t1.py, base posterior. Share of alone_galaxy mass with x >= 1 if intergalactic expansion works: 0.15 at 0.1c, 0.37 at 0.5c, 0.44 at 0.9c; share with 0.01 <= x < 1: 0.21, 0.17, 0.15. Reweighted with q_ig = 0.8: v = 0.1c gives 0.291/0.458/0.038/0.016/0.002/0.162/0.033; v uniform 0.1-0.99c gives 0.321/0.407/0.040/0.011/0.003/0.179/0.040; q_ig = 1 gives 0.338/0.382/0.036/0.009/0.000/0.188/0.047. P(Nciv x N_reach < 1) = 0.63, 0.46, 0.37, 0.35 at 0.01c, 0.1c, 0.5c, 0.9c, against P(Nciv < 1) = 0.75.
  2. [major] integrate.py has no cosmic birth-date / host-star likelihood (lines 127-144 are within-planet timing only; line 185-186 'mdwarf_alive' just multiplies by M_alive); headline step (4); the M-dwarf rows of the future-observations table

    • Argument: Hanson's earliness argument is a likelihood on our date. In the model's posterior, 82% of alone_universe and 69% of alone_galaxy mass has at least 3 hard steps (counting hard abiogenesis). In those worlds any long-lived host makes us early: grabby.py itself gives a no-expander rank of 8e-4 (n=3) to 8e-7 (n=6) if M dwarfs are habitable. integrate.py never uses this. Its posterior P(M alive) is 0.244 against a prior of 0.25, and 'M-dwarf planets shown habitable' moves no class by more than 1.2 points. The model takes the Carter bonus for hard steps (L_late up to 2.05) without paying the cosmic-date cost of the same assumption.
    • Proposed change: Multiply each sample's weight by the density of (birth at T0, Sun-like host) among all civilisation origins, from grabby.birth_law and occupancy_kernel, as a function of the sample's own n (hard steps incl. hard abiogenesis), host population and x. Tabulate once per (n, host scenario) on an x grid and interpolate. Drop or reduce L_late to avoid double counting.
    • Expected effect: With the project's priors the classes barely move (0.28/0.50/0.05/0.02/0.01/0.13/0.02 with birth date alone) but P(M alive) drops 0.25 -> 0.02. If M-dwarf habitability is established: alone_universe 0.27 -> about 0.03, alone_galaxy 0.48 -> 0.16, infeasible 0.16 -> 0.67, hidden 0.02 -> 0.11, P(no hard steps) 0.13 -> 0.80, expanders-en-route 0.15 (0.34-0.42 with a lower no-hard-steps prior or expansionist fate priors). M-dwarf habitability goes from irrelevant to the most decisive pending observation.
    • Tested: tables.py, t2.py. Birth-date density per Gyr, no expanders: M dead 0.044-0.077 (n = 1-6); M alive at 100 Gyr with weight 1: 3.3e-3, 3.6e-4, 3.3e-5, 2.9e-6, 2.4e-7, 2.0e-8 for n = 1-6; best case with expanders at x = 0.4-0.85: 0.008-0.014. Combined run with p_M_class = 1: 0.029/0.159/0.008/0.028/0.002/0.666/0.110, ESS 45k. Caveat: I used the nominal n and an unbroken power law; with saturation (see the Bayes-factor objection) the penalty is 100-1000x rather than 1e4-1e6, same direction. Pacing worlds are slightly over-credited (no host penalty applied).
  3. [major] grabby.py scenario list (line 159-167: every Sun-like host capped at T_sun = 8 Gyr; M dwarfs either dead or 100-1000 Gyr) and integrate.py p_M_class as a binary

    • Argument: The 'we are not early' baseline (rank 0.64-0.69) depends on giving all FGK hosts an 8 Gyr window. K dwarfs are about half or more of the FGK class and have main-sequence lifetimes of 17-40 Gyr (t proportional to M^-2.5); early M dwarfs above Kipping's 0.34 solar-mass cut live about 100 Gyr. The JWST atmosphere-loss evidence concerns late M dwarfs. So 'M dwarfs are dead' does not remove earliness for hard-step worlds; Hanson et al.'s own condition is fewer than 3 steps and lifetimes under 50 Gyr.
    • Proposed change: Replace the binary with a prior on a critical host mass (Kipping 2025b: above 0.34 solar masses at 2 sigma) and a habitable-window law T(M), capped by a planet-lifetime prior (5-20 Gyr, Hanson's L_max). Use the same host population in integrate.py's planet counts and in the birth-date likelihood.
    • Expected effect: With a K component (weight 1.5, window 15-20 Gyr) and M dwarfs dead: alone (both classes) 0.75 -> 0.55-0.60; infeasible 0.15 -> 0.28-0.33; P(no hard steps) 0.13 -> 0.28-0.34; expanders-en-route 0.09 -> 0.14-0.18 on project priors and 0.25-0.33 on expansionist fate priors. A lever comparable in size to the anthropic one.
    • Tested: t3.py, t5.py. No-expander rank: n=3 0.69 -> 0.25 (15 Gyr), 0.11 (20 Gyr), 0.034 (30 Gyr); n=6 0.64 -> 0.078, 0.014, 0.0012. G-host birth-date density at n=3: 0.064 -> 0.0026 (20 Gyr). Combined base with K at 20 Gyr: 0.169/0.380/0.040/0.022/0.003/0.325/0.061. The K-dwarf window and weight are my assumptions, not a literature value.
  4. [major] The three anthropic conventions in play: integrate.py 'none' (line 71, 172), integrate.py 'SIA' (line 190-192), grabby.py like_time (line 111); headline step (5) and the SIA result 0.82 / 0.14 / 0.04

    • Argument: 'None' treats Earth as a pre-selected site: non-settlement counts as ordinary evidence but our existence carries no weight. That is neither SSA nor SIA. grabby.py is SSA over civilisation origin dates. The SIA branch weights by Nciv. The earliness Bayes factor exists only under origin-date SSA: under SIA the normalising integral drops out and the date evidence is at most exp(-x). Separately, the SIA output is a readout of the prior atoms: SIA sends all mass to whichever hypotheses decouple civilisation count from expansion, and the split among them is the ratio of q_infeasible : p_stealth : q_doom (0.15 : 0.03 : 0.03), as Olson & Ord's 1/q reweighting predicts.
    • Proposed change: Run two complete branches. SSA (origin dates): weight = birth-date density given total occupancy (local plus cosmic) x P(none visible); L1 is replaced by that density. SIA: weight = Nciv x g(T0) x S(T0) x P(none visible), with no normalisation. In both, replace the atoms with a continuous prior on p_exp reaching 1e-20 or lower. Under SIA report P(some universal barrier or future filter), not the split.
    • Expected effect: SIA headline becomes 'a universal barrier or future filter is near-certain; which one is not identified'. Under SSA, L1 softens: the density ratio is 0.78 at x = 0.7 (exp(-x) = 0.50) and 0.116 at x = 3 (0.050), so handful_first and restraint rise by up to about 2x, from small bases.
    • Tested: t4.py, 3M samples. SIA base 0.822 infeasible / 0.136 hidden / 0.042 late (ESS 2,191). q_feasible = 0.97: 0.437 / 0.431 / 0.132. q_feasible = 0.97 and q_doom = 0.15: 0.297 / 0.267 / 0.436. All atoms at 0.001-0.003: 0.126 / 0.686 / 0.188 (ESS 87). Doom floor 1e-30: late 0.042 -> 0.110.
  5. [major] grabby.py posterior_summary line 141, 'bayes_factor_expanders_vs_none' (0.59 Sun-like; 35.6 at n=3; 25,212 at n=6; 2.5e10 for 1000 Gyr) and any conclusion drawn from it

    • Argument: Five problems. (a) It is conditional on a branch that the same likelihood disfavours: on date plus host, 'M dwarfs dead' beats 'M dwarfs alive plus expanders averaged over the script's prior box' by 24:1 to 218:1. (b) It is box-dependent: the Sun-like 0.59 is essentially the surviving fraction of a 7.5-decade prior on x. (c) The n=6 headline contradicts integrate.py: posterior P(6 hard steps in total) = 0.04; 23% of nominal 'hard' steps have p > 0.1 per window; of a mean 3.04 nominal steps only 1.80 remain hard over 100 Gyr. (d) The 1000 Gyr figure is the unbroken tau^(n-1) law extrapolated two decades past where it can hold. (e) like_time ignores that we orbit a Sun-like star, a factor 1 + w_M = 6 across scenarios.
    • Proposed change: Stop printing a Bayes factor. Export the like_time(x) table to integrate.py and report P(expanders hold at least 1% of the universe) per camp. Replace the pure power law with P(all steps done by tau) = product of (1 - exp(-r_j tau)), with r_j drawn from integrate.py's step prior. Condition on host class.
    • Expected effect: Replaces 'BF 25,000 for expanders' with an unconditional probability: about 0.09 on project priors, 0.15 on expansionist fate priors, 0.15-0.42 if M dwarfs are shown habitable, 0.14-0.33 with long-lived K dwarfs. At the model's own effective n of 2-3, the within-branch factor is tens, not tens of thousands.
    • Tested: From grabby_results.json rows: Sun-like BF 0.589 as coded, 0.770 if the box extends to 1e-12, 0.725 for x <= 1 only, 0.05 at v = 0.003c to 0.82 at 0.99c. n=6 scenario: maximum over grid 4.5e5, 14,089 with the extended box, 994 at 0.1c, 0.17 at 0.01c. Cross-scenario mean likelihoods: M dead 0.053-0.064 vs M alive plus expanders 0.0003-0.0022.
  6. [major] The three universal-barrier atoms: q_feasible = 0.85 (line 55), q_doom = 0.03 (line 56), p_stealth = 0.03 (line 61); the reported infeasible 0.15 against late filter 0.02

    • Argument: Posterior atom masses are 0.298, 0.052 and 0.059: each about twice its prior. The data do not discriminate between them, so 'infeasible 0.15 vs late filter 0.02' is the modeller's 5:1 prior restated. The 0.15 contradicts the project's own expansion brief ('impossible fails at 1e-4 to 1e-2 c'; a 300 Myr crossing at 30 km/s). Hanson's bound is conditional (transition chance under 1e-4 for even one other quiet civilisation ever in the Galaxy), and the cosmic sweep sharpens it to p_exp below about 5e-6/Nciv at 0.1c. That is below the model's non-doom floor of 1e-6, so worlds with neighbours can exist only through an atom. 'Doom' is also too narrow: any universal non-expansion attractor (extinction, permanent stagnation, lock-in) does the same work.
    • Proposed change: Set q_feasible to 0.95-0.97, defining infeasible as 'no self-sustaining settlement at any speed above 30 km/s for any substrate'. Widen doom to a universal non-expansion attractor with prior 0.10-0.15 and survival down to 1e-20. Better, replace the atoms and floors with one continuous heavy-tailed prior on p_exp. Report P(civilisations common and some universal barrier), about 0.19, as the robust number and label the split as prior.
    • Expected effect: infeasible 0.148 -> 0.030; late_filter 0.018 -> 0.109-0.116; other classes move by 0.01 or less.
    • Tested: t4.py. q_feasible 0.97 with q_doom 0.15: 0.275/0.502/0.055/0.109/0.011/0.030/0.019; with doom_surv 1e-20 to 1e-3, late = 0.116. The project's own sensitivity rows show the same (q_doom 0.2 gives late 0.108; q_feasible 0.97 gives infeasible 0.034).
  7. [moderate] p_surv = (1e-2, 1) and p_will = (1e-4, 1) (lines 58-59) applied to every civilisation including us; no output for humanity's own prospects

    • Argument: The fate parameters are the same for us as for anyone. The model therefore asserts, by prior alone, that a civilisation at our stage has a mean 1.9% (median 4e-4) chance of ever expanding and a mean 21% chance of surviving to the capability. Evidence never touches this in the 'alone' classes. That is a soft late filter of 2-3 orders of magnitude sitting under a headline that says late filter 0.02. The line 58 comment says 'human-calibrated: 0.3-0.97' while the prior is 0.01-1. Hanson's question ('are we almost past it?') should be an explicit output: if expansion is feasible and we are alone, we are the grabby ones.
    • Proposed change: Output P(humanity becomes a sustained expander), P(we are the first expanders in our reach volume) and 'orders of magnitude of filter still ahead'. Either calibrate the human-stage priors to the one observed case (p_surv 0.3-0.97; p_will 0.03-1, since expansionist factions already exist) or keep the wide prior and state its implication in the summary. The self-consistency test for 'alone, first, and about to expand' is the birth-date likelihood above.
    • Expected effect: With human-calibrated fate priors: alone_universe 0.27 -> 0.31, alone_galaxy 0.49 -> 0.44, handful 0.054 -> 0.037, restraint 0.010 -> 0.000, infeasible 0.15 -> 0.17, hidden 0.018 -> 0.029. Full expansionist camp in the combined model: 0.48/0.40/0.03/0.03/0.00/0.04/0.02, with expanders-en-route 0.15.
    • Tested: t4.py. Prior mean p_exp 0.0192, median 3.8e-4, P(p_exp > 0.1) = 0.051; posterior mean 0.0121. Mean p_surv 0.195 (prior 0.209). Within the alone classes: mean p_exp 0.0151, P(feasible) = 0.83. P(alone in Galaxy and we fill it) = 0.011.
  8. [moderate] Headline step (2) and L2 (line 163); grabby.py mu_det (lines 116-119), which assumes certain detection inside z_det; the 'P(v > 0.3c)' outputs

    • Argument: This is the Olson/Hanson selection effect. Given that we exist (x of order 1 or less), fast expanders are rarely visible. From the script's own rows at z_det = 0.1, the expected number of visible-but-not-arrived domains per unit x is 20 (0.1c), 4.4 (0.2c), 1.9 (0.3c), 0.62 (0.5c), 0.24 (0.7c), 0.06 (0.9c). So the survey null is worth at most about 3x at c/3 and 1.5x at c/2 beyond our own existence. L2 also has the wrong geometry: settled galaxies come in domains of 1e3-1e8, not independently with locally born settlers. And the two scripts disagree on detection: integrate.py lets p_harvest fall to 0.03 with 20% cold-only; grabby.py assumes 1.
    • Proposed change: Use one visibility module in both scripts: P(no detection) = exp(-p_vis x mu_det(v, z_det)), with p_vis from the covering-fraction curve in gaps section 7 and a prior on z_det of 0.03-0.3. Report the prior on the v grid next to every speed posterior. Restate step (2): 'for v below about 0.1c the surveys bound the origin rate; above about c/3 the bound is our own existence, under 1e-6 x (0.1c/v)^3 per galaxy'.
    • Expected effect: Class probabilities move by 0.01 or less. The speed claim weakens: P(v > 0.3c) 0.91 -> 0.65 (n=6) and 0.85 -> 0.61 (n=3); P(v <= 0.1c) 0.004 -> 0.15. In the Sun-like scenario 0.54 against a grid prior of 0.40 is almost no update.
    • Tested: Rows of grabby_results.json. P(see none | x = 0.7, z_det = 0.1) = 7e-6 (0.1c), 0.076 (0.2c), 0.33 (0.3c), 0.69 (0.5c), 0.87 (0.7c), 0.97 (0.9c). Re-ran the posterior with integrate.py's p_harvest and cold-only prior as the detection probability. Adding a visibility term to the cosmic run changed alone_galaxy from 0.407 to 0.404.
  9. [moderate] The seven-class taxonomy (lines 75-92, 196-207) and 'p_filter_behind_us'

    • Argument: (a) 'Handful; we are among the first' is 46% settlement-infeasible, 8% doom and 9% stealth; only 38% is anything like being first, and the model has no timing variable that could make us first. (b) 'Alone in the observable universe' uses 1e11 galaxies, but the physically relevant volumes are the reach volume (1e5-1e8 galaxies, depending on v) and the affectable universe (16.5 Gly comoving, under 5% of observable galaxies per Ord 2021). (c) The expansion brief lists 'expanders are fast and we are simply not yet inside one' as a surviving explanation, yet it has no class. (d) 'Filter behind us' is defined as Nciv < 1, which is not sufficient once neighbours' expanders can reach us.
    • Proposed change: Classes by cosmic occupancy: A, no other civilisation ever within our reach volume; B, others exist but no expander within reach (state why: low p_exp, intergalactic infeasible); C, expanders exist and hold at least 1% of the volume, not yet here, with a meeting-time distribution; D, universal barrier (infeasible / non-expansion attractor); E, here and hidden. Rename handful_first by its actual contents.
    • Expected effect: Presentation only. On the project's priors A is about 0.37-0.46, C about 0.09, D about 0.19, E about 0.04, B the remainder (about 0.25-0.3).
    • Tested: t4.py and the reach-volume script: handful_first composition 0.46 / 0.08 / 0.09 / 0.38. Old-taxonomy location of class C: 0.088 in alone_galaxy, 0.004 in late_filter, 0.001 in handful_first.
  10. [minor] L_late = m x^(m-1) and L_early (lines 129, 140) applied to every nominal hard step; hard_step_decades prior (line 51)

Code errors

Claims that survive

Missing explanations

Presentation advice

Lead with one axis: log10 of expander origins per galaxy, with the four thresholds marked: 1 (our Galaxy would be full), 3e-5 (galaxy surveys, slow visible expanders only), 1e-6 to 1e-9 (we would already be overrun, for 0.1c to near c), 1e-11 (none in the observable universe). Show where the posterior mass sits and relabel classes by cosmic occupancy, with 'expanders en route' as its own class and a meeting-time distribution. Report three numbers the current summary lacks: P(expanders hold at least 1% of the universe now), P(humanity becomes an expander) as the model implies it, and P(M-dwarf planets habitable) before and after the birth-date datum. Say plainly which results are prior restated: the infeasible / doom / hidden split, and the entire SIA split. Do not print the 25,000 Bayes factor; if grabby.py numbers appear, give the prior on speed next to every speed posterior. Present the anthropic branches as two complete, internally consistent models (origin-date SSA and SIA), and drop 'none' or label it as a pre-selected-site convention.

Critic: the code audit

Verdict. The code does what its model description says: my independent re-implementation reproduces the base case to within 0.0006 on every class, eight camp and sensitivity rows to within 0.002, and the SIA row within Monte Carlo noise. The headline is still weaker than presented, because the silence enters through one line only. Setting the Milky Way term L1 or the SETI term L3 to 1 in the original code changes no class by more than 0.0001, so the extragalactic survey term L2 and three hand-set numbers (1e5 galaxies, 2e3 galaxies, harvest probability >= 0.03) carry the whole update. The 'infeasible' and 'hidden' posteriors are their priors divided by the evidence (mean likelihood 0.996 and 0.987), and the SIA row is a ratio of three prior switches. The single most important change is to state this openly and replace line 163 with the covering-fraction limit curve and the studies' own corrected limits. Second is to fix the two future-observation rows (M dwarfs, HWO), which have real likelihood omissions. grabby.py is numerically converged, and sdo.py matches the published 52%, median 0.32 and mean 2.7e7, but gives 39.4% against the published 38%.

Critic’s own estimate of each answer: alone in the universe 0.2, alone in the Galaxy 0.44, handful first 0.06, late filter 0.03, restraint 0.04, infeasible 0.16, hidden 0.03, other 0.04. What “other” covers: Settled or visited but not evident without a universal convention (sparse or percolating settlement), and expanders beyond our horizon. Neither is representable in the current class set.

Objections

  1. [major] integrate.py lines 161-163, 170, 172 (L1, L2, L3) and headline logic steps (1)-(2)

    • Argument: The docstring says four observations weight each sample. Two of them are numerically inert. L1 (Milky Way not settled) can never bind, because L2 constrains the same mu at least 60 times harder (N_surv x p_harvest is at least 2e3 x 0.03) and typically 3e3 to 1e5 times harder. L3 (SETI) has L3 < 0.9 in only 0.05% of prior samples. So headline steps (1) and (2) are not two independent supports. The whole 'crushing' of restraint rests on line 163 and on N_surveyed_warm = 1e5, N_surveyed_cold = 2e3 and the p_harvest floor of 0.03. The existing sensitivity rows look robust only because each one varies a single number while the others still close the gap.
    • Proposed change: State in the report that the Fermi update is the extragalactic K-III null alone. Report 'L2 removed' as a co-headline, not a sensitivity row. Vary the three L2 inputs jointly. Either give L1 its own evidence probability (settled but not evident) or drop the claim that the empty Milky Way does work in this model.
    • Expected effect: No change to the base numbers. With L2 removed: alone 0.75 -> 0.61, restraint 0.01 -> 0.12, handful 0.05 -> 0.11. With p_harvest floor 1e-6: alone 0.68, restraint 0.061, handful 0.090. With N_cold = 0 and p_cold_only = 0.5: alone 0.67, restraint 0.074. With p_will floor 1e-8 and N_cold = 0: alone 0.64, restraint 0.128.
    • Tested: Patched copy of the original integrate.py. L1 := 1 gives all seven classes within 0.0001 of base (restraint 0.0101 -> 0.0102). L3 := 1 gives all within 0.0001. Optimist, Zoo and Late-filter camps with L1 = L3 = 1 change by at most 0.002. Dropping L2 in my re-implementation gives 0.194 / 0.418 / 0.114 / 0.031 / 0.121 / 0.108 / 0.013, matching the saved 'no extragalactic constraint' row.
  2. [major] integrate.py lines 185-188 (mdwarf_alive / mdwarf_dead) and the absence of any link to grabby.py; p_M_alive output

    • Argument: integrate.py lets M-dwarf habitability change only the planet count, by about a factor of 2. It has no likelihood for our being born now around a Sun-like star, which is the quantity grabby.py computes. So P(M alive | data) stays at 0.244 against a prior of 0.25, and the future row 'M-dwarf planets shown habitable' reports almost no change. grabby.py's own birth law says that datum is 13 to 4e6 times less likely in an M-alive world, depending on the number of hard steps. The two models contradict each other on the one observation the project built a study around.
    • Proposed change: Multiply M_alive samples by the ratio of (all civilisations ever on Sun-like hosts) to (all civilisations ever on any host) from grabby.birth_law, at n = m + 1[hard abiogenesis]. For n = 0 use N_sun / N_hp. Or import the grabby likelihood, expanders included, directly.
    • Expected effect: Base classes move by at most 0.005, but P(M alive | data) falls from 0.244 to about 0.014. The 'M dwarfs shown habitable' row changes from alone 0.74 / infeasible 0.16 / hidden 0.02 to alone 0.14 / infeasible 0.66 / hidden 0.10, with P(no hard steps) = 0.85. The model's prior probability of that observation falls 22-fold (evidence 0.104 -> 0.0046).
    • Tested: Ratios from grabby.birth_law (T_sun = 8, T_M = 100 Gyr, w_M = 1): 0.074, 6.4e-3, 5.1e-4, 4.1e-5, 3.3e-6, 2.6e-7 for n = 1 to 6. Applied to 4M samples. The host-type factor alone (N_sun / N_hp, mean 0.48) takes P(M alive) to 0.136.
  3. [major] integrate.py lines 190-192 (SIA branch) and the reported SIA line (infeasible 0.82, hidden 0.14, late 0.04)

    • Argument: The SIA numbers are numerically sound but are not a result. Under SIA the infeasible and hidden classes both have likelihood near 1 and the same Nciv weighting, so their ratio is (1 - q_feasible) : q_feasible x p_stealth = 0.15 : 0.0255 = 5.9, against an observed 6.0. The late-filter share is set by q_doom and the doom_surv range. Separately, the weight w *= Nciv counts M-dwarf civilisations as 'in our situation', which inflates P(M alive) to 0.46. The SIA 'evidence' of 6.1e5 is stored next to non-SIA evidences but is not comparable with them.
    • Proposed change: Present the SIA row as 'alone -> 0; the split among universal barriers equals the prior odds you entered', with a small table over (q_feasible, p_stealth, q_doom, p_will floor). Weight by Nciv x N_sun / N_hp. Pool at least 40M samples or stratify on the switches. Drop or rescale 'evidence' in SIA mode.
    • Expected effect: Base SIA is unchanged at 0.82 / 0.14 / 0.04. q_feasible = 0.97 gives infeasible 0.45, hidden 0.42, late 0.125. Adding p_stealth = 0.2 gives hidden 0.82, infeasible 0.13. q_doom = 0.2 gives late 0.22. p_will floor 1e-12 gives restraint 0.32, infeasible 0.58. The Sun-like restriction returns P(M alive) from 0.46 to 0.25 with classes within 0.002.
    • Tested: Pooled 80M samples: 0.0396 late / 0.8239 infeasible / 0.1365 hidden, ESS 51,951, against the saved 0.0369 / 0.8242 / 0.1389 at ESS 2,505. Six independent 4M runs gave infeasible 0.821-0.831, hidden 0.127-0.142, late 0.037-0.042. Per-4M-batch s.d. over 20 batches: 0.007 / 0.006 / 0.003. So the two-decimal figures are trustworthy to about +/-0.01. Dropping L3 under SIA changes nothing (evidence ratio 1.02). SIA posterior median is 300 extant quiet civilisations in the Galaxy, nearest about 4,000 ly.
  4. [moderate] integrate.py lines 63-65, 160, 163: N_surveyed_cold = 2e3 '>=75% harvesting excluded at any temperature', and the p_cold_only branch

    • Argument: Three mismatches with the project's own studies. First, the fp_kiii report's headline conservative limit at f = 0.75 is 0.29%, equivalent to about 1,030 galaxies with zero detections; it is 0.90% at f = 0.9 (about 330) and there is no constraint above f of about 0.93. The tf_kiii referee corrects the Tully-Fisher limits to 2.3% and 1.4% (about 130-210 galaxies) and rejects the 'any temperature' wording. So 2,000 is too high by 1.7 to 4 times in range and should be 0 for nearly dark galaxies. Second, the cold-only branch is defined as covering only part of the galaxy, yet it is still hit with a >=75% dimming limit at full p_harvest. Third, gaps_and_corrections section 7 told the modeller to use the covering-fraction curve (1.2e-6 full, 3e-5 at 10%, 1e-3 at 1%); the code uses two scalars.
    • Proposed change: Sample a harvested fraction f per sample and take N_surv(f) from the Lacki/Griffith curve (warm) and the FP/TF N_eff(f) tables (cold), with N = 0 for cold f > 0.93 and for partial coverage below the survey thresholds.
    • Expected effect: Small in the base case, larger in combination. N_cold = 1000 / 500 / 130 / 0 gives restraint 0.012 / 0.014 / 0.019 / 0.036 and alone 0.749 / 0.746 / 0.740 / 0.720. With p_cold_only = 0.5 and N_cold = 0: restraint 0.074, handful 0.085, alone 0.67.
    • Tested: Re-implementation, 3M samples per variant; figures as listed. The fp_kiii and tf_kiii numbers were read from studies/fp_kiii/report.md and studies/tf_kiii/referee_report.md. No tf_kiii/report.md exists.
  5. [moderate] integrate.py lines 198-207 (classification masks) and CLASS_LABELS

    • Argument: The masks are mutually exclusive and exhaustive, and the assignment is not order-dependent. But three labels do not describe what the classes contain. (a) 'restraint' is 54% stealth-world samples with mu < 1 that escaped L2 through the stealth switch; restraint by independent choice is 0.0046, not 0.010. Its samples have median p_surv of 0.026 (not 'long-lived') and sit in the prior box corner (median p_will 10^-3.6, Nciv about 90). (b) 'late_filter' is 96.6% universal-doom-switch samples; independent attrition without doom or stealth is 0.00004. (c) 'handful_first' is 46.5% infeasible-settlement worlds and 9% stealth worlds; only 0.024 of the 0.053 fits 'none expanded, we are among the first'. (d) The late/restraint split is just 'which of p_surv and p_will is smaller'.
    • Proposed change: Classify by mechanism flag first (infeasible, stealth with mu above a small threshold or soft-weighted by 1 - exp(-mu), doom), then by Nciv. Rename the classes or report the flag composition alongside them.
    • Expected effect: Restraint 0.010 -> 0.005. Hidden 0.018 -> 0.027 if stealth samples with mu >= 1e-3 are counted as hidden (the soft 1 - exp(-mu) version gives only 0.019). Handful 0.054 -> about 0.024, with about 0.025 moving to infeasible (0.148 -> about 0.173). This strengthens headline step (3) but changes four of the seven published numbers.
    • Tested: 4M-sample composition table: stealth share of restraint 0.541; doom share of late 0.966; infeasible share of handful 0.465. Reclassification run gave restraint 0.0050 and hidden 0.0269.
  6. [moderate] integrate.py line 50 hard_m_weights and line 48 w_pacing, tagged '[STUDY convergence]'

    • Argument: The line cites the convergence study, but the weights are not the study's. The model puts P(m >= 3) = 0.7 x 0.36 = 0.25 and P(m = 0) = 0.30. studies/convergence/report.md gives P(0) = 0.35, P(1) = 0.39, P(2) = 0.20, P(>=3) = 0.06 and says models with four or five steps are not supported. The posterior then drifts further up, to a mean of 2.64 steps against a prior mean of 1.58, because both L2 and the Carter term reward more steps.
    • Proposed change: Either use the study's distribution as the base case, or remove the STUDY tag and show the study's distribution as a named camp.
    • Expected effect: With the study's weights: alone_universe 0.27 -> 0.19, alone_galaxy 0.49 -> 0.42 (alone 0.75 -> 0.60), infeasible 0.15 -> 0.26, hidden 0.018 -> 0.033, late 0.032.
    • Tested: Re-implementation, 3M samples, w_pacing = 0.35, weights {1: 0.39, 2: 0.20, 3: 0.06}: 0.186 / 0.417 / 0.062 / 0.032 / 0.014 / 0.256 / 0.033.
  7. [moderate] integrate.py lines 40-41, 135-141: L_early = 1 for the whole 'easy' camp; headline step (4) 'timing moves things only modestly'

    • Argument: The comment defines easy as 'near-inevitable within ~1 Gyr', but easy_fl is log-uniform over 0.1-1. If f_l is a per-window probability, then f_l of 0.1-0.9 means a rate of 0.1-2.3 per window, and P(life within tau | life arose) is 0.07-0.17, the same as in the hard camp. Yet every easy sample gets the full early-life bonus. Conversely, 'hard' samples with f_l near 1 are penalised. The coded result holds only if f_l < 1 means site availability, which is not stated. Separately, timing is not a modest lever.
    • Proposed change: Derive L_early from each sample's own rate: q = (1 - exp(-lambda tau)) / (1 - exp(-lambda)), L = 1 - (1 - q)^(m+1). Put site availability in a separate factor. Or state the site-availability reading explicitly and correct headline step (4).
    • Expected effect: Under the rate reading applied to both camps: alone_universe 0.27 -> 0.39, P(easy) 0.69 -> 0.41, infeasible 0.15 -> 0.09. Removing the penalty only from hard-camp samples with high f_l changes nothing (within 0.001).
    • Tested: Variants (c) and (c') on 4M samples. Dropping L_early alone: alone_universe 0.265 -> 0.402 and P(easy) 0.69 -> 0.34. Dropping L_late alone: infeasible 0.148 -> 0.195 and P(pacing) 0.13 -> 0.21. The implied timing-only Bayes factor easy:hard is 4.3, inside the 3.8-13 range the briefs quote.
  8. [moderate] integrate.py lines 179-182 (hwo_none / hwo_some): p_bio = f_l x sqrt(f_persist) x 0.5

    • Argument: The HWO targets are habitable-zone rocky planets of Sun-like stars. In this model only a fraction f_hz_habitable x f_rare_earth of those are habitable (both factors are inside N_hp, the population f_l applies to). The likelihood omits both. As coded, the model predicts a 47% chance that 25 planets yield at least one biosignature, and so it over-reads a null.
    • Proposed change: Use p_bio = f_hz_habitable x f_rare_earth x f_l x sqrt(f_persist) x 0.5. Or move f_rare_earth out of N_hp into the intelligence chain if it is meant to gate only complex life, and then fix the bottleneck statistic accordingly.
    • Expected effect: P(at least one detection) falls from 0.47 to 0.38 (f_hz only) or 0.14 (both). The HWO-null row's alone_universe is 0.35 or 0.29 instead of 0.39, and infeasible 0.11 or 0.13 instead of 0.09. The detection row barely changes (alone 0.63-0.65).
    • Tested: 4M samples. My as-coded rows match the saved JSON (0.3855 / 0.4530 ... and 0.1323 / 0.5228 ...). Corrected rows as listed.
  9. [moderate] grabby.py lines 101, 132-141 (posterior_summary: 'Log-uniform prior on x and on v')

    • Argument: The speed grid is [0.003, 0.01, 0.03, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9, 0.99] and every row gets equal weight. That is not log-uniform: the implied prior has P(v > 0.3c) = 0.40 and P(v > 0.1c) = 0.60, against 0.16-0.21 and 0.34-0.40 for a true log-uniform prior on the same range. Every 'P(v > 0.3c)' and Bayes factor in grabby_results.json inherits this. Also, the lower bound of x at 1e-6 is arbitrary and the Sun-only posteriors pile up there (10.6% of mass on the lowest five grid points), so P(occupied > 10%) scales with the chosen range.
    • Proposed change: Weight rows by log-spacing cell widths in v, or use a uniform log grid. Report results for two lower bounds on x, or quote likelihood ratios at fixed x instead of prior-averaged Bayes factors.
    • Expected effect: Sun-only n = 3: P(v > 0.3c) 0.54 -> 0.27, Bayes factor 0.59 -> 0.48, P(occupied > 10%) 0.10 -> 0.06. M dwarfs habitable n = 6: P(v > 0.3c) 0.91 -> 0.80, Bayes factor 2.5e4 -> 1.0e4, P(arrive < 10 Gyr) 0.98 -> 0.97. The qualitative conclusions survive.
    • Tested: Reweighted the saved rows in grabby_results.json with trapezoid weights in log v, for all six scenarios and both detection criteria.
  10. [moderate] integrate.py lines 119-123 and 129: f_i = product of per-step p_j, with Carter density m x^(m-1)

  1. [moderate] integrate.py line 190 (anthropic = 'none') and the class definition on line 198
  1. [minor] sdo.py LOG10_GALAXIES = 10.0 and the claimed replication of 52% / 38%
  1. [minor] integrate.py lines 220-232 (bottleneck_given_rare) and assorted small defects in both models

Code errors

Claims that survive

Missing explanations

Presentation advice

  1. Print the mean likelihood per class next to each posterior (alone_universe 0.50, alone_galaxy 0.73, handful 0.32, late 0.08, restraint 0.02, infeasible 1.00, hidden 0.99). This shows which numbers the data moved and which are priors renormalised by the evidence of 0.43.
  2. Say plainly that the silence enters through the galaxy-survey term only, and make 'no extragalactic constraint' a co-headline.
  3. Report the stealth, doom and infeasible composition of each class, or reclassify by mechanism.
  4. Present the SIA line as prior odds, with a small grid over q_feasible, p_stealth, q_doom and the p_will floor.
  5. Replace 'timing moves things only modestly' with the actual figures: 13 points on alone_universe and a doubling of P(easy abiogenesis).
  6. Show the camp evidences. They span only a factor of 3.4, so the observation barely discriminates between camps.
  7. Mark the M-dwarf and HWO future rows as provisional until the likelihood fixes are in.