Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/galaxy-gen#70
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Compiling #65 and #66. They are two symptoms of one thing, the evidence for that is now in hand, and the remaining work is a single coherent change rather than two independent fixes. This issue owns the change. #65 and #66 keep their own leftovers, listed at the bottom.
The two symptoms
vsig2.5-3.7) and pressure-supported by t=2500 (0.3-0.5). On screen: a uniform grey mess of 40k points over perfectly good gas structure.disk_r, then a cliff to the sky floor. Not the renderer: the star fade completes at1.276 disk_rand the cliff sits at1.07-1.10.The one cause
Stars are put on orbits that the potential they actually read cannot hold, and then that mismatch is converted into random motion. Two independent mechanisms do the converting, and each is sufficient on its own:
ASSOCIATION_ORBIT_SPEED_CAPis an absolute speed of 2.1 that binds on nearly every birth, against a local circular speed near 0.8. Newborns are handed 2-3x circular, past the ~1.41 escape ratio. In a torque-free potential angular momentum is conserved, so that mismatch never goes away - it is a permanent large radial excursion.Both symptoms fall out of that. Stars that cannot hold their orbits randomize (#66) and climb out to pile against the
STELLAR_HALO_MIX_RADIUSdrain (#65).The evidence
Measured through the ablation harness on
main(docs/ablation.md), irregular=>spiral, size 500, seeds 12345 / 12346.Every single-factor ablation is negative.
vsigat t=2500: baseline 0.48/0.31, fresh field 0.46/0.47, smoothed field 0.36/0.19, axisymmetric field 0.30/0.25, no stellar self-gravity 0.27/0.26, no association binding 0.40/0.43, no birth dispersion 0.50/0.49. Nothing moves the crossover.Both together hold the disk indefinitely.
The old cohort - stars aged 500+, the population that was reading 0.28/0.24 - comes back to 2.07/2.21. There is no crossover at any checkpoint.
The drain shuts either way, which is what ties #65 in. Stars retired to the diffuse halo by t=2500: baseline 3200/9009, birth cap 114/149, axisymmetric field 144/242, both 110/175. A 30-80x reduction, and either mechanism alone does it - which is why the halo bump is the easier symptom.
The disk was never bad at making disks. Age-resolved
vsig, baseline: young cohort (age under 150) reads 2.91 / 2.22 / 2.44 / 2.12 at t=900 / 1500 / 2000 / 2500. Star formation produces good disk stars at t=2500 exactly as it did at t=250. Heating is entirely post-birth, taking a cohort from ~2.5 to ~0.3 within about 500 sim-time units, and the pooled decline is the growing old fraction.Two things worth keeping from how this went wrong before. One-at-a-time ablation is structurally blind to a pair of independently sufficient causes, so an empty sweep is not an absence of causes. And every metric here carries a calibration test against a population whose answer is known by construction, because this issue's ancestor produced a retraction from a metric nobody had checked.
The change
Not a constant tweak. The three pieces:
BIRTH_ORBIT_RATIO_CAParound 1.06 keeps newborns just above circular and well under escape. Keep the absolute cap as a backstop for degenerate radii.STAR_WAVE_COUPLINGexists for exactly this and is currently 0.0. A density wave stars pass through should not scatter them the way a lumpy grid does. Being measured now; the result lands as a comment here.The cost, measured
This will break scenario tests, in the direction #66 already predicted.
econ0.76 -> 0.93, itssctr0.66 -> 0.86, irregular=>spiralsctr0.07 -> 0.45, bang=>spiral coherence 0.36 -> 0.11. The ring survives intact. One mechanism showing up four times, not four problems.vsig0.51 -> 3.16. Its pressure-supported spheroid is currently produced by the over-fast births. It needs explicit birth dispersion instead of borrowing the side effect of a bad cap.Work items
Sequenced deliberately. A push to
mainpublishes the image and rolls the public site, so this lands once, whole, not in pieces that each change the look.What stays on the original issues
CONFINE_STIFFNESSand has nothing to do with stellar orbits, and the small resolved-to-diffuse cross-fade, which is a renderer change that should wait until this issue settles where the stellar population actually ends.Landed on
mainalready and unrelated to the risk above: the ablation harness, the age-resolved metric, calibration tests,ward exec ablation-sweep. All switches default off, the wasm build reads no environment, golden fields untouched, 91 Rust tests plus 48 e2e green. No physics has changed.Work item 1: measured. Green light, for a different reason than expected.
Coupling ladder against the two-factor configuration, plus a wave-only control. irregular=>spiral, size 500, seeds 12345 / 12346, t=2500.
The wave does not heat, at any coupling tried
vsigvsigThe hypothesis holds. A coherent analytic density wave costs maybe 10-20% of the retained rotational support and does not restore anything like the collapse - even at 0.70, which is most of the gas wave. That is the difference between a wave stars pass through and a lumpy grid that scatters them, and it means there is headroom to put coherent non-axisymmetric structure into the stellar potential without paying for it in heating. That is the useful result for item 2.
But it adds no arm tracing, because there is no deficit to fill
stellar_arm_affinityat t=2500: no wave 1.56 / 1.07, wave 0.15 1.78 / 1.41, wave 0.35 1.44 / 1.32, wave 0.70 1.59 / 0.98. No trend, and the scatter across seeds and checkpoints (0.74 to 2.24 across the run) is wider than any difference between configurations. Two seeds cannot resolve this and I am not going to claim a trend from it.What is clear is that the worry motivating this experiment was unfounded. Axisymmetrizing the field does not cost arm tracing - baseline reads 1.02 / 1.12 and the axisymmetric configurations read the same or better. Stars trace arms because they are born in the arms, where the gas collapses, not because the field they orbit in has arms.
The wave alone is not a third factor
Control, wave 0.35 with no cap and no axisymmetric field: pooled
vsig0.34 / 0.27 against baseline 0.48 / 0.31, drain 2954 / 8655 against 3200 / 9009, star count and central concentration unmoved. Nothing. It is neither a cause nor a fix on its own, which is the right null result to have on record before anyone reaches for it later.Gas spiral coherence is mildly better at 0.15-0.35 in seed 12345 (0.36-0.40 against 0.26) and flat in 12346. Suggestive, not a finding.
What this changes
STAR_WAVE_COUPLINGis safe to use but is not required for arm tracing. It stays available as a deliberate art-direction knob rather than a load-bearing part of the fix.That question is worth answering directly rather than shipping full axisymmetrization, which throws away the stellar potential's response to real mass. Running the smoothing ladder now - birth cap plus 2 / 5 / 10 / 20 box passes - to find the least smoothing that holds the disk. Note the smoothed field was measured worse than baseline on its own, so this is specifically a test of the pair, not a re-run.
Switch landed on
main, default still 0.0, both wave sites routed through one helper so the constant stays the single owner of the default. 91 Rust tests, clippy, rustfmt green.Smoothing ladder: negative, and it identifies the heat source properly
Birth cap plus 2 / 5 / 10 / 20 box passes, same protocol. Old cohort
vsigat t=2500, seeds 12345 / 12346:Box smoothing does not substitute for axisymmetrization. There is a real monotone trend - 20 passes is clearly better than 2 - but it saturates around 0.5, still under the 0.7 mush line and a factor of four short. More smoothing is not going to close that; the curve is flattening, not climbing.
Why, and this is the useful part
Twenty 3x3 box passes is a Gaussian of about 3.6 cells on a 64-cell grid, roughly 11% of the disk radius. That erases cell-scale roughness completely and barely touches an arm. So the heating is not grid noise or clump-scale texture. It is the large-scale, transient, non-axisymmetric mass distribution itself - the arms and the big clumps.
That also explains the
FIELD_RES = 192result from #66, which bought a partial late-time improvement at 9x the cost: raising resolution sharpens small-scale structure while leaving the large-scale pattern exactly where it was.Which resolves the apparent contradiction with the wave result
A coherent analytic wave at 0.70 coupling does not heat. The field's own arms do. The difference is not amplitude, it is coherence: the analytic wave is a rigidly rotating pattern at a fixed pattern speed, while the field's structure is the gas's instantaneous mass distribution - churning, shearing, decorrelating. Stars are heated by structure that changes under them, not by structure that rotates with them. A density wave stars pass through is exactly what does not scatter them, which is what the comment on
STAR_WAVE_COUPLINGsaid in the first place.So the design is already measured
Smooth axisymmetric field for orbital support, plus the analytic wave for coherent structure, plus the birth ratio cap. That configuration was run in the previous comment: pooled
vsig1.73-2.32, old cohort 1.63-2.13, drain down 30-80x, arm tracing unharmed. Item 2 does not need a new experiment - it needs the ablation turned into an implementation.One caveat to carry forward: azimuthal averaging discards the stellar potential's response to real mass, including the bar and any genuine lopsidedness. The wave puts back a scripted pattern, not a self-consistent one. That is a legitimate art-direction trade for this sim rather than a physics regression, but it should be a decision made on purpose, not inherited from an ablation.
Side findings
Item status
Items 4 and 5 answered, and two of the three costs I reported were wrong
Both turned out to be artifacts of measuring the birth cap in isolation. Correcting my own numbers from the opening post before anyone plans around them.
Item 5: the star-formation drop is the radiation gate, and it is not intrinsic
The collapse watch skips any dense cell where
radiation_at_cell >= COLLAPSE_RADIATION_RESIST. Capped stars stay in the disk instead of being flung into the halo, so they irradiate the gas that would have made the next generation. Bypassing the gate:Collapses recover 4x, past baseline. Gas mass falls back from 1083k to 869k, which confirms the direction: gas was accumulating because it could not ignite, not being consumed faster. The gate also suppresses baseline (no-resist alone lifts collapses to 4291 / 4009), so this is a pre-existing throttle that the birth cap merely walks into.
And the disk survives it. cap + axisym + no-resist: pooled
vsig1.81 / 2.19, old cohort 1.61 / 1.87. Slightly under the 2.25 / 2.44 of the sparse configuration, still firmly rotation-dominated - with 77-90k resolved stars instead of 24k, which is roughly twice baseline.So "star formation halves" was wrong.
COLLAPSE_RADIATION_RESISTis a tunable throttle and the fix has room on both sides of it.Item 4: the central concentration is inward migration, caused by the same thing as the heating
The age-split answers this directly. Central fraction, all ages against young only:
Under the cap alone, stars are not born centrally - the young fraction sits at 0.06-0.13, the same as baseline - while the all-ages population sits at a very stable 0.24-0.26. Newborns are spread and the accumulated population is concentrated, so stars are migrating inward after birth.
Add the axisymmetric field and the gap closes: all-ages 0.04-0.15 against young 0.03-0.19, both near baseline and within seed scatter of it.
That identifies the mechanism as angular-momentum transport by the same transient non-axisymmetric structure that heats the disk. It is not a second problem. Scattering off structure that changes under you does two things at once - randomizes velocities, and moves angular momentum inward - and we were watching the two halves and calling them separate findings.
So the "central over-concentration in all four scenarios" I reported in the opening post is not a cost of the fix. It was a cost of applying half the fix. Item 4 folds into item 2.
The configuration as it now stands
Birth ratio cap 1.06, axisymmetric field, relaxed collapse radiation resist. Against baseline at t=2500, seeds 12345 / 12346:
vsig1.81 / 2.19 against 0.48 / 0.31That is a rotating disk, twice the stars, the halo bump gone, and no concentration regression. The remaining known break is the elliptical, item 3 - running the four-scenario survey under this configuration now.
Corrected item status
Central over-concentration- withdrawn, same cause as item 2.Halved star formation- withdrawn as a cost. Becomes a tuning decision onCOLLAPSE_RADIATION_RESIST, with the note that the gate throttles baseline too and is worth revisiting on its own merits.Probes on
main, inert by default, 91 tests plus clippy and rustfmt green.Qualifying the previous comment: the result is size-dependent, and the tests run at the size where it is worse
Ran the four-scenario survey at size 150, the test scale. It does not reproduce what size 500 showed. Flagging this immediately rather than letting the withdrawal above stand unqualified.
Item 4's withdrawal holds at size 500 and fails at size 150
Central fraction, irregular=>spiral, baseline -> configuration:
sctrAt size 500 the concentration is comparable to baseline. At size 150 it is 7-19x baseline. Same configuration, same scenario, same seeds.
So "item 4 is withdrawn" is only true at size 500. The mechanism I described - inward migration by transient structure, removed along with the structure - is still what the age split shows at 500, but something else dominates at 150 and I do not yet know what. Treat item 4 as open again, now with a size axis on it.
The elliptical is badly broken, not marginally
size 150, t=1200, baseline -> full, both seeds:
econ0.76 -> 0.99 and 0.52 -> 0.99sctr0.66 -> 0.99 and 0.44 -> 0.99ext0.36 -> 0.09 and 0.43 -> 0.09erot0.15 -> 0.80 and 0.07 -> 0.82Essentially every star inside 0.3
disk_r, extent collapsed to a tenth, and rotating. That is not a pressure-supported spheroid that needs retuning, it is a different object. Item 3 is bigger than "give it birth dispersion."The radiation gate is too blunt to remove outright
Star counts at size 150, t=1200: bang=>ring 1851 -> 20700, elliptical 7153 -> 17473. An 11x increase on the ring. At size 500 the same switch roughly doubled the count. The gate is far more load-bearing at small sizes, so the honest form of item 5 is retune
COLLAPSE_RADIATION_RESIST, not bypass it, and the retune has to hold across sizes.What this means for method
Everything measured on this issue so far has been at size 500, irregular=>spiral. That was the right place to characterize the heating, because it is the configuration the symptom was reported in. It is not sufficient to validate a fix, because the Rust scenario tests run at small sizes and the site runs larger. A result at one size is a hypothesis at another.
Running a size sweep now - 150 / 250 / 350 / 500, baseline against cap+axisym, same ticks and seeds - to find where the behaviour changes and whether it is a smooth trend or a threshold. Field cell size against disk radius is the obvious suspect, since
FIELD_RESis fixed at 64 while the disk is not: a field cell spans 2.3 sim cells at size 150 and 7.8 at size 500. If the fix is really a statement about how coarse the stellar potential is relative to the disk, it should show up as a clean trend across that ratio.Item status
COLLAPSE_RADIATION_RESIST, must hold across sizes.Size sweep: the alarm was half wrong. The disk fix is size-robust; the concentration issue is real but confined to the smallest size.
My previous comment compared size 500 at t=2500 against size 150 at t=1200. Mismatched tick counts, so part of what I called a size effect was an age effect. Re-run properly - same ticks, same seeds, sizes 150 / 250 / 350 / 500 - the picture is a smooth trend, not a cliff.
The disk fix works at every size, and holds
vsigwith cap + axisymmetric field, baseline -> fixed:Rotation-dominated at every size, sustained to t=3000 where measured, against baselines of 0.11-0.44. Old cohort follows: 2.90 / 3.10 at size 150, 1.69 / 2.78 at 250, all far above the 0.7 mush line. Drain goes to zero at every size tested. That part is not size-dependent and I over-corrected in saying otherwise.
Central concentration converges at size 250 and up, not at 150
sctr, baseline -> fixed, run out to t=3000:At 250 the two converge - by t=3000 the fixed run is at or below baseline. At 150 it stays 2-12x. So item 4 is a small-size problem, and size 150 is the only size where it bites.
Why: the sim's length scales are absolute, so 150 is not a scaled-down 500
A pile of constants are in sim cells and do not scale with the domain, while
disk_rgoes from 74 at size 150 to 249 at size 500:disk_rat 150FIELD_SOFTENING_SQASSOCIATION_TIDAL_RADIUS_MAXASSOCIATION_JOIN_RADIUSSN_RADIUSASSOCIATION_BIRTH_RADIUSBIRTH_VCIRC_CAPandASSOCIATION_ORBIT_SPEED_CAPare absolute speeds on top of that. Associations at size 150 are three times larger relative to the disk than at size 500, and the field is three times softer relative to it. Size 150 is a different physical setup, not a smaller picture of the same one.This is pre-existing and not caused by the fix - but the fix depends on birth orbits matching the potential, which is exactly the thing those absolute scales distort. Worth knowing on its own terms.
The elliptical is broken at both sizes, and it is the blocker
Not size-dependent at all. size 500, t=2500, baseline -> full:
econ0.51 -> 0.99, 0.41 -> 0.97sctr0.40 -> 0.98, 0.29 -> 0.97ext0.45 -> 0.08, 0.50 -> 0.13erot0.12 -> 0.86, 0.10 -> 0.86vsig0.52 -> 5.56, 0.49 -> 4.50A five-fold star-formation runaway into a tiny rotating core. Confirms two things: the elliptical's spheroid genuinely depends on the birth bug, and removing the radiation gate outright is not viable - in a scenario with a dense core it removes the only thing holding star formation back. Item 5 is a retune of
COLLAPSE_RADIATION_RESIST, full stop, and the elliptical is where it will be hardest.Two ways to land, both real decisions
disk_rso size 150 is a scaled-down 500. Larger change, fixes the class rather than the instance, and would need every scenario re-tuned once.Both are Kai's call, not mine, and they change what "retune the scenarios" in item 6 means.
Item status
Item 3: confirmed. The elliptical wants its dispersion handed to it, and it has to be per-scenario.
irregular=>elliptical, size 500, t=2500, seeds 12345 / 12346. Target is the baseline row - that is the object we are trying to keep.
econexterotsctrvsigAt dispersion 1.2 the kinematics come back essentially exactly:
vsig0.60 / 0.70 against a baseline 0.52 / 0.49, from 3.08 / 2.89 without it. The spheroid is pressure-supported again, and this time because it was given dispersion rather than because its stars were launched past escape. The hypothesis on #66 was right.Structure recovers most of the way but not all: extent 0.32 / 0.41 against 0.45 / 0.50, and
erot0.45 against 0.12 - still three times baseline wherevsigsays the population is not rotating. Two rotation metrics disagreeing is worth understanding before tuning to either.erotkeeps falling to 0.26 / 0.24 at dispersion 2.0 whilevsigovershoots to 0.30 / 0.38, so the useful range is somewhere in 1.2-1.7 and the two metrics do not want the same number. Scanning 1.5 and 1.7 now.It has to be a scenario parameter, not a constant
Control: the same dispersion 1.2 applied to irregular=>spiral, size 500, t=2500.
vsigIt undoes the disk fix outright. Which is the correct answer rather than a problem: a spiral is rotation-supported and an elliptical is pressure-supported, and the sim should not be handing them the same birth kinematics. This belongs in
ScenarioParamsnext tostar_dragandv_flat- 0.0 for the ring and both spirals, somewhere around 1.2-1.7 for the elliptical.Note the drain even at dispersion 1.2 on the spiral is 1046 / 902 against baseline 3200 / 9009, so #65's halo bump stays 3-9x better even in the configuration that breaks the disk. The two symptoms really do have partly independent handles.
Where all seven items now stand
birth_velocity_dispersiontoScenarioParams, 0.0 for the disk scenarios and ~1.2-1.7 for the elliptical. Exact value pending the finer scan and a look at whyerotandvsigdisagree.The fork, which is Kai's
Every mechanism is now identified and every fix has a measured design. What is left before this can land is one decision:
disk_rso every size behaves like a scaled version of the others. Larger change, fixes the class, needs all four scenarios retuned once.Item 4 dissolves under option 2 and persists under option 1. That is the main thing separating them.
All probes are on
mainand inert by default: 91 Rust tests, clippy, rustfmt green, golden fields untouched, and no physics changed.Dispersion pinned, and the fork measured rather than guessed
Item 3: 1.5 is the number, and disks tolerate a little
Elliptical, size 500, t=2500, seeds 12345 / 12346:
econexterotvsig1.5 matches the target
vsigalmost exactly. Extent recovers about 70% of the way,erotabout half. The residualeconandsctrelevation is the same central-concentration signature as item 4, not something specific to the elliptical - so it should be chased there, once, rather than tuned away here.And a useful discovery on the disk side: a small dispersion is nearly free. Spiral at 0.3, size 500, t=2500:
vsig1.68 / 2.29 against 2.25 / 2.44 at zero, drain 100 / 164. Still firmly a disk. Real disks have some dispersion, so the parameter has a physically sensible non-zero default for the disk scenarios rather than a hard zero.Recommendation for
ScenarioParams:birth_velocity_dispersionof 1.5 for the elliptical, 0.0-0.3 for the ring and both spirals.The fork: proportional lengths help, and are not sufficient
Rather than leave option 2 as an argument, I made it measurable.
GALAXY_ABL_LENGTH_REFERENCE_SIZEscales the five absolute length constants - association join, birth, tidal, and binding radii plus the coarse field softening - bysize / reference. irregular=>spiral, t=3000 at 150 and 250, against size 500 at t=2500 as the reference:sctrsctrvsigReal movement in the right direction. The birth distribution improves most - young central fraction 0.25 / 0.83 to 0.18 / 0.12, close to the reference - which is the cleanest evidence that absolute lengths were distorting where stars form.
vsigat 150 converges toward the reference rather than overshooting it.But all-ages
sctronly goes 0.31 / 0.62 to 0.25 / 0.48 against a reference 0.16 / 0.17. Roughly a third of the gap, not the whole thing.The likely reason is that I only scaled lengths. Under a proper self-similar scaling, speeds go as
sqrt(GM/r)and times asr/v, soBIRTH_VCIRC_CAP,ASSOCIATION_ORBIT_SPEED_CAP,ASSOCIATION_BINDING_LIFETIME,ASSOCIATION_TIDAL_GRACEand the stellar lifetimes all need to move too. Scaling one dimension of three is why it half-worked.So option 2 is directionally correct and bigger than advertised. It is not "make the lengths fractions of
disk_r" - it is a full dimensional-scaling pass over lengths, speeds, and times. Worth knowing before choosing it, and worth knowing that the cheap version of it buys about a third.The fork, restated with what it costs
I would take option 1 first and hold option 2 as its own issue: it is a real improvement to the sim, it is independent of this fix, and coupling it to a change that already rolls the public site makes both harder to review. But this is your call and the numbers above are the input to it, not a substitute for it.
Item status
birth_velocity_dispersion1.5 elliptical / 0.0-0.3 disks.Everything measured here is behind switches on
mainthat are off by default. 91 tests, clippy, rustfmt green, golden fields untouched, no physics changed.Fork resolved: option 1. Scenario tests now run at 250, landed on
main.Kai picked raising the test size. Done, and it turned out cheaper and more informative than expected.
They were at 50, not 150
Worth correcting the record: the scenario-identity tests ran at
Galaxy::new(50, 0). The site serves 500. Everything I said about size 150 being marginal applies an order of magnitude harder to the size the guarantees were actually calibrated at -FIELD_SOFTENING_SQis 21% of the disk radius at size 50 against 2% at 500.The suite got faster, not slower
The scenario tests integrate real galaxies for a thousand ticks, and an unoptimized test binary was most of the runtime.
[profile.test] opt-level = 3keeps debug assertions and overflow checks on and trades compile time for run time:Twenty-five times the domain, a quarter of the wall clock. The golden hashes were unchanged by the profile change on its own, which is the check that matters - Rust does not enable fast-math, so f32 results are identical across opt levels and the golden test is what keeps that honest.
250 rather than 500 because that is where the size-sensitive behaviour settles - central concentration converges to the size-500 answer at 250 and does not at 150 - and 500 costs about 100s per scenario against about 10s. The residual gap to 500 is real and stays recorded here.
Two of three scenarios held every threshold untouched
The ring and the elliptical pass at 250 with every existing bar unchanged: concentration 0.45-0.85, smoothness 0.7, axis ratio 0.65, extent 0.3-0.65. That is a better result than I expected and says those guarantees were describing something real rather than a small-domain artifact.
The spiral did not, and that is a finding
test_spiral_remains_..._coherentrequired minimum coherence 0.3 and minimum coverage 0.5 across a hundred-tick window. At 250, seed 42:Coherence swings between 0.07 and 0.30 inside the same hundred ticks, so a strict minimum was measuring the deepest trough of a recurrent pattern rather than whether the arms are present. It now asserts on the window mean (0.15 coherence, 0.25 coverage) with a floor underneath (0.04, 0.10) that still fails a scenario whose arms actually vanish.
That is weaker than what it replaced and I am not dressing it up. The old guarantee was a property of a domain a tenth the size of the one being served. Whether a mean coherence of 0.2 at the real size is good enough visually is a product question this metric cannot answer - it is the same question #66 opened with, and it is now measured at the size it matters.
The occupied-cell floor moved 200 -> 3000 to stay a collapse detector rather than a formality at the new size. Golden fields regenerated in the same commit.
What this unblocks
Item 6 was gated on this. The tests now exercise a regime close to what ships, so the scenario retune that lands the #70 fix will be tuned against something meaningful instead of against size 50.
Item 4 persists by design under this option - it lives at 150 and below, and nothing runs there now. The full dimensional-scaling pass stays worth doing on its own merits and should be its own issue, not bolted onto a change that already rolls the public site.
Item status
birth_velocity_dispersion1.5 / 0.0-0.3.ward exec test-rust,lint-rust, andcheck-jsall green on a clean tree.New blocker on item 6: this fix removes the population's only sink
Kai asked whether the sim needs an asymptotic star-count limit or whether the gas mechanics already provide one. Measured, and it is the second kind of answer - the gas mechanics do not, and the thing that currently bounds the count is the drain this issue removes.
Filed as #72 with the full numbers. Short version:
SN_GAS_RETURN0.8 plus the fountain), so the gas budget is not a ceiling.Star count at size 500 out to t=5000, seed 12345:
Baseline turns over with 8993 stars drained. The fix has drained 802 and is still adding 4340 per thousand ticks. With the radiation gate open it is adding 18870 and rising. Gas does not stop any of it - 612690 remains against 1932968 at t=0.
The render is already at
fps=16.8 jank=99/101with 32081 stars in theruntime-perfspec, so this is a hard constraint rather than an aesthetic preference.Item 8, and item 6 should not land before it. #72 proposes a resolved-luminosity floor rather than a count cap - half the population produces 4% of the light, so retiring dim main-sequence stars into the existing diffuse reservoir costs almost nothing visually and is asymptotic by construction. It also generalizes a pattern the sim already has for dim remnants rather than inventing one.
Worth doing before item 6 regardless, since it helps the site at today's star counts too.
Item 6 landed. The disk is a disk, at every size and out to t=5000.
Commit
5ab7302, filed as #85. Kai called build-and-land.What shipped, as per-scenario parameters
birth_orbit_ratio_capbirth_velocity_dispersioncollapse_radiation_resistSTAR_FIELD_AXISYMMETRICEvery switch inverts to its own control, following the
RESOLVED_LUMINOSITY_FLOORprecedent, so none of these numbers needs an edit to re-measure.Item 2, the shipping smooth field: full axisymmetrization
The design question was whether the product needed something between "the raw clumpy field" and "the ablation's axisymmetric average". The answer is no, on this issue's own evidence: axisymmetrizing costs no arm tracing, because stars trace arms by being born in them, and the analytic wave that would have carried coherent structure costs 10-20% of rotational support while buying nothing measurable.
STAR_WAVE_COUPLINGstays 0.0.Item 5, the radiation gate: 80 for disks, and it had to be per-scenario
Swept 20 / 40 / 80 / 160 at sizes 250 and 500. 80 restores collapses to 2541 against a baseline ~2316 - the honest target being baseline formation, not maximum stars - while
vsigstays 2.50.The elliptical could not take it. At 80 its extra supernovae sweep gas into an annulus and it fails its own ring-signature check, 0.293 against a 0.25 bar. Isolated by testing each switch separately rather than assuming which one did it. It keeps 20, alongside its already scenario-owned
collapse_density_fractionandcollapse_chance.Results, size 500, t=2500, two seeds
To t=5000:
vsig1.83, old cohort 1.51, no crossover at any checkpoint, against a baseline of 0.11-0.44. Population settles near 20k. Your prediction on #72 was exact - removing the bad sink and adding the good one nearly cancel.The probe had drifted again
birth_circular_ratiomirrored the ablation switch but not the new scenario parameter, so it reportedbcirc=1.93while births were capped at 1.06. That is precisely the failure its own comment documents, one change after the retraction that prompted the warning. Caught because 1.93 was impossible under a 1.06 cap and the number was worth a second look. Both sides now carry a two-line DRAGON.The lesson generalizes: a mirrored probe is a second implementation of the rule, and it silently rots whenever the rule gains a new input. Worth considering whether these should read one shared resolver rather than mirror each other.
Verification
91 Rust tests, 48 e2e, clippy, rustfmt,
check-js, fullprecommitgate. All four scenario-identity tests pass at 250 with every existing threshold unchanged. Only the elliptical golden moved - it is the only scenario forming stars by tick 100 - and it was recaptured in the same commit.Item status
Leaves #65's gas-confinement retune and #72's elliptical renderer, both of which are their own change with their own golden regeneration. This issue can close once you are happy with how it looks on the site.