Performance and resource envelopes (1.0)¶
Status: measurement recipe + baseline notes (0.9.7); large-library UI soak pass 2026-08-07 (200+ transcripts); Medium Balanced batch pass 2026-08-07 (~9.3 min / 6 transcripts on Docker Compose); thorough full-preset LLM timings on speaker-complete corpus pass 2026-08-07 (qwen2.5:7b); final Thorough stress pass (2 tx + 2 groups) pass 2026-08-08 (corpus 68.7 min)
Programme: pre_release_roadmap_1_0.md §12
Related: release_severity_triage_1_0.md, run_performance.md, runtime/docker-efficiency-baseline.md
Documented expectations and regression indicators — not necessarily strict universal guarantees. Capacity failures that corrupt data or hang without recovery are release blockers / must-fix; non-critical misses may ship as known limitations.
Representative corpus sizes¶
Class |
Working definition |
Notes |
|---|---|---|
Small |
1 short meeting (~2–8 minutes, low segment count) |
First useful result / smoke |
Medium |
~5–10 transcripts; default (Balanced) preset |
Typical personal corpus |
Large-for-1.0 |
~50 transcripts in library + one multi-member group (3–5 members) |
Upper documented expectation for 1.0 |
Raw measurement notes may live under ignored .local/ scratch; curated numbers only below.
Measurement recipe¶
From repo root on the machine under test (record package version, OS, Docker vs native, CPU/RAM class):
# 1) Package / image identity
python -c "import transcriptx; print(transcriptx.__version__)"
docker images --digests transcriptx:latest # if Docker profile
# 2) Startup (GUI cold)
# Time until Home is interactive after `make run` / `./transcriptx.sh`
# Record wall seconds.
# 3) Import (Small / Medium)
# Managed import of N WhisperX/whispermlx JSON transcripts; record wall + disk delta under data root.
# 4) Default-preset runtime
# Run Balanced (or product default) on Small and Medium; read
# <run>/.transcriptx/run_performance.json
# and module duration_ms in run_results.json (see run_performance.md).
# 5) Time to first useful result
# Clock from empty library → import Small → first Overview/Insights paint.
# 6) Memory / disk
# Peak RSS during Medium default preset; data-root disk before/after.
# 7) Model download sizes (optional extras)
# Document Hub / spaCy / Ollama pulls from runtime/models.md; do not re-download in CI.
# 8) Docker image size
docker images transcriptx:latest
docker history transcriptx:latest
# Compare docs/runtime/docker-efficiency-baseline.md (~3.7GB class historically).
# 9) Group scaling
# One group of 3–5 Medium-class members; record group wall from group run_performance sidecar.
# 10) Insufficient capacity
# Note behaviour when disk full / OOM / missing model: must fail closed with recovery path (no corrupt commit).
Optional helper (maintainer):
make perf-envelopes
# or: python3 scripts/release/perf_envelope_recipe.py
Keep notes in .local/perf_envelopes_<date>.md (gitignored). Curated numbers only below.
Metrics checklist¶
Metric |
Status |
Expectation / note |
|---|---|---|
Startup time |
measured-or-tagged |
Target: interactive Home under ~30s cold on supported Docker/native (known limitation if host-bound) |
Import time |
measured-or-tagged |
Small: seconds–low tens; Medium scales ~linear with file count |
Time to first useful result |
measured-or-tagged |
Small path should complete without undocumented steps |
Default-preset runtime |
measured |
Medium Balanced pass 2026-08-07 — 6 transcripts, batch wall ~9.3 min, all succeeded (see manual_acceptance_1_0.md §3.12). Thorough full-preset + local LLM ( |
Memory and disk use |
measured-or-tagged |
Record peak RSS + data-root delta; OOM without recovery = blocker |
Model download sizes |
documented |
See runtime/models.md; first-run download is expected when enabled |
Docker image size |
documented baseline |
Historical ~3.7GB class — docker-efficiency-baseline.md; re-measure on release hardware |
Group-analysis scaling |
measured-or-tagged |
Group wall ≠ sum of members; includes aggregation |
UI responsiveness with large library |
measured |
pass 2026-08-07 — Home/library responsive with 200+ transcripts (exceeds Large-for-1.0 ~50); see manual_acceptance_1_0.md §3.12 |
Behaviour when disk/RAM/model insufficient |
must document |
Fail closed; no corrupt run commit; actionable GUI/docs errors |
Thorough full-preset LLM timings (2026-08-07)¶
Scope: every managed transcript whose speaker map is complete (every diarized ID named or ignored). After a local schema_version "1.0" → 1 patch so the files load under the integer-1 epoch, that set is:
Transcript |
Segments |
Speakers |
Duration |
Status |
|---|---|---|---|---|
|
297 |
10 |
~28 min |
complete |
|
450 |
3 |
~36 min |
complete |
(_deep_test_large_norm remains partial — 1 unidentified speaker — and was excluded. Mini / fixture transcripts are none / incomplete.)
Environment: native host Python 0.9.8.7, Apple Silicon / host Ollama, shared model qwen2.5:7b (~7.6B, Q4_K_M; project-recommended ~6–8B class). Mode=full, modules=None (default full set including LLM consumers + chart_descriptions finalize).
Results¶
Transcript |
Wall |
DAG |
|
Final status |
Notes |
|---|---|---|---|---|---|
Presentation QA (initial) |
71.4 min (4283 s) |
53.3 min |
18.1 min |
partial |
4 LLM modules timed out at 600 s each while Ollama still held |
Presentation QA (LLM retry) |
32 s |
n/a |
n/a |
succeeded |
Retried only |
Supervision meeting |
10.1 min (606 s) |
3.9 min |
6.1 min |
succeeded |
42 modules, 0 errors. Clean run with |
Corpus effective sum |
~42.0 min |
— |
— |
composite |
QA effective (~31.9 min = initial − 2400 s timeout dead time + retry) + supervision 10.1 min |
LLM consumer timings (clean Ollama / qwen2.5:7b)¶
Module |
Presentation QA (retry) |
Supervision |
|---|---|---|
|
6.0 s |
7.0 s |
|
5.7 s |
6.5 s |
|
3.2 s |
2.9 s |
|
5.7 s |
3.0 s |
|
(545 s under contention in initial QA) |
13.6 s |
|
~18 min (197-class chart set; initial QA) |
~6.1 min |
Regression / ops notes¶
Ollama contention is a first-class risk: a resident multi-GB vision model can push LLM modules into the 600 s soft-timeout path and inflate wall clock by ~40 minutes even though non-LLM work is fine. Documented expectation: keep the intended chat model loaded (or unload others) before thorough LLM runs; treat multi-model contention hangs as capacity / ops, not analysis correctness failures when the circuit-breaker soft-fails.
chart_descriptionsdominate thorough walls once LLM chat modules are healthy (often longer than the entire DAG on chart-heavy transcripts).Machine-readable copies:
artifacts/roadmap_1_0_llm_analysis/corpus_timings.json,qa_timings.json, plus run logs /thorough_named_speaker_corpus.md. Private mirror:.local/release_evidence/20260807_thorough_qwen25_7b/. Run dirs:…/260615_Ana_phd_presentation_QA/20260807_171909_15949872(+ retry…/20260807_232957_38197390),…/260615_Ana_phd_supervision_meeting/20260807_233852_38732557.
Final Thorough stress pass (2026-08-08)¶
Scope: same speaker-complete transcript rule as above, plus every group whose members are all speaker-complete. Qualifying set on this host: 2 transcripts + 2 groups (_deep_test_bertopic_group2, Perf smoke Ana multi-speaker — identical Ana member pair).
Environment: native host Python 0.9.8.8 / git 3b206e3, Apple Silicon / host Ollama, shared model qwen2.5:7b only (no vision contention). Preset=thorough (42 suitable modules including BERTopic + LLM consumers + chart_descriptions).
Results¶
Run |
Wall |
Final status |
Notes |
|---|---|---|---|
Presentation QA |
9.8 min (585.5 s) |
succeeded |
42 modules / 0 failures; DAG ~199 s; |
Supervision meeting |
10.9 min (651.9 s) |
succeeded |
42 modules / 0 failures; DAG ~261 s; |
Group |
24.0 min (1442.6 s) |
succeeded |
both members + aggregation + group charts |
Group |
24.0 min (1439.4 s) |
succeeded |
same members; independent group run |
Corpus sum |
68.7 min (4119.4 s) |
passed |
transcripts 20.6 + groups 48.0 |
Clean-Ollama transcript walls are ~4× faster than the contended 2026-08-07 presentation QA probe; group walls are ~2.3× the two-transcript sum (member re-analysis + aggregation + group chart_descriptions).
Artifacts¶
Scratch:
artifacts/roadmap_1_0_llm_analysis/stress_pass_20260808/(SUMMARY.md,batch_summary.json,corpus_timings.json,batch.log)Private mirror:
.local/release_evidence/20260808_thorough_stress_pass/Run dirs:
…/260615_Ana_phd_presentation_QA/20260808_151213_94733139,…/260615_Ana_phd_supervision_meeting/20260808_152158_95318679,…/groups/7b9c6531-…/20260808_135224_e1985784,…/groups/bba6641e-…/20260808_141623_8a279f84
UI Docker Thorough batch — partial / stalled (2026-08-09)¶
Scope: Streamlit Batch Analysis via Docker Compose on the mounted managed library (not the native speaker-complete stress corpus above). Preset = Thorough (41 modules). Live LLM gemma3:4b. Package 0.9.8.9.
Outcome: stalled — incomplete; do not treat as a Thorough envelope pass.
Phase |
Wall |
Status |
Notes |
|---|---|---|---|
10 skip-heavy library-head transcripts |
~2.1 min sum |
succeeded |
Unnamed-speaker gates → mostly SKIP; ~9–16 s each |
First full Thorough transcript ( |
~18 min |
artifacts written; batch did not advance |
41/41 modules, 0 failures; 197/197 |
Batch remainder |
— |
stalled |
No next pipeline start after |
Ops notes: UI Thorough on a mixed library is skip-heavy until named-speaker rows; long chart_descriptions is a batch-resilience risk (logs look finished while the queue hangs). An earlier Balanced UI kick the same evening was aborted as the wrong preset.
Artifacts: artifacts/roadmap_1_0_llm_analysis/ui_thorough_batch_20260809/ (anonymised labels only) · private mirror .local/release_evidence/20260809_ui_docker_thorough_batch/
Recording¶
Record measured values per environment (Docker vs native) in release-evidence notes when claiming envelopes. Soft-cut for 0.9.7 allows recipe + tagged gaps; RC prefers filled Small/Medium rows on release hardware.