polish(sprint-0): clean code per ruff + mypy strict

Run the dev linters over Sprint 0's core/library/shared modules and
address every finding. Behaviour unchanged; tests still 80/80 green.

Changes:

- Replace `class Foo(str, Enum)` with `class Foo(StrEnum)` (PEP 663
  / Python 3.11+) in 7 enum classes: ActuatorType, AlarmSeverity,
  AlarmType, KnobMode, KnobFunction, AutopilotMode, AccessLevel,
  VesselType. Pydantic v2 serialises StrEnum the same way, so YAML/JSON
  round-trips are byte-identical.
- Use `datetime.UTC` alias in place of `datetime.timezone.utc`
  (UP017) across alarms.py, knob_state.py, project_config.py, and
  test_knob_state.py.
- Remove now-unnecessary forward-reference quotes from method return
  type annotations (UP037) — `from __future__ import annotations` is
  already in scope everywhere.
- Tighten `_read_json_resource` / `_read_yaml_resource` in the library
  loader: validate that the deserialised payload is actually a dict
  before returning, instead of leaking `Any` from json.loads /
  yaml.safe_load. Fixes the only two `mypy --strict` findings.
- Add `.claude/settings.local.json` to .gitignore (personal
  Claude Code overrides are not committed).

Verification:
  ruff check arautopilot/                 -> All checks passed
  mypy arautopilot/core library shared    -> Success, 0 issues, 12 files
  pytest                                  -> 80 passed in 0.25s

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-18 07:26:37 -04:00
parent 700756c16f
commit 8d4a698144
10 changed files with 54 additions and 41 deletions
+3 -3
View File
@@ -11,12 +11,12 @@ Mirrors section 6 of the brief:
from __future__ import annotations
from enum import Enum
from enum import StrEnum
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
class AccessLevel(str, Enum):
class AccessLevel(StrEnum):
"""Three-level RBAC for PID tuning (brief section 6)."""
OPERATOR = "operator"
@@ -133,7 +133,7 @@ class PidConfig(BaseModel):
return v
@model_validator(mode="after")
def _check_loop_frequencies(self) -> "PidConfig":
def _check_loop_frequencies(self) -> PidConfig:
if self.inner_loop_freq_hz <= self.outer_loop_freq_hz:
raise ValueError(
"inner_loop_freq_hz must be strictly greater than outer_loop_freq_hz "