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.
@@ -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,22 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ dist/
7
+ build/
8
+ .venv/
9
+ .uv/
10
+
11
+ # Testing
12
+ .coverage
13
+ htmlcov/
14
+ .pytest_cache/
15
+
16
+ # Docs
17
+ site/
18
+
19
+ # Editors
20
+ .vscode/
21
+ .idea/
22
+ *.swp
@@ -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
+ [![CI](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml/badge.svg)](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml)
34
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org)
35
+ [![License: GPLv3-or-later](https://img.shields.io/badge/code-GPLv3--or--later-blue.svg)](LICENSE-CODE)
36
+ [![Docs License: CC BY 4.0](https://img.shields.io/badge/docs-CC%20BY%204.0-lightgrey.svg)](LICENSE-DOCS)
37
+ [![Status: SPECULATIVE](https://img.shields.io/badge/status-SPECULATIVE-orange)](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
+ [![CI](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml/badge.svg)](https://github.com/GenesisAeon/utac-metastable-clusters/actions/workflows/ci.yml)
4
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org)
5
+ [![License: GPLv3-or-later](https://img.shields.io/badge/code-GPLv3--or--later-blue.svg)](LICENSE-CODE)
6
+ [![Docs License: CC BY 4.0](https://img.shields.io/badge/docs-CC%20BY%204.0-lightgrey.svg)](LICENSE-DOCS)
7
+ [![Status: SPECULATIVE](https://img.shields.io/badge/status-SPECULATIVE-orange)](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,10 @@
1
+ # entropy-table bridge configuration
2
+ bridge:
3
+ source_project: "utac-metastable-clusters"
4
+ export_format: "entropy-table-v1"
5
+ domains_file: "domains.yaml"
6
+ output: "exports/entropy-table.yaml"
7
+
8
+ options:
9
+ sort_keys: false
10
+ allow_unicode: true
@@ -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_)