A lazydocker-style terminal UI for the stack's test scripts (verify / bench / verify-stress-NIAH / quality / soak / rebench-full): auto-detects the running model + endpoint, injects MODEL=/URL=, streams live progress, and browses the results/ history. Built by Qwen Max from docs/club3090-test-tui-prompt.md. - scripts/c3t — launcher that derives the repo root from its own location and runs the tool from tools/test-console's own venv (no global installs). - tools/test-console/ — Python + Textual package, pinned pyproject + uv.lock, and an 83-test offline pytest suite (parsers vs fixtures, mocked docker / /v1/models detection, BENCH_MOCK bench parse) — all green, no GPU required. Fixed before merge: __main__.py and a test fixture hardcoded the rig path /opt/ai/github/club-3090 — now derived from __file__ (parents[3]; override via C3T_REPO_ROOT) so it works from any clone, not just this rig. .gitignore excludes .venv / caches. Co-authored-by: noonghunna <[email protected]> Co-authored-by: Claude Opus 4.8 <[email protected]>
club3090-test-console (c3t)
A lazydocker-style terminal UI for the club-3090 AI inference stack test suite.
What it does
The TUI wraps the stack's existing test scripts (bench.sh, verify-full.sh, quality-test.sh, etc.) and:
- Auto-detects the serving model + endpoint (no more wrong-port/wrong-MODEL headaches)
- Runs tests with one keystroke — full pipeline or individual tests
- Streams live progress with structured parsing (bench TPS bars, NIAH ladder, quality counters, soak gauges)
- Shows GPU stats (VRAM, utilization, power draw/cap, temperature) in real-time
Quick start
# From the repo root:
bash scripts/c3t
# Or install with uv:
cd tools/test-console
uv sync
uv run c3t
Setup
cd tools/test-console
# Option A: uv (recommended)
uv sync
# Option B: pip + venv
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
Keybindings
| Key | Action |
|---|---|
↑/↓ or j/k |
Move in test menu |
Enter |
Run selected test (default config) |
c |
Configure selected test |
x |
Stop current run |
r |
Re-detect serving target |
m |
Manual target override |
f |
Toggle log follow/scroll-lock |
Tab |
Cycle pane focus |
? |
Help |
q |
Quit |
Test catalog
| Test | Script | Duration |
|---|---|---|
| Smoke | verify.sh |
~15s |
| Functional | verify-full.sh |
~2min |
| Speed bench | bench.sh |
~5min |
| Stress / NIAH | verify-stress.sh |
~15min |
| Quality packs | quality-test.sh |
5-90min |
| Soak / stability | soak-test.sh |
~20min |
| ★ FULL rebench | rebench-full.sh |
~45min-4h |
Architecture
tools/test-console/
├── pyproject.toml
├── README.md
├── club3090_test_console/
│ ├── __init__.py
│ ├── __main__.py # Entry point
│ ├── app.py # Main Textual App
│ ├── app.tcss # Textual CSS
│ ├── detect.py # Endpoint/model auto-detection
│ ├── parsers.py # Output parsers per test
│ ├── runner.py # Subprocess management
│ └── widgets/
│ ├── target_pane.py # Target status display
│ ├── test_menu.py # Test selection menu
│ └── live_pane.py # Structured progress + log
└── tests/
├── test_parsers.py # Parser unit tests (offline)
└── test_detect.py # Detection unit tests (offline)
Development
# Run tests (no GPU needed)
cd tools/test-console
uv run pytest -v
# Run the TUI
uv run c3t
Design decisions
- Python + Textual over Go+BubbleTea: reuses the stack's Python ecosystem and can import
compose_registrydirectly - No script modifications: the TUI is a pure wrapper — it spawns existing scripts and parses their output
- No global installs: uses
uv/ project-local.venvfor isolation - XDG state: run history persists under
~/.local/state/club3090-test-console/, never in the repo tree - Headless-testable: all parsers and detection logic are unit-testable without a GPU