Ctrl K
ComunidadGuías…

MAINTAINERS.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Maintainers

This file documents how Ciaren is maintained and how project decisions are
made as the contributor base grows.

## Current Maintainer

- Rodrigo Arenas — GitHub: [@rodrigo-arenas](https://github.com/rodrigo-arenas)

## Maintainer Responsibilities

- Triage new issues and route questions to Discussions when appropriate.
- Keep `main` stable and releasable at all times via CI — it's the only integration branch.
- Review pull requests for correctness, tests, security, maintainability, and
  fit with the local-first product scope.
- Keep public documentation aligned with implemented behavior.
- Apply security fixes and coordinate responsible disclosure.

## Review Policy

- Pull requests should target `main`.
- Maintainers may close duplicate, stale, unsupported, or out-of-scope issues.
- Large features, breaking changes, plugin API changes, and security-sensitive
  changes should have an accepted issue or discussion before implementation.
- New contributors are encouraged to start with focused fixes, docs, tests, or
  `good-first-issue` tasks.

## Branch Protection

See [CONTRIBUTING.md#-branching-strategy](CONTRIBUTING.md#-branching-strategy)
for the contributor-facing branch diagram. This section covers who can push
where and what GitHub branch protection should enforce.

| Branch | Direct pushes | Required for merge | Force-push / delete |
|---|---|---|---|
| `main` | Nobody — PR only, from `feature/*`/`fix/*`/`docs/*`/`chore/*` | Passing CI (all workflows), 1 approving review from a CODEOWNER, branch up to date with `main` | Blocked |
| `release/x.y` | Maintainers, via PR (cherry-picks from `main`) | Passing CI | Blocked while a version is still supported |
| `feature/*`, `fix/*`, `docs/*`, `chore/*` | Anyone, on their own branch/fork | N/A | Allowed — contributor's own branch |

**Release flow:** every merge to `main` goes through the full CI suite, so
`main` is releasable at any point — tag directly from `main` when cutting a
release (see [Versioning and Tags](#versioning-and-tags)). There's no
intermediate integration branch to promote through.

**Patching an older release:** if `main` has moved on but an already-shipped
minor version still needs a fix, cut `release/x.y` from that version's tag,
cherry-pick the fix (and its tests) from `main`, then tag a patch release from
the branch. This is the same pattern Airflow (`vX-Y-stable`) and MLflow
(`branch-2.x`) use to keep old versions maintainable without blocking `main`.
Ciaren doesn't have supported parallel versions yet, so you likely won't need
this until there's a real backport request.

## Release Policy

Ciaren is currently alpha software. Releases should include:

- A short changelog or release notes.
- Passing CI for backend, frontend, docs, packaging, and security checks.
- Clear notes for breaking changes, migration steps, or known limitations.

### Versioning and Tags

- Pre-1.0, versions are `0.MINOR.PATCH` with an `-alpha`/`-beta` suffix as
  needed (e.g. `0.1.0-alpha`); breaking changes can happen between them.
  Semantic versioning applies strictly from `1.0.0` onward.
- Two packages are versioned in lockstep: `backend/pyproject.toml` (`ciaren`)
  and `client/pyproject.toml` (`ciaren-client`). Bump both together before
  tagging — the `Package` workflow verifies each independently against the
  tag and fails the corresponding build job if either is out of sync.
- Cutting a release: on `main`, bump both `pyproject.toml` versions, update
  `CHANGELOG.md`, then push a bare `X.Y.Z` tag (e.g. `0.1.0`,
  or a pre-release like `0.1.0-alpha.1`) on `main` — **no `v` prefix**; the
  `Package` workflow's tag trigger only matches the unprefixed pattern. The
  tag runs the complete backend release matrix, builds both wheels/sdists,
  and publishes only after all three gates succeed. Publication uses trusted
  publishing (OIDC), no API token needed.
- Before pushing a release candidate, run the installed local preflight. The
  backend's complete gate is `uv run python tools/run_tests.py` after
  `uv sync --all-groups --extra ml`. It collects the full suite, runs modules
  sequentially in separate processes, accounts for every collected test and
  enforces combined 87% coverage. Receipts live in `.test-results/`; use a fresh
  directory for each run. OS/Python release matrix checks still run remotely
  before PyPI publication. A local Windows run does not validate other OSes.
- PyPI trusted publishing must be configured once per package on pypi.org
  (Owner `ciaren-labs`, Repository `Ciaren`, Workflow `package.yml`,
  Environment `pypi` for `ciaren` / `pypi-client` for `ciaren-client`) before
  the first tag push — until then, `publish-server`/`publish-client` will
  fail with an OIDC/permission error even though the build jobs succeed.

## Becoming a Maintainer

Maintainer access may be granted to contributors who consistently make high
quality contributions, review others' work constructively, understand the
project's security posture, and help keep the community healthy.