Problem
tests/verify-components-charts.py fetches 21 registry tag lists and pulls and renders 42 charts strictly sequentially on every PR (test-ingress-modes): ~30 s in CI, ~50 s locally. The components are independent (only the read-only kagent range floor is shared). Measured on #450's head: tag fetches 13.8 s sequential vs 2.1 s with 8 workers; pulls + renders ~37 s vs ~5 s.
Proposed solution
Run the per-component loop body on a concurrent.futures.ThreadPoolExecutor(8) (stdlib; the work is I/O-bound in urllib and subprocess), have workers raise instead of sys.exit, collect and print each component's lines in roster order after completion so the output stays readable.
Acceptance criteria
Problem
tests/verify-components-charts.pyfetches 21 registry tag lists and pulls and renders 42 charts strictly sequentially on every PR (test-ingress-modes): ~30 s in CI, ~50 s locally. The components are independent (only the read-only kagent range floor is shared). Measured on #450's head: tag fetches 13.8 s sequential vs 2.1 s with 8 workers; pulls + renders ~37 s vs ~5 s.Proposed solution
Run the per-component loop body on a
concurrent.futures.ThreadPoolExecutor(8)(stdlib; the work is I/O-bound inurllibandsubprocess), have workers raise instead ofsys.exit, collect and print each component's lines in roster order after completion so the output stays readable.Acceptance criteria
tests/verify-kagent-tools-namespace.pyandtests/verify-kyverno.py, which import the module, are unaffected.