# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Brahe's versioning and deprecation policy is modeled on [NumPy's policy](https://numpy.org/doc/stable/dev/depending_on_numpy.html) rather than strict SemVer — see the [versioning documentation](https://duncaneddy.github.io/brahe/latest/about/versioning/) for the full policy, including the transitional deprecation window currently in effect.

Each release groups entries under the Keep a Changelog section headings in the order **Added**, **Changed**, **Deprecated**, **Removed**, **Fixed**. Entries in **Deprecated** correspond to APIs that still work in this release but emit a `DeprecationWarning` or `FutureWarning`; entries in **Removed** list APIs that previous releases had deprecated.

<!-- release notes start -->

## [1.6.2] - 2026-07-01

### Added

- Added native Linux `arm64` wheel builds to the latest and release workflows, with platform-specific wheel artifact names to avoid artifact collisions. [@hectcastro](https://github.com/hectcastro) ([#372](https://github.com/duncaneddy/brahe/pull/372))
- `CachingEOPProvider` / `CachingSpaceWeatherProvider` (and `initialize_eop()` / `initialize_sw()`) now seed a missing cache from the compiled-in bundled data, so EOP and space-weather initialization succeed offline without an immediate network download. [@duncaneddy](https://github.com/duncaneddy) ([#374](https://github.com/duncaneddy/brahe/pull/374))
- EOP and space-weather downloads now retry transient failures (connection errors, timeouts, HTTP 429/5xx) with exponential backoff and jitter (up to 4 attempts). [@duncaneddy](https://github.com/duncaneddy) ([#374](https://github.com/duncaneddy/brahe/pull/374))

### Changed

- Changed standard EOP product source to [USNO finals2000A.all](https://maia.usno.navy.mil/ser7/finals2000A.all). [@duncaneddy](https://github.com/duncaneddy) ([#373](https://github.com/duncaneddy/brahe/pull/373))
- Changed C04 EOP product source to [Paris Observatory C04 Product](https://www.simplespacedata.org/eop/obspm/c04_1962now/latest/eopc04.1962-now). [@duncaneddy](https://github.com/duncaneddy) ([#373](https://github.com/duncaneddy/brahe/pull/373))
- Download failure messages now include the attempted URL and number of attempts. [@duncaneddy](https://github.com/duncaneddy) ([#374](https://github.com/duncaneddy/brahe/pull/374))
- Consolidated EOP and space-weather download logic into a shared `utils::download` helper (internal refactor, no API change). [@duncaneddy](https://github.com/duncaneddy) ([#374](https://github.com/duncaneddy/brahe/pull/374))

### Fixed

- Fix compilation issue due to transitive dependency breaking change in `ureq`/`time` crates. Pin `time` until issue is resolved. [@duncaneddy](https://github.com/duncaneddy) ([#373](https://github.com/duncaneddy/brahe/pull/373))
- Fixed issue with failing tests due to inability to update outdated EOP products. [@duncaneddy](https://github.com/duncaneddy) ([#373](https://github.com/duncaneddy/brahe/pull/373))
- `initialize_eop()` / `initialize_sw()` no longer fail on a fresh/empty cache when the remote EOP or space-weather server is transiently unreachable (e.g. `Standard EOP download request failed: io: Connection refused` in CI); bundled data is used instead. [@duncaneddy](https://github.com/duncaneddy) ([#374](https://github.com/duncaneddy/brahe/pull/374))

## [1.6.1] - 2026-06-16

### Added

- Added "Getting Started" section to main documentation page. [@duncaneddy](https://github.com/duncaneddy) ([#356](https://github.com/duncaneddy/brahe/pull/356))
- `integration` flag to rust and python test suites, replacing `ci`. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- `par_propagate_to` (Python) now accepts a list that mixes `KeplerianPropagator`, `SGPPropagator`, and `NumericalOrbitPropagator` instances. Propagators are grouped by type and each group is propagated in parallel; results are written back to the original objects in place, preserving list order. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))
- `MANUAL` example flag for examples that must never run automatically (scaffolding templates and credential-gated examples), so the `--ignore` live-network run no longer sweeps them in. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))


### Changed

- Update C04 data source to point to currently updating data series. [@duncaneddy](https://github.com/duncaneddy) ([#356](https://github.com/duncaneddy/brahe/pull/356))
- Makes the `plots` submodule of the python package an optional dependency installed with `brahe[plots]` and not installed by default to avoid importing the heavy dependencies by default. [@duncaneddy](https://github.com/duncaneddy) ([#360](https://github.com/duncaneddy/brahe/pull/360))
- Optimized the serial spherical-harmonic gravity evaluation (`GravityModel::compute_spherical_harmonics` / `compute_spherical_harmonics_with_workspace`) by precomputing the V/W recurrence reciprocal coefficients and reading the recurrence and accumulation buffers through bounds-check-free column slices. The workspace path is ~1.7–1.8× faster at degree/order 20–80 (the range common to LEO propagation) and ~1.6× faster at 360×360, with results unchanged to within 1e-12 relative. Measured on a 10-core Apple M1 Max. [@duncaneddy](https://github.com/duncaneddy) ([#361](https://github.com/duncaneddy/brahe/pull/361))
- Raised the `ParallelMode::Auto` parallelization threshold for spherical-harmonic gravity from degree 150 to 210. The faster serial path moved the serial/parallel break-even point, so `Auto` now stays serial until parallel evaluation is at least as fast. [@duncaneddy](https://github.com/duncaneddy) ([#361](https://github.com/duncaneddy/brahe/pull/361))
- `compute_spherical_harmonics`, `compute_spherical_harmonics_with_workspace`, `accel_gravity_spherical_harmonics`, and `accel_gravity_spherical_harmonics_with_workspace` now take a `parallel: ParallelMode` argument; `GravityConfiguration::SphericalHarmonic` gained a `parallel` field (defaults to `Auto`). [@duncaneddy](https://github.com/duncaneddy) ([#361](https://github.com/duncaneddy/brahe/pull/361))
- Updated CI workflow to only run integration tests weekly and at release time to reduce frequent occurrence of CI tests failing due to external integration test failures. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Improved CI caching to large texture / basemap files to be updated with integration tests weekly and avoid redownload on most CI runs. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Updated `pyo3` dependency version. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Updated `uv.lock`. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Tagged `TEMPLATE.{py,rs}` and `getting_started/clients_spacetrack.{py,rs}` as `MANUAL` so they are excluded from all automated example runs. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))
- Raised the per-example `TIMEOUT` to 600s for the `starlink_propagation.py` examples, which propagate the full live Starlink constellation and exceeded the default 180s limit during the weekly/release live-network run. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))

### Removed

- `ci` flag from rust and python test suites. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))

### Fixed

- CSSI space weather data loader has been fixed to use the observed f107 rather than the adjusted f107. [@jackyarndley](https://github.com/jackyarndley) ([#362](https://github.com/duncaneddy/brahe/pull/362))
- The NRLMSISE-00 implementation has been updated to use the previous day observed f107 as is standard. [@jackyarndley](https://github.com/jackyarndley) ([#362](https://github.com/duncaneddy/brahe/pull/362))
- Fixed race condition in examples CI tests where two could download the same Natural Earth basemap and corrupt the file for both. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Fixed regression from lazy-impoting `brahe.plots` that caused static-analyzers (griffee) to fail path-traversal. This caused `build-docs` to fail and slipped through due to other test-failure noise. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- Fixed `test-examples` flakyness on external integration dependencies. Ignore testing integration-based examples by default, but exercise them weekly in the integration tests to ensure continued coverage. [@duncaneddy](https://github.com/duncaneddy) ([#365](https://github.com/duncaneddy/brahe/pull/365))
- `par_propagate_to` (Python) no longer raises `TypeError` when given a list containing more than one propagator type; mixed-type lists are now propagated correctly. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))
- Fixed the release `test-examples` integration job failing on `--ignore`: `IGNORE` was an overloaded bucket that mixed live-network examples with templates, credential-gated, slow, and broken examples, so opting into the live-network set pulled in examples that could never pass there. [@duncaneddy](https://github.com/duncaneddy) ([#366](https://github.com/duncaneddy/brahe/pull/366))
## [1.6.0] - 2026-06-05

### Added

- Add `RKF78` / `RKF78Integrator` support for high-order adaptive integration in Rust and Python. [@Mtrya](https://github.com/Mtrya) ([#339](https://github.com/duncaneddy/brahe/pull/339))
- Add RKF78 tests, examples, and API/reference documentation. [@Mtrya](https://github.com/Mtrya) ([#339](https://github.com/duncaneddy/brahe/pull/339))
- Added [GMAT](https://github.com/nasa/GMAT) baselines. [@duncaneddy](https://github.com/duncaneddy) ([#340](https://github.com/duncaneddy/brahe/pull/340))
- Added [Basilisk](https://github.com/AVSLab/basilisk) baselines. [@duncaneddy](https://github.com/duncaneddy) ([#340](https://github.com/duncaneddy/brahe/pull/340))
- `profiles/` subdirectory with short, standalone rust and python scripts for use with profiling tools. [@duncaneddy](https://github.com/duncaneddy) ([#341](https://github.com/duncaneddy/brahe/pull/341))
- Added `justfile` commands to run profiling scripts. [@duncaneddy](https://github.com/duncaneddy) ([#341](https://github.com/duncaneddy/brahe/pull/341))
- Add baselines against Nyx 2.4.0 / ANISE 0.10.1. [@duncaneddy](https://github.com/duncaneddy) ([#342](https://github.com/duncaneddy/brahe/pull/342))
- Added `datasets.icgem` submodule to integrate with ICGEM gravity field model distribution network. Listing and downloading models uses the local brahe cache to minimize network traffic. [@duncaneddy](https://github.com/duncaneddy) ([#343](https://github.com/duncaneddy/brahe/pull/343))
- Added brahe vs astrojax benchmarks. [@duncaneddy](https://github.com/duncaneddy) ([#344](https://github.com/duncaneddy/brahe/pull/344))
- Add `ci-success` stage to enable gating CI auto-merge on completion. [@duncaneddy](https://github.com/duncaneddy) ([#350](https://github.com/duncaneddy/brahe/pull/350))

### Changed

- Extend numerical propagation integrator selection and comparison examples to include RKF78. [@Mtrya](https://github.com/Mtrya) ([#339](https://github.com/duncaneddy/brahe/pull/339))
- Split baselines into speed and accuracy tests. [@duncaneddy](https://github.com/duncaneddy) ([#340](https://github.com/duncaneddy/brahe/pull/340))
- Added `ICGEMModel(body, model_name)` to `GravityModelType` enabling ICGEM models to be specified for numerical orbit propagators. [@duncaneddy](https://github.com/duncaneddy) ([#343](https://github.com/duncaneddy/brahe/pull/343))
- Scaled back python-version test matrix on PRs to minimum supported python version. [@duncaneddy](https://github.com/duncaneddy) ([#345](https://github.com/duncaneddy/brahe/pull/345))
- Removed `anise` default feature dependency to just pull in SPICE kernel features. [@duncaneddy](https://github.com/duncaneddy) ([#350](https://github.com/duncaneddy/brahe/pull/350))

### Fixed

- `EulerAngleOrder` semantics now match what brahe's documentation always described and what the comparative benchmark expects. Prior to this fix, `attitude.euler_angle_to_quaternion` disagreed with OreKit, GMAT, and Basilisk. The discrepancy was traced through to a convention mismatch between the per-order formulas (faithfully transcribed from Diebel 2006) and the aerospace rotation-sequence interpretation users (and the docs) assumed. [@duncaneddy](https://github.com/duncaneddy) ([#338](https://github.com/duncaneddy/brahe/pull/338))
- Fixed issue with CHANGELOG parsing in PRs where a blank line after a section header would fail to validate. [@duncaneddy](https://github.com/duncaneddy) ([#338](https://github.com/duncaneddy/brahe/pull/338))
- Fixed issue with Orekit access baseline not properly inserting leap seconds in accuracy computation leading to in accurate error. [@duncaneddy](https://github.com/duncaneddy) ([#340](https://github.com/duncaneddy/brahe/pull/340))
- Fixed build breaking from conflicting `nalgebra` required dependencies. [@duncaneddy](https://github.com/duncaneddy) ([#350](https://github.com/duncaneddy/brahe/pull/350))
- Regression in use of custom python-based access constraints where they would give an error at use. [@nkgotcode](https://github.com/nkgotcode) [@duncaneddy](https://github.com/duncaneddy) ([#354](https://github.com/duncaneddy/brahe/pull/354))

## [1.5.2] - 2026-05-18

### Fixed

- Fix issue with new release workflow `CHANGELOG` generation that would result in an error causing the release to fail. Release notes now must be manually generated and committed _prior_ to running the release action. [@duncaneddy](https://github.com/duncaneddy) ([#334](https://github.com/duncaneddy/brahe/pull/334))

## [1.5.1] - 2026-05-18

### Added

- `DNumericalOrbitPropagator::builder()` - typestate builder that names required fields and lets optional fields be set by name or omitted. `build()` is only callable once `epoch`, `state`, and `force_config` are all set, enforced via `Set`/`Unset` marker type parameters. [@markusz](https://github.com/markusz) ([#321](https://github.com/duncaneddy/brahe/pull/321))
- Added `states_ecef` and `states_eme2000` to `SGPPropagator`. [@duncaneddy](https://github.com/duncaneddy) ([#331](https://github.com/duncaneddy/brahe/pull/331))
- Added `states_eme2000` to `KeplerianPropagator`. [@duncaneddy](https://github.com/duncaneddy) ([#331](https://github.com/duncaneddy/brahe/pull/331))
- Added `states_eci`, `states_ecef`, `states_gcrf`, `states_itrf`, and `states_eme2000` to `NumericalOrbitPropagator`. [@duncaneddy](https://github.com/duncaneddy) ([#331](https://github.com/duncaneddy/brahe/pull/331))
- Added `states` to `NumericalPropagator`. [@duncaneddy](https://github.com/duncaneddy) ([#331](https://github.com/duncaneddy/brahe/pull/331))
- New high-fidelity propagator benchmarks under `benchmarks/comparative/tasks/propagation_tasks.py`: `numerical_rk4_grav5x5`, `numerical_rk4_grav20x20_sun_moon`, `numerical_rk4_grav80x80_full`. Each runs RK4 over one LEO revolution with matched force-model and frame settings on both sides (OreKit loads brahe's `EGM2008_360.gfc` via `ICGEMFormatReader`, GCRF inertial frame, ITRF / IAU 2006/2000A body-fixed rotation, DE-440 third-body ephemerides, identical spacecraft mass / area / Cd / Cr). [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- New function-level acceleration benchmarks under `benchmarks/comparative/tasks/force_model_tasks.py` for point-mass gravity, 20×20 and 80×80 spherical-harmonic gravity, and third-body Sun/Moon. These evaluate a single acceleration at a fixed state and epoch, isolating force-model code from integrator behaviour. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- "Force Model" section in `docs/about/benchmarks.md` documenting the new function-level comparisons. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `GravityModel::load_uncached(model)` — explicit cold-load primitive for users who need deterministic memory or want to profile the parse path. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `GravityModel::compute_spherical_harmonics_with_workspace(...)` and `accel_gravity_spherical_harmonics_with_workspace(...)` — variants that accept caller-supplied V/W work matrices, letting hot-path callers (the numerical propagator's dynamics closure, batch orbit-determination residual code) amortize the per-call `DMatrix::zeros((n_max + 2)²)` allocation. At 80×80 the saved allocation+memset is ~15 µs per call. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `clear_gravity_model_cache()` — manual cache invalidation, useful after replacing a `FromFile(path)` source on disk or in tests. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `mimalloc` as the global allocator for the `brahe-py` Python extension and the comparative-benchmark Rust binary. The brahe core library remains allocator-agnostic so downstream Rust consumers pick their own. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- Added `SECONDS_PER_DAY` constant. [@duncaneddy](https://github.com/duncaneddy) ([#333](https://github.com/duncaneddy/brahe/pull/333))

### Changed

- `NumericalOrbitPropagator` and `NumericalPropagator` now no longer store accelerations by default to save space and improve performance. [@duncaneddy](https://github.com/duncaneddy) ([#330](https://github.com/duncaneddy/brahe/pull/330))
- The FD fallback for HermiteQuintic is removed. Previously, calling HermiteQuintic on a trajectory without stored accelerations would silently degrade to finite-difference acceleration estimation if 3+ points were available; now it errors. Combined with the earlier store_accelerations: false default flip, any code path that today uses HermiteQuintic either needs NumericalPropagationConfig::with_store_accelerations(true) (propagator path) or trajectory.enable_acceleration_storage() (direct path). [@duncaneddy](https://github.com/duncaneddy) ([#330](https://github.com/duncaneddy/brahe/pull/330))
- **Performance, numerical propagator (no behaviour change)**: the `DNumericalOrbitPropagator` hot path now caches the ECI→body-fixed rotation across integrator stages, shares one `Arc<GravityModel>` across propagators with the same gravity config (no more 60 ms `.gfc` reload per construction), borrows the state vector instead of cloning it on every stage call, returns the orbital derivative as a stack-allocated `Vector6<f64>` instead of allocating a fresh `DVector`, and reuses the spherical-harmonic V/W work matrices across stages. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `GravityModel::from_model_type` is now process-wide cache-backed. Repeated calls for the same `GravityModelType` parse the `.gfc` file once (~60 ms cold), then return owned clones from the cached `Arc` (~1 ms each). The public signature is unchanged. Cache is documented as unbounded — see the `# Caution` block on the function for the growth caveat with many distinct `FromFile(path)` sources, and use `clear_gravity_model_cache()` as the escape hatch. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- `bias_precession_nutation` switched from `iauXys06a` (full IAU 2000A nutation, ~1300 terms) to `iauXys00b` (truncated IAU 2000B, ~77 terms). Per-call cost dropped from ~150 µs to ~2.3 µs; agreement with the full series is sub-milliarcsecond, no regressions in tests. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- Refreshed benchmark plots and docs. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- Changed how adding a flaot second time to an Epoch (`epc + 42.5`) processes the internal addition. Previously, it would loop of remaining nanoseconds and convert them into integer seconds. For large second values, this would result in many loops for a single step, meaning that time addition, a frequent code hot-path, would grow linearly in time. Now it is an O(1) operation. [@duncaneddy](https://github.com/duncaneddy) ([#333](https://github.com/duncaneddy/brahe/pull/333))

### Fixed

- Update urllib3 to mitigate security vulnerability. [@duncaneddy](https://github.com/duncaneddy) ([#326](https://github.com/duncaneddy/brahe/pull/326))
- Some estimation plots used unicode sigma instead of `$\sigma$`. When latex is installed and defaults to pdfLaTeX compiler, this causes an error. Switch to `$\sigma$` everywhere. [@duncaneddy](https://github.com/duncaneddy) ([#331](https://github.com/duncaneddy/brahe/pull/331))
- **`DNumericalOrbitPropagator::propagate_to` may hang with fixed-step RK4.** At `src/propagators/dnumerical_orbit_propagator.rs:2312` the restore-`dt_next` guard used `>` instead of `>=`. With `target_epoch = epc + N * step_size` constructed by repeated arithmetic, float drift could leave `target_rel` slightly larger than the integer multiple; Fixed by changing the comparison to `>=` so the restore fires whenever the integrator returned its preferred step. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))
- Workspace mismatch in `benchmarks/comparative/implementations/rust/Cargo.toml`: the crate predated the brahe repo-root workspace and would fail with *"current package believes it's in a workspace when it's not"*. Added an empty `[workspace]` table so cargo treats the bench as its own workspace root. [@duncaneddy](https://github.com/duncaneddy) ([#332](https://github.com/duncaneddy/brahe/pull/332))

## [1.5.0] - 2026-05-06

### Added

- Added `accel_earth_zonal_gravity` — a hand-rolled closed-form J2–J6 zonal acceleration that mirrors `accel_gravity_spherical_harmonics` with `m = 0` but evaluates ~1.5–2x faster, with agreement to <3 km over a 24 h LEO propagation when both are driven in the same Earth-fixed frame. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Added `GravityConfiguration::EarthZonal { degree }` variant and supporting `ZonalHarmonicsDegree` enum (`J2`..`J6`) so the numerical propagator can use the fast zonal path directly. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Added `FrameTransformationModel` (variants `FullEarthRotation`, `EarthRotationOnly`) and a `frame_transform` field on `ForceModelConfig`. `EarthRotationOnly` skips precession, nutation, and polar motion for ~1.5x faster ECI↔ECEF rotations at the cost of ~0.07° pole-tilt accuracy; `FullEarthRotation` (default) preserves prior behavior. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Added `J3_EARTH`, `J4_EARTH`, `J5_EARTH`, and `J6_EARTH` constants derived from EGM2008. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Added Python bindings for `accel_earth_zonal_gravity`, `ZonalHarmonicsDegree`, `FrameTransformationModel`, `GravityConfiguration.earth_zonal(...)`, and the new `J3_EARTH`–`J6_EARTH` constants. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Added coefficient-derivation tests verifying each `J_n_EARTH` constant matches `-C_n,0 * sqrt(2n + 1)` against the EGM2008 fully-normalized Stokes coefficients. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))

### Changed

- Refined `J2_EARTH` to be derived from the EGM2008 `C_2,0` Stokes coefficient (`1.0826261738522227e-3`) instead of GGM05s. Downstream values change in the 5th significant digit. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Reused a single ECI→body-fixed rotation per dynamics step across gravity, NRLMSISE-00 density, and drag inside `DNumericalOrbitPropagator` rather than recomputing the rotation per force term. [@markusz](https://github.com/markusz) ([#302](https://github.com/duncaneddy/brahe/pull/302))
- Update package lockfile. [@duncaneddy](https://github.com/duncaneddy) ([#306](https://github.com/duncaneddy/brahe/pull/306))

### Removed

- Removed rust artifact caching from CI since existing rust environment already provides (working) caching. [@duncaneddy](https://github.com/duncaneddy) ([#315](https://github.com/duncaneddy/brahe/pull/315))

### Fixed

- Add missing `CHANGELOG.md` release entries. [@duncaneddy](https://github.com/duncaneddy) ([#306](https://github.com/duncaneddy/brahe/pull/306))
- Fix error with release note generation step of release workflow. [@duncaneddy](https://github.com/duncaneddy) ([#306](https://github.com/duncaneddy/brahe/pull/306))
- Fix issue with awk-based release-note generation step of release workflow not populating release note contents. [@duncaneddy](https://github.com/duncaneddy) ([#306](https://github.com/duncaneddy/brahe/pull/306))
- Fixed Starlink examples and documentation prose that still referenced the removed `bh.datasets.celestrak` / `bh::datasets::celestrak` API. [@Mtrya](https://github.com/Mtrya) ([#310](https://github.com/duncaneddy/brahe/pull/310))
- Fix 3rd party changes PRs not generating changelog fragments. [@duncaneddy](https://github.com/duncaneddy) ([#317](https://github.com/duncaneddy/brahe/pull/317))

## [1.4.2] - 2026-04-23
### Fixed

- Fix `brahe-py` Crate not using root `Cargo.toml` as single-source-of-truth for package version. [#298](https://github.com/duncaneddy/brahe/pull/298)
- Corrected `format_exponential` exponent offset in TLE generation ([#300](https://github.com/duncaneddy/brahe/issues/300)). BSTAR and second time derivative values are no longer 10x too small.


## [1.4.1] - 2026-04-21
### Changed

- Improve documentation around versioning practices. [#282](https://github.com/duncaneddy/brahe/pull/282)
- Add deprecation section to changelog [#284](https://github.com/duncaneddy/brahe/pull/284)
- Bump version for v1.4.1 release [#295](https://github.com/duncaneddy/brahe/pull/295)

### Fixed

- Fix a permissions issue that pervented CHANGELOG validation from running on fork PRs [#293](https://github.com/duncaneddy/brahe/pull/293)

## [1.4.0] - 2026-04-17
### Added

- Added [brahe-mcp](https://github.com/duncaneddy/brahe-mcp) information to docs [#278](https://github.com/duncaneddy/brahe/pull/278)

### Changed

- Refactored repository structure to use a Rust workspace to breakup the python module from the core rust module. This pure-rust package consumers to avoid having to build the `cdylib`, which is only needed for python module builds. [#278](https://github.com/duncaneddy/brahe/pull/278)
- `pyo3` and `numpy` are now optional dependencies, activated via the `python` feature flag. Pure-Rust consumers that do not need the Python bindings no longer compile these crates.
- Split the repository into a Cargo workspace so the PyO3 bindings live in a dedicated `brahe-py` member crate at `crates/brahe-py/`. The published `brahe` crate now builds only an `rlib`, eliminating the unnecessary `cdylib` artifact previously produced for every pure-Rust consumer. Rust downstream (`use brahe::*`) and Python downstream (`import brahe`) are unchanged.


### Fixed

- Fixed issue that would cause tests and auto-merge to not run on dependabot PRs [#278](https://github.com/duncaneddy/brahe/pull/278)

## [1.3.4] - 2026-04-15
### Fixed

- Fix failing celestrak queries by migrating from celestrak.com to celestrak.org [#272](https://github.com/duncaneddy/brahe/pull/272)

## [1.3.3] - 2026-04-10
### Added

- Add JD_J2000 constant to python bindings [#264](https://github.com/duncaneddy/brahe/pull/264)

## [1.3.2] - 2026-04-06
### Changed

- Updated JOSS manuscript to comply with latest guidelines [#256](https://github.com/duncaneddy/brahe/pull/256)

### Fixed

- Fixed issue with SGP4 propagators erroring during parallel propagation on satellite reentry. Addressed by adding a `termination_error` field to SGPPropagators which will be documented and stop propagation rather than erroring all propagation.
  Issued with documentation builds in CI failing due to dependency changes. Fixed by updating `uv.lock` [#256](https://github.com/duncaneddy/brahe/pull/256)

## [1.3.1] - 2026-03-29
### Added

- Added retry logic and exponential back-off to Celestrak client
  Added process-based rate-limiting to Celestrak client [#244](https://github.com/duncaneddy/brahe/pull/244)

### Changed

- Set default celestrak client cache age to 2 hours. [#244](https://github.com/duncaneddy/brahe/pull/244)
- Bump version for `v1.3.1` [#248](https://github.com/duncaneddy/brahe/pull/248)

### Fixed

- Pointed `mike` documentation deployment to use `properdocs.yml` [#244](https://github.com/duncaneddy/brahe/pull/244)
- Fix `mike set-default` invocation to use `properdocs.yml` config [#246](https://github.com/duncaneddy/brahe/pull/246)

## [1.3.0] - 2026-03-29
### Added

- Added python constructors for CCSDS OPM and OMM file types [#225](https://github.com/duncaneddy/brahe/pull/225)
- Added dedicated `celestrak` and `spacetrack` submodules to the brahe CLI for querying and interfacing with space track.
  Added `to_dict()` and `to_json()` methods for GPRecord python module to enable easy interoperability [#227](https://github.com/duncaneddy/brahe/pull/227)
- Added additional python test coverage [#228](https://github.com/duncaneddy/brahe/pull/228)
- Added `estimation` module with support for `EKF`, `UKF`, and `BLS` (batched least-squares) filters
  Added estimation plotting routines
  Added implementations of magnetic field models. In particular the IGRF and WMMHR models.
  Added `from_unix_timestamp` and `unix_timestamp` methods to support interoperability with native unix time systems
  Added sponsor logo [#241](https://github.com/duncaneddy/brahe/pull/241)

### Changed

- Added additional test coverage [#225](https://github.com/duncaneddy/brahe/pull/225)
- Renamed `MJD2000` constant to `MJD_J2000` to align with `JD_J2000` naming [#231](https://github.com/duncaneddy/brahe/pull/231)
- Improved documentation code samples by auto-generating, capturing, and rendering script outputs so values are guaranteed to be kept up to date. [#234](https://github.com/duncaneddy/brahe/pull/234)
- Migrated to `properdocs` from `mkdocs` for documentation due to instability in project. [#241](https://github.com/duncaneddy/brahe/pull/241)

### Fixed

- Fixed issue with anomaly conversion CLI not properly using `use_degrees` [#225](https://github.com/duncaneddy/brahe/pull/225)

## [1.2.0] - 2026-03-21
### Added

- Added polygon tessellation for large area access computation [#199](https://github.com/duncaneddy/brahe/pull/199)
- Added additional benchmarks and comparisons to OreKit in `benchmarks/comparisons` [#209](https://github.com/duncaneddy/brahe/pull/209)
- Add support for CCSDS OEM, OMM, OPM (blue-book) and CDM (pinkbook) types. Methods exist to load, access, modify, and create these data objects. [#214](https://github.com/duncaneddy/brahe/pull/214)
- Add full support for XML and JSON output across OEM, OPM, and OMM files. [#222](https://github.com/duncaneddy/brahe/pull/222)

### Changed

- Have Propagators set a UUID by default
  Have Locations set a UUID by default
  Migrated default-generated UUIDs to UUIDv7 [#202](https://github.com/duncaneddy/brahe/pull/202)
- Removed `release` environment flag from github release workflows
  Only retain last 3 minor documentation verions to prevent unbounded growth of github pages deployments. [#209](https://github.com/duncaneddy/brahe/pull/209)
- Cleaned up space-track and celestrak documentation to improve readability and understandability [#214](https://github.com/duncaneddy/brahe/pull/214)
- Added coverage reporting for python bindings and module [#218](https://github.com/duncaneddy/brahe/pull/218)
- Improved CCSDS module round trip test coverage
  Ensures that default OEM to Trajectory conversion returns a `DOrbitTrajectory` so that it can immediately be used with access computation. [#222](https://github.com/duncaneddy/brahe/pull/222)

### Fixed

- Reverted compilation regression due to dependabot update. Ignored packages to prevent future regressions [#194](https://github.com/duncaneddy/brahe/pull/194)
- Skip running CI-related tests on fork-PRs so that tests pass. [#204](https://github.com/duncaneddy/brahe/pull/204)
- Changes access module type annotations from `List` to `Sequence` so that LSPs don't erroneously report a warning that `location_accesses` and other functions might mutate the list.
  Fix issue where python bindings for access properties would return a copy of the underlying data so mutations would not persist. Introduce `AccessPropertyView` so that it is now properly possible to access, set, and modify access properties in python. [#206](https://github.com/duncaneddy/brahe/pull/206)
- Fixed issue with Gabbard plots not generating properly [#218](https://github.com/duncaneddy/brahe/pull/218)
- Fix coverage reporting [#220](https://github.com/duncaneddy/brahe/pull/220)

## [1.1.4] - 2026-03-05
### Fixed

- Fix regression from dependabot update
  Included type annotations in package generation [#188](https://github.com/duncaneddy/brahe/pull/188)

## [1.1.3] - 2026-03-04
### Added

- Added `SubdivisionConfig` a subfield of `AccessSearchConfig` to control how subdivisions are created [#181](https://github.com/duncaneddy/brahe/pull/181)

### Changed

- Migrated to PyO3 `v0.28`
  Update Cargo dependencies [#179](https://github.com/duncaneddy/brahe/pull/179)
- Removed `time_step` parameter from internal `find_access_windows` method. Configuration of stepping and subdivision is now unified as a property of `AccessSearchConfig` [#181](https://github.com/duncaneddy/brahe/pull/181)

### Fixed

- Fixed issue in dataframe creation from dependabot update. [#179](https://github.com/duncaneddy/brahe/pull/179)

## [1.1.2] - 2026-02-14
### Fixed

- Fix spacetrack client erroring out when query returns a lot of results
- Fix spacetrack `cdm_public` route having wrong parent stem [#169](https://github.com/duncaneddy/brahe/pull/169)

## [1.1.1] - 2026-02-14
### Added

- Added ability to configure `TrajectoryMode` on `SGP4Propagator` for applications where memory-use management is key. [#167](https://github.com/duncaneddy/brahe/pull/167)

### Changed

- The JOSS paper submission used code examples with the older celestrak API. This PR updates the code examples to use the updated, stabilized API.
- Slightly adjust language in paper to avoid silly page overflow [#165](https://github.com/duncaneddy/brahe/pull/165)
- Changed default interpolator used by `NumericalOrbitPropgator` for event detection from linear to 3rd degree Hermite. [#167](https://github.com/duncaneddy/brahe/pull/167)

### Fixed

- Make `.current_epoch()` property a method, not property in python bindings.
- Fixed issue with event detection system in `NumericalOrbitPropagator` where it not correctly process events co-located with the current time, and would sometimes miss events in between time steps. [#167](https://github.com/duncaneddy/brahe/pull/167)

## [1.1.0] - 2026-02-10
### Added

- Added `par_propagate_to_d` method. [#109](https://github.com/duncaneddy/brahe/pull/109)
- Add Github issue templates for bugs and feature requests [#113](https://github.com/duncaneddy/brahe/pull/113)
- Add arXiv citation to README and documentation. [#124](https://github.com/duncaneddy/brahe/pull/124)
- Modified python bindings to support access computation with numerical orbit propagators. [#126](https://github.com/duncaneddy/brahe/pull/126)
- Added `spacetrack` client module, enabling direct interaction with space-track.org APIs [#150](https://github.com/duncaneddy/brahe/pull/150)
- Added BSL-1.0 to allowed dependency license list
- Added [GCAT](https://planet4589.org/space/gcat/web/cat/index.html) dataset interface [#152](https://github.com/duncaneddy/brahe/pull/152)
- Added simplified `CelestrakClient` interface to bridge gap between new interface and old one. [#157](https://github.com/duncaneddy/brahe/pull/157)

### Changed

- Bump version for 1.0.1 release [#106](https://github.com/duncaneddy/brahe/pull/106)
- Renamed `par_propagate_to` to `par_propagate_to_s`
- Move SGPPropagator to D-Type event detection. [#109](https://github.com/duncaneddy/brahe/pull/109)
- Update documentation to add [JOSS](https://joss.theoj.org/) paper submission badge. [#113](https://github.com/duncaneddy/brahe/pull/113)
- Update JOSS workflow to export tex artifacts to support arXiv upload. [#122](https://github.com/duncaneddy/brahe/pull/122)
- Moved all Brahe errors in python bindings from `OSError` to `BraheError` to make them more distinguishable and easy to handle. [#126](https://github.com/duncaneddy/brahe/pull/126)
- Updated JOSS paper with [new required sections](https://blog.joss.theoj.org/2026/01/preparing-joss-for-a-generative-ai-future). [#137](https://github.com/duncaneddy/brahe/pull/137)
- Enable manual triggering of latest documentation build in CI for handling EOP-update edge cases for releases. [#139](https://github.com/duncaneddy/brahe/pull/139)
- Overhauled `celestrak` client. The `celestrak` client now uses a common type and query structure shared with the `spacetrack` module. In particular, the `GPRecord` serves as the common representation of OMM elements returned by both sites. This enables greater interoperability between other library modules that can consume or act on `GPRecord` types. The `celestrak` module is now it's own, stand-alone, module independent of `datasets`.
- Migrate developer workflow from `make.py` to [just](https://github.com/casey/just)
- Remove dependency on [BTreeCursor](https://github.com/rust-lang/rust/issues/107540) nightly feature, allowing crate to compile with stable rust. [#150](https://github.com/duncaneddy/brahe/pull/150)
- Adjusted `CelestrakQuery` python bindings to properly use properties instead of methods for specific dataset queries. **Example:** New: `CelestrakQuery.gp` vs Old: `CelestrakQuery.gp()` [#157](https://github.com/duncaneddy/brahe/pull/157)

### Fixed

- Enabled event detection in `par_propagate_to` method in Python [#109](https://github.com/duncaneddy/brahe/pull/109)
- Fixed broken documentation links in readme. (Thank you Stuart Bartlett for pointing it out) [#129](https://github.com/duncaneddy/brahe/pull/129)
- Fix broken links in main documentation landing page. [#131](https://github.com/duncaneddy/brahe/pull/131)
- Fix provider names for SSC stations in NASA Near Earth Network [#143](https://github.com/duncaneddy/brahe/pull/143)
- Fix https://duncaneddy.github.io/brahe/ to redirect to the current default root URL. [#147](https://github.com/duncaneddy/brahe/pull/147)
- Fixed tables in ephemeris documentation not being justified. [#152](https://github.com/duncaneddy/brahe/pull/152)
- Reverted `pyo3` version update due to incompatibility with `numpy` depdency
- Prevented dependabot from auto-updating `pyo3` [#157](https://github.com/duncaneddy/brahe/pull/157)
- Properly pass environment secrets from the `release` workflow to child-workflows [#159](https://github.com/duncaneddy/brahe/pull/159)

## [1.0.1] - 2025-12-04
### Added

- Added `from_omm_elements` to `SGPPropagator`. Supports direct initialization of propagator from OMM elements without needing to go through TLE lines. This is both more accurate as well as more robust to TLE ID depletion. [#102](https://github.com/duncaneddy/brahe/pull/102)
- Add support for event detection to `SGPPropagator`
- Add `AOIEntryEvent` and `AOIExitEvent` as premade event detectors. [#104](https://github.com/duncaneddy/brahe/pull/104)

### Fixed

- Fix typo in JOSS paper title [#99](https://github.com/duncaneddy/brahe/pull/99)

## [1.0.0] - 2025-11-29
### Added

- `{D}NumericalOrbitPropagator` and python bindings
- `{D}NumericalPropagator` and python bindings
- Event detection system for numerical propagators to find events during propagation [#89](https://github.com/duncaneddy/brahe/pull/89)
- Mean to osculating, osculating to mean orbital element transformations
- Update OrbitStateProviders to provide `state(s)_koe_mean` and `state(s)_koe_osc`
- Implement ECI<>ROE direct transformations
- Add `ephemeris_age` to `SGPPropagator`
- Implement Largrange, cubic Hermite, and quintic Hermite interpolation methods.
- Add `WalkerConstellationGenerator` which enables rapidly generating propagators with walker-geometry configurations. [#96](https://github.com/duncaneddy/brahe/pull/96)

### Changed

- Make access computation use D-type propagators.
- Standardize on
- Add support for D-type returns to `KeplerianPropagator` and `SGPPropagator`
- Standardized trait traits for `{S|D}StateProvider`, `{S|D}CovarianceProvider`, `{S|D}StatePropagator`
- `DTrajectory` and `DOrbitTrajectory` can now store trajectories of arbitrary length
- `DTrajectory` and `DOrbitTrajectory` can now store stm and sensitivity matricies alongside state and covariance.
- Improved test coverage across modules
- Changed how third-body ephemeris sources are defined and loaded. DE source is now a parameter instead of set by function name. Dynamically load BSP files when called.
- Changed how Gravity models are defined in terms of enumeration types.
- Renamed `state_cartesian_to_osculating` and `state_osculating_to_cartesian` as `state_eci_to_koe` and `state_koe_to_eci` [#89](https://github.com/duncaneddy/brahe/pull/89)
- Improve trajectory module test coverage
- Improve events module test coverage
- Changed CI release workflow to publish documentation updates only after packages have been successfully published [#96](https://github.com/duncaneddy/brahe/pull/96)

### Fixed

- Numerical integration `step` and `step_with_varmat` now take explicit parameter values. [#89](https://github.com/duncaneddy/brahe/pull/89)

### Removed

- Removed `STrajectory6` from python bindings. [#89](https://github.com/duncaneddy/brahe/pull/89)

## [0.4.0] - 2025-11-28
### Added

- Add space weather data management and access modeled on Earth orientation data provider design. [#73](https://github.com/duncaneddy/brahe/pull/73)
- Added support for control inputs to numerical integration
- Added support for integration of sensitivity matrices to numerical integration functions
- Added support for analytical and numerical computation of sensitivity matrix
- Added documentation for integration with control inputs and sensitivity matrix integration
- Added documentation for computation and handling of sensitivity matrices [#78](https://github.com/duncaneddy/brahe/pull/78)
- Add JOSS draft paper [#80](https://github.com/duncaneddy/brahe/pull/80)
- Added NRLMSISE-00 atmospheric density model implementation [#82](https://github.com/duncaneddy/brahe/pull/82)

### Changed

- Consolidates internal implementation of numerical integration
- Added additional numerical integration tests to improve coverage
- Consolidates duplicate type definitions across integrator files [#78](https://github.com/duncaneddy/brahe/pull/78)
- Refactor `celestrak.rs` and `naif.rs` modules to use `HttpClient` structure to enable mocking and mock testing through [mockall](https://github.com/asomers/mockall) to make struct calls
- Refactored main package documentation [#84](https://github.com/duncaneddy/brahe/pull/84)

### Fixed

- Auto-merge of bundled data update wasn't auto-merging [#75](https://github.com/duncaneddy/brahe/pull/75)
- Removed erroring cache-check in python test workflow [#78](https://github.com/duncaneddy/brahe/pull/78)

## [0.3.0] - 2025-11-18
### Added

- Added `Integrators` submodule with complete rust implementation, python bindings, documentation, and examples
- Support for `RK4`, `RKF45`, `DP54`, and `RKN1210` numerical integration methods
- License validation and compliance checks. Package is now automatically checked to ensure all dependencies have permissive, commercially-adoptable licenses [#63](https://github.com/duncaneddy/brahe/pull/63)
- NAIF Development Ephemeride dataset download and caching
- High-accuracy DE440s-based ephemeris prediction
- High-accuracy DE440s-based third-body acceleration prediction
- Python bindings for orbit dynamics functions [#68](https://github.com/duncaneddy/brahe/pull/68)
- Added `geo_sma` function to directly return the semi-major axis needed for a geostationary orbit. [#69](https://github.com/duncaneddy/brahe/pull/69)

### Changed

- Moved mathematics capabilities from `utils` submodule to dedicated `math` submodule.
- Bumped version to `0.2.0` for release
- Removed Rust test sections from coverage reporting [#63](https://github.com/duncaneddy/brahe/pull/63)
- Orbit dynamics functions which previously required a position-only vector can now accept either a position-only or a state vector. Conversion will be handled by the `IntoPosition` trait. [#68](https://github.com/duncaneddy/brahe/pull/68)

### Fixed

- Fix inconsistencies in Python API reference header levels
- Missing Ground station
- Miscellaneous documentation improvements and fixes [#63](https://github.com/duncaneddy/brahe/pull/63)

## [0.2.0] - 2025-11-17
### Added

- Added `relative_motion` submodule to contain functionality related to relative motion
- Implemented RTN rotation and state transformations: `rotation_eci_to_rtn`, `rotation_rtn_to_eci`, `state_eci_to_rtn`, and `state_rtn_to_eci`
- Implemented Relative Orbital Element (ROE) state transformations `state_oe_to_roe` and `state_roe_to_oe`
- Added `util::math` functions `sqrtm` and `spd_sqrtm` to calculate matrix square root
- Added `util::math` functions `oe_to_radians` and `oe_to_degrees` to reduce duplication in converting angle values in orbital element calcualtions [#57](https://github.com/duncaneddy/brahe/pull/57)
- Implement `CovarianceProvider` trait for `OrbitTrajectory`. Provides `covariance`, `covariance_eci`, `covariance_gcrf`, and `covariance_rtn`
- Add `interpolation` submodule to store consistent covariance interpolation methods
- Implement covariance rotation from ECI to RTN frame
- Extends `OrbitTrajectory` to optionally store covariance information. [#59](https://github.com/duncaneddy/brahe/pull/59)

### Changed

- Don't run PR tests on release CHANGELOG update. [#49](https://github.com/duncaneddy/brahe/pull/49)
- Unit test and PR test workflows now cancel in-progress runs if a new commit lands
- Added concurrency guards to auto-merge workflows. [#53](https://github.com/duncaneddy/brahe/pull/53)
- Moved where internal vector/matrix (e.g. `SMatrix3`, `SVector6`) type aliases are defined from `coordinates` submodule to `utils` [#57](https://github.com/duncaneddy/brahe/pull/57)

### Fixed

- Don't trigger multiple changelog merges on changelog a PR. [#49](https://github.com/duncaneddy/brahe/pull/49)
- Only trigger auto-merge on `opened` due to changelog PRs not issuing `labeled` events [#51](https://github.com/duncaneddy/brahe/pull/51)
- Added additional triggers to auto-merge workflows to ensure they are properly triggered. [#53](https://github.com/duncaneddy/brahe/pull/53)
- Fixed assorted typos and errors in docstrings related to covariance interpolation features. [#61](https://github.com/duncaneddy/brahe/pull/61)
- Fixes package-data update CI workflow by moving to auto-PR, auto-merge approach [#64](https://github.com/duncaneddy/brahe/pull/64)

## [0.1.3] - 2025-11-12
### Added

- Added python missing bindings for `states_icrf` and `states_gcrf` for `KeplerianPropagator` and `SGPPropagator`
- Added additional tests across various module to improve test coverage. [#36](https://github.com/duncaneddy/brahe/pull/36)

### Changed

- Refactor `frames.rs` file into submodule with subfiles for long-term maintainability. [#14](https://github.com/duncaneddy/brahe/pull/14)
- Automatically create and merge PRs for changelog updates [#16](https://github.com/duncaneddy/brahe/pull/16)
- Auto-merge changelog PRs
- Auto-merge dependabot PRs
- Expand dependabot to cover python and rust packages [#26](https://github.com/duncaneddy/brahe/pull/26)
- Bump package version to `v0.1.3` [#34](https://github.com/duncaneddy/brahe/pull/34)
- Skip unit test suite on auto-generated changelog PRs. [#44](https://github.com/duncaneddy/brahe/pull/44)

### Fixed

- PR changelogs were not being incorporated into the package changelog due to main-branch protection [#16](https://github.com/duncaneddy/brahe/pull/16)
- Stop generation changelog PRs for auto-generated changelog PRs [#26](https://github.com/duncaneddy/brahe/pull/26)
- Fixed issue with release pipeline release note generation [#38](https://github.com/duncaneddy/brahe/pull/38)
- Fix auto-merge for changelog PRs by using PAT [#40](https://github.com/duncaneddy/brahe/pull/40)
- Fix auto-merge workflow to accept PAT owner as actor. [#42](https://github.com/duncaneddy/brahe/pull/42)
- Fix workflow release step to use workflow PAT and declare base branch [#46](https://github.com/duncaneddy/brahe/pull/46)
