Plesty Documentation

Pixel & Nebula Gates (1–6)

The six local static analysis gates that run under pixel and nebula standards.

These gates run entirely locally with no network access. They complete in under 15 seconds on a typical module.

pixel [SDK] Gate 1 — Metadata & Namespace
Checks pyproject.toml: required fields present (name, version, description, authors); package name matches plesty-<module> pattern; plesty/<module>/ directory exists. If module_type is present in [tool.plesty], validates it is one of device, experiment, analyzer, core.
pixel [SDK] Gate 2 — Code Hygiene
Runs ruff (E, F, W, D rule sets) with the SDK ruff.toml (line-length = 99). Runs ruff format --check. Runs mypy type-checking (excluding tests/). All three must pass with zero errors.
nebula [SDK] Gate 3 — API Interface Matching
Static AST analysis: any class that imports from plesty.lib.* must inherit from the imported base class. For example, a class importing BaseDeviceSyncModel must list it in its MRO. Catches cases where a developer imports the class but forgets to inherit from it.
nebula [SDK] Gate 4 — Data Layer Compliance
All public methods (those not prefixed with _) must have explicit return type annotations. Accepts None for procedures. Prevents return type drift in the public API.
nebula [SDK] Gate 5 — Documentation Completeness
docs/index.md (or index.rst) must exist. CHANGELOG.md must exist and must have been updated (file modified) since the last git tag. This ensures release notes are always current.
nebula [SDK] Gate 6 — Dependency Coexistence
No exact version pins (==x.y.z) in [project.dependencies] or [dependency-groups]. Use compatible ranges: >=x.y,<x+1. Prevents dependency conflicts when multiple PLESTY modules are installed together.

Quick fixes

Gate Common failure Fix
2 Format violation uv run ruff format --config <sdk-ruff.toml> .
2 Lint violation uv run ruff check --fix .
2 Mypy error Add return type annotation; fix type mismatch
5 Missing docs/index.md Create minimal overview file
5 Stale CHANGELOG Add a dated entry to CHANGELOG.md
6 Exact pin == Change to >=x.y,<x+1