utac-metastable-clusters 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- utac_metastable_clusters-1.0.0/.github/workflows/ci.yml +44 -0
- utac_metastable_clusters-1.0.0/.github/workflows/release.yml +118 -0
- utac_metastable_clusters-1.0.0/.gitignore +22 -0
- utac_metastable_clusters-1.0.0/.pre-commit-config.yaml +14 -0
- utac_metastable_clusters-1.0.0/.zenodo.json +36 -0
- utac_metastable_clusters-1.0.0/AGENT.md +26 -0
- utac_metastable_clusters-1.0.0/CITATION.cff +20 -0
- utac_metastable_clusters-1.0.0/DISCLAIMER.md +71 -0
- utac_metastable_clusters-1.0.0/LICENSE +11 -0
- utac_metastable_clusters-1.0.0/LICENSE-CODE +45 -0
- utac_metastable_clusters-1.0.0/LICENSE-DOCS +28 -0
- utac_metastable_clusters-1.0.0/PKG-INFO +131 -0
- utac_metastable_clusters-1.0.0/README.md +101 -0
- utac_metastable_clusters-1.0.0/config/entropy.yaml +10 -0
- utac_metastable_clusters-1.0.0/domains.yaml +14 -0
- utac_metastable_clusters-1.0.0/pyproject.toml +53 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/__init__.py +31 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/bridge.py +32 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/cluster_entropy_node.py +96 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/constants.py +42 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/sgr_a_modulator.py +75 -0
- utac_metastable_clusters-1.0.0/src/utac_metastable_clusters/system.py +134 -0
- utac_metastable_clusters-1.0.0/tests/__init__.py +0 -0
- utac_metastable_clusters-1.0.0/tests/test_main.py +141 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main", "master", "claude/**"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main", "master"]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
name: Lint (ruff + mypy)
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
- uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.11"
|
|
22
|
+
- name: Install dev dependencies
|
|
23
|
+
run: pip install -e ".[dev]"
|
|
24
|
+
- name: Run ruff
|
|
25
|
+
run: ruff check src tests
|
|
26
|
+
- name: Run mypy
|
|
27
|
+
run: mypy src
|
|
28
|
+
|
|
29
|
+
test:
|
|
30
|
+
name: Tests (Python ${{ matrix.python-version }})
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
strategy:
|
|
33
|
+
fail-fast: false
|
|
34
|
+
matrix:
|
|
35
|
+
python-version: ["3.11", "3.12"]
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
- uses: actions/setup-python@v5
|
|
39
|
+
with:
|
|
40
|
+
python-version: ${{ matrix.python-version }}
|
|
41
|
+
- name: Install dependencies
|
|
42
|
+
run: pip install -e ".[dev]"
|
|
43
|
+
- name: Run pytest with coverage
|
|
44
|
+
run: pytest --cov=src --cov-report=xml
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
- "v*.*.*-rc*"
|
|
8
|
+
- "v*.*.*-alpha*"
|
|
9
|
+
- "v*.*.*-beta*"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write
|
|
13
|
+
id-token: write # for PyPI trusted publishing, if configured
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build:
|
|
17
|
+
name: Build distribution
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
with:
|
|
22
|
+
fetch-depth: 0
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
|
|
29
|
+
- name: Install build tooling
|
|
30
|
+
run: python -m pip install --upgrade pip build
|
|
31
|
+
|
|
32
|
+
- name: Build sdist and wheel
|
|
33
|
+
run: python -m build
|
|
34
|
+
|
|
35
|
+
- name: Upload build artifacts
|
|
36
|
+
uses: actions/upload-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: dist
|
|
39
|
+
path: dist/
|
|
40
|
+
|
|
41
|
+
test:
|
|
42
|
+
name: Run test suite
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v4
|
|
46
|
+
|
|
47
|
+
- name: Set up Python
|
|
48
|
+
uses: actions/setup-python@v5
|
|
49
|
+
with:
|
|
50
|
+
python-version: "3.12"
|
|
51
|
+
|
|
52
|
+
- name: Install package with dev/test extras
|
|
53
|
+
run: |
|
|
54
|
+
python -m pip install --upgrade pip
|
|
55
|
+
if python -c "import tomllib" 2>/dev/null; then :; fi
|
|
56
|
+
pip install -e ".[dev]" 2>/dev/null || pip install -e ".[test]" 2>/dev/null || pip install -e "."
|
|
57
|
+
pip install pytest pytest-cov
|
|
58
|
+
|
|
59
|
+
- name: Run tests
|
|
60
|
+
run: pytest -q || pytest -q --no-header
|
|
61
|
+
|
|
62
|
+
publish-canary:
|
|
63
|
+
name: Publish canary (TestPyPI + pre-release)
|
|
64
|
+
needs: [build, test]
|
|
65
|
+
if: contains(github.ref_name, '-rc') || contains(github.ref_name, '-alpha') || contains(github.ref_name, '-beta')
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
environment: testpypi
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/download-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
name: dist
|
|
72
|
+
path: dist/
|
|
73
|
+
|
|
74
|
+
- name: Publish to TestPyPI
|
|
75
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
76
|
+
with:
|
|
77
|
+
repository-url: https://test.pypi.org/legacy/
|
|
78
|
+
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
79
|
+
skip-existing: true
|
|
80
|
+
|
|
81
|
+
- name: Create GitHub pre-release
|
|
82
|
+
uses: softprops/action-gh-release@v2
|
|
83
|
+
with:
|
|
84
|
+
files: dist/*
|
|
85
|
+
prerelease: true
|
|
86
|
+
generate_release_notes: true
|
|
87
|
+
|
|
88
|
+
publish-production:
|
|
89
|
+
name: Publish production (PyPI + release + Zenodo archive)
|
|
90
|
+
needs: [build, test]
|
|
91
|
+
if: ${{ !contains(github.ref_name, '-rc') && !contains(github.ref_name, '-alpha') && !contains(github.ref_name, '-beta') }}
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
environment: pypi
|
|
94
|
+
steps:
|
|
95
|
+
- uses: actions/download-artifact@v4
|
|
96
|
+
with:
|
|
97
|
+
name: dist
|
|
98
|
+
path: dist/
|
|
99
|
+
|
|
100
|
+
- name: Publish to PyPI
|
|
101
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
102
|
+
with:
|
|
103
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
104
|
+
skip-existing: true
|
|
105
|
+
|
|
106
|
+
- name: Create GitHub Release
|
|
107
|
+
uses: softprops/action-gh-release@v2
|
|
108
|
+
with:
|
|
109
|
+
files: dist/*
|
|
110
|
+
prerelease: false
|
|
111
|
+
generate_release_notes: true
|
|
112
|
+
|
|
113
|
+
# NOTE: Zenodo archival of this GitHub Release happens automatically
|
|
114
|
+
# IF this repo has Zenodo-GitHub integration enabled at
|
|
115
|
+
# https://zenodo.org/account/settings/github/ (a per-repo, per-owner
|
|
116
|
+
# OAuth toggle on zenodo.org — cannot be set from a workflow file).
|
|
117
|
+
# Once enabled, every GitHub Release like this one mints/updates a
|
|
118
|
+
# Zenodo DOI automatically using the .zenodo.json metadata in this repo.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.6.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
9
|
+
rev: v4.6.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: trailing-whitespace
|
|
12
|
+
- id: end-of-file-fixer
|
|
13
|
+
- id: check-yaml
|
|
14
|
+
- id: check-toml
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "utac-metastable-clusters — P56: Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes",
|
|
3
|
+
"description": "<p>Metastable star clusters and Sagittarius A* modelled as UTAC entropy-return nodes -- a realistic, non-exotic alternative to white holes, plus a UTAC-framework application to star formation near the Galactic Center. GenesisAeon Package 56.</p><p>Part of the <strong>GenesisAeon</strong> ecosystem (P56, domain: astrophysics / entropy dynamics).</p><p>See <a href=\"https://github.com/GenesisAeon/utac-metastable-clusters\">github.com/GenesisAeon/utac-metastable-clusters</a> for source, documentation, and reproducibility notebooks.</p><p>SPECULATIVE module -- see DISCLAIMER.md. Dual-licensed: source code under GPL-3.0-or-later, documentation under CC BY 4.0.</p>",
|
|
4
|
+
"creators": [
|
|
5
|
+
{
|
|
6
|
+
"name": "Römer, Johann",
|
|
7
|
+
"affiliation": "Independent Researcher / MOR Research Collective"
|
|
8
|
+
}
|
|
9
|
+
],
|
|
10
|
+
"license": "other-open",
|
|
11
|
+
"upload_type": "software",
|
|
12
|
+
"access_right": "open",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"GenesisAeon",
|
|
15
|
+
"P56",
|
|
16
|
+
"astrophysics / entropy dynamics",
|
|
17
|
+
"UTAC",
|
|
18
|
+
"CREP",
|
|
19
|
+
"white holes",
|
|
20
|
+
"Sagittarius A*",
|
|
21
|
+
"star clusters",
|
|
22
|
+
"open science"
|
|
23
|
+
],
|
|
24
|
+
"related_identifiers": [
|
|
25
|
+
{
|
|
26
|
+
"identifier": "10.5281/zenodo.19645351",
|
|
27
|
+
"relation": "isPartOf",
|
|
28
|
+
"resource_type": "publication-article",
|
|
29
|
+
"scheme": "doi"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"version": "1.0.0",
|
|
33
|
+
"communities": [
|
|
34
|
+
{ "identifier": "genesisaeon" }
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# AGENT.md – GenesisAeon Release & Metadata Rules
|
|
2
|
+
|
|
3
|
+
## Bei jeder relevanten Änderung (Version Bump, Feature, Bugfix, Docs):
|
|
4
|
+
|
|
5
|
+
1. **.zenodo.json**
|
|
6
|
+
- Aktualisiere `version`, `description`, `keywords`, `related_identifiers`
|
|
7
|
+
- Beschreibung muss die aktuelle Funktion des Packages klar beschreiben
|
|
8
|
+
- Immer den Whitepaper-DOI (10.5281/zenodo.19645351) als `isPartOf` oder
|
|
9
|
+
`isDocumentedBy` eintragen
|
|
10
|
+
|
|
11
|
+
2. **README.md**
|
|
12
|
+
- Aktualisiere Whitepaper-Badge auf aktuelle Version
|
|
13
|
+
- Aktualisiere @software BibTeX-Eintrag (version, publisher=Zenodo, DOI)
|
|
14
|
+
- Füge Package-Number-Badge ein (z.B. Package 17)
|
|
15
|
+
|
|
16
|
+
3. **Versionierung**
|
|
17
|
+
- pyproject.toml und __init__.py müssen synchron auf dieselbe Version sein
|
|
18
|
+
- Tags immer als annotated Tag (`git tag -a vX.Y.Z`)
|
|
19
|
+
|
|
20
|
+
4. **Commit-Message**
|
|
21
|
+
- Beginne mit "release:", "feat:", "fix:", "docs:" oder "chore:"
|
|
22
|
+
|
|
23
|
+
5. **Nach jedem neuen Tag**
|
|
24
|
+
- Release-Pipeline (PyPI + Zenodo) wird automatisch ausgelöst
|
|
25
|
+
|
|
26
|
+
Diese Regeln sind bindend für alle Claude-Code-Runs und zukünftige Agents in GenesisAeon-Repos.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
type: software
|
|
4
|
+
title: "utac-metastable-clusters"
|
|
5
|
+
version: "1.0.0"
|
|
6
|
+
date-released: "2026-08-01"
|
|
7
|
+
authors:
|
|
8
|
+
- name: "GenesisAeon"
|
|
9
|
+
repository-code: "https://github.com/GenesisAeon/utac-metastable-clusters"
|
|
10
|
+
license: GPL-3.0-or-later
|
|
11
|
+
abstract: "Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes -- a realistic, non-exotic alternative to white holes. GenesisAeon Package 56. SPECULATIVE, not peer-reviewed."
|
|
12
|
+
keywords:
|
|
13
|
+
- GenesisAeon
|
|
14
|
+
- UTAC
|
|
15
|
+
- CREP
|
|
16
|
+
- open-science
|
|
17
|
+
- astrophysics
|
|
18
|
+
- white-holes
|
|
19
|
+
- Sagittarius-A
|
|
20
|
+
- star-clusters
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# DISCLAIMER — Speculative Astrophysics Module
|
|
2
|
+
|
|
3
|
+
**Status: SPECULATIVE**
|
|
4
|
+
|
|
5
|
+
This module (`utac-metastable-clusters`) implements two related UTAC-framework
|
|
6
|
+
applications to compact-object entropy dynamics:
|
|
7
|
+
|
|
8
|
+
1. **Metastable star clusters as resonant entropy-return nodes** — a realistic,
|
|
9
|
+
non-exotic alternative to the (unobserved, thermodynamically problematic)
|
|
10
|
+
white-hole hypothesis, using known processes (stellar winds, supernovae,
|
|
11
|
+
tidal ejections) instead of a hypothetical time-reversed black hole.
|
|
12
|
+
2. **Sagittarius A\* as a metastable entropy modulator** — a UTAC-framework
|
|
13
|
+
explanation for the real, actively-studied puzzle of active star formation
|
|
14
|
+
within a few light-years of the Galactic Center despite extreme conditions
|
|
15
|
+
(the "paradox of youth").
|
|
16
|
+
|
|
17
|
+
## What this is
|
|
18
|
+
|
|
19
|
+
- A mathematically self-consistent UTAC-framework application to two real,
|
|
20
|
+
documented astrophysical puzzles (white-hole non-detection; star formation
|
|
21
|
+
near Sgr A*)
|
|
22
|
+
- A source of **falsifiable predictions** (β > 7 in active clusters/regions,
|
|
23
|
+
testable against Gaia DR4 astrometry and future GRAVITY/JWST observations)
|
|
24
|
+
- Part of the GenesisAeon research collective's theoretical physics preprint
|
|
25
|
+
programme
|
|
26
|
+
|
|
27
|
+
## What this is NOT
|
|
28
|
+
|
|
29
|
+
- Established physics — this framework has **not** passed peer review
|
|
30
|
+
- A claim that white holes are ruled out, or that star clusters literally are
|
|
31
|
+
white holes — it proposes an alternative mechanism for a related
|
|
32
|
+
entropy-recycling role
|
|
33
|
+
- A claim that the neural/microtubule 13.5 MHz resonance (see the separate,
|
|
34
|
+
externally-verified finding in the Feldtheorie package) extends to
|
|
35
|
+
Sagittarius A* — an earlier preprint (`The 0.0625 Invariant`, Zenodo
|
|
36
|
+
18310715) asserted a 13.5 MHz resonance "in galactic cores like Sagittarius
|
|
37
|
+
A*"; a literature check (2026-08-01) found no observational support for
|
|
38
|
+
this specific extension (real Sgr A* periodicities are a ~106-day radio
|
|
39
|
+
cycle and ~17-minute IR quasi-periodicity — many orders of magnitude away
|
|
40
|
+
from 13.5 MHz). **This module deliberately does not repeat that claim.**
|
|
41
|
+
|
|
42
|
+
## Falsification conditions
|
|
43
|
+
|
|
44
|
+
1. Gaia DR4 astrometry of active star-forming clusters shows no threshold
|
|
45
|
+
behaviour near the predicted β > 7 regime
|
|
46
|
+
2. Future GRAVITY/JWST observations of the Sgr A* environment find no
|
|
47
|
+
entropy-modulation signature consistent with the UTAC mapping
|
|
48
|
+
3. The underlying real observations this module builds on turn out to be
|
|
49
|
+
mischaracterized (see References — both were independently verified via
|
|
50
|
+
WebSearch on 2026-08-01)
|
|
51
|
+
|
|
52
|
+
## References
|
|
53
|
+
|
|
54
|
+
Verified real, independently checked (2026-08-01), not just carried over from
|
|
55
|
+
the source preprints:
|
|
56
|
+
|
|
57
|
+
- High-redshift protocluster A2744-z7p9OD (z≈7.88-7.9), spectroscopically
|
|
58
|
+
confirmed via JWST NIRSpec — real, confirmed object (see e.g.
|
|
59
|
+
`en.wikipedia.org/wiki/A2744z7p9OD`; GLASS-JWST XIV, ApJL 2023)
|
|
60
|
+
- Gaia DR3 open-cluster tidal tails: a real 2025 study (Astronomy &
|
|
61
|
+
Astrophysics) found tidal tails in 19 of 21 nearby open clusters, several
|
|
62
|
+
asymmetric/tilted relative to the Galactic Centre direction
|
|
63
|
+
- Active star formation near Sgr A* despite extreme tidal/radiative
|
|
64
|
+
conditions ("paradox of youth") — a real, actively-studied astrophysical
|
|
65
|
+
puzzle, referenced via ALMA/JWST/GRAVITY observations in the source
|
|
66
|
+
preprint (specific paper/author citations for this were not given in the
|
|
67
|
+
original preprint abstract and have not been independently traced here —
|
|
68
|
+
treat as a real phenomenon, not yet as a specifically-sourced citation)
|
|
69
|
+
|
|
70
|
+
Please treat all numerical outputs from this module as **hypotheses**, not
|
|
71
|
+
measurements.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
This repository is dual-licensed:
|
|
2
|
+
|
|
3
|
+
- **Source code** (everything under `src/`, `scripts/`, `tests/`, and any
|
|
4
|
+
other `.py` files) is licensed under the **GNU General Public License
|
|
5
|
+
v3.0 or later (GPL-3.0-or-later)**. See [LICENSE-CODE](LICENSE-CODE).
|
|
6
|
+
|
|
7
|
+
- **Documentation** (`README.md`, files under `docs/`, and other prose
|
|
8
|
+
content) is licensed under **Creative Commons Attribution 4.0
|
|
9
|
+
International (CC BY 4.0)**. See [LICENSE-DOCS](LICENSE-DOCS).
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2026 Johann Römer / GenesisAeon Project
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
GNU GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 29 June 2007
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
5
|
+
Everyone is permitted to copy and distribute verbatim copies
|
|
6
|
+
of this license document, but changing it is not allowed.
|
|
7
|
+
|
|
8
|
+
Preamble
|
|
9
|
+
|
|
10
|
+
The GNU General Public License is a free, copyleft license for
|
|
11
|
+
software and other kinds of works.
|
|
12
|
+
|
|
13
|
+
The licenses for most software and other practical works are designed
|
|
14
|
+
to take away your freedom to share and change the works. By contrast,
|
|
15
|
+
the GNU General Public License is intended to guarantee your freedom to
|
|
16
|
+
share and change all versions of a program--to make sure it remains free
|
|
17
|
+
software for all its users. We, the Free Software Foundation, use the
|
|
18
|
+
GNU General Public License for most of our software; it applies also to
|
|
19
|
+
any other work released this way by its authors. You can apply it to
|
|
20
|
+
your programs, too.
|
|
21
|
+
|
|
22
|
+
This program is distributed under the GNU General Public License
|
|
23
|
+
version 3 or, at your option, any later version ("GPLv3-or-later").
|
|
24
|
+
|
|
25
|
+
For the full, authoritative text of the GNU General Public License,
|
|
26
|
+
version 3, see <https://www.gnu.org/licenses/gpl-3.0.txt> or
|
|
27
|
+
<https://www.gnu.org/licenses/gpl-3.0.html>. The complete license text
|
|
28
|
+
is also distributed with this software in the file COPYING, or can be
|
|
29
|
+
obtained by writing to the Free Software Foundation, Inc.,
|
|
30
|
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
31
|
+
|
|
32
|
+
This program is free software: you can redistribute it and/or modify
|
|
33
|
+
it under the terms of the GNU General Public License as published by
|
|
34
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
35
|
+
(at your option) any later version.
|
|
36
|
+
|
|
37
|
+
This program is distributed in the hope that it will be useful,
|
|
38
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
39
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
40
|
+
GNU General Public License for more details.
|
|
41
|
+
|
|
42
|
+
You should have received a copy of the GNU General Public License
|
|
43
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
44
|
+
|
|
45
|
+
Copyright (C) 2026 Johann Römer / GenesisAeon Project
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Creative Commons Attribution 4.0 International (CC BY 4.0)
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 Johann Römer / GenesisAeon Project
|
|
4
|
+
|
|
5
|
+
This documentation (README.md, files under docs/, and other
|
|
6
|
+
non-source-code prose in this repository) is licensed under the
|
|
7
|
+
Creative Commons Attribution 4.0 International License.
|
|
8
|
+
|
|
9
|
+
To view a copy of this license, visit
|
|
10
|
+
<https://creativecommons.org/licenses/by/4.0/> or send a letter to
|
|
11
|
+
Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
|
12
|
+
|
|
13
|
+
You are free to:
|
|
14
|
+
- Share — copy and redistribute the material in any medium or format
|
|
15
|
+
- Adapt — remix, transform, and build upon the material
|
|
16
|
+
for any purpose, even commercially.
|
|
17
|
+
|
|
18
|
+
Under the following terms:
|
|
19
|
+
- Attribution — You must give appropriate credit, provide a link to
|
|
20
|
+
the license, and indicate if changes were made. You may do so in
|
|
21
|
+
any reasonable manner, but not in any way that suggests the
|
|
22
|
+
licensor endorses you or your use.
|
|
23
|
+
|
|
24
|
+
No additional restrictions — You may not apply legal terms or
|
|
25
|
+
technological measures that legally restrict others from doing
|
|
26
|
+
anything the license permits.
|
|
27
|
+
|
|
28
|
+
Full legal code: <https://creativecommons.org/licenses/by/4.0/legalcode>
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: utac-metastable-clusters
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes -- realistic, non-exotic alternatives to white holes (GenesisAeon Package 56)
|
|
5
|
+
Project-URL: Homepage, https://github.com/GenesisAeon/utac-metastable-clusters
|
|
6
|
+
Project-URL: Repository, https://github.com/GenesisAeon/utac-metastable-clusters
|
|
7
|
+
Project-URL: Issues, https://github.com/GenesisAeon/utac-metastable-clusters/issues
|
|
8
|
+
Author: GenesisAeon
|
|
9
|
+
License: GPL-3.0-or-later
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: LICENSE-CODE
|
|
12
|
+
License-File: LICENSE-DOCS
|
|
13
|
+
Keywords: CREP,GenesisAeon,Sagittarius-A,UTAC,astrophysics,entropy,star-clusters,white-holes
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Astronomy
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Requires-Dist: pyyaml>=6.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: mypy>=1.10.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: ruff>=0.6.0; extra == 'dev'
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
# utac-metastable-clusters
|
|
32
|
+
|
|
33
|
+
[](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml)
|
|
34
|
+
[](https://www.python.org)
|
|
35
|
+
[](LICENSE-CODE)
|
|
36
|
+
[](LICENSE-DOCS)
|
|
37
|
+
[](DISCLAIMER.md)
|
|
38
|
+
|
|
39
|
+
**Metastable star clusters and Sagittarius A\* as UTAC entropy-return nodes** —
|
|
40
|
+
a realistic, non-exotic alternative to the white-hole hypothesis, plus a
|
|
41
|
+
UTAC-framework application to star formation near the Galactic Center.
|
|
42
|
+
GenesisAeon Package 56.
|
|
43
|
+
|
|
44
|
+
> **SPECULATIVE MODULE** — see [DISCLAIMER.md](DISCLAIMER.md). Not peer-reviewed.
|
|
45
|
+
|
|
46
|
+
## What is this?
|
|
47
|
+
|
|
48
|
+
White holes are unobserved and face severe thermodynamic and stability
|
|
49
|
+
issues. This package models two real, documented astrophysical puzzles
|
|
50
|
+
through the UTAC (Universal Threshold Adaptive Criticality) framework
|
|
51
|
+
instead:
|
|
52
|
+
|
|
53
|
+
1. **Compact star clusters as distributed entropy-return nodes** — using
|
|
54
|
+
known processes (stellar winds, supernovae, tidal ejection) rather than
|
|
55
|
+
a hypothetical time-reversed black hole.
|
|
56
|
+
2. **Sagittarius A\* as a metastable entropy modulator** — explaining active
|
|
57
|
+
star formation within a few light-years of the Galactic Center despite
|
|
58
|
+
extreme tidal/radiative conditions (the "paradox of youth").
|
|
59
|
+
|
|
60
|
+
## Installation
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pip install utac-metastable-clusters
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Usage
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from utac_metastable_clusters import UTACMetastableClusters
|
|
70
|
+
|
|
71
|
+
sys = UTACMetastableClusters()
|
|
72
|
+
result = sys.run_cycle()
|
|
73
|
+
|
|
74
|
+
print(result["cluster"]) # star-cluster entropy-node summary
|
|
75
|
+
print(result["sgr_a"]) # Sagittarius A* modulator summary
|
|
76
|
+
print(sys.get_crep_state())
|
|
77
|
+
print(sys.to_zenodo_record())
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Falsifiable predictions
|
|
81
|
+
|
|
82
|
+
| Prediction | Value | Testable against |
|
|
83
|
+
|-----------|-------|-------------------|
|
|
84
|
+
| UTAC steepness β in "active" clusters/regions | β > 7 | Gaia DR4 astrometry |
|
|
85
|
+
| Sgr A* entropy-modulation signature | model-comparison ΔAIC ≥ 10 vs. null | Future GRAVITY/JWST observations |
|
|
86
|
+
|
|
87
|
+
## Real reference data used (independently verified 2026-08-01)
|
|
88
|
+
|
|
89
|
+
- **Gaia DR3 tidal tails**: 19 of 21 nearby open clusters show tidal tails
|
|
90
|
+
(2025 A&A study), 4 of those asymmetric/tilted away from the Galactic
|
|
91
|
+
Centre — a real finding the standard tidal-disruption picture doesn't fully
|
|
92
|
+
predict.
|
|
93
|
+
- **A2744-z7p9OD**: a real, JWST-NIRSpec-confirmed protocluster at z≈7.88.
|
|
94
|
+
|
|
95
|
+
See [DISCLAIMER.md](DISCLAIMER.md) for what this package does and does
|
|
96
|
+
**not** claim — notably, it deliberately does **not** repeat an unsupported
|
|
97
|
+
"13.5 MHz resonance in Sagittarius A\*" claim found in a related preprint.
|
|
98
|
+
|
|
99
|
+
## Role in the GenesisAeon Ecosystem
|
|
100
|
+
|
|
101
|
+
**Package ID:** P56 | **Domain:** astrophysics / entropy dynamics
|
|
102
|
+
|
|
103
|
+
Builds on the same UTAC/CREP/v_RIG/σ_Φ constants used across the ecosystem
|
|
104
|
+
(see `vrig-cosmological`, `beta-clustering-utac`, Feldtheorie).
|
|
105
|
+
v_RIG = c/(α⁻¹·Φ) ≈ 1352.07 km/s here uses the corrected value (see
|
|
106
|
+
FELDTHEORIE_EPISTEMIC_MAP.md, 2026-08-01).
|
|
107
|
+
|
|
108
|
+
## Development
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
git clone https://github.com/GenesisAeon/utac-metastable-clusters.git
|
|
112
|
+
cd utac-metastable-clusters
|
|
113
|
+
pip install -e ".[dev]"
|
|
114
|
+
ruff check src tests
|
|
115
|
+
mypy src
|
|
116
|
+
pytest
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## License
|
|
120
|
+
|
|
121
|
+
Dual-licensed: source code under
|
|
122
|
+
[GPL-3.0-or-later](LICENSE-CODE), documentation under
|
|
123
|
+
[CC BY 4.0](LICENSE-DOCS).
|
|
124
|
+
|
|
125
|
+
## Citation
|
|
126
|
+
|
|
127
|
+
See [CITATION.cff](CITATION.cff) and [.zenodo.json](.zenodo.json).
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
*GenesisAeon · MOR Research Collective · August 2026*
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# utac-metastable-clusters
|
|
2
|
+
|
|
3
|
+
[](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.python.org)
|
|
5
|
+
[](LICENSE-CODE)
|
|
6
|
+
[](LICENSE-DOCS)
|
|
7
|
+
[](DISCLAIMER.md)
|
|
8
|
+
|
|
9
|
+
**Metastable star clusters and Sagittarius A\* as UTAC entropy-return nodes** —
|
|
10
|
+
a realistic, non-exotic alternative to the white-hole hypothesis, plus a
|
|
11
|
+
UTAC-framework application to star formation near the Galactic Center.
|
|
12
|
+
GenesisAeon Package 56.
|
|
13
|
+
|
|
14
|
+
> **SPECULATIVE MODULE** — see [DISCLAIMER.md](DISCLAIMER.md). Not peer-reviewed.
|
|
15
|
+
|
|
16
|
+
## What is this?
|
|
17
|
+
|
|
18
|
+
White holes are unobserved and face severe thermodynamic and stability
|
|
19
|
+
issues. This package models two real, documented astrophysical puzzles
|
|
20
|
+
through the UTAC (Universal Threshold Adaptive Criticality) framework
|
|
21
|
+
instead:
|
|
22
|
+
|
|
23
|
+
1. **Compact star clusters as distributed entropy-return nodes** — using
|
|
24
|
+
known processes (stellar winds, supernovae, tidal ejection) rather than
|
|
25
|
+
a hypothetical time-reversed black hole.
|
|
26
|
+
2. **Sagittarius A\* as a metastable entropy modulator** — explaining active
|
|
27
|
+
star formation within a few light-years of the Galactic Center despite
|
|
28
|
+
extreme tidal/radiative conditions (the "paradox of youth").
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install utac-metastable-clusters
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from utac_metastable_clusters import UTACMetastableClusters
|
|
40
|
+
|
|
41
|
+
sys = UTACMetastableClusters()
|
|
42
|
+
result = sys.run_cycle()
|
|
43
|
+
|
|
44
|
+
print(result["cluster"]) # star-cluster entropy-node summary
|
|
45
|
+
print(result["sgr_a"]) # Sagittarius A* modulator summary
|
|
46
|
+
print(sys.get_crep_state())
|
|
47
|
+
print(sys.to_zenodo_record())
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Falsifiable predictions
|
|
51
|
+
|
|
52
|
+
| Prediction | Value | Testable against |
|
|
53
|
+
|-----------|-------|-------------------|
|
|
54
|
+
| UTAC steepness β in "active" clusters/regions | β > 7 | Gaia DR4 astrometry |
|
|
55
|
+
| Sgr A* entropy-modulation signature | model-comparison ΔAIC ≥ 10 vs. null | Future GRAVITY/JWST observations |
|
|
56
|
+
|
|
57
|
+
## Real reference data used (independently verified 2026-08-01)
|
|
58
|
+
|
|
59
|
+
- **Gaia DR3 tidal tails**: 19 of 21 nearby open clusters show tidal tails
|
|
60
|
+
(2025 A&A study), 4 of those asymmetric/tilted away from the Galactic
|
|
61
|
+
Centre — a real finding the standard tidal-disruption picture doesn't fully
|
|
62
|
+
predict.
|
|
63
|
+
- **A2744-z7p9OD**: a real, JWST-NIRSpec-confirmed protocluster at z≈7.88.
|
|
64
|
+
|
|
65
|
+
See [DISCLAIMER.md](DISCLAIMER.md) for what this package does and does
|
|
66
|
+
**not** claim — notably, it deliberately does **not** repeat an unsupported
|
|
67
|
+
"13.5 MHz resonance in Sagittarius A\*" claim found in a related preprint.
|
|
68
|
+
|
|
69
|
+
## Role in the GenesisAeon Ecosystem
|
|
70
|
+
|
|
71
|
+
**Package ID:** P56 | **Domain:** astrophysics / entropy dynamics
|
|
72
|
+
|
|
73
|
+
Builds on the same UTAC/CREP/v_RIG/σ_Φ constants used across the ecosystem
|
|
74
|
+
(see `vrig-cosmological`, `beta-clustering-utac`, Feldtheorie).
|
|
75
|
+
v_RIG = c/(α⁻¹·Φ) ≈ 1352.07 km/s here uses the corrected value (see
|
|
76
|
+
FELDTHEORIE_EPISTEMIC_MAP.md, 2026-08-01).
|
|
77
|
+
|
|
78
|
+
## Development
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/GenesisAeon/utac-metastable-clusters.git
|
|
82
|
+
cd utac-metastable-clusters
|
|
83
|
+
pip install -e ".[dev]"
|
|
84
|
+
ruff check src tests
|
|
85
|
+
mypy src
|
|
86
|
+
pytest
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
Dual-licensed: source code under
|
|
92
|
+
[GPL-3.0-or-later](LICENSE-CODE), documentation under
|
|
93
|
+
[CC BY 4.0](LICENSE-DOCS).
|
|
94
|
+
|
|
95
|
+
## Citation
|
|
96
|
+
|
|
97
|
+
See [CITATION.cff](CITATION.cff) and [.zenodo.json](.zenodo.json).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
*GenesisAeon · MOR Research Collective · August 2026*
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Domain configuration for utac-metastable-clusters
|
|
2
|
+
# Compatible with entropy-table bridge format
|
|
3
|
+
domains:
|
|
4
|
+
primary:
|
|
5
|
+
name: "utac-metastable-clusters"
|
|
6
|
+
metrics: crep
|
|
7
|
+
description: "Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes -- realistic alternatives to white holes"
|
|
8
|
+
|
|
9
|
+
relations: []
|
|
10
|
+
|
|
11
|
+
metadata:
|
|
12
|
+
project: "utac-metastable-clusters"
|
|
13
|
+
author: "Johann Römer"
|
|
14
|
+
version: "1.0.0"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "utac-metastable-clusters"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes -- realistic, non-exotic alternatives to white holes (GenesisAeon Package 56)"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = { text = "GPL-3.0-or-later" }
|
|
7
|
+
authors = [{ name = "GenesisAeon" }]
|
|
8
|
+
requires-python = ">=3.11"
|
|
9
|
+
keywords = ["UTAC", "CREP", "GenesisAeon", "astrophysics", "white-holes",
|
|
10
|
+
"Sagittarius-A", "star-clusters", "entropy"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 3 - Alpha",
|
|
13
|
+
"Intended Audience :: Science/Research",
|
|
14
|
+
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.11",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Topic :: Scientific/Engineering :: Astronomy",
|
|
19
|
+
"Topic :: Scientific/Engineering :: Physics",
|
|
20
|
+
]
|
|
21
|
+
dependencies = ["pyyaml>=6.0"]
|
|
22
|
+
|
|
23
|
+
[project.optional-dependencies]
|
|
24
|
+
dev = ["ruff>=0.6.0", "mypy>=1.10.0", "pytest>=8.0.0", "pytest-cov>=5.0.0"]
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Homepage = "https://github.com/GenesisAeon/utac-metastable-clusters"
|
|
28
|
+
Repository = "https://github.com/GenesisAeon/utac-metastable-clusters"
|
|
29
|
+
Issues = "https://github.com/GenesisAeon/utac-metastable-clusters/issues"
|
|
30
|
+
|
|
31
|
+
[build-system]
|
|
32
|
+
requires = ["hatchling"]
|
|
33
|
+
build-backend = "hatchling.build"
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.wheel]
|
|
36
|
+
packages = ["src/utac_metastable_clusters"]
|
|
37
|
+
|
|
38
|
+
[tool.ruff]
|
|
39
|
+
line-length = 100
|
|
40
|
+
target-version = "py311"
|
|
41
|
+
|
|
42
|
+
[tool.ruff.lint]
|
|
43
|
+
select = ["E", "F", "B", "I", "W", "UP"]
|
|
44
|
+
|
|
45
|
+
[tool.pytest.ini_options]
|
|
46
|
+
testpaths = ["tests"]
|
|
47
|
+
addopts = "--cov=utac_metastable_clusters --cov-report=term-missing -v"
|
|
48
|
+
|
|
49
|
+
[tool.mypy]
|
|
50
|
+
python_version = "3.11"
|
|
51
|
+
strict = true
|
|
52
|
+
warn_return_any = true
|
|
53
|
+
ignore_missing_imports = true
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""utac-metastable-clusters -- GenesisAeon Package 56.
|
|
2
|
+
|
|
3
|
+
Metastable star clusters and Sagittarius A* as UTAC entropy-return nodes:
|
|
4
|
+
a realistic, non-exotic alternative to white holes, plus a UTAC-framework
|
|
5
|
+
application to star formation near the Galactic Center. SPECULATIVE, see
|
|
6
|
+
DISCLAIMER.md.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from utac_metastable_clusters.cluster_entropy_node import ClusterEntropyNode, TidalTailSurvey
|
|
10
|
+
from utac_metastable_clusters.constants import (
|
|
11
|
+
BETA_ACTIVE_THRESHOLD,
|
|
12
|
+
PACKAGE_ID,
|
|
13
|
+
SIGMA_PHI,
|
|
14
|
+
V_RIG_KM_S,
|
|
15
|
+
)
|
|
16
|
+
from utac_metastable_clusters.sgr_a_modulator import SgrAEnvironment
|
|
17
|
+
from utac_metastable_clusters.system import UTACMetastableClusters
|
|
18
|
+
|
|
19
|
+
__version__ = "1.0.0"
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"BETA_ACTIVE_THRESHOLD",
|
|
23
|
+
"PACKAGE_ID",
|
|
24
|
+
"SIGMA_PHI",
|
|
25
|
+
"V_RIG_KM_S",
|
|
26
|
+
"ClusterEntropyNode",
|
|
27
|
+
"SgrAEnvironment",
|
|
28
|
+
"TidalTailSurvey",
|
|
29
|
+
"UTACMetastableClusters",
|
|
30
|
+
"__version__",
|
|
31
|
+
]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""entropy-table YAML bridge for utac-metastable-clusters."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import yaml
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def export_to_entropy_table(
|
|
11
|
+
input_path: str | Path = "domains.yaml",
|
|
12
|
+
output_path: str | Path = "exports/entropy-table.yaml",
|
|
13
|
+
) -> Path:
|
|
14
|
+
"""Export domain YAML to entropy-table compatible format."""
|
|
15
|
+
input_path = Path(input_path)
|
|
16
|
+
output_path = Path(output_path)
|
|
17
|
+
|
|
18
|
+
with input_path.open() as f:
|
|
19
|
+
data = yaml.safe_load(f)
|
|
20
|
+
|
|
21
|
+
entropy_data = {
|
|
22
|
+
"domains": data.get("domains", {}),
|
|
23
|
+
"relations": data.get("relations", []),
|
|
24
|
+
"metadata": {
|
|
25
|
+
**data.get("metadata", {}),
|
|
26
|
+
"generated_by": "utac-metastable-clusters (diamond-setup v1.0.0)",
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
output_path.write_text(yaml.dump(entropy_data, sort_keys=False, allow_unicode=True))
|
|
32
|
+
return output_path
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Metastable star clusters as UTAC entropy-return nodes.
|
|
2
|
+
|
|
3
|
+
SPECULATIVE (see DISCLAIMER.md): a non-exotic alternative to the white-hole
|
|
4
|
+
hypothesis. White holes are unobserved and thermodynamically problematic;
|
|
5
|
+
this module proposes that open/globular star clusters play an analogous
|
|
6
|
+
"distributed entropy-return" role using known, real processes (stellar
|
|
7
|
+
winds, supernovae, tidal ejection) rather than a hypothetical time-reversed
|
|
8
|
+
black hole. The UTAC steepness beta here is the framework's own construct
|
|
9
|
+
(k / mass_recycling_fraction, mirroring the k/alpha and k/b-value mappings
|
|
10
|
+
used elsewhere in the ecosystem, e.g. the USGS seismic adapter) -- not a
|
|
11
|
+
measured quantity, an untested, falsifiable prediction (see
|
|
12
|
+
BETA_ACTIVE_THRESHOLD, DISCLAIMER.md falsification conditions).
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
|
|
19
|
+
from utac_metastable_clusters.constants import (
|
|
20
|
+
BETA_ACTIVE_THRESHOLD,
|
|
21
|
+
GAIA_DR3_ASYMMETRIC_TAILS,
|
|
22
|
+
GAIA_DR3_CLUSTERS_SURVEYED,
|
|
23
|
+
GAIA_DR3_CLUSTERS_WITH_TAILS,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# UTAC mapping constant k (framework convention, not independently derived
|
|
27
|
+
# here -- see cluster_entropy_node module docstring).
|
|
28
|
+
K_CLUSTER: float = 1.0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class TidalTailSurvey:
|
|
33
|
+
"""Real Gaia DR3 tidal-tail survey data (verified 2026-08-01, not re-derived).
|
|
34
|
+
|
|
35
|
+
Source: a 2025 Astronomy & Astrophysics study mapping tidal tails of
|
|
36
|
+
nearby open clusters with Gaia DR3. 19 of 21 surveyed clusters show
|
|
37
|
+
tidal tails; 4 of those 19 are tilted away from the Galactic Centre
|
|
38
|
+
direction, an asymmetry the standard tidal-disruption picture does not
|
|
39
|
+
predict -- used here as real, independently-confirmed input data, not
|
|
40
|
+
as evidence for the UTAC entropy-node hypothesis itself.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
clusters_surveyed: int = GAIA_DR3_CLUSTERS_SURVEYED
|
|
44
|
+
clusters_with_tails: int = GAIA_DR3_CLUSTERS_WITH_TAILS
|
|
45
|
+
asymmetric_tails: int = GAIA_DR3_ASYMMETRIC_TAILS
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def tail_fraction(self) -> float:
|
|
49
|
+
"""Fraction of surveyed clusters with any detected tidal tail."""
|
|
50
|
+
return self.clusters_with_tails / self.clusters_surveyed
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def asymmetry_fraction(self) -> float:
|
|
54
|
+
"""Fraction of tailed clusters with an asymmetric (tilted) tail."""
|
|
55
|
+
return self.asymmetric_tails / self.clusters_with_tails
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True)
|
|
59
|
+
class ClusterEntropyNode:
|
|
60
|
+
"""A single star cluster modelled as a UTAC entropy-return node.
|
|
61
|
+
|
|
62
|
+
mass_recycling_fraction: fraction of cluster mass actively being
|
|
63
|
+
returned to the interstellar medium per unit time via stellar winds,
|
|
64
|
+
supernovae, and tidal ejection combined (a real, physically meaningful
|
|
65
|
+
quantity in principle -- here supplied by the caller, not computed from
|
|
66
|
+
first principles, since that requires cluster-specific stellar-
|
|
67
|
+
population synthesis outside this module's scope).
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
name: str
|
|
71
|
+
mass_recycling_fraction: float # dimensionless, in (0, 1]
|
|
72
|
+
|
|
73
|
+
def beta(self) -> float:
|
|
74
|
+
"""UTAC steepness beta = k / mass_recycling_fraction.
|
|
75
|
+
|
|
76
|
+
Framework convention (see module docstring): higher recycling
|
|
77
|
+
fraction -> lower beta (smoother, more continuous entropy return);
|
|
78
|
+
lower recycling fraction -> higher beta (sharper, more threshold-like
|
|
79
|
+
return, e.g. dominated by rare, high-mass tidal-ejection events).
|
|
80
|
+
"""
|
|
81
|
+
if self.mass_recycling_fraction <= 0:
|
|
82
|
+
raise ValueError("mass_recycling_fraction must be positive")
|
|
83
|
+
return K_CLUSTER / self.mass_recycling_fraction
|
|
84
|
+
|
|
85
|
+
def is_active_regime(self) -> bool:
|
|
86
|
+
"""True if beta exceeds the falsifiable BETA_ACTIVE_THRESHOLD (=7)."""
|
|
87
|
+
return self.beta() > BETA_ACTIVE_THRESHOLD
|
|
88
|
+
|
|
89
|
+
def summary(self) -> dict[str, object]:
|
|
90
|
+
return {
|
|
91
|
+
"name": self.name,
|
|
92
|
+
"mass_recycling_fraction": self.mass_recycling_fraction,
|
|
93
|
+
"beta": self.beta(),
|
|
94
|
+
"active_regime": self.is_active_regime(),
|
|
95
|
+
"status": "SPECULATIVE",
|
|
96
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Constants for utac-metastable-clusters (GenesisAeon Package 56).
|
|
2
|
+
|
|
3
|
+
v_RIG value corrected 2026-08-01: c/(alpha_inv*Phi) with CODATA-2018 alpha
|
|
4
|
+
gives ~1352.07 km/s, not the ~1351.8 km/s figure that briefly (and
|
|
5
|
+
incorrectly) circulated in FELDTHEORIE_EPISTEMIC_MAP.md on 2026-07-31.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import math
|
|
11
|
+
|
|
12
|
+
# ── Shared UTAC/Feldtheorie constants (see vrig-cosmological, Feldtheorie) ──
|
|
13
|
+
C_KM_S: float = 299_792.458
|
|
14
|
+
ALPHA_INV: float = 137.035_999_084 # CODATA 2018
|
|
15
|
+
PHI: float = (1.0 + math.sqrt(5.0)) / 2.0
|
|
16
|
+
V_RIG_KM_S: float = C_KM_S / (ALPHA_INV * PHI) # ~1352.07 km/s
|
|
17
|
+
SIGMA_PHI: float = 1.0 / 16.0 # 0.0625, Frame Principle
|
|
18
|
+
|
|
19
|
+
# ── Package-specific: β threshold predictions ────────────────────────────
|
|
20
|
+
# Both source preprints predict beta > 7 in "active" (entropy-recycling)
|
|
21
|
+
# regions -- an untested, falsifiable prediction, not a measured result.
|
|
22
|
+
BETA_ACTIVE_THRESHOLD: float = 7.0
|
|
23
|
+
|
|
24
|
+
# ── Real, independently-verified reference data (2026-08-01) ────────────
|
|
25
|
+
# Gaia DR3 tidal-tail survey (real 2025 A&A study): 19 of 21 nearby open
|
|
26
|
+
# clusters show tidal tails, several tilted away from the Galactic Centre
|
|
27
|
+
# direction (an asymmetry the standard tidal-formation picture does not
|
|
28
|
+
# predict). Verified via WebSearch, not re-derived here.
|
|
29
|
+
GAIA_DR3_CLUSTERS_WITH_TAILS: int = 19
|
|
30
|
+
GAIA_DR3_CLUSTERS_SURVEYED: int = 21
|
|
31
|
+
GAIA_DR3_ASYMMETRIC_TAILS: int = 4 # tilted away from Galactic Centre
|
|
32
|
+
|
|
33
|
+
# High-redshift protocluster A2744-z7p9OD -- real, JWST-NIRSpec-confirmed
|
|
34
|
+
# (see en.wikipedia.org/wiki/A2744z7p9OD; GLASS-JWST XIV, ApJL 2023).
|
|
35
|
+
PROTOCLUSTER_REDSHIFT: float = 7.88
|
|
36
|
+
PROTOCLUSTER_HALO_MASS_MSUN: float = 2e15 # present-day estimate, ~Coma-cluster scale
|
|
37
|
+
|
|
38
|
+
# ── Model-comparison convention used by the source preprints ─────────────
|
|
39
|
+
DELTA_AIC_SIGNIFICANT: float = 10.0 # null-model rejection threshold
|
|
40
|
+
|
|
41
|
+
# ── Package metadata ──────────────────────────────────────────────────────
|
|
42
|
+
PACKAGE_ID: int = 56
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Sagittarius A* as a metastable entropy modulator.
|
|
2
|
+
|
|
3
|
+
SPECULATIVE (see DISCLAIMER.md): a UTAC-framework explanation for the real,
|
|
4
|
+
actively-studied astrophysical puzzle of active star formation within a few
|
|
5
|
+
light-years of the Galactic Center despite extreme tidal/radiative
|
|
6
|
+
conditions -- the "paradox of youth", documented via real ALMA/JWST/GRAVITY
|
|
7
|
+
observations. This module does NOT repeat the unsupported "13.5 MHz
|
|
8
|
+
resonance in Sagittarius A*" claim found in a related preprint (The 0.0625
|
|
9
|
+
Invariant, Zenodo 18310715) -- a literature check (2026-08-01) found no
|
|
10
|
+
observational basis for that specific extension of the (separately, solidly
|
|
11
|
+
verified) neural/microtubule 13.5 MHz finding.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
|
|
18
|
+
from utac_metastable_clusters.constants import BETA_ACTIVE_THRESHOLD, SIGMA_PHI
|
|
19
|
+
|
|
20
|
+
# UTAC mapping constant for gravitational-compression-driven entropy
|
|
21
|
+
# minima (framework convention, not independently derived here).
|
|
22
|
+
K_SGR_A: float = 1.0
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(frozen=True)
|
|
26
|
+
class SgrAEnvironment:
|
|
27
|
+
"""A region of the Sgr A* environment modelled as an entropy modulator.
|
|
28
|
+
|
|
29
|
+
tidal_compression: dimensionless proxy for gravitational tidal
|
|
30
|
+
compression strength relative to a reference "quiescent ISM" value
|
|
31
|
+
(>1 means compression-dominated, i.e. closer to the black hole or in a
|
|
32
|
+
denser sub-structure). Supplied by the caller -- this module does not
|
|
33
|
+
derive it from raw orbital/density data.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
region: str
|
|
37
|
+
tidal_compression: float # dimensionless, > 0
|
|
38
|
+
|
|
39
|
+
def beta(self) -> float:
|
|
40
|
+
"""UTAC steepness beta = k_SgrA * tidal_compression.
|
|
41
|
+
|
|
42
|
+
Framework convention: stronger compression -> sharper (higher-beta)
|
|
43
|
+
threshold behaviour in the entropy-minima formation process,
|
|
44
|
+
mirroring the module's proposed mechanism (compression + shock
|
|
45
|
+
triggering + jet/outflow feedback create localised entropy minima
|
|
46
|
+
that permit star formation despite the extreme environment).
|
|
47
|
+
"""
|
|
48
|
+
if self.tidal_compression <= 0:
|
|
49
|
+
raise ValueError("tidal_compression must be positive")
|
|
50
|
+
return K_SGR_A * self.tidal_compression
|
|
51
|
+
|
|
52
|
+
def is_active_regime(self) -> bool:
|
|
53
|
+
"""True if beta exceeds the falsifiable BETA_ACTIVE_THRESHOLD (=7)."""
|
|
54
|
+
return self.beta() > BETA_ACTIVE_THRESHOLD
|
|
55
|
+
|
|
56
|
+
def frame_stability_estimate(self) -> float:
|
|
57
|
+
"""A SIGMA_PHI-scaled stability proxy (dimensionless).
|
|
58
|
+
|
|
59
|
+
SPECULATIVE: uses the same sigma_phi=1/16 Frame-Principle constant
|
|
60
|
+
that appears (with real external support in other domains, e.g. the
|
|
61
|
+
13.5 MHz neural-resonance chain) elsewhere in the ecosystem -- its
|
|
62
|
+
application to this specific quantity is this module's own
|
|
63
|
+
construction, not independently derived or externally verified.
|
|
64
|
+
"""
|
|
65
|
+
return SIGMA_PHI * self.beta()
|
|
66
|
+
|
|
67
|
+
def summary(self) -> dict[str, object]:
|
|
68
|
+
return {
|
|
69
|
+
"region": self.region,
|
|
70
|
+
"tidal_compression": self.tidal_compression,
|
|
71
|
+
"beta": self.beta(),
|
|
72
|
+
"active_regime": self.is_active_regime(),
|
|
73
|
+
"frame_stability_estimate": self.frame_stability_estimate(),
|
|
74
|
+
"status": "SPECULATIVE",
|
|
75
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""UTACMetastableClusters -- Diamond interface (GenesisAeon Package 56).
|
|
2
|
+
|
|
3
|
+
Implements the standard GenesisAeon Diamond interface manually (mirroring
|
|
4
|
+
vrig-cosmological's pattern), rather than subclassing diamond_setup's
|
|
5
|
+
DiamondPackage -- that base class has no type stubs, which causes a known
|
|
6
|
+
mypy-strict "cannot subclass Any" issue elsewhere in the ecosystem
|
|
7
|
+
(beta-clustering-utac, implosive-origin-utac); avoided here from the start.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from utac_metastable_clusters.cluster_entropy_node import ClusterEntropyNode, TidalTailSurvey
|
|
13
|
+
from utac_metastable_clusters.constants import (
|
|
14
|
+
BETA_ACTIVE_THRESHOLD,
|
|
15
|
+
PACKAGE_ID,
|
|
16
|
+
SIGMA_PHI,
|
|
17
|
+
V_RIG_KM_S,
|
|
18
|
+
)
|
|
19
|
+
from utac_metastable_clusters.sgr_a_modulator import SgrAEnvironment
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UTACMetastableClusters:
|
|
23
|
+
"""GenesisAeon Package 56 -- metastable entropy nodes at compact objects.
|
|
24
|
+
|
|
25
|
+
Usage
|
|
26
|
+
-----
|
|
27
|
+
>>> sys = UTACMetastableClusters()
|
|
28
|
+
>>> result = sys.run_cycle()
|
|
29
|
+
>>> result["cluster"]["active_regime"]
|
|
30
|
+
False
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
cluster_name: str = "reference-cluster",
|
|
36
|
+
cluster_recycling_fraction: float = 0.2,
|
|
37
|
+
sgr_a_region: str = "central-parsec",
|
|
38
|
+
sgr_a_tidal_compression: float = 5.0,
|
|
39
|
+
) -> None:
|
|
40
|
+
self._cluster = ClusterEntropyNode(
|
|
41
|
+
name=cluster_name,
|
|
42
|
+
mass_recycling_fraction=cluster_recycling_fraction,
|
|
43
|
+
)
|
|
44
|
+
self._sgr_a = SgrAEnvironment(
|
|
45
|
+
region=sgr_a_region,
|
|
46
|
+
tidal_compression=sgr_a_tidal_compression,
|
|
47
|
+
)
|
|
48
|
+
self._tidal_survey = TidalTailSurvey()
|
|
49
|
+
self._cycles_completed = 0
|
|
50
|
+
|
|
51
|
+
# ------------------------------------------------------------------
|
|
52
|
+
# Diamond interface
|
|
53
|
+
# ------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
def run_cycle(self) -> dict[str, object]:
|
|
56
|
+
"""Run one full evaluation of both entropy-node models."""
|
|
57
|
+
self._cycles_completed += 1
|
|
58
|
+
return {
|
|
59
|
+
"cluster": self._cluster.summary(),
|
|
60
|
+
"sgr_a": self._sgr_a.summary(),
|
|
61
|
+
"gaia_dr3_tail_fraction": self._tidal_survey.tail_fraction,
|
|
62
|
+
"gaia_dr3_asymmetry_fraction": self._tidal_survey.asymmetry_fraction,
|
|
63
|
+
"beta_active_threshold": BETA_ACTIVE_THRESHOLD,
|
|
64
|
+
"status": "SPECULATIVE",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
def get_crep_state(self) -> dict[str, object]:
|
|
68
|
+
"""Return current CREP state derived from the two entropy-node models."""
|
|
69
|
+
return {
|
|
70
|
+
"Gamma": SIGMA_PHI * self._cluster.beta() / BETA_ACTIVE_THRESHOLD,
|
|
71
|
+
"C": self._tidal_survey.tail_fraction,
|
|
72
|
+
"R": 1.0 - self._tidal_survey.asymmetry_fraction,
|
|
73
|
+
"E": self._sgr_a.frame_stability_estimate(),
|
|
74
|
+
"P": SIGMA_PHI,
|
|
75
|
+
"domain": "astrophysics",
|
|
76
|
+
"scale": "compact-object",
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
def get_utac_state(self) -> dict[str, object]:
|
|
80
|
+
"""Return UTAC parameter state (cluster beta as the headline value)."""
|
|
81
|
+
return {
|
|
82
|
+
"r": self._cluster.mass_recycling_fraction,
|
|
83
|
+
"K": BETA_ACTIVE_THRESHOLD,
|
|
84
|
+
"sigma": 2.2,
|
|
85
|
+
"beta": self._cluster.beta(),
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
def get_phase_events(self) -> list[dict[str, object]]:
|
|
89
|
+
"""Return phase events: regime transitions for cluster and Sgr A*."""
|
|
90
|
+
events = []
|
|
91
|
+
if self._cluster.is_active_regime():
|
|
92
|
+
events.append({
|
|
93
|
+
"type": "cluster_active_regime",
|
|
94
|
+
"name": self._cluster.name,
|
|
95
|
+
"beta": self._cluster.beta(),
|
|
96
|
+
})
|
|
97
|
+
if self._sgr_a.is_active_regime():
|
|
98
|
+
events.append({
|
|
99
|
+
"type": "sgr_a_active_regime",
|
|
100
|
+
"region": self._sgr_a.region,
|
|
101
|
+
"beta": self._sgr_a.beta(),
|
|
102
|
+
})
|
|
103
|
+
return events
|
|
104
|
+
|
|
105
|
+
def to_zenodo_record(self) -> dict[str, object]:
|
|
106
|
+
"""Return metadata dict suitable for Zenodo deposition."""
|
|
107
|
+
return {
|
|
108
|
+
"title": (
|
|
109
|
+
"Metastable star clusters and Sagittarius A* as UTAC "
|
|
110
|
+
"entropy-return nodes -- GenesisAeon Package 56"
|
|
111
|
+
),
|
|
112
|
+
"description": (
|
|
113
|
+
"A realistic, non-exotic alternative to the white-hole "
|
|
114
|
+
"hypothesis (compact star clusters as distributed entropy-"
|
|
115
|
+
"return nodes), plus a UTAC-framework application to star "
|
|
116
|
+
"formation near Sagittarius A*. SPECULATIVE -- not "
|
|
117
|
+
"peer-reviewed, see DISCLAIMER.md."
|
|
118
|
+
),
|
|
119
|
+
"creators": [{"name": "Römer, Johann", "affiliation": "MOR Research Collective"}],
|
|
120
|
+
"keywords": [
|
|
121
|
+
"UTAC", "CREP", "white holes", "Sagittarius A*",
|
|
122
|
+
"star clusters", "GenesisAeon", "astrophysics",
|
|
123
|
+
],
|
|
124
|
+
"package_id": PACKAGE_ID,
|
|
125
|
+
"v_rig_km_s": V_RIG_KM_S,
|
|
126
|
+
"status": "speculative -- not peer-reviewed",
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def cycles_completed(self) -> int:
|
|
131
|
+
return self._cycles_completed
|
|
132
|
+
|
|
133
|
+
def __repr__(self) -> str:
|
|
134
|
+
return f"UTACMetastableClusters(package={PACKAGE_ID}, cycles={self._cycles_completed})"
|
|
File without changes
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Tests for utac-metastable-clusters."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from utac_metastable_clusters import (
|
|
8
|
+
BETA_ACTIVE_THRESHOLD,
|
|
9
|
+
V_RIG_KM_S,
|
|
10
|
+
ClusterEntropyNode,
|
|
11
|
+
SgrAEnvironment,
|
|
12
|
+
TidalTailSurvey,
|
|
13
|
+
UTACMetastableClusters,
|
|
14
|
+
__version__,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_version() -> None:
|
|
19
|
+
assert __version__ == "1.0.0"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TestVRIGConstant:
|
|
23
|
+
def test_v_rig_matches_ecosystem_corrected_value(self) -> None:
|
|
24
|
+
"""v_RIG = c/(alpha_inv*Phi) ~ 1352.07 km/s (corrected 2026-08-01,
|
|
25
|
+
see FELDTHEORIE_EPISTEMIC_MAP.md - not the ~1351.8 km/s figure that
|
|
26
|
+
briefly circulated in error)."""
|
|
27
|
+
assert V_RIG_KM_S == pytest.approx(1352.07, abs=0.1)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TestClusterEntropyNode:
|
|
31
|
+
def test_beta_decreases_with_higher_recycling_fraction(self) -> None:
|
|
32
|
+
low_recycling = ClusterEntropyNode(name="a", mass_recycling_fraction=0.05)
|
|
33
|
+
high_recycling = ClusterEntropyNode(name="b", mass_recycling_fraction=0.5)
|
|
34
|
+
assert low_recycling.beta() > high_recycling.beta()
|
|
35
|
+
|
|
36
|
+
def test_zero_recycling_fraction_raises(self) -> None:
|
|
37
|
+
node = ClusterEntropyNode(name="a", mass_recycling_fraction=0.0)
|
|
38
|
+
with pytest.raises(ValueError):
|
|
39
|
+
node.beta()
|
|
40
|
+
|
|
41
|
+
def test_active_regime_above_threshold(self) -> None:
|
|
42
|
+
# beta = 1.0 / 0.1 = 10 > BETA_ACTIVE_THRESHOLD (7)
|
|
43
|
+
node = ClusterEntropyNode(name="active", mass_recycling_fraction=0.1)
|
|
44
|
+
assert node.beta() > BETA_ACTIVE_THRESHOLD
|
|
45
|
+
assert node.is_active_regime() is True
|
|
46
|
+
|
|
47
|
+
def test_inactive_regime_below_threshold(self) -> None:
|
|
48
|
+
# beta = 1.0 / 0.5 = 2.0 < BETA_ACTIVE_THRESHOLD (7)
|
|
49
|
+
node = ClusterEntropyNode(name="quiet", mass_recycling_fraction=0.5)
|
|
50
|
+
assert node.is_active_regime() is False
|
|
51
|
+
|
|
52
|
+
def test_summary_keys(self) -> None:
|
|
53
|
+
node = ClusterEntropyNode(name="a", mass_recycling_fraction=0.2)
|
|
54
|
+
summary = node.summary()
|
|
55
|
+
assert summary["status"] == "SPECULATIVE"
|
|
56
|
+
assert set(summary) >= {"name", "mass_recycling_fraction", "beta", "active_regime"}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TestTidalTailSurvey:
|
|
60
|
+
def test_real_gaia_dr3_figures(self) -> None:
|
|
61
|
+
"""Verified real figures (WebSearch, 2026-08-01): 19 of 21 nearby open
|
|
62
|
+
clusters show tidal tails in a 2025 Gaia DR3 survey; 4 of those 19
|
|
63
|
+
are asymmetric/tilted away from the Galactic Centre direction."""
|
|
64
|
+
survey = TidalTailSurvey()
|
|
65
|
+
assert survey.clusters_surveyed == 21
|
|
66
|
+
assert survey.clusters_with_tails == 19
|
|
67
|
+
assert survey.tail_fraction == pytest.approx(19 / 21)
|
|
68
|
+
assert survey.asymmetry_fraction == pytest.approx(4 / 19)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class TestSgrAEnvironment:
|
|
72
|
+
def test_beta_scales_with_tidal_compression(self) -> None:
|
|
73
|
+
weak = SgrAEnvironment(region="outer", tidal_compression=1.0)
|
|
74
|
+
strong = SgrAEnvironment(region="inner", tidal_compression=10.0)
|
|
75
|
+
assert strong.beta() > weak.beta()
|
|
76
|
+
|
|
77
|
+
def test_zero_compression_raises(self) -> None:
|
|
78
|
+
env = SgrAEnvironment(region="a", tidal_compression=0.0)
|
|
79
|
+
with pytest.raises(ValueError):
|
|
80
|
+
env.beta()
|
|
81
|
+
|
|
82
|
+
def test_frame_stability_estimate_is_sigma_phi_scaled(self) -> None:
|
|
83
|
+
env = SgrAEnvironment(region="a", tidal_compression=4.0)
|
|
84
|
+
# frame_stability = SIGMA_PHI * beta = (1/16) * 4.0 = 0.25
|
|
85
|
+
assert env.frame_stability_estimate() == pytest.approx(0.25)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class TestUTACMetastableClusters:
|
|
89
|
+
def test_run_cycle_returns_dict(self) -> None:
|
|
90
|
+
sys_ = UTACMetastableClusters()
|
|
91
|
+
result = sys_.run_cycle()
|
|
92
|
+
assert isinstance(result, dict)
|
|
93
|
+
for key in ("cluster", "sgr_a", "gaia_dr3_tail_fraction", "status"):
|
|
94
|
+
assert key in result
|
|
95
|
+
assert result["status"] == "SPECULATIVE"
|
|
96
|
+
|
|
97
|
+
def test_cycles_completed_increments(self) -> None:
|
|
98
|
+
sys_ = UTACMetastableClusters()
|
|
99
|
+
assert sys_.cycles_completed == 0
|
|
100
|
+
sys_.run_cycle()
|
|
101
|
+
assert sys_.cycles_completed == 1
|
|
102
|
+
sys_.run_cycle()
|
|
103
|
+
assert sys_.cycles_completed == 2
|
|
104
|
+
|
|
105
|
+
def test_crep_state_keys(self) -> None:
|
|
106
|
+
sys_ = UTACMetastableClusters()
|
|
107
|
+
sys_.run_cycle()
|
|
108
|
+
state = sys_.get_crep_state()
|
|
109
|
+
assert set(state) >= {"Gamma", "C", "R", "E", "P"}
|
|
110
|
+
for key in ("Gamma", "C", "R", "E", "P"):
|
|
111
|
+
assert isinstance(state[key], float)
|
|
112
|
+
|
|
113
|
+
def test_utac_state_keys(self) -> None:
|
|
114
|
+
sys_ = UTACMetastableClusters()
|
|
115
|
+
state = sys_.get_utac_state()
|
|
116
|
+
assert set(state) == {"r", "K", "sigma", "beta"}
|
|
117
|
+
|
|
118
|
+
def test_phase_events_is_list(self) -> None:
|
|
119
|
+
sys_ = UTACMetastableClusters()
|
|
120
|
+
sys_.run_cycle()
|
|
121
|
+
events = sys_.get_phase_events()
|
|
122
|
+
assert isinstance(events, list)
|
|
123
|
+
|
|
124
|
+
def test_active_regime_generates_phase_event(self) -> None:
|
|
125
|
+
# low recycling fraction -> high beta -> active regime -> phase event
|
|
126
|
+
sys_ = UTACMetastableClusters(cluster_recycling_fraction=0.05)
|
|
127
|
+
sys_.run_cycle()
|
|
128
|
+
events = sys_.get_phase_events()
|
|
129
|
+
assert any(e["type"] == "cluster_active_regime" for e in events)
|
|
130
|
+
|
|
131
|
+
def test_zenodo_record_keys(self) -> None:
|
|
132
|
+
sys_ = UTACMetastableClusters()
|
|
133
|
+
record = sys_.to_zenodo_record()
|
|
134
|
+
assert set(record) >= {"title", "description", "creators", "package_id", "v_rig_km_s"}
|
|
135
|
+
assert record["package_id"] == 56
|
|
136
|
+
assert "SPECULATIVE" in record["description"] or "speculative" in record["status"]
|
|
137
|
+
|
|
138
|
+
def test_repr(self) -> None:
|
|
139
|
+
sys_ = UTACMetastableClusters()
|
|
140
|
+
assert "UTACMetastableClusters" in repr(sys_)
|
|
141
|
+
assert "package=56" in repr(sys_)
|