PQF tracks the quality and compliance state of Canonical Platform Engineering's tracked products. Products are scored automatically across five quality dimensions (test coverage, documentation, security, substrate compatibility, support engagement) and awarded a bronze / silver / gold medal based on configurable criteria.
| 📊 Live dashboard | The deployed UI |
| 🏗 Architecture | How the system works |
| ➕ Add a product | Onboard a new product |
| 🔧 Add a dimension | Create a new scorer |
| 🤝 Contributing | Local setup and PR workflow |
| 🤖 AGENTS.md | AI agent onboarding |
PQF should stay simple, deterministic, and high-confidence as it evolves.
- Prefer explicit, explainable metrics over broad heuristics.
- Support only sanctioned structural variants such as monorepo vs non-monorepo, charm vs snap, root/meta vs leaf aggregation context, and equivalent YAML/workflow encodings of the same canonical signal.
- Treat measured-low and unmeasurable as different outcomes: a low measured value should score low, while a missing or unreliable signal should become
unrated/insufficient_data. - Do not absorb arbitrary repo-by-repo drift into scorer logic when PQF is intentionally trying to drive alignment.
See AGENTS.md for the detailed scorer/rubric guardrails and docs/metric-calibration-roadmap.md for the remaining calibration phases.
# Python engine
pip install -e ".[dev]"
make test
# React UI
make install-ui
make dev # → http://localhost:5173| Target | Description |
|---|---|
make install |
Install Python dev dependencies |
make install-ui |
Install Node/UI dependencies |
make install-all |
Install everything |
make lint |
Lint Python with ruff |
make format |
Auto-format Python with ruff |
make format-check |
Check formatting without modifying |
make test |
Run Python unit tests |
make test-ui |
Run Vitest UI unit tests |
make test-all |
Run Python + UI tests |
make build |
Build the React app (ui/dist/) |
make dev |
Start Vite dev server |
make e2e |
Run Playwright E2E tests |
make audit |
Run pip-audit + npm audit |
make score PRODUCT=<id> |
Score a product locally (needs GITHUB_TOKEN + OPENROUTER_API_KEY) |
To catch linting, formatting, type, and test errors before pushing:
# Install pre-commit framework (once)
pip install pre-commit
# Install git hooks (once per repo clone)
pre-commit install
# Run manually on all files
pre-commit run --all-files
# Hooks run automatically on `git commit`Pre-commit will run:
- Python lint + format check + tests on Python changes
- TypeScript type check + build + tests on UI changes
To skip hooks (discouraged): git commit --no-verify
