Stars orbit a potential they were never given orbits for: one root cause behind #65 and #66 #70

Open
opened 2026-08-09 03:50:58 +00:00 by coilyco-ops · 10 comments
Member

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

  • #66 - the stellar disk is rotation-dominated at t=250 (vsig 2.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.
  • #65 - a 2x stellar luminance bump pooling just outside disk_r, then a cliff to the sky floor. Not the renderer: the star fade completes at 1.276 disk_r and the cliff sits at 1.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:

  1. The birth orbit is wrong. ASSOCIATION_ORBIT_SPEED_CAP is 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.
  2. The field the stars read is lumpy. They integrate against a 64-cell coarse field rebuilt from a clump-dominated quadtree every 4 ticks. Give a star a perfectly circular birth orbit and the field scatters it apart anyway.

Both symptoms fall out of that. Stars that cannot hold their orbits randomize (#66) and climb out to pile against the STELLAR_HALO_MIX_RADIUS drain (#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. vsig at 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.

configuration 12345 12346
baseline 0.48 0.31
birth ratio cap 1.06 alone 0.19 0.44
axisymmetric field alone 0.30 0.25
both 2.25 2.44

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:

  1. Cap the birth orbit to a multiple of local circular speed rather than to an absolute speed. BIRTH_ORBIT_RATIO_CAP around 1.06 keeps newborns just above circular and well under escape. Keep the absolute cap as a backstop for degenerate radii.
  2. Give stars a smooth potential for orbital support. The axisymmetric field is an ablation, not a design - it has no arms in it. What ships needs to be smooth enough not to scatter while still carrying structure.
  3. Put the arms back as a coherent wave. STAR_WAVE_COUPLING exists 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.

  • Central over-concentration in all four scenarios. At size 150, t=1200: elliptical econ 0.76 -> 0.93, its sctr 0.66 -> 0.86, irregular=>spiral sctr 0.07 -> 0.45, bang=>spiral coherence 0.36 -> 0.11. The ring survives intact. One mechanism showing up four times, not four problems.
  • The elliptical starts rotating, vsig 0.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.
  • Resolved star count roughly halves, 43656 -> 24018, while the drain is nearly gone - so this is a drop in formation, not retention. Unexplained, and worth understanding before accepting.

Work items

  1. Measure smooth-field-plus-analytic-wave. Does a coherent wave restore arm tracing without heating? (running)
  2. Design the shipping smooth field. The ablation says "axisymmetric"; the product needs something that supports orbits without scattering and still reads as a galaxy.
  3. Give the elliptical explicit velocity dispersion at birth, so its spheroid stops depending on the birth bug.
  4. Find the single mechanism behind the central over-concentration.
  5. Explain the halved star formation rate.
  6. Land it: retune the four scenarios, regenerate the golden fields in the same commit.

Sequenced deliberately. A push to main publishes 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

  • #66 keeps nothing but its history. Every open question there is an item above.
  • #65 keeps two genuinely separate things: the gas confinement ridge retune, which is about gas and CONFINE_STIFFNESS and 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 main already 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.

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 - **#66** - the stellar disk is rotation-dominated at t=250 (`vsig` 2.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. - **#65** - a 2x stellar luminance bump pooling just outside `disk_r`, then a cliff to the sky floor. Not the renderer: the star fade completes at `1.276 disk_r` and the cliff sits at `1.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**: 1. **The birth orbit is wrong.** `ASSOCIATION_ORBIT_SPEED_CAP` is 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. 2. **The field the stars read is lumpy.** They integrate against a 64-cell coarse field rebuilt from a clump-dominated quadtree every 4 ticks. Give a star a perfectly circular birth orbit and the field scatters it apart anyway. Both symptoms fall out of that. Stars that cannot hold their orbits randomize (#66) and climb out to pile against the `STELLAR_HALO_MIX_RADIUS` drain (#65). ## The evidence Measured through the ablation harness on `main` ([docs/ablation.md](../src/branch/main/docs/ablation.md)), irregular=>spiral, size 500, seeds 12345 / 12346. **Every single-factor ablation is negative.** `vsig` at 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.** | configuration | 12345 | 12346 | |---|---|---| | baseline | 0.48 | 0.31 | | birth ratio cap 1.06 alone | 0.19 | 0.44 | | axisymmetric field alone | 0.30 | 0.25 | | **both** | **2.25** | **2.44** | 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: 1. **Cap the birth orbit to a multiple of local circular speed** rather than to an absolute speed. `BIRTH_ORBIT_RATIO_CAP` around 1.06 keeps newborns just above circular and well under escape. Keep the absolute cap as a backstop for degenerate radii. 2. **Give stars a smooth potential for orbital support.** The axisymmetric field is an ablation, not a design - it has no arms in it. What ships needs to be smooth enough not to scatter while still carrying structure. 3. **Put the arms back as a coherent wave.** `STAR_WAVE_COUPLING` exists 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. - **Central over-concentration in all four scenarios.** At size 150, t=1200: elliptical `econ` 0.76 -> 0.93, its `sctr` 0.66 -> 0.86, irregular=>spiral `sctr` 0.07 -> 0.45, bang=>spiral coherence 0.36 -> 0.11. The ring survives intact. One mechanism showing up four times, not four problems. - **The elliptical starts rotating**, `vsig` 0.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. - **Resolved star count roughly halves**, 43656 -> 24018, while the drain is nearly gone - so this is a drop in formation, not retention. Unexplained, and worth understanding before accepting. ## Work items 1. Measure smooth-field-plus-analytic-wave. Does a coherent wave restore arm tracing without heating? *(running)* 2. Design the shipping smooth field. The ablation says "axisymmetric"; the product needs something that supports orbits without scattering and still reads as a galaxy. 3. Give the elliptical explicit velocity dispersion at birth, so its spheroid stops depending on the birth bug. 4. Find the single mechanism behind the central over-concentration. 5. Explain the halved star formation rate. 6. Land it: retune the four scenarios, regenerate the golden fields in the same commit. Sequenced deliberately. A push to `main` publishes 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 - **#66** keeps nothing but its history. Every open question there is an item above. - **#65** keeps two genuinely separate things: the gas confinement ridge retune, which is about gas and `CONFINE_STIFFNESS` and 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 `main` already 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.
Author
Member

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

configuration pooled vsig old cohort vsig
baseline 0.48 / 0.31 0.28 / 0.24
cap + axisymmetric, no wave 2.25 / 2.44 2.07 / 2.21
+ wave 0.15 1.97 / 1.94 1.79 / 1.74
+ wave 0.35 1.73 / 2.32 1.63 / 2.13
+ wave 0.70 2.03 / 2.18 1.86 / 1.80

The 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_affinity at 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 vsig 0.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

  • Item 1 closes. STAR_WAVE_COUPLING is 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.
  • Item 2 gets easier and more urgent. "Smooth enough not to scatter, structured enough to read as a galaxy" now has slack in it, since coherent structure is provably cheap. The open question is narrower than it looked: how smooth does the field have to be?

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.

  • Items 3, 4, and 5 are untouched by this and remain the real work.

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.

## 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 | configuration | pooled `vsig` | old cohort `vsig` | |---|---|---| | baseline | 0.48 / 0.31 | 0.28 / 0.24 | | cap + axisymmetric, no wave | 2.25 / 2.44 | 2.07 / 2.21 | | + wave 0.15 | 1.97 / 1.94 | 1.79 / 1.74 | | + wave 0.35 | 1.73 / 2.32 | 1.63 / 2.13 | | + wave 0.70 | 2.03 / 2.18 | 1.86 / 1.80 | The 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_affinity` at 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 `vsig` 0.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 - **Item 1 closes.** `STAR_WAVE_COUPLING` is 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. - **Item 2 gets easier and more urgent.** "Smooth enough not to scatter, structured enough to read as a galaxy" now has slack in it, since coherent structure is provably cheap. The open question is narrower than it looked: how smooth does the field have to be? 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. - Items 3, 4, and 5 are untouched by this and remain the real work. 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.
Author
Member

Smoothing ladder: negative, and it identifies the heat source properly

Birth cap plus 2 / 5 / 10 / 20 box passes, same protocol. Old cohort vsig at t=2500, seeds 12345 / 12346:

configuration old cohort pooled resolved stars
baseline 0.28 / 0.24 0.48 / 0.31 43656 / 37707
cap only 0.16 / 0.32 0.19 / 0.44 17839 / 19359
cap + smooth 2 0.25 / 0.20 0.26 / 0.29 20766 / 21132
cap + smooth 5 0.30 / 0.22 0.38 / 0.42 22365 / 24502
cap + smooth 10 0.15 / 0.22 0.30 / 0.33 28114 / 27455
cap + smooth 20 0.46 / 0.53 0.50 / 0.83 28546 / 26166
cap + axisymmetric 2.07 / 2.21 2.25 / 2.44 24018 / 24588

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 = 192 result 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_COUPLING said 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 vsig 1.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

  • Star count partly recovers with smoothing - 28k at 20 passes against 17.8k for cap-only, with baseline at 43.7k. So item 5, the halved star formation, is coupled to how the field is treated, not solely to the birth cap. A real lead rather than a mystery.
  • Central concentration eases slightly in the same direction: cap-only 0.24 / 0.26, smooth 20 0.14 / 0.24, axisymmetric 0.16 / 0.17, against baseline 0.14 / 0.05. Still the main scenario risk, and still item 4.
  • The drain is insensitive to all of it - 109 to 181 across every capped configuration. The birth cap alone closes #65's halo bump; nothing about the field treatment matters there.

Item status

  1. Wave coupling - closed, safe and not load-bearing.
  2. Smooth field design - closed on evidence, open on implementation: axisymmetric support plus analytic wave, with the self-consistency trade named explicitly.
  3. Elliptical birth dispersion - open, unchanged.
  4. Central over-concentration - open, now with a lead: it moves with field treatment.
  5. Halved star formation - open, same lead.
  6. Land it - open, and still one whole change.
## Smoothing ladder: negative, and it identifies the heat source properly Birth cap plus 2 / 5 / 10 / 20 box passes, same protocol. Old cohort `vsig` at t=2500, seeds 12345 / 12346: | configuration | old cohort | pooled | resolved stars | |---|---|---|---| | baseline | 0.28 / 0.24 | 0.48 / 0.31 | 43656 / 37707 | | cap only | 0.16 / 0.32 | 0.19 / 0.44 | 17839 / 19359 | | cap + smooth 2 | 0.25 / 0.20 | 0.26 / 0.29 | 20766 / 21132 | | cap + smooth 5 | 0.30 / 0.22 | 0.38 / 0.42 | 22365 / 24502 | | cap + smooth 10 | 0.15 / 0.22 | 0.30 / 0.33 | 28114 / 27455 | | cap + smooth 20 | 0.46 / 0.53 | 0.50 / 0.83 | 28546 / 26166 | | **cap + axisymmetric** | **2.07 / 2.21** | **2.25 / 2.44** | 24018 / 24588 | 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 = 192` result 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_COUPLING` said 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 `vsig` 1.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 - **Star count partly recovers with smoothing** - 28k at 20 passes against 17.8k for cap-only, with baseline at 43.7k. So item 5, the halved star formation, is coupled to how the field is treated, not solely to the birth cap. A real lead rather than a mystery. - **Central concentration eases slightly** in the same direction: cap-only 0.24 / 0.26, smooth 20 0.14 / 0.24, axisymmetric 0.16 / 0.17, against baseline 0.14 / 0.05. Still the main scenario risk, and still item 4. - **The drain is insensitive to all of it** - 109 to 181 across every capped configuration. The birth cap alone closes #65's halo bump; nothing about the field treatment matters there. ### Item status 1. Wave coupling - **closed**, safe and not load-bearing. 2. Smooth field design - **closed on evidence**, open on implementation: axisymmetric support plus analytic wave, with the self-consistency trade named explicitly. 3. Elliptical birth dispersion - open, unchanged. 4. Central over-concentration - open, now with a lead: it moves with field treatment. 5. Halved star formation - open, same lead. 6. Land it - open, and still one whole change.
Author
Member

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:

configuration CloudCollapse @ t=2500 resolved stars gas mass
baseline 2316 / 2366 43656 / 37707 966k / 972k
cap 870 / 982 17839 / 19359 1083k / 1078k
cap + no radiation resist 3556 / 3452 72098 / 68699 869k / 890k
cap + axisym + no radiation resist 4346 / 3720 90722 / 77152 801k / 861k

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 vsig 1.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_RESIST is 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:

configuration all ages young only
baseline 0.03 / 0.14 / 0.03 / 0.05 0.10 / 0.09 / 0.11 / 0.05
cap 0.26 / 0.24 / 0.25 / 0.26 0.03 / 0.12 / 0.13 / 0.06
cap + axisym + no-resist 0.04 / 0.07 / 0.15 / 0.14 0.03 / 0.12 / 0.19 / 0.09

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:

  • pooled vsig 1.81 / 2.19 against 0.48 / 0.31
  • old cohort 1.61 / 1.87 against 0.28 / 0.24
  • resolved stars 90722 / 77152 against 43656 / 37707
  • drained to halo 256 / 345 against 3200 / 9009, still 25-35x better
  • central fraction 0.07 / 0.14 against 0.14 / 0.05, comparable

That 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

  1. Wave coupling - closed, safe, optional.
  2. Smooth field - closed on evidence, open on implementation. Now also owns item 4.
  3. Elliptical birth dispersion - the only known remaining break. Measuring.
  4. Central over-concentration - withdrawn, same cause as item 2.
  5. Halved star formation - withdrawn as a cost. Becomes a tuning decision on COLLAPSE_RADIATION_RESIST, with the note that the gate throttles baseline too and is worth revisiting on its own merits.
  6. Land it - open.

Probes on main, inert by default, 91 tests plus clippy and rustfmt green.

## 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: | configuration | CloudCollapse @ t=2500 | resolved stars | gas mass | |---|---|---|---| | baseline | 2316 / 2366 | 43656 / 37707 | 966k / 972k | | cap | 870 / 982 | 17839 / 19359 | 1083k / 1078k | | cap + no radiation resist | **3556 / 3452** | **72098 / 68699** | 869k / 890k | | cap + axisym + no radiation resist | 4346 / 3720 | 90722 / 77152 | 801k / 861k | 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 `vsig` 1.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_RESIST` is 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: | configuration | all ages | young only | |---|---|---| | baseline | 0.03 / 0.14 / 0.03 / 0.05 | 0.10 / 0.09 / 0.11 / 0.05 | | cap | 0.26 / 0.24 / 0.25 / 0.26 | 0.03 / 0.12 / 0.13 / 0.06 | | cap + axisym + no-resist | 0.04 / 0.07 / 0.15 / 0.14 | 0.03 / 0.12 / 0.19 / 0.09 | 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: - pooled `vsig` **1.81 / 2.19** against 0.48 / 0.31 - old cohort **1.61 / 1.87** against 0.28 / 0.24 - resolved stars **90722 / 77152** against 43656 / 37707 - drained to halo **256 / 345** against 3200 / 9009, still 25-35x better - central fraction 0.07 / 0.14 against 0.14 / 0.05, comparable That 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 1. Wave coupling - closed, safe, optional. 2. Smooth field - closed on evidence, open on implementation. Now also owns item 4. 3. Elliptical birth dispersion - **the only known remaining break.** Measuring. 4. ~~Central over-concentration~~ - **withdrawn**, same cause as item 2. 5. ~~Halved star formation~~ - **withdrawn as a cost.** Becomes a tuning decision on `COLLAPSE_RADIATION_RESIST`, with the note that the gate throttles baseline too and is worth revisiting on its own merits. 6. Land it - open. Probes on `main`, inert by default, 91 tests plus clippy and rustfmt green.
Author
Member

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:

size ticks baseline sctr with cap+axisym with the full three
500 2500 0.14 / 0.05 0.16 / 0.17 0.07 / 0.14
150 1200 0.07 / 0.04 0.45 / - 0.49 / 0.75

At 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:

  • econ 0.76 -> 0.99 and 0.52 -> 0.99
  • sctr 0.66 -> 0.99 and 0.44 -> 0.99
  • ext 0.36 -> 0.09 and 0.43 -> 0.09
  • erot 0.15 -> 0.80 and 0.07 -> 0.82

Essentially 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_RES is 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

  1. Wave coupling - closed.
  2. Smooth field - open, and now needs a size-independent formulation.
  3. Elliptical - open, and worse than described. Not a tuning job.
  4. Central concentration - reopened, size-dependent.
  5. Star formation - open as a retune of COLLAPSE_RADIATION_RESIST, must hold across sizes.
  6. Land it - open.
  7. New: characterize the size dependence. Blocks the rest, because nothing above can be validated until a result at one size predicts the next.
## 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: | size | ticks | baseline `sctr` | with cap+axisym | with the full three | |---|---|---|---|---| | 500 | 2500 | 0.14 / 0.05 | 0.16 / 0.17 | 0.07 / 0.14 | | 150 | 1200 | 0.07 / 0.04 | 0.45 / - | 0.49 / 0.75 | At 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: - `econ` 0.76 -> 0.99 and 0.52 -> 0.99 - `sctr` 0.66 -> 0.99 and 0.44 -> 0.99 - `ext` 0.36 -> 0.09 and 0.43 -> 0.09 - `erot` 0.15 -> 0.80 and 0.07 -> 0.82 Essentially 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_RES` is 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 1. Wave coupling - closed. 2. Smooth field - open, and now needs a size-independent formulation. 3. Elliptical - open, and worse than described. Not a tuning job. 4. Central concentration - **reopened**, size-dependent. 5. Star formation - open as a retune of `COLLAPSE_RADIATION_RESIST`, must hold across sizes. 6. Land it - open. 7. **New: characterize the size dependence.** Blocks the rest, because nothing above can be validated until a result at one size predicts the next.
Author
Member

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

vsig with cap + axisymmetric field, baseline -> fixed:

size t=1200 t=2500 t=3000
150 0.40 -> 4.27 / 1.35 -> 4.52 0.20 -> 3.81 / 0.42 -> 3.44 0.33 -> 2.57 / 0.16 -> 3.44
250 0.79 -> 2.57 / 0.67 -> 4.14 0.30 -> 1.84 / 0.11 -> 2.82 0.31 -> 1.82 / 0.33 -> 2.86
350 1.57 -> 4.07 / 1.34 -> 4.12 - -
500 1.52 -> 4.51 / 1.28 -> 4.18 1.81 / 2.19 (full config) -

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:

size t=1200 t=2000 t=2500 t=3000
150 s5 0.07 -> 0.45 0.18 -> 0.35 0.15 -> 0.43 0.19 -> 0.31
150 s6 0.04 -> 0.72 0.12 -> 0.55 0.24 -> 0.66 0.05 -> 0.62
250 s5 0.05 -> 0.18 0.14 -> 0.17 0.23 -> 0.14 0.26 -> 0.13
250 s6 0.11 -> 0.37 0.32 -> 0.29 0.22 -> 0.32 0.25 -> 0.32

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_r goes from 74 at size 150 to 249 at size 500:

constant value as a share of disk_r at 150 at 500
FIELD_SOFTENING_SQ 25.0, so 5 cells 6.8% 2.0%
ASSOCIATION_TIDAL_RADIUS_MAX 6.5 8.8% 2.6%
ASSOCIATION_JOIN_RADIUS 3.2 4.3% 1.3%
SN_RADIUS 2 2.7% 0.8%
ASSOCIATION_BIRTH_RADIUS 0.9 1.2% 0.4%

BIRTH_VCIRC_CAP and ASSOCIATION_ORBIT_SPEED_CAP are 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:

  • econ 0.51 -> 0.99, 0.41 -> 0.97
  • sctr 0.40 -> 0.98, 0.29 -> 0.97
  • ext 0.45 -> 0.08, 0.50 -> 0.13
  • erot 0.12 -> 0.86, 0.10 -> 0.86
  • vsig 0.52 -> 5.56, 0.49 -> 4.50
  • stars 54422 -> 268810, 50684 -> 254989

A 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

  1. Raise the scenario test size. Tests would then exercise the regime the site actually runs in, at the cost of slower tests. The current suite passes at a size where the sim is marginal.
  2. Scale the length constants with the domain. Express them as fractions of disk_r so 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

  1. Wave coupling - closed.
  2. Smooth field - open on implementation; size-robust, which is the good news here.
  3. Elliptical - open, the blocker, broken at every size, needs a redesign not a constant.
  4. Central concentration - open but downgraded: converges at size 250+, only bites at 150, and traces to absolute length scales rather than to the fix.
  5. Radiation gate - open as a retune. Removal is off the table.
  6. Land it - open, and now gated on the test-size decision above.
  7. Size dependence - characterized, cause identified, remedy is a decision rather than an experiment.
## 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 `vsig` with cap + axisymmetric field, baseline -> fixed: | size | t=1200 | t=2500 | t=3000 | |---|---|---|---| | 150 | 0.40 -> 4.27 / 1.35 -> 4.52 | 0.20 -> 3.81 / 0.42 -> 3.44 | 0.33 -> 2.57 / 0.16 -> 3.44 | | 250 | 0.79 -> 2.57 / 0.67 -> 4.14 | 0.30 -> 1.84 / 0.11 -> 2.82 | 0.31 -> 1.82 / 0.33 -> 2.86 | | 350 | 1.57 -> 4.07 / 1.34 -> 4.12 | - | - | | 500 | 1.52 -> 4.51 / 1.28 -> 4.18 | 1.81 / 2.19 (full config) | - | 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: | size | t=1200 | t=2000 | t=2500 | t=3000 | |---|---|---|---|---| | 150 s5 | 0.07 -> 0.45 | 0.18 -> 0.35 | 0.15 -> 0.43 | 0.19 -> 0.31 | | 150 s6 | 0.04 -> 0.72 | 0.12 -> 0.55 | 0.24 -> 0.66 | 0.05 -> 0.62 | | 250 s5 | 0.05 -> 0.18 | 0.14 -> 0.17 | 0.23 -> 0.14 | 0.26 -> **0.13** | | 250 s6 | 0.11 -> 0.37 | 0.32 -> 0.29 | 0.22 -> 0.32 | 0.25 -> **0.32** | 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_r` goes from 74 at size 150 to 249 at size 500: | constant | value | as a share of `disk_r` at 150 | at 500 | |---|---|---|---| | `FIELD_SOFTENING_SQ` | 25.0, so 5 cells | 6.8% | 2.0% | | `ASSOCIATION_TIDAL_RADIUS_MAX` | 6.5 | 8.8% | 2.6% | | `ASSOCIATION_JOIN_RADIUS` | 3.2 | 4.3% | 1.3% | | `SN_RADIUS` | 2 | 2.7% | 0.8% | | `ASSOCIATION_BIRTH_RADIUS` | 0.9 | 1.2% | 0.4% | `BIRTH_VCIRC_CAP` and `ASSOCIATION_ORBIT_SPEED_CAP` are 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: - `econ` 0.51 -> 0.99, 0.41 -> 0.97 - `sctr` 0.40 -> 0.98, 0.29 -> 0.97 - `ext` 0.45 -> 0.08, 0.50 -> 0.13 - `erot` 0.12 -> 0.86, 0.10 -> 0.86 - `vsig` 0.52 -> 5.56, 0.49 -> 4.50 - stars 54422 -> **268810**, 50684 -> **254989** A 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 1. **Raise the scenario test size.** Tests would then exercise the regime the site actually runs in, at the cost of slower tests. The current suite passes at a size where the sim is marginal. 2. **Scale the length constants with the domain.** Express them as fractions of `disk_r` so 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 1. Wave coupling - closed. 2. Smooth field - open on implementation; **size-robust**, which is the good news here. 3. Elliptical - open, the blocker, broken at every size, needs a redesign not a constant. 4. Central concentration - open but **downgraded**: converges at size 250+, only bites at 150, and traces to absolute length scales rather than to the fix. 5. Radiation gate - open as a retune. Removal is off the table. 6. Land it - open, and now gated on the test-size decision above. 7. Size dependence - **characterized**, cause identified, remedy is a decision rather than an experiment.
Author
Member

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.

configuration econ ext erot sctr vsig stars
baseline (the target) 0.51 / 0.41 0.45 / 0.50 0.12 / 0.10 0.40 / 0.29 0.52 / 0.49 54422 / 50684
cap + axisym, no dispersion 0.89 / 0.84 0.24 / 0.27 0.79 / 0.81 0.84 / 0.77 3.08 / 2.89 45268 / 37252
+ dispersion 0.6 0.71 / 0.52 0.31 / 0.40 0.72 / 0.74 0.67 / 0.47 1.57 / 1.63 42313 / 35534
+ dispersion 1.2 0.73 / 0.58 0.32 / 0.41 0.45 / 0.45 0.66 / 0.50 0.60 / 0.70 40336 / 31753
+ dispersion 2.0 0.73 / 0.58 0.33 / 0.43 0.26 / 0.24 0.64 / 0.47 0.30 / 0.38 37089 / 32467

At dispersion 1.2 the kinematics come back essentially exactly: vsig 0.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 erot 0.45 against 0.12 - still three times baseline where vsig says the population is not rotating. Two rotation metrics disagreeing is worth understanding before tuning to either. erot keeps falling to 0.26 / 0.24 at dispersion 2.0 while vsig overshoots 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.

metric cap+axisym cap+axisym + dispersion 1.2
pooled vsig 2.25 / 2.44 0.75 / 0.66
old cohort 2.07 / 2.21 0.68 / 0.56
drained 110 / 175 1046 / 902

It 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 ScenarioParams next to star_drag and v_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

  1. Wave coupling - closed. Safe at any coupling tried, not required, available as art direction.
  2. Smooth field - closed on evidence, size-robust, open on implementation.
  3. Elliptical - closed on design. Add birth_velocity_dispersion to ScenarioParams, 0.0 for the disk scenarios and ~1.2-1.7 for the elliptical. Exact value pending the finer scan and a look at why erot and vsig disagree.
  4. Central concentration - open, confined to size 150, traced to absolute length scales.
  5. Radiation gate - open as a retune. Removal is off the table: it caused a five-fold star-formation runaway in the elliptical.
  6. Land it - open, gated on the fork below.
  7. Size dependence - characterized.

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:

  1. Raise the scenario test size so tests exercise the regime the site runs in. Slower tests, smaller change.
  2. Make the length constants fractions of disk_r so 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 main and inert by default: 91 Rust tests, clippy, rustfmt green, golden fields untouched, and no physics changed.

## 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. | configuration | `econ` | `ext` | `erot` | `sctr` | `vsig` | stars | |---|---|---|---|---|---|---| | **baseline (the target)** | 0.51 / 0.41 | 0.45 / 0.50 | 0.12 / 0.10 | 0.40 / 0.29 | **0.52 / 0.49** | 54422 / 50684 | | cap + axisym, no dispersion | 0.89 / 0.84 | 0.24 / 0.27 | 0.79 / 0.81 | 0.84 / 0.77 | **3.08 / 2.89** | 45268 / 37252 | | + dispersion 0.6 | 0.71 / 0.52 | 0.31 / 0.40 | 0.72 / 0.74 | 0.67 / 0.47 | 1.57 / 1.63 | 42313 / 35534 | | **+ dispersion 1.2** | 0.73 / 0.58 | 0.32 / 0.41 | 0.45 / 0.45 | 0.66 / 0.50 | **0.60 / 0.70** | 40336 / 31753 | | + dispersion 2.0 | 0.73 / 0.58 | 0.33 / 0.43 | 0.26 / 0.24 | 0.64 / 0.47 | 0.30 / 0.38 | 37089 / 32467 | At dispersion 1.2 the kinematics come back essentially exactly: `vsig` 0.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 `erot` 0.45 against 0.12 - still three times baseline where `vsig` says the population is not rotating. Two rotation metrics disagreeing is worth understanding before tuning to either. `erot` keeps falling to 0.26 / 0.24 at dispersion 2.0 while `vsig` overshoots 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. | metric | cap+axisym | cap+axisym + dispersion 1.2 | |---|---|---| | pooled `vsig` | 2.25 / 2.44 | **0.75 / 0.66** | | old cohort | 2.07 / 2.21 | 0.68 / 0.56 | | drained | 110 / 175 | 1046 / 902 | It 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 `ScenarioParams` next to `star_drag` and `v_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 1. **Wave coupling** - closed. Safe at any coupling tried, not required, available as art direction. 2. **Smooth field** - closed on evidence, size-robust, open on implementation. 3. **Elliptical** - **closed on design.** Add `birth_velocity_dispersion` to `ScenarioParams`, 0.0 for the disk scenarios and ~1.2-1.7 for the elliptical. Exact value pending the finer scan and a look at why `erot` and `vsig` disagree. 4. **Central concentration** - open, confined to size 150, traced to absolute length scales. 5. **Radiation gate** - open as a retune. Removal is off the table: it caused a five-fold star-formation runaway in the elliptical. 6. **Land it** - open, gated on the fork below. 7. **Size dependence** - characterized. ### 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: 1. **Raise the scenario test size** so tests exercise the regime the site runs in. Slower tests, smaller change. 2. **Make the length constants fractions of `disk_r`** so 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 `main` and inert by default: 91 Rust tests, clippy, rustfmt green, golden fields untouched, and no physics changed.
Author
Member

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:

dispersion econ ext erot vsig
baseline (target) 0.51 / 0.41 0.45 / 0.50 0.12 / 0.10 0.52 / 0.49
1.2 0.73 / 0.58 0.32 / 0.41 0.45 / 0.45 0.60 / 0.70
1.5 0.70 / 0.60 0.35 / 0.41 0.39 / 0.33 0.58 / 0.45
1.7 0.72 / 0.60 0.36 / 0.42 0.32 / 0.27 0.41 / 0.42
2.0 0.73 / 0.58 0.33 / 0.43 0.26 / 0.24 0.30 / 0.38

1.5 matches the target vsig almost exactly. Extent recovers about 70% of the way, erot about half. The residual econ and sctr elevation 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: vsig 1.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_dispersion of 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_SIZE scales the five absolute length constants - association join, birth, tidal, and binding radii plus the coarse field softening - by size / reference. irregular=>spiral, t=3000 at 150 and 250, against size 500 at t=2500 as the reference:

configuration sctr young sctr vsig
150, absolute lengths 0.31 / 0.62 0.25 / 0.83 2.57 / 3.44
150, scaled to 500 0.25 / 0.48 0.18 / 0.12 2.33 / 2.02
250, scaled to 500 0.14 / 0.35 0.05 / 0.26 1.57 / 3.09
500, reference 0.16 / 0.17 - 2.25 / 2.44

Real 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. vsig at 150 converges toward the reference rather than overshooting it.

But all-ages sctr only 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 as r/v, so BIRTH_VCIRC_CAP, ASSOCIATION_ORBIT_SPEED_CAP, ASSOCIATION_BINDING_LIFETIME, ASSOCIATION_TIDAL_GRACE and 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

  1. Raise the scenario test size. Small change, slower tests, exercises the regime the site runs in. Item 4 persists but stops mattering, because nothing runs at 150.
  2. Full dimensional scaling. Large change across three dimensions, fixes the class, needs all four scenarios retuned and golden fields regenerated. A third of item 4 is measured; the rest is projected, not proven.

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

  1. Wave coupling - closed.
  2. Smooth field - closed on evidence, size-robust, open on implementation.
  3. Elliptical - closed, birth_velocity_dispersion 1.5 elliptical / 0.0-0.3 disks.
  4. Central concentration - open, ~a third attributable to absolute lengths, remainder unexplained.
  5. Radiation gate - open as a retune, removal off the table.
  6. Land it - open, gated on the fork.
  7. Size dependence - characterized and now partially quantified.

Everything measured here is behind switches on main that are off by default. 91 tests, clippy, rustfmt green, golden fields untouched, 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: | dispersion | `econ` | `ext` | `erot` | `vsig` | |---|---|---|---|---| | **baseline (target)** | 0.51 / 0.41 | 0.45 / 0.50 | 0.12 / 0.10 | **0.52 / 0.49** | | 1.2 | 0.73 / 0.58 | 0.32 / 0.41 | 0.45 / 0.45 | 0.60 / 0.70 | | **1.5** | 0.70 / 0.60 | 0.35 / 0.41 | 0.39 / 0.33 | **0.58 / 0.45** | | 1.7 | 0.72 / 0.60 | 0.36 / 0.42 | 0.32 / 0.27 | 0.41 / 0.42 | | 2.0 | 0.73 / 0.58 | 0.33 / 0.43 | 0.26 / 0.24 | 0.30 / 0.38 | 1.5 matches the target `vsig` almost exactly. Extent recovers about 70% of the way, `erot` about half. The residual `econ` and `sctr` elevation 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: `vsig` 1.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_dispersion` of 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_SIZE` scales the five absolute length constants - association join, birth, tidal, and binding radii plus the coarse field softening - by `size / reference`. irregular=>spiral, t=3000 at 150 and 250, against size 500 at t=2500 as the reference: | configuration | `sctr` | young `sctr` | `vsig` | |---|---|---|---| | 150, absolute lengths | 0.31 / 0.62 | 0.25 / 0.83 | 2.57 / 3.44 | | 150, scaled to 500 | **0.25 / 0.48** | **0.18 / 0.12** | 2.33 / 2.02 | | 250, scaled to 500 | 0.14 / 0.35 | 0.05 / 0.26 | 1.57 / 3.09 | | 500, reference | 0.16 / 0.17 | - | 2.25 / 2.44 | Real 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. `vsig` at 150 converges toward the reference rather than overshooting it. But all-ages `sctr` only 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 as `r/v`, so `BIRTH_VCIRC_CAP`, `ASSOCIATION_ORBIT_SPEED_CAP`, `ASSOCIATION_BINDING_LIFETIME`, `ASSOCIATION_TIDAL_GRACE` and 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 1. **Raise the scenario test size.** Small change, slower tests, exercises the regime the site runs in. Item 4 persists but stops mattering, because nothing runs at 150. 2. **Full dimensional scaling.** Large change across three dimensions, fixes the class, needs all four scenarios retuned and golden fields regenerated. A third of item 4 is measured; the rest is projected, not proven. 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 1. Wave coupling - closed. 2. Smooth field - closed on evidence, size-robust, open on implementation. 3. Elliptical - **closed**, `birth_velocity_dispersion` 1.5 elliptical / 0.0-0.3 disks. 4. Central concentration - open, ~a third attributable to absolute lengths, remainder unexplained. 5. Radiation gate - open as a retune, removal off the table. 6. Land it - open, gated on the fork. 7. Size dependence - characterized and now partially quantified. Everything measured here is behind switches on `main` that are off by default. 91 tests, clippy, rustfmt green, golden fields untouched, no physics changed.
Author
Member

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_SQ is 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 = 3 keeps debug assertions and overflow checks on and trades compile time for run time:

before after
domain size 50 250
full suite ~40s ~11s

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_..._coherent required minimum coherence 0.3 and minimum coverage 0.5 across a hundred-tick window. At 250, seed 42:

statistic measured at 250 old bar
mean coherence 0.195 -
min coherence 0.072 0.3
mean coverage 0.337 -
min coverage 0.125 0.5

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

  1. Wave coupling - closed.
  2. Smooth field - closed on evidence, open on implementation.
  3. Elliptical - closed on design, birth_velocity_dispersion 1.5 / 0.0-0.3.
  4. Central concentration - parked, out of scope under option 1.
  5. Radiation gate - open as a retune.
  6. Land it - unblocked. Next actual step.
  7. Size dependence - closed by decision. Residual belongs in its own issue.

ward exec test-rust, lint-rust, and check-js all green on a clean tree.

## 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_SQ` is 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 = 3` keeps debug assertions and overflow checks on and trades compile time for run time: | | before | after | |---|---|---| | domain size | 50 | **250** | | full suite | ~40s | **~11s** | 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_..._coherent` required minimum coherence 0.3 and minimum coverage 0.5 across a hundred-tick window. At 250, seed 42: | statistic | measured at 250 | old bar | |---|---|---| | mean coherence | 0.195 | - | | min coherence | **0.072** | 0.3 | | mean coverage | 0.337 | - | | min coverage | **0.125** | 0.5 | 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 1. Wave coupling - closed. 2. Smooth field - closed on evidence, open on implementation. 3. Elliptical - closed on design, `birth_velocity_dispersion` 1.5 / 0.0-0.3. 4. Central concentration - parked, out of scope under option 1. 5. Radiation gate - open as a retune. 6. Land it - **unblocked.** Next actual step. 7. Size dependence - **closed by decision.** Residual belongs in its own issue. `ward exec test-rust`, `lint-rust`, and `check-js` all green on a clean tree.
Author
Member

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:

  • Mass recycles (SN_GAS_RETURN 0.8 plus the fountain), so the gas budget is not a ceiling.
  • Only about 4% of stars born die of old age inside a 2500-tick run, so mortality is not a sink either. Half of all births live 64800 ticks.
  • That leaves the spatial phase-mixing drain, which this issue cuts 30-80x on purpose.

Star count at size 500 out to t=5000, seed 12345:

t baseline the fix fix, no radiation gate
2500 43656 24018 90722
5000 49458, turning over 31095, still climbing 131567, accelerating

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/101 with 32081 stars in the runtime-perf spec, 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.

## 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: - Mass recycles (`SN_GAS_RETURN` 0.8 plus the fountain), so the gas budget is not a ceiling. - Only about 4% of stars born die of old age inside a 2500-tick run, so mortality is not a sink either. Half of all births live 64800 ticks. - That leaves the spatial phase-mixing drain, which this issue cuts 30-80x on purpose. Star count at size 500 out to t=5000, seed 12345: | t | baseline | the fix | fix, no radiation gate | |---|---|---|---| | 2500 | 43656 | 24018 | 90722 | | 5000 | **49458**, turning over | **31095**, still climbing | **131567**, accelerating | 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/101` with 32081 stars in the `runtime-perf` spec, 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.
Author
Member

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

parameter disks elliptical
birth_orbit_ratio_cap 1.06 1.06
birth_velocity_dispersion 0.3 1.5
collapse_radiation_resist 80 (was 20) 20
STAR_FIELD_AXISYMMETRIC true true

Every switch inverts to its own control, following the RESOLVED_LUMINOSITY_FLOOR precedent, 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_COUPLING stays 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 vsig stays 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_fraction and collapse_chance.

Results, size 500, t=2500, two seeds

scenario before after
irregular => spiral 0.48 / 0.31 2.50 / 3.30
bang => spiral - 2.49 / 2.75
irregular => elliptical 0.52 / 0.49 (target) 0.58 / 0.45

To t=5000: vsig 1.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_ratio mirrored the ablation switch but not the new scenario parameter, so it reported bcirc=1.93 while 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, full precommit gate. 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

  1. Wave coupling - closed, stays 0.
  2. Smooth field - closed, shipped as full axisymmetrization.
  3. Elliptical dispersion - closed, shipped at 1.5.
  4. Central concentration - parked, out of scope under option 1.
  5. Radiation gate - closed, per-scenario 80/20.
  6. Land it - done.
  7. Size dependence - closed by decision.

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.

## 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 | parameter | disks | elliptical | |---|---|---| | `birth_orbit_ratio_cap` | 1.06 | 1.06 | | `birth_velocity_dispersion` | 0.3 | 1.5 | | `collapse_radiation_resist` | 80 (was 20) | 20 | | `STAR_FIELD_AXISYMMETRIC` | true | true | Every switch inverts to its own control, following the `RESOLVED_LUMINOSITY_FLOOR` precedent, 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_COUPLING` stays 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 `vsig` stays 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_fraction` and `collapse_chance`. ### Results, size 500, t=2500, two seeds | scenario | before | after | |---|---|---| | irregular => spiral | 0.48 / 0.31 | **2.50 / 3.30** | | bang => spiral | - | 2.49 / 2.75 | | irregular => elliptical | 0.52 / 0.49 (target) | **0.58 / 0.45** | To t=5000: `vsig` 1.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_ratio` mirrored the ablation switch but not the new scenario parameter, so it reported `bcirc=1.93` while 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`, full `precommit` gate. 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 1. Wave coupling - closed, stays 0. 2. Smooth field - **closed, shipped as full axisymmetrization.** 3. Elliptical dispersion - **closed, shipped at 1.5.** 4. Central concentration - parked, out of scope under option 1. 5. Radiation gate - **closed, per-scenario 80/20.** 6. Land it - **done.** 7. Size dependence - closed by decision. 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.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/galaxy-gen#70
No description provided.