Skip to main content

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 release
  • WARN: strengthen evidence or escalate review depth
  • BLOCK: 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-trigger rules 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: true only 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 only
  • pre-push: run full checks, then print review-trigger warnings
  • CI: run routa-fitness run and 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)

Source distribution for routa-fitness 0.1.4
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)

Table of built distributions (wheels) for routa-fitness 0.1.4
File Interpreter ABI Platform Actions
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page