Repository navigation
V1 Release Roadmap
Index · Product Roadmap · Technical Debt Tracker
Created: 2026-06-24 Goal: Ship
testo-corev1.0.0 — a production-ready, published, fully-gated release. Current state: All 4 delivery phases are implemented in code. Zero TODO/FIXME/HACK markers. 123+ test files. But: no release checklists executed, not on PyPI, persistence module missing, 16 draft PRs unmerged, 14 tech-debt items open.
| Priority | Meaning |
|---|---|
| P0 | Release blocker — must be done before v1.0 tag |
| P1 | High — should be done before v1.0, significant risk if skipped |
| P2 | Medium — quality/hardening, can ship without but degrades confidence |
| P3 | Low — future work, nice-to-have, post-v1.0 |
| Effort | Meaning |
|---|---|
| XS | < 30 min |
| S | 30 min – 2 hours |
| M | 2 – 4 hours |
| L | 4 – 8 hours (1 day) |
| XL | 1 – 3 days |
Why: 16 draft PRs contain correctness fixes and test coverage that must land before any release gate can pass. Critical bugs in report artifact paths could cause data loss or broken reports in production.
Execution order: Bugs first (data loss risk), then coverage, then automation.
| # | Task | PR | Priority | Effort | Depends On |
|---|---|---|---|---|---|
| 1.1.1 | Review and merge: Fix AI summary refresh data loss and failed-run generation wiring | PR #22 | P0 | S | — |
| 1.1.2 | Review and merge: Harden report archive extraction paths | PR #28 | P0 | S | — |
| 1.1.3 | Review and merge: Harden report artifact path handling | PR #30 | P0 | S | 1.1.2 |
| # | Task | PR | Priority | Effort | Depends On |
|---|---|---|---|---|---|
| 1.2.1 | Review and merge: Fix execution accepted-status race condition | PR #26 | P1 | XS | — |
| 1.2.2 | Review and merge: Fix sandbox/mock API support restoration | Draft PR | P1 | XS | — |
| 1.2.3 | Review and merge: Dockerless runner allure analytics fallback | Draft PR | P2 | XS | — |
| # | Task | PR | Priority | Effort | Depends On |
|---|---|---|---|---|---|
| 1.3.1 | Review and merge: AI failure summary service coverage | PR #21 | P1 | S | 1.1.1 |
| 1.3.2 | Review and merge: AI failure summary regression coverage (set 1) | PR #23 | P1 | S | 1.3.1 |
| 1.3.3 | Review and merge: AI failure summary regression coverage (set 2) | PR #24 | P1 | S | 1.3.1 |
| 1.3.4 | Review and merge: Execution accepted status coverage | PR #26 | P1 | S | 1.2.1 |
| 1.3.5 | Review and merge: Report archive diff regression coverage (set 1) | PR #27 | P1 | S | 1.1.2 |
| 1.3.6 | Review and merge: Report archive diff regression coverage (set 2) | PR #29 | P1 | S | 1.1.2 |
| # | Task | PR | Priority | Effort | Depends On |
|---|---|---|---|---|---|
| 1.4.1 | Review and merge: Claude AI code review workflow | PR #31 | P2 | XS | — |
Why: All 8 release checklists have 0/210 items checked. The roadmap says phases are "done" but the operational go/no-go gates were never run. Without formal sign-off, there's no proof of release readiness.
Execution order: Phase 1 → 2 → 3 → 4 (each phase builds on prior).
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 2.1.1 | Run Phase 1 pre-reqs: pip install -e '.[dev]' and python -m build in clean venv |
P0 | XS | 1.1.* |
| 2.1.2 | Run Phase 1 CLI contract tests: pytest tests/unit/testo_core/test_cli_run.py tests/contract/testo_core/test_cli_contract.py
|
P0 | XS | 2.1.1 |
| 2.1.3 | Run Phase 1 repository tests: pytest tests/unit/testo_core/test_repository_sqlite.py tests/contract/testo_core/test_repository_contract.py
|
P0 | XS | 2.1.1 |
| 2.1.4 | Verify testo run --help and testo --version output |
P0 | XS | 2.1.1 |
| 2.1.5 | Check off all items in docs/Release Management/Release Checklist - Phase 1 Foundation.md
|
P0 | S | 2.1.2–2.1.4 |
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 2.2.1 | Run Phase 2 CI integration tests: pytest tests/unit/ci/test_github_action_wrapper.py tests/contract/ci/test_wrapper_contract.py
|
P0 | XS | 2.1.5 |
| 2.2.2 | Run Phase 2 Ghost mode smoke: pytest tests/integration/test_ghost_mode_smoke.py
|
P0 | S | 2.1.5 |
| 2.2.3 | Run Phase 2 Runner image smoke: build Dockerfile.testo-runner and verify docker run --rm uqo-runner:rc run --help
|
P0 | S | 2.1.5 |
| 2.2.4 | Run Ghost policy + CI provenance unit tests | P0 | XS | 2.1.5 |
| 2.2.5 | Run NDJSON contract tests: pytest tests/contract/testo_core/test_ghost_summary_contract.py tests/contract/testo_core/test_ghost_ndjson_contract.py
|
P0 | XS | 2.1.5 |
| 2.2.6 | Check off all items in Release Checklist - Phase 2 CI Integrations.md
|
P0 | S | 2.2.1–2.2.5 |
| 2.2.7 | Check off all items in Release Checklist - Phase 2 Ghost Mode.md
|
P0 | S | 2.2.2, 2.2.4, 2.2.5 |
| 2.2.8 | Check off all items in Release Checklist - Phase 2 Runner Image.md
|
P0 | S | 2.2.3 |
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 2.3.1 | Run dashboard service + contract tests: pytest tests/unit/testo_core/test_dashboard_service.py tests/contract/api/test_dashboard_contract.py
|
P0 | XS | 2.2.6 |
| 2.3.2 | Run delta analytics + comparison contract tests: pytest tests/contract/api/test_analytics_contract.py
|
P0 | XS | 2.2.6 |
| 2.3.3 | Run frontend unit tests: npm --prefix frontend run test
|
P0 | S | 2.2.6 |
| 2.3.4 | Run frontend E2E tests: npm --prefix frontend run test:e2e
|
P0 | S | 2.3.3 |
| 2.3.5 | Manual verify: Dashboard / renders KPI cards, trend badges, drill-down links |
P0 | S | 2.3.3 |
| 2.3.6 | Manual verify: Compare page /compare selects runs and shows delta visualization |
P0 | S | 2.3.2 |
| 2.3.7 | Manual verify: degraded-data behavior (n/a display, degraded banner, missing report links) | P1 | S | 2.3.5 |
| 2.3.8 | Check off all items in Release Checklist - Phase 3 Frontend Migration.md
|
P0 | S | 2.3.1–2.3.7 |
| 2.3.9 | Check off all items in Release Checklist - Phase 3 Delta Engine.md
|
P0 | S | 2.3.2, 2.3.6 |
| 2.3.10 | Check off all items in Release Checklist - Phase 3 Unified Dashboard.md
|
P0 | S | 2.3.5, 2.3.7 |
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 2.4.1 | Run AI service unit tests: pytest tests/unit/testo_core/test_failure_analysis_service.py
|
P0 | XS | 2.3.8 |
| 2.4.2 | Run AI contract tests: pytest tests/contract/api/test_ai_contract.py
|
P0 | XS | 2.3.8 |
| 2.4.3 | Manual verify: AI Settings page /settings/ai — provider config, key management, model selection |
P0 | S | 2.4.1 |
| 2.4.4 | Manual verify: Run Detail /runs/:runId — AI summary generation with configured provider |
P0 | S | 2.4.1 |
| 2.4.5 | Verify AI summary caching (generate once, retrieve cached on refresh) | P1 | S | 2.4.4 |
| 2.4.6 | Check off all items in Release Checklist - Phase 4 AI and Failure Analysis.md
|
P0 | S | 2.4.1–2.4.5 |
Why: orchestrator.py:228 promises testo_core.persistence for Phase 4. The engine layer currently writes plan_result.json only. The services layer has DB persistence (headless_engine.py, run_history.py), but the engine doesn't. This is confusing and the --no-persist flag name is misleading.
Decision needed: Build the module, or formally document JSON-only approach and rename flags.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 3.1.1 | Design testo_core/persistence/ module interface: what data flows from engine to DB |
P0 | S | — |
| 3.1.2 | Create testo_core/persistence/__init__.py with PersistenceBackend protocol |
P0 | S | 3.1.1 |
| 3.1.3 | Create testo_core/persistence/json_backend.py — extract current _try_persist logic |
P0 | M | 3.1.2 |
| 3.1.4 | Create testo_core/persistence/db_backend.py — wire to existing RunRepository
|
P0 | M | 3.1.2 |
| 3.1.5 | Integrate persistence backend into orchestrator.run_plan() replacing _try_persist
|
P0 | M | 3.1.3, 3.1.4 |
| 3.1.6 | Update --no-persist / --persist CLI flags with clear semantics |
P0 | S | 3.1.5 |
| 3.1.7 | Add unit tests for JSON and DB persistence backends | P0 | M | 3.1.5 |
| 3.1.8 | Update orchestrator.py docstring to remove "wired up in Phase 4" reference |
P0 | XS | 3.1.5 |
| 3.1.9 | Update docs/Architecture/Architecture Overview.md with persistence layer |
P1 | S | 3.1.5 |
| 3.1.10 | Update Technical Debt Tracker item #4 as fixed | P1 | XS | 3.1.5 |
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 3.2.1 | Rename --no-persist to --no-artifact-json or similar |
P0 | S | — |
| 3.2.2 | Update orchestrator.py docstring to reflect JSON-only design decision |
P0 | XS | — |
| 3.2.3 | Document that DB persistence lives in services layer, not engine layer | P0 | S | — |
| 3.2.4 | Add ADR: "Engine persistence is JSON-only; DB persistence via services" | P1 | S | 3.2.3 |
| 3.2.5 | Update Technical Debt Tracker item #4 to "Resolved — by design" | P1 | XS | 3.2.2 |
Why: Modern engine (orchestrator.py + executor.py) and legacy stack (headless_engine.py + runners.py) have duplicate EngineExitCode, duplicate classification logic, and risk behavioral drift. Tech Debt Tracker items #2 and #12.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 4.1 | Audit: map all callers of headless_engine.py vs orchestrator.py — document which CLI/API paths use which |
P1 | M | 1.1.* |
| 4.2 | Single-source EngineExitCode: keep in engine/exit_codes.py, import in headless_engine.py
|
P1 | S | 4.1 |
| 4.3 | Single-source classify_exit_code: remove duplicate from headless_engine.py
|
P1 | S | 4.2 |
| 4.4 | Replace literal exit code constants in CLI (raise typer.Exit(code=2)) with EngineExitCode.INVALID_INPUT
|
P2 | S | 4.2 |
| 4.5 | Add contract test asserting both stacks produce identical exit codes for same inputs | P1 | M | 4.3 |
| 4.6 | Document boundary: which stack handles what (in Architecture Overview or ADR) | P1 | S | 4.1 |
| 4.7 | Long-term: design RunBackend protocol with host and Docker implementations |
P3 | L | 4.6 |
| 4.8 | Update Technical Debt Tracker items #2, #6, #12 as resolved | P1 | XS | 4.3, 4.4 |
Why: Broad except Exception in Docker/S3/reporter paths causes silent degradation — empty reports, stale DB rows, swallowed errors. Tech Debt Tracker items #5, #7, #8, #9, #10.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 5.1 | Audit: list all except Exception sites in runners.py, run_history.py, reporter clients |
P2 | S | — |
| 5.2 | Narrow runners.py Docker exception handlers to docker.errors.DockerException, OSError, TimeoutError
|
P2 | M | 5.1 |
| 5.3 | Narrow run_history.py S3/DB handlers to ClientError, SQLAlchemyError
|
P2 | M | 5.1 |
| 5.4 | Narrow reporter exception handlers (extent_reporter.py, reportportal_client.py, testbeats_reporter.py) |
P2 | M | 5.1 |
| 5.5 | Add logger.warning(..., exc_info=True) to all narrowed handlers |
P2 | S | 5.2–5.4 |
| 5.6 | Fix swallowed BehaveX/native report errors: set StageResult.error when HTML generation fails |
P2 | S | — |
| 5.7 | Reporter factory: add reporters_required config option or emit reporter_failed NDJSON event |
P2 | M | 5.4 |
| 5.8 | Git trigger fallback: emit {"event":"trigger_fallback","mode":"snapshot","reason":"..."} NDJSON when --ci
|
P2 | S | — |
| 5.9 | Orchestrator defensive catch: re-raise KeyboardInterrupt/SystemExit, narrow to adapter errors, use exit 4 for internal |
P2 | S | — |
| 5.10 | Update Technical Debt Tracker items #5, #7, #8, #9, #10 as resolved | P2 | XS | 5.2–5.9 |
Status (2026-07-01): 6.1–6.5 complete — CHANGELOG.md created at repo root (adopted from sprint-4/publish-and-document, extended with commit #35), with PR-time enforcement (commitlint + changelog-diff check) and an AI-drafted [Unreleased] step on every push to main. 6.6–6.9 verified already satisfied — README.md has GitHub Action quickstart, GitLab template quickstart, required secrets/variables, and CI troubleshooting sections. See Changelog Automation and CI Enforcement Policy.
Why: No CHANGELOG exists. README may lack CI quickstarts. Docs lack "last updated" dates. Release checklists serve as templates but don't record actual sign-offs.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 6.1 | Create CHANGELOG.md at repo root with entries for all 4 phases derived from git history |
P0 | M | — |
| 6.2 | Add Phase 1 changelog entry: DB adapters, PyPI packaging, headless CLI | P0 | XS | 6.1 |
| 6.3 | Add Phase 2 changelog entry: GitHub Action, GitLab template, Ghost mode, Runner image | P0 | XS | 6.1 |
| 6.4 | Add Phase 3 changelog entry: React frontend, Delta comparison, Unified dashboard | P0 | XS | 6.1 |
| 6.5 | Add Phase 4 changelog entry: BYOK AI, Context-aware failure analysis | P0 | XS | 6.1 |
| 6.6 | Verify README contains GitHub Action quickstart snippet | P1 | S | — |
| 6.7 | Verify README contains GitLab template quickstart snippet | P1 | S | — |
| 6.8 | Verify README contains required variables/secrets section | P1 | S | — |
| 6.9 | Verify README contains troubleshooting section | P1 | S | — |
| 6.10 | Add frontmatter last-updated: YYYY-MM-DD to all docs in docs/Architecture/
|
P3 | S | — |
| 6.11 | Add frontmatter last-updated: YYYY-MM-DD to all docs in docs/CLI Commands/
|
P3 | S | — |
| 6.12 | Add frontmatter last-updated: YYYY-MM-DD to all docs in docs/Specs & ADRs/
|
P3 | S | — |
Why: Phase 1 promises pip install testo-core. The package is not on PyPI and no publish workflow exists.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 7.1 | Register testo-core package name on PyPI (or Test PyPI first) |
P0 | S | — |
| 7.2 | Create .github/workflows/publish.yml — triggered on GitHub Release tag push |
P0 | M | 7.1 |
| 7.3 | Configure trusted publisher (OIDC) for GitHub → PyPI auth (no API token in secrets) | P0 | S | 7.1 |
| 7.4 | Add python -m build and twine check dist/* to publish workflow |
P0 | S | 7.2 |
| 7.5 | Add Test PyPI dry-run step before real publish | P1 | S | 7.2 |
| 7.6 | Test end-to-end: create a test release, verify pip install testo-core works from PyPI |
P0 | M | 7.4 |
| 7.7 | Document publish process in docs/Processes & Guides/Publishing to PyPI.md
|
P1 | S | 7.6 |
Why: Dockerfile.testo-runner exists but has no CI for building/pushing to a registry. Phase 2 promises a pre-built runner image.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 8.1 | Choose container registry (GitHub Container Registry recommended — free for public repos) | P1 | XS | — |
| 8.2 | Create .github/workflows/docker-publish.yml — triggered on release tag |
P1 | M | 8.1 |
| 8.3 | Add multi-arch build support (linux/amd64, linux/arm64) via docker buildx
|
P2 | S | 8.2 |
| 8.4 | Add image scanning step (e.g. trivy) to CI before publish |
P2 | S | 8.2 |
| 8.5 | Tag images with semver + latest + commit SHA |
P1 | S | 8.2 |
| 8.6 | Test end-to-end: pull published image, run uqo run --help
|
P1 | S | 8.5 |
| 8.7 | Update README with published image pull command | P1 | XS | 8.6 |
| 8.8 | Update docker-compose.yml to use published image instead of local build |
P2 | S | 8.6 |
Why: testo_ui/ (Streamlit) still exists alongside React frontend. No formal deprecation or removal plan. Running both causes confusion about which UI is "official."
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 9.1 | Confirm React frontend covers all Streamlit UI functionality (feature parity audit) | P1 | M | 2.3.* |
| 9.2 | Add deprecation warning to testo-ui entrypoint: "Streamlit UI is deprecated, use React frontend" |
P1 | XS | 9.1 |
| 9.3 | Remove `UQO_UI_MODE=dual | streamlit` mode toggle logic | P2 | S |
| 9.4 | Remove testo_ui/ directory and testo-ui entrypoint from pyproject.toml
|
P2 | S | 9.3 |
| 9.5 | Remove streamlit from [ui] extras in pyproject.toml
|
P2 | XS | 9.4 |
| 9.6 | Update docs/Processes & Guides/Streamlit to React Migration Guide.md to mark migration complete |
P2 | XS | 9.4 |
| 9.7 | Remove dual-mode integration tests (tests/integration/test_dual_mode_ui.py if exists) |
P2 | XS | 9.4 |
Why: Version is still 0.1.0 despite 4 phases of features. The final step is tagging and publishing v1.0.0.
| # | Task | Priority | Effort | Depends On |
|---|---|---|---|---|
| 10.1 | Bump version to 1.0.0 in pyproject.toml
|
P0 | XS | All P0 tasks |
| 10.2 | Final CHANGELOG entry for v1.0.0 | P0 | S | 6.1, 10.1 |
| 10.3 | Create Git tag v1.0.0
|
P0 | XS | 10.2 |
| 10.4 | Create GitHub Release from tag with changelog notes | P0 | S | 10.3 |
| 10.5 | Verify PyPI publish triggered and successful | P0 | S | 7.*, 10.4 |
| 10.6 | Verify Docker image publish triggered and successful | P1 | S | 8.*, 10.4 |
| 10.7 | Smoke test: pip install testo-core==1.0.0 in clean venv → testo --version
|
P0 | XS | 10.5 |
| 10.8 | Announce release (README badge, GitHub Release notes) | P1 | S | 10.7 |
Not blocking v1.0. Tracked here for visibility.
| # | Task | Priority | Effort |
|---|---|---|---|
| 11.1.1 | Design parallel stage execution model (resource limits, artifact isolation) | P3 | M |
| 11.1.2 | Implement concurrent.futures or asyncio stage runner in orchestrator |
P3 | L |
| 11.1.3 | Add parallel: true stage config in testosterone.yaml schema |
P3 | S |
| 11.1.4 | Aggregate exit codes from parallel stages | P3 | M |
| 11.1.5 | Add integration tests for parallel execution | P3 | M |
| # | Task | Priority | Effort |
|---|---|---|---|
| 11.2.1 | Create testo_core/frameworks/locust_adapter.py following BaseAdapter protocol |
P3 | M |
| 11.2.2 | Handle Locust HTML report collection | P3 | S |
| 11.2.3 | Add Locust cycle example in testosterone.yaml
|
P3 | XS |
| 11.2.4 | Add unit tests for Locust adapter | P3 | S |
| # | Task | Priority | Effort |
|---|---|---|---|
| 11.3.1 | Complete InfluxDB metrics export from run results | P3 | M |
| 11.3.2 | Add Grafana dashboard template for Testo metrics | P3 | L |
| 11.3.3 | Document metrics pipeline in docs/
|
P3 | S |
| # | Task | Priority | Effort |
|---|---|---|---|
| 11.4.1 | Document Pluggy hook specs and plugin API | P3 | M |
| 11.4.2 | Create example third-party plugin (e.g. Slack notifier) | P3 | M |
| 11.4.3 | Add testo plugins list CLI command |
P3 | S |
| # | Task | Priority | Effort |
|---|---|---|---|
| 11.5.1 | Create Helm chart for Kubernetes deployment | P3 | XL |
| 11.5.2 | Create Terraform module for cloud deployment | P3 | XL |
| 11.5.3 | Document production deployment guide | P3 | L |
The recommended execution order groups tasks into sprints:
Tasks: 1.1.1 → 1.1.2 → 1.1.3 → 1.2.1 → 1.2.2 → 1.3.1–1.3.6 Goal: All 16 draft PRs reviewed, critical bugs merged, test coverage landed. Estimated effort: 1–2 days
Tasks: 2.1.1–2.1.5 → 2.2.1–2.2.8 → 2.3.1–2.3.10 → 2.4.1–2.4.6 Goal: All 8 release checklists executed and checked off. Estimated effort: 2–3 days
Tasks: 3.1.1–3.1.10 (or 3.2.1–3.2.5) → 4.1–4.6 Goal: Persistence module resolved. Exit codes consolidated. Architecture documented. Estimated effort: 2–3 days
Tasks: 6.1–6.9 → 7.1–7.6 → 8.1–8.6 Goal: CHANGELOG created. PyPI publish pipeline working. Docker image pipeline working. Estimated effort: 2–3 days
Tasks: 5.1–5.10 → 9.1–9.7 → 1.2.3 → 1.4.1 Goal: Exception handling narrowed. Streamlit deprecated/removed. CI automation. Estimated effort: 2–3 days
Tasks: 10.1–10.8 Goal: Version bumped, tagged, published, verified. Estimated effort: 1 day
Tasks: 11.1–11.5 (all P3) Goal: Parallel execution, Locust adapter, InfluxDB, plugin docs, production deployment.
Total estimated effort to v1.0: ~10–15 working days
| Priority | Count | Effort Range |
|---|---|---|
| P0 | 42 | Mostly XS–M |
| P1 | 28 | S–M |
| P2 | 22 | S–M |
| P3 | 18 | M–XL |
| Total | 110 |
- Product Roadmap — high-level phase delivery narrative
- Technical Debt Tracker — inferred debt backlog (items referenced above)
- Release Management — release gate hub
- Architecture Overview — system design
- Deep Dive - Execution Logic — engine internals
- UQO Engineering Hub — engineering coordination
Generated from docs/Archive/V1 Release Roadmap.md. Edit it there; changes made in the wiki are overwritten.
Architecture
CLI Commands
Processes & Guides
- CI-CD Pipeline Setup
- E2E Harness Operations Guide
- GitLab Pages Demo
- Publishing Docker Images
- Publishing to Artifactory
- Publishing to PyPI
Prompts & Snippets
Roadmap & Strategy
Specs & ADRs
- Architecture Consolidation - 2026-10-06
- BehaveX Reports - 2026-10-21
- Command Adapter and JUnit Import - 2026-09-25
- Delta Comparison Policy
- Docs Site - 2026-10-19
- Docs Vault and Wiki Sync - 2026-10-07
- GitHub Action PR Comment - 2026-10-19
- Interview Readiness Fixes - 2026-10-07
- Library Packaging
- Open Source Features - 2026-10-19
- Phase 3 Delta Comparison Engine Plan
- Phase 3 Unified Dashboard Plan
- Phase 4 BYOK and Failure Analysis
- Phase 5 UI Redesign - Cycles-First Navigation
- Playwright Adapter - 2026-10-19
- Plugin API - 2026-10-19
- Specs & ADRs
- Repository Pattern - Database-Agnostic Refactor
- UI Restyle - 2026-10-19
Testing Workflows
Vault