Skip to content

Architecture Consolidation - 2026-10-06

Context

Before this batch the CLI and the API ran cycles through two different code paths, the frontend's API types were written by hand, run history was read through several ad-hoc helpers, and mypy and ruff format were advisory. The project is meant to be read by other engineers, so the structure had to be explainable in one diagram.

Decision

Change Pull request
Accurate ARCHITECTURE.md with a system diagram; frontend CI job; generated artifacts untracked #61
The cycle use case moves into services/cycle_run.CycleRunService, shared by CLI and API #60
The legacy execution stack is retired; every run goes through the cycle engine #62
Frontend API types are generated from FastAPI's OpenAPI schema and typechecked in CI #63
One storage boundary for run history (testo_core/history/) #65
mypy backlog cleared; mypy and ruff format are blocking in CI #64
changelog-on-main skips instead of failing when bot secrets are missing #66

Consequences

  • One engine: config/loader.py → config/resolver.py → engine/orchestrator.run_plan() → engine/executor.run_stage(), entered only through CycleRunService. See Architecture Overview.
  • A backend schema change that the frontend doesn't regenerate for fails CI.
  • The 2026-10-07 Interview Readiness Fixes build on this base.