Entrix
Guardrails Embedded in the Change Lifecycle
routa-fitness is the Python package behind Routa's fitness orchestration.
It is built to keep verification close to the lifecycle of a change, not only at the tail end of CI.
This package currently powers three kinds of decisions:
- should the change pass baseline quality gates?
- how much confidence do we have in the current change?
- should a human reviewer be pulled in because the change is risky?
Lifecycle View
The further to the right, the higher the fix cost,
the lower the certainty of automation,
and the more human judgment is required.
[Requirements / AI-generated change]
|
v
[Rule Definition] -> [Baseline Quality Gates] -> [Risk Identification & Routing] -> [Deep Validation] -> [Release & Feedback]
| | | | |
| | | | |
|- metrics? |- compile? |- API/schema? |- API parity? |- merge / release
|- thresholds? |- lint? |- impact radius? |- E2E / visual? |- update rules
|- hard gates? |- tests? |- suspicious expansion? |- semgrep / audit? |- tune thresholds
|- evidence? |- coverage? |- missing evidence? |- need human review? |- close the loop
Possible outcomes:
PASS: continue to review, merge, and releaseWARN: strengthen evidence or escalate review depthBLOCK: do not merge
System foundation:
docs/fitness -> routa-fitness orchestration -> hard gates + weighted score + review triggers
Feedback loop:
production issue / missed detection
-> update docs/fitness
-> refine thresholds
-> add stronger verification templates
What It Does
Today the package provides:
- architecture fitness checks grouped by dimension
- fast / normal / deep execution tiers
- change-aware execution against the current git diff
- hard-gate and weighted-score orchestration
review-triggerrules that ask for human review on risky changes
It is useful both as:
- a repository-local fitness runner for Routa
- the beginning of a more reusable fitness engine
Installation
Install from PyPI with uv
uv tool install routa-fitness
Run without installing globally:
uvx routa-fitness --help
uvx routa-fitness run --tier fast
uvx routa-fitness review-trigger --base HEAD~1
Install from PyPI with pip
pip install routa-fitness
Run in a project without global install
uvx --from routa-fitness routa-fitness --help
uvx --from routa-fitness routa-fitness run --tier fast
Develop the package itself from source
If you are working on the routa-fitness package source itself, clone this repository and install it from the repository root.
From the repository root:
git clone https://github.com/phodal/entrix.git
cd entrix
uv pip install -e .
With pip:
git clone https://github.com/phodal/entrix.git
cd entrix
pip install -e .
Quick Start
1. Create a fitness spec
By default, routa-fitness run looks for specs under the current project's:
docs/fitness/*.md
Example docs/fitness/code-quality.md:
---
dimension: code_quality
weight: 20
threshold:
pass: 90
warn: 80
metrics:
- name: lint
command: npm run lint 2>&1
hard_gate: true
tier: fast
description: ESLint must pass
- name: unit_tests
command: npm run test:run 2>&1
pattern: "Tests\\s+\\d+\\s+passed"
hard_gate: true
tier: normal
description: unit tests must pass
---
# Code Quality
Narrative evidence, rules, and ownership notes can live below the frontmatter.
2. Run the checks
routa-fitness run --tier fast
routa-fitness run --tier normal
routa-fitness run --changed-only --base HEAD~1
routa-fitness validate
3. Add review triggers
By default, review-trigger loads the current project's:
docs/fitness/review-triggers.yaml
Example docs/fitness/review-triggers.yaml:
review_triggers:
- name: high_risk_directory_change
type: changed_paths
paths:
- src/core/acp/**
- src/core/orchestration/**
- crates/routa-server/src/api/**
severity: high
action: require_human_review
- name: oversized_change
type: diff_size
max_files: 12
max_added_lines: 600
max_deleted_lines: 400
severity: medium
action: require_human_review
Run it:
routa-fitness review-trigger --base HEAD~1
routa-fitness review-trigger --base HEAD~1 --json
Example output:
{
"human_review_required": true,
"base": "HEAD~1",
"changed_files": [
"crates/routa-server/src/api/acp_routes.rs"
],
"diff_stats": {
"file_count": 13,
"added_lines": 936,
"deleted_lines": 20
},
"triggers": [
{
"name": "high_risk_directory_change",
"severity": "high",
"action": "require_human_review",
"reasons": [
"changed path: crates/routa-server/src/api/acp_routes.rs"
]
}
]
}
Commands
routa-fitness run
Runs dimension-based fitness checks loaded from docs/fitness/*.md.
Common flags:
routa-fitness run --tier fast
routa-fitness run --parallel
routa-fitness run --dry-run
routa-fitness run --verbose
routa-fitness run --changed-only --base HEAD~1
routa-fitness validate
Checks that dimension weights sum to 100%.
routa-fitness validate
routa-fitness review-trigger
Evaluates governance-oriented trigger rules for risky changes.
Common flags:
routa-fitness review-trigger --base HEAD~1
routa-fitness review-trigger --json
routa-fitness review-trigger --fail-on-trigger
routa-fitness review-trigger --config docs/fitness/review-triggers.yaml
routa-fitness graph ...
Graph-backed commands support impact analysis, test radius, and AI-friendly review context.
Examples:
routa-fitness graph impact --base HEAD~1
routa-fitness graph test-radius --base HEAD~1
routa-fitness graph review-context --base HEAD~1 --json
AI-Friendly Authoring Notes
If an AI agent is generating or updating fitness specs, these conventions work best:
- keep one dimension per file
- make the frontmatter executable and the body explanatory
- prefer stable command outputs over fragile text matching
- use
hard_gate: trueonly when failure should really block progress - keep review-trigger rules separate from scoring metrics
- treat markdown as the narrative layer, not the only source of structure
Recommended file layout:
your-project/
docs/
fitness/
README.md
code-quality.md
security.md
review-triggers.yaml
Minimal bootstrap flow for a new repository:
mkdir -p docs/fitness
cat > docs/fitness/code-quality.md <<'EOF'
---
dimension: code_quality
weight: 100
threshold:
pass: 100
warn: 80
metrics:
- name: lint
command: npm run lint 2>&1
hard_gate: true
tier: fast
---
# Code Quality
EOF
routa-fitness validate
routa-fitness run --tier fast
Python API
Review trigger example
from pathlib import Path
from routa_fitness.review_trigger import (
collect_changed_files,
collect_diff_stats,
evaluate_review_triggers,
load_review_triggers,
)
repo_root = Path(".").resolve()
rules = load_review_triggers(repo_root / "docs" / "fitness" / "review-triggers.yaml")
changed_files = collect_changed_files(repo_root, "HEAD~1")
diff_stats = collect_diff_stats(repo_root, "HEAD~1")
report = evaluate_review_triggers(rules, changed_files, diff_stats, base="HEAD~1")
print(report.to_dict())
Fitness spec loading example
from pathlib import Path
from routa_fitness.evidence import load_dimensions
dimensions = load_dimensions(Path("docs/fitness"))
for dimension in dimensions:
print(dimension.name, len(dimension.metrics))
Recommended Hook Integration
For local repositories, a practical pattern is:
pre-commit: run quick lint onlypre-push: run full checks, then print review-trigger warnings- CI: run
routa-fitness runand publish JSON/report output
That lets automation catch deterministic failures early while still escalating ambiguous risky changes to humans.
Known Constraints
Current constraints to be aware of:
- the package name on PyPI is
routa-fitness - the default authoring format is still markdown frontmatter under
docs/fitness - the project is evolving toward a cleaner core / adapter / preset split
- graph commands require the optional graph dependency set
Status
Current status:
- stable for Routa-internal usage
- installable as a standalone PyPI package
- suitable for AI-assisted project configuration
- evolving toward a reusable fitness engine architecture
Metadata
Release files for routa-fitness 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| routa_fitness-0.1.4.tar.gz | 54.6 kB | Without provenance | Details for routa_fitness-0.1.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| routa_fitness-0.1.4-py3-none-any.whl | Python 3 | none | any | Details for routa_fitness-0.1.4-py3-none-any.whl |
Total release size: 108.4 kB
Release files / routa_fitness-0.1.4.tar.gz
| Download URL | routa_fitness-0.1.4.tar.gz |
|---|---|
| Size | 54.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38054253f354f8b9138bcfd8e8f2d82672f5814726371380d8d13222760b833d
|
|
BLAKE2b-256 checksum How to use checksums |
1f692a4e32ad4bf12d61107d1ca24c841f766ccd30d8d9bca9a92dc828436763
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|
Release files / routa_fitness-0.1.4-py3-none-any.whl
| Download URL | routa_fitness-0.1.4-py3-none-any.whl |
|---|---|
| Size | 53.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
26a6f0af4a68cf57d4899d77ecc9edc9a058f4e047be67659f78efe3acd8cdd2
|
|
BLAKE2b-256 checksum How to use checksums |
71a5d6c331072e0d0c52c50160a04302df6cc5ceab736be6465f8f7ce5d528de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|
Security for routa-fitness 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.