Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ GRAFANA_ADMIN_PASSWORD=

# PII detection engine: spacy-regex (default) | presidio | the name of an
# engine another package registers in the admina.pii_engines entry-point group.
# presidio requires: pip install "admina-framework[presidio]"
# presidio requires: pip install "admina[presidio]"
# ADMINA_PII_ENGINE=spacy-regex

# PII masks: typed (default: [EMAIL], [PERSON], ...) | omissis ([OMISSIS] for
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
# Workflow name: release-core.yml (this file)
# Environment name: pypi-core
#
# The matching trusted publisher for admina-framework is configured for
# The matching trusted publisher for admina is configured for
# release.yml (the other workflow).
#
# ── How to cut a release ───────────────────────────────────────────────────
Expand Down
52 changes: 28 additions & 24 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@

# Release pipeline — fires on version tags (vX.Y.Z).
#
# Publishes the pure-Python root package admina-framework to PyPI, then the
# alias package admina (packaging/admina: no code, it installs
# admina-framework at the same version), and creates the GitHub Release. The Rust accelerator admina-core is built
# and published by a sibling workflow (.github/workflows/release-core.yml)
# Publishes the pure-Python root package admina to PyPI and creates the
# GitHub Release. On the v0.14.0 tag it also publishes the last
# admina-framework release (packaging/admina-framework, built by
# scripts/build-admina-framework-sdist.py): a source distribution that stops
# its installation with the commands to switch to admina. The Rust
# accelerator admina-core is built and published by a sibling workflow (.github/workflows/release-core.yml)
# triggered by the same tag — they run in parallel, independently.
#
# Why two workflows? PyPI Trusted Publishers had a transient issue
Expand All @@ -29,15 +31,15 @@
# Before the first run, configure the publisher on pypi.org:
#
# https://pypi.org/manage/account/publishing/ → Add pending publisher
# PyPI Project Name: admina-framework
# PyPI Project Name: admina
# Owner: admina-org
# Repository name: admina
# Workflow name: release.yml
# Environment name: pypi
#
# The publisher of the alias project "admina" has the same values, with
# PyPI Project Name: admina. The matching publisher for admina-core is
# configured for release-core.yml.
# The publisher of the project "admina-framework" has the same values, with
# PyPI Project Name: admina-framework. The matching publisher for
# admina-core is configured for release-core.yml.
# See https://docs.pypi.org/trusted-publishers/ for details.
#
# ── How to cut a release ───────────────────────────────────────────────────
Expand Down Expand Up @@ -105,9 +107,10 @@ jobs:
run: |
uv build --out-dir dist/

- name: Build the admina alias (sdist + wheel)
- name: Build the last admina-framework release (sdist)
if: github.ref_name == 'v0.14.0'
run: |
uv build packaging/admina --out-dir dist-alias/
python3 scripts/build-admina-framework-sdist.py dist-framework/

- name: Upload artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand All @@ -117,17 +120,18 @@ jobs:
if-no-files-found: error
retention-days: 7

- name: Upload alias artifact
- name: Upload admina-framework artifact
if: github.ref_name == 'v0.14.0'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: admina-alias-dist
path: dist-alias/*
name: admina-framework-dist
path: dist-framework/*
if-no-files-found: error
retention-days: 7

# ── 4. Publish root admina-framework to PyPI ────────────────────────────
# ── 4. Publish root admina to PyPI ──────────────────────────────────────
publish-root:
name: Publish admina-framework to PyPI
name: Publish admina to PyPI
needs: [build-root, tests]
# admina-core (the optional Rust accelerator) is published by the
# sibling workflow release-core.yml, in parallel with this one.
Expand All @@ -136,7 +140,7 @@ jobs:
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/project/admina-framework/
url: https://pypi.org/project/admina/
steps:
- name: Download root artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand All @@ -153,20 +157,20 @@ jobs:
packages-dir: dist/
skip-existing: true

# ── 5. Publish the admina alias to PyPI ─────────────────────────────────
publish-alias:
name: Publish admina (alias) to PyPI
# After admina-framework, so that the version the alias pins exists.
# ── 5. Publish the last admina-framework release (v0.14.0 only) ─────────
publish-framework-final:
name: Publish the last admina-framework release to PyPI
if: github.ref_name == 'v0.14.0'
needs: [build-root, tests, publish-root]
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/project/admina/
url: https://pypi.org/project/admina-framework/
steps:
- name: Download alias artifacts
- name: Download admina-framework artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: admina-alias-dist
name: admina-framework-dist
path: dist

- name: List artifacts
Expand All @@ -188,7 +192,7 @@ jobs:
with:
fetch-depth: 0 # needed to extract the CHANGELOG section for this tag

- name: Download admina-framework artifacts
- name: Download admina artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: admina-root-dist
Expand Down
37 changes: 36 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,40 @@ stability commitment. See [ROADMAP.md](ROADMAP.md) for planned milestones.

## [Unreleased]

## [0.14.0] — 2026-10-07

Minor release with a declared breaking change: Admina is published on PyPI
as `admina`. The module (`import admina`), the `admina` command, the extras,
`admina-core` and the container images do not change. Upgrading an
installation of `admina-framework`: see `docs/guides/package-name.md`.

### Changed

- **Breaking:** the distribution is named `admina` (`pip install admina`,
`pip install "admina[proxy]"`). `admina-framework` 0.14.0 is its last
release: a source distribution that stops the installation with the
commands to switch (`pip uninstall -y admina admina-framework && pip
install admina`) and leaves the installed packages as they are. A pin
such as `admina-framework<0.14` keeps installing the 0.13 releases.
- The `admina` package holds the code; in 0.13.2 it was an alias that
installed `admina-framework`.
- The `[rust]` extra requires `admina-core>=0.14.0,<0.15`.
- The `pyproject.toml` that `admina plugin create` writes depends on
`admina>=<version>`. A plugin created by an earlier release depends on
`admina-framework`: change that line (see the guide).
- Install hints in error messages, warnings, the README and the docs name
`admina[...]`.
- The Markdown compliance report of the dashboard ends with the forensic
section.

### Documentation

- `docs/guides/package-name.md`: the package names by release, the last
`admina-framework` release, the upgrade with pip, uv and dependency
lists, and the reinstall that restores the module when
`admina-framework` is uninstalled after `admina` was installed over it.
- ROADMAP: the 0.14.0 entry and the released milestones.

## [0.13.2] — 2026-10-07

Patch release: the PyPI package `admina`, an alias of `admina-framework`,
Expand Down Expand Up @@ -2232,7 +2266,8 @@ environment in `docker-compose.benchmark.yml`.

---

[Unreleased]: https://github.com/admina-org/admina/compare/v0.13.2...HEAD
[Unreleased]: https://github.com/admina-org/admina/compare/v0.14.0...HEAD
[0.14.0]: https://github.com/admina-org/admina/compare/v0.13.2...v0.14.0
[0.13.2]: https://github.com/admina-org/admina/compare/v0.13.1...v0.13.2
[0.13.1]: https://github.com/admina-org/admina/compare/v0.13.0...v0.13.1
[0.13.0]: https://github.com/admina-org/admina/compare/v0.12.2...v0.13.0
Expand Down
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ forwarded by the proxy.

**Import conventions**:
- Everything is nested under `admina.*` — there are no other top-level
packages on `sys.path` after `pip install admina-framework`.
packages on `sys.path` after `pip install admina`.
- Inside the package, prefer absolute imports: `from admina.core.types import RiskLevel`
- Relative imports (`from .types import ...`) are accepted inside the same sub-package.

Expand Down Expand Up @@ -231,8 +231,8 @@ maintainers before it is merged.

### Areas Where Help Is Welcome

See [ROADMAP.md](ROADMAP.md) for the planned direction from 0.9.x to 1.0
and beyond. In addition, the following areas accept contributions on an
See [ROADMAP.md](ROADMAP.md) for the released milestones and the next
planned release. In addition, the following areas accept contributions on an
ongoing basis regardless of the current milestone:

- New injection detection patterns (`admina/domains/agent_security/firewall.py`)
Expand Down
8 changes: 4 additions & 4 deletions MODEL_CARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,10 +270,10 @@ Detects and redacts PII in text. Three modes:
opt-in via `ADMINA_ENGINE=rust`. Categories are individually
toggleable from `admina.yaml`
(`admina/domains/data_sovereignty/pii.py:41-108`).
- **Regex + spaCy NER** (`pip install admina-framework[nlp]`): adds named-entity
- **Regex + spaCy NER** (`pip install admina[nlp]`): adds named-entity
detection for `PERSON`, `ORG`, `GPE`, `LOC`. Python only
(`admina/domains/data_sovereignty/pii.py:60-77`).
- **Microsoft Presidio** (`pip install admina-framework[presidio]`,
- **Microsoft Presidio** (`pip install admina[presidio]`,
selected with `ADMINA_PII_ENGINE=presidio` or `pii_engine: presidio`
in `admina.yaml`): a third, opt-in detection engine. Presidio does
**detection only** — Admina keeps its own masking, so the output
Expand All @@ -285,7 +285,7 @@ Detects and redacts PII in text. Three modes:
- **English-trained NER model.** The shipped `en_core_web_sm` is a
small English model. It under-detects names and organizations in
Italian, French, German, Spanish, etc. For multilingual deployments,
switch to the Presidio engine (`admina-framework[presidio]` +
switch to the Presidio engine (`admina[presidio]` +
`ADMINA_PII_ENGINE=presidio`) and download the per-language spaCy
models it needs. Note that on Admina's own corpus Presidio measures
*lower* type-level recall than the default spaCy+regex engine on
Expand Down Expand Up @@ -939,7 +939,7 @@ to `minimal`.
- **No coverage of national implementing legislation** beyond EU. Member
states may enact additional obligations (e.g. on biometric
identification by law enforcement). Admina does not model these.
- **ISO/IEC 42001 and SOC 2** are not implemented in OSS.
- **ISO/IEC 42001 and SOC 2** are not implemented.

---

Expand Down
Loading
Loading