Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
393 commits
Select commit Hold shift + click to select a range
df4e2ab
[llm_d] orchestration: config: use a FQDN quay image for curl
kpouget Jul 15, 2026
3fde221
[core] library: config: add a helper method to generate the variables…
kpouget Jul 16, 2026
9142731
[llm_d] orchestration: ci: allow passing the presets to apply before …
kpouget Jul 16, 2026
e044d84
feat: Do not retry
albertoperdomo2 Jul 17, 2026
5152e93
Merge branch 'feat/benchmark-matrix-isolation' of github.com:albertop…
albertoperdomo2 Jul 17, 2026
f9d538c
Merge branch 'main' into feat/benchmark-matrix-isolation
albertoperdomo2 Jul 17, 2026
cbc8a59
Make HF_TOKEN secret name configurable in guidellm benchmark
Harshith-umesh Jul 17, 2026
41ad8ab
Merge pull request #131 from kpouget/llm-d_improve
kpouget Jul 18, 2026
bdba8e9
[kserve] toolbox: deploy_llmisvc: accept a dry-run parameter to only …
kpouget Jul 16, 2026
8e7bfaa
[kserve] toolbox: deploy_llmisvc: update to avoid building a custom d…
kpouget Jul 16, 2026
76de0e3
[llm_d] orchestration: add a kserve dry-run flag
kpouget Jul 16, 2026
9b6ab21
[guidellm] toolbox: run_smoke_request: save to file directly
kpouget Jul 16, 2026
7f1382c
Merge branch 'main' into feat/benchmark-matrix-isolation
albertoperdomo2 Jul 20, 2026
7c237f6
Merge pull request #132 from kpouget/llmd-dry-run
kpouget Jul 20, 2026
3bc2997
Merge branch 'main' into feat/benchmark-matrix-isolation
albertoperdomo2 Jul 20, 2026
8df998c
Merge pull request #129 from albertoperdomo2/feat/benchmark-matrix-is…
openshift-merge-bot[bot] Jul 20, 2026
c02d8e3
feat: add nightly pipeline to forge using clusterless pipeline
ashtarkb Jul 20, 2026
625cf60
fix: use openshift origin-cli image for oc in cronjob
ashtarkb Jul 20, 2026
e16dc56
refactor: collapse nightly pipeline into single task with notifications
ashtarkb Jul 20, 2026
318657b
fix: use correct cluster name for nightly job target
ashtarkb Jul 20, 2026
9370ef2
fix: correct pipeline name to forge-full
ashtarkb Jul 20, 2026
fdc49f1
fix: rename _mesh_ready_spec to propagate across DSL tasks
ashtarkb Jul 20, 2026
b983a1d
Add Slack failure alert when RHAIIS pipeline crashes
Harshith-umesh Jul 20, 2026
3948bd1
Append FJOB suffix to deployment name for parallel job isolation
Harshith-umesh Jul 20, 2026
d4c7600
Switch RHAIIS Slack notifications to topsail bot on psap-rhaiis-alert…
Harshith-umesh Jul 20, 2026
7850ad4
Truncate deployment name to respect KServe 63-char hostname limit
Harshith-umesh Jul 21, 2026
e30e0eb
Fix deployment name truncation to preserve unique FJOB suffix
Harshith-umesh Jul 21, 2026
0119b54
Add AGENTS.md with security guidelines for secret handling
ashtarkb Jul 21, 2026
0eb3bc3
Merge branch 'main' into agents-md
ashtarkb Jul 21, 2026
dca57ba
Apply suggestion from @kpouget
kpouget Jul 21, 2026
b328d55
Apply suggestion from @kpouget
kpouget Jul 21, 2026
1fa202a
Merge pull request #134 from ashtarkb/agents-md
kpouget Jul 21, 2026
cee42b3
Remove slack-webhook-url, use topsail bot exclusively for notifications
Harshith-umesh Jul 21, 2026
57f0848
Refactor: extract analysis, notifications; configurable ISVC labels a…
Harshith-umesh Jul 21, 2026
069859a
Fix config collision: move rhaiis.s3 to config.d/rhaiis.yaml
Harshith-umesh Jul 22, 2026
c3a89ab
refactor: config-driven nightly pipeline with reusable MLflow verifier
ashtarkb Jul 22, 2026
cf1ff57
style: apply ruff formatting
ashtarkb Jul 22, 2026
abfe64a
fix: Increase number of attempts
albertoperdomo2 Jul 22, 2026
5738c61
Merge pull request #137 from albertoperdomo2/fix/fournos-launcher-delay
openshift-merge-bot[bot] Jul 22, 2026
a7cea8a
small fix to run in the smoke cluster
ashtarkb Jul 22, 2026
6196820
[core] dsl: show the function duration in the completion banner
kpouget Jul 15, 2026
71c91ae
[core] library: postprocess: skip in the postprocessing on keyboard i…
kpouget Jul 15, 2026
aaed126
[core] library: ci: better handle early exception
kpouget Jul 16, 2026
69062f6
[core] library: config: more more reliable if 'extends: None'
kpouget Jul 16, 2026
7affb82
[core] dsl: utils: k8s: allow oc to save to file
kpouget Jul 16, 2026
c9d19f4
[core] dsl: utils: k8s: use stdout_dest
kpouget Jul 16, 2026
5caaa6c
[agentic_tools] mcp: toolbox: deploy_mock_servers/main: use stdout_dest
kpouget Jul 16, 2026
5a63729
[guidellm] toolbox: run_guidellm_benchmark: use stdout_dest
kpouget Jul 16, 2026
9cbfac0
[agentic_tools] locust: toolbox: generate_prompts/main: use stdout_dest
kpouget Jul 16, 2026
9790aa0
[kserve] toolbox: prepare_hf_model_cache: use oc stdout_dest
kpouget Jul 16, 2026
101b4b8
[llm_d] toolbox: capture_prepare_state: use stdout_dest
kpouget Jul 16, 2026
d032774
[mcp_gateway] toolbox: use stdout_dest
kpouget Jul 16, 2026
83cdf21
[mcp_gateway] toolbox: install_platform: use stdout_dest
kpouget Jul 16, 2026
885f618
[core] Add the config changelog
kpouget Jul 16, 2026
c78e432
Merge pull request #130 from kpouget/stdout_dest
kpouget Jul 22, 2026
80b3ac2
[llm_d] start working on P/D testing
kpouget Jul 15, 2026
545b173
[llm_d] orchestration: render_inference_service: add support for P/D
kpouget Jul 16, 2026
b6cf2c8
[llm_d] orchestration: work on the P/D deployment
kpouget Jul 17, 2026
fc629cd
[llm_d] tests: add reference profiles
kpouget Jul 17, 2026
4badfcc
[llm_d] orchestration: keep working on P/D
kpouget Jul 20, 2026
7527409
[llm_d] orchestration: manifests: scheduler_config: unify
kpouget Jul 20, 2026
c76f038
[core] library: env: create link from /tmp/forge_last to the current …
kpouget Jul 21, 2026
a4cbb64
[core] library: env: use '%Y%m%d-%H%M-%S' if '%Y%m%d-%H%M' already ex…
kpouget Jul 21, 2026
50dd143
[llm_d] work on P/D
kpouget Jul 21, 2026
0c0f6a2
[llm_d] CHANGELOG-orchestration: add a changelog
kpouget Jul 21, 2026
a6099df
[core] library: postprocess: return the status dict if postprocessing…
kpouget Jul 21, 2026
103e33c
[llm_d] orchestration: use the config file to define the labels
kpouget Jul 21, 2026
bdf4935
[llm_d] finish removing the managed namespace
kpouget Jul 21, 2026
20f1854
[kserve] toolbox: prepare_hf_model_cache: remove the useless namespac…
kpouget Jul 21, 2026
e133a3a
[llm_d] relocatethe runtime.kserve.dry_run flag
kpouget Jul 21, 2026
d52fc25
Fix result extraction truncation and PVC cleanup for parallel jobs
Harshith-umesh Jul 22, 2026
fdf73c3
Refactor dashboard CSV to use Caliper postprocessing pipeline
Harshith-umesh Jul 22, 2026
4d6e58d
Populate all dashboard CSV fields from Caliper KPIs
Harshith-umesh Jul 22, 2026
d15938f
Handle large benchmark files: compress before oc cp
Harshith-umesh Jul 22, 2026
2b55199
Fix KPI validation: add required run_id field
Harshith-umesh Jul 22, 2026
af3b991
Fix dashboard CSV: use GPU chip name for accelerator, include run_uuid
Harshith-umesh Jul 22, 2026
c77bd80
fix: sort extra curves by request_rate and convert latency units to ms
Harshith-umesh Jul 22, 2026
05cf21b
[llm_d] orchestration: config: platform: remove trailing "
kpouget Jul 23, 2026
f3f956c
[llm_d] orchestration: render_inference_service: vllm_default_args ar…
kpouget Jul 23, 2026
6dfbb35
Merge pull request #126 from kpouget/llmd
openshift-merge-bot[bot] Jul 23, 2026
3c629b8
[projects] Fix ruff in MD files
kpouget Jul 24, 2026
635e05e
ruff: pin the version to 0.16.0
kpouget Jul 24, 2026
0506991
Merge pull request #141 from kpouget/ruff
kpouget Jul 24, 2026
ece24b9
cluster: add capture_prometheus toolbox for extracting time-bounded m…
ashtarkb Jul 26, 2026
6502de3
addres few code rabbit issues
ashtarkb Jul 26, 2026
343b78c
address kevin's comments, as well as a small fix to the core cli entr…
ashtarkb Jul 27, 2026
d5355c5
refactor: move oc_exec/oc_cp_from_pod to shared k8s utils library
ashtarkb Jul 27, 2026
d3b67d9
Merge pull request #142 from ashtarkb/capture-prometheus-toolbox
openshift-merge-bot[bot] Jul 27, 2026
5ac1d5c
Update secret handling guidelines in AGENTS.md
kpouget Jul 27, 2026
f4e51eb
Merge branch 'main' into port/model-furnace-features
Harshith-umesh Jul 27, 2026
0ff3aa8
Merge remote-tracking branch 'upstream/main' into nightly-pipeline
ashtarkb Jul 27, 2026
2b61dce
fix: resolve all ruff lint errors
Harshith-umesh Jul 27, 2026
fd84c53
style: apply ruff formatting to all changed files
Harshith-umesh Jul 27, 2026
61fdcd1
refactor: move CSV regression analysis from caliper engine to rhaiis …
Harshith-umesh Jul 27, 2026
5668caf
fix: separate test nodes per workload for correct dashboard CSV per-p…
Harshith-umesh Jul 27, 2026
a34777c
Merge pull request #144 from openshift-psap/kpouget-patch-1
kpouget Jul 27, 2026
d57c523
[core] dsl: task: log the end time
kpouget Jul 21, 2026
407ca50
[core] dsl: runtime: reduce the log level
kpouget Jul 22, 2026
b3f7964
[core] library: export: improve the test status
kpouget Jul 22, 2026
7635cda
[core] library: config: write_variables_override: accept comma separa…
kpouget Jul 23, 2026
0c9ce60
[core] library: env: add a MuteStdOut context
kpouget Jul 22, 2026
ba1b681
Merge pull request #140 from kpouget/core
kpouget Jul 28, 2026
8aa9b77
fix: address PR review comments (coderabbit + colleague)
Harshith-umesh Jul 28, 2026
3f2ecca
Merge branch 'main' into port/model-furnace-features
Harshith-umesh Jul 28, 2026
0dced36
Merge remote-tracking branch 'upstream/main' into nightly-pipeline
ashtarkb Jul 29, 2026
44902bf
Address PR review: stricter error handling in mlflow verifier, fix du…
ashtarkb Jul 29, 2026
c4bc7af
fix: sort imports in mlflow_verifier to satisfy ruff I001
ashtarkb Jul 29, 2026
024bd90
style: apply ruff formatting to mlflow_verifier
ashtarkb Jul 29, 2026
ce6a8f8
Merge pull request #128 from Harshith-umesh/port/model-furnace-features
openshift-merge-bot[bot] Jul 29, 2026
08bf719
[caliper] orchestration: postprocess: re-enable the hierarchical KPI …
kpouget Jul 29, 2026
68c3880
Merge pull request #146 from kpouget/kpi
kpouget Jul 29, 2026
b61e356
feat: add SGLang and TRT-LLM engine support
Harshith-umesh Jul 29, 2026
cf28237
fix: remove runAsUser:0 from vLLM/SGLang ServingRuntime
Harshith-umesh Jul 29, 2026
ea8f555
fix: add USER env var back for vLLM/SGLang ServingRuntime
Harshith-umesh Jul 29, 2026
fa0dab0
refactor: replace image_pull_secret string with image_pull_secrets list
Harshith-umesh Jul 29, 2026
6c1c397
refactor: move manifest building to orchestration layer
Harshith-umesh Jul 29, 2026
70a55ea
fix: write hierarchical KPIs to separate file to preserve JSONL
Harshith-umesh Jul 29, 2026
0f061ab
add default trtllm_config structure to base config
Harshith-umesh Jul 30, 2026
b69e3eb
Add artifact export and MLflow config to nightly pipeline
ashtarkb Jul 30, 2026
1f64f22
Decouple verifier experiment from export experiment
ashtarkb Jul 30, 2026
f088034
Handle verifier bootstrap: treat failures as no previous version
ashtarkb Jul 30, 2026
42ad31a
[kserve] toolbox: deploy_llmisvc: correctly resolve the kserve address
kpouget Jul 21, 2026
74f94fd
[kserve] toolbox: deploy_llmisvc: improve wait_old_pods_gone
kpouget Jul 21, 2026
ce0d075
[kserve] toolbox: prepare_hf_model_cache: wait for the pod to start r…
kpouget Jul 22, 2026
ca2bcec
[kserve] toolbox: capture_llmisvc_state: capture more information
kpouget Jul 22, 2026
049bdcc
[kserve] toolbox: deploy_llmisvc: capture more information
kpouget Jul 22, 2026
35efb51
[kserve] toolbox: prepare_hf_model_cache: wait 1h for the download co…
kpouget Jul 22, 2026
d8f7538
[kserve] toolbox: deploy_llmisvc: add flag to wait_pods_scheduled
kpouget Jul 22, 2026
b957741
[kserve] toolbox: deploy_llmisvc: capture_final_llmisvc_yaml: better …
kpouget Jul 23, 2026
e9c25dd
[kserve] toolbox: deploy_llmisvc: abort on Pod restart
kpouget Jul 23, 2026
3d80550
[kserve] toolbox: deploy_llmisvc: improve the URL resolution
kpouget Jul 23, 2026
02247d6
[kserve] toolbox: deploy_llmisvc: also wait on SchedulingGated
kpouget Jul 23, 2026
ef3abf5
[kserve] toolbox: deploy_llmisvc: expose the try_resolve_endpoint_url…
kpouget Jul 23, 2026
8ef80c1
[kserve] toolbox: deploy_llmisvc: save the deploy/rs/pod description
kpouget Jul 23, 2026
96b00a0
[guidellm] toolbox: run_smoke_request: save the pod info in a file
kpouget Jul 22, 2026
68b26a8
[guidellm] toolbox: run_smoke_request: don't wait for the pod deletion
kpouget Jul 23, 2026
bcde3d0
[guidellm] toolbox: run_guidellm_benchmark: give more time
kpouget Jul 23, 2026
b4e8c2c
[guidellm] toolbox: run_guidellm_benchmark: set the owner of the PVC
kpouget Jul 23, 2026
c5547eb
[caliper] engine: parameter_matrix: don't truncate long parameters
kpouget Jul 27, 2026
b7f46d8
[llm_d] tests: test_deployment_profiles: add a 60s timeout
kpouget Jul 27, 2026
e7ff52b
Merge pull request #138 from kpouget/helpers
openshift-merge-bot[bot] Jul 30, 2026
b4577af
[caliper] postprocess: helpers: visualization_utils: update the size/…
kpouget Jul 27, 2026
5ebeae8
[caliper] cli: commands: don't swallow the stack trace
kpouget Jul 27, 2026
b80af82
[caliper] engine: parse: show the parsing duration
kpouget Jul 27, 2026
ae6b755
[caliper] orchestration: postprocess: show the stack trace
kpouget Jul 27, 2026
ec6b56d
[caliper] improve the --include-filter behavior
kpouget Jul 30, 2026
9283f38
Revert "[caliper] remove unnecessary reference to the hierachical for…
kpouget Jul 29, 2026
9901b0b
[caliper] engine: traverse: include hierarchical label parsing
kpouget Jul 30, 2026
802a178
fix: add init container to fix PVC permissions for GuideLLM
Harshith-umesh Jul 30, 2026
27be386
fix: make fsGroup opt-in for GuideLLM job pods
Harshith-umesh Jul 30, 2026
a5de6ca
chore: add missing trtllm_config defaults for Nemotron-H
Harshith-umesh Jul 30, 2026
f221ef1
fix: include trtllm_config in dashboard runtime_args
Harshith-umesh Jul 30, 2026
c4d582e
chore: use recommended sglang serve entrypoint
Harshith-umesh Jul 30, 2026
f88e6a7
docs: update README with multi-engine support
Harshith-umesh Jul 31, 2026
5812b6c
Merge pull request #150 from kpouget/caliper
kpouget Jul 31, 2026
618599e
[cluster] toolbox: create_sa_kubeconfig: new toolbox script
kpouget Jul 22, 2026
39fe524
[core] dsl: utils: k8s: add the handled secretly arg to flag the call…
kpouget Jul 29, 2026
c5ce243
AGENTS.md: adjust the secret-handling guidelines
kpouget Jul 30, 2026
cec558c
[core] dsl: shell: add support for input and timeout
kpouget Jul 30, 2026
342ca3e
Merge pull request #139 from kpouget/cluster
kpouget Jul 31, 2026
89f906a
fix: address PR review comments
Harshith-umesh Jul 31, 2026
f6de064
Merge branch 'main' into sglang-trtllm
Harshith-umesh Jul 31, 2026
f5274f7
fix: use format.py from PR #136 for csv-export v2 support
Harshith-umesh Jul 31, 2026
e10f721
fix: preserve per-KPI labels (rate_index) in hierarchical JSON
Harshith-umesh Jul 31, 2026
b95b5c2
fix: restore run_path when flattening hierarchical KPIs
Harshith-umesh Jul 31, 2026
e8921fb
Merge pull request #149 from Harshith-umesh/sglang-trtllm
kpouget Jul 31, 2026
445a560
[kserve] toolbox: capture_llmisvc_state: capture more information
kpouget Jul 22, 2026
3938c15
[kserve] toolbox: deploy_llmisvc: raise an exception if name isn't k8…
kpouget Jul 22, 2026
88ff61b
[kserve] toolbox: deploy_llmisvc: wait_pods_scheduled: ensure the LLM…
kpouget Jul 24, 2026
0711987
[guidellm] toolbox: run_guidellm_benchmark: give more time
kpouget Jul 23, 2026
2de3103
[guidellm] toolbox: run_guidellm_benchmark: compress and trim the ben…
kpouget Jul 27, 2026
244d836
[guidellm] postprocess: guidellm: improve the plotting
kpouget Jul 27, 2026
cd1f5e7
[rhoai] library: deploy: improve the error message
kpouget Jul 27, 2026
5edff8c
[rhoai] toolbox: wait_datasciencecluster_ready: better detect deploym…
kpouget Jul 27, 2026
875babc
[cluster] toolbox: deploy_custom_catalog: wait for the Pod to start r…
kpouget Jul 27, 2026
f5457e7
[llm_d] orchestration: render_inference_service: make the deployment …
kpouget Jul 30, 2026
37a5125
[llm_d] tests: reference_deployments: normalize the guidellm names
kpouget Jul 30, 2026
d75dbfe
[core] dsl: utils: k8s: add the text flag for the oc command
kpouget Jul 27, 2026
f9a05ed
[core] dsl: shell: add text field for the run command
kpouget Jul 27, 2026
fdb42e0
[llm_d] orchestration: config: disable kpis_to_csv and analyze
kpouget Jul 31, 2026
cd8c7c8
Merge pull request #151 from kpouget/inference
kpouget Jul 31, 2026
8bed774
Merge branch 'main' into nightly-pipeline
ashtarkb Aug 3, 2026
d35c899
Merge pull request #133 from ashtarkb/nightly-pipeline
openshift-merge-bot[bot] Aug 3, 2026
492ac33
[fournos_launcher] toolbox: submit_and_wait: Avi's early return
kpouget Jul 21, 2026
7b7f550
docs: caliper: test-labels-format: new doc
kpouget Jul 27, 2026
6ceec50
[llm_d] work on P/D
kpouget Jul 21, 2026
2f2aa7e
[llm_d] orchestration: add the ability to skip the test finalizers
kpouget Jul 21, 2026
4ac8f62
[llm_d] orchestration: presets: cks: new preset file
kpouget Jul 21, 2026
0af9e35
[llm_d] orchestration: allow skipping the kserver readiness wait
kpouget Jul 21, 2026
5f77485
[llm_d] improve the kueue handling
kpouget Jul 21, 2026
4c6237b
[llm_d] orchestration: correctly cleanup the llmisvc
kpouget Jul 21, 2026
5a631ea
[llm_d] toolbox: cleanup_test_resources: delete_inference_service: mo…
kpouget Jul 21, 2026
03e3f43
[llm_d] orchestration: preflight_phase: make more flexible and easier…
kpouget Jul 22, 2026
6f8ec99
[llm_d] orchestration: prepare_phase: make the storage_class_name fie…
kpouget Jul 22, 2026
679f735
[llm_d] orchestration: presets: janus: new preset file
kpouget Jul 22, 2026
f134f63
[llm_d] orchestration: test_phase: use MuteStdOut to mute the finalizers
kpouget Jul 22, 2026
0aea34d
[llm_d] orchestration: test_phase: add flag to wait for pod scheduling
kpouget Jul 22, 2026
6cc6112
[llm_d] orchestration: config: runtime: allow waiting for a long time…
kpouget Jul 22, 2026
61bbe24
[llm_d] orchestration: render_inference_service: slugginfy the llmisv…
kpouget Jul 22, 2026
0cd797d
[llm_d] orchestration: make the scheduler node selector configurable
kpouget Jul 22, 2026
ec20b6a
[llm_d] orchestration: cli: new 'deploy_and_test' entrypoint
kpouget Jul 23, 2026
798b762
[llm_d] orchestration: improve the P/D config and rendering
kpouget Jul 23, 2026
4bbdbfa
[llm_d] orchestration: runtime_config: remove legacy check
kpouget Jul 23, 2026
b6c0e53
[llm_d] orchestration: runtime_config: mute some config.project.get_c…
kpouget Jul 23, 2026
fe33de4
[llm_d] orchestration: runtime_config: use the deployment in the test…
kpouget Jul 23, 2026
5086615
[llm_d] orchestration: test_phase: don't put the test in the llmd_tes…
kpouget Jul 23, 2026
e361302
[llm_d] orchestration: test_phase: capture the llmisvc state with the…
kpouget Jul 23, 2026
e199f0b
[llm_d] orchestration: include VLLM args in the workload configuration
kpouget Jul 23, 2026
a04fb69
[llm_d] orchestration: presets: new preset for llama3-70b
kpouget Jul 23, 2026
0655e23
[llm_d] tests: test_deployment_profiles: disable the post-processing
kpouget Jul 23, 2026
381ee4e
[llm_d] orchestration: add a config flag to reuse the existing llmisvc
kpouget Jul 23, 2026
c6a27ea
[llm_d] orchestration: test_phase: delete the llmisvc & workloads on …
kpouget Jul 23, 2026
89ff380
[llm_d] tests: reference_deployments: update
kpouget Jul 23, 2026
e290388
[llm_d] orchestration: test_phase: cleanup with the right llmisvc name
kpouget Jul 23, 2026
03c63d6
[llm_d] orchestration: test_phase: use the status_address_name only w…
kpouget Jul 23, 2026
a7e47b7
[llm_d] orchestration: test_phase: correctly extract the llmisvc name
kpouget Jul 23, 2026
23ec952
[llm_d] orchestration: config: enable the KPI export
kpouget Jul 27, 2026
66dbd08
[llm_d] orchestration: test_phase: expose the test completion status …
kpouget Jul 27, 2026
e973bdb
[llm_d] orchestration: disable Kueue when necessary
kpouget Jul 27, 2026
c25eed5
[llm_d] orchestration: save the config and fjob
kpouget Jul 27, 2026
20c57bb
[llm_d] orchestration: render_inference_service: correctly set the TP…
kpouget Jul 27, 2026
1d0b97d
[llm_d] orchestration: ci: make the RHOAI vaults mandatory if the cus…
kpouget Jul 27, 2026
66eb60d
[llm_d] orchestration: presets: rhoai-rc: new preset for RHOAI RC
kpouget Jul 27, 2026
e935a3b
[llm_d] tests: reference_deployments: correctly set the TP
kpouget Jul 27, 2026
865e50f
[llm_d] orchestration: presets: cpt: more presets
kpouget Jul 27, 2026
b35cc93
[llm_d] orchestration: render_inference_service: add anti-affinity fo…
kpouget Jul 28, 2026
25c7083
[llm_d] tests: reference_deployments: add the anti-affinity fields
kpouget Jul 28, 2026
d70c86d
Revert Revert '[caliper] remove unnecessary reference to the hierachi…
kpouget Jul 31, 2026
bee915b
feat(caliper): implement KPI regression analysis POC
Harshith-umesh Jul 31, 2026
d39659f
[caliper] orchestration: postprocess: improve the step status reporting
kpouget Jul 31, 2026
2f6be00
[caliper] orchestration: postprocess: better configure the analyze se…
kpouget Jul 31, 2026
21fab2d
[caliper] orchestration: postprocess: re-enable the hierarchical KPI …
kpouget Jul 29, 2026
975112c
[caliper] orchestration: postprocess: move logging code to postproces…
kpouget Jul 29, 2026
b067985
[caliper] orchestration: postprocess: move code to caliper_invocation
kpouget Jul 29, 2026
0a43c5d
[llm_d] orchestration: test_phase: save extra KPI labels
kpouget Jul 31, 2026
a2c5a86
[core] library: postprocess: allow saving kpi_labels in the test_labe…
kpouget Jul 31, 2026
6201c53
[guidellm] postprocess: guidellm: generate the KPI labels
kpouget Jul 31, 2026
1cafc9e
[llm_d] orchestration: config: xks CPT labels
kpouget Jul 31, 2026
60b9c09
[caliper] KPI analyze
kpouget Jul 31, 2026
86b6523
[caliper] tests: test_kpi_analyze: update to use the test status dict
kpouget Jul 31, 2026
376e78c
[skeleton] orchestration: config: fix the analyze config
kpouget Jul 31, 2026
823ca89
[caliper] orchestration: cli_builder: make the command easy to copy-a…
kpouget Aug 1, 2026
de3a282
[kserve] toolbox: capture_llmisvc_state: capture the nodes details
kpouget Aug 1, 2026
a9b0484
[caliper] orchestration: notification: include the post-processing me…
kpouget Aug 3, 2026
dd3a6e3
[caliper] orchestration: postprocess: include a message in the post-p…
kpouget Aug 3, 2026
2769596
fournos: gitops: base/workflows/pipeline-replot: use 0x instead of 00x
kpouget Aug 3, 2026
9cc931b
[caliper] cli: commands: fail early if no data is parsed
kpouget Aug 3, 2026
d4c1e14
[caliper] orchestration: replot: raise the warning level for visibility
kpouget Aug 3, 2026
5e46e88
Merge pull request #136 from kpouget/llmd-testing
kpouget Aug 3, 2026
c66dfd6
[caliper] kpi: generic kpis.json to metrics.json conversion for MLflow
ashtarkb Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read -r f; [[ \"$f\" == *.py ]] && { ruff format . || echo \"Warning: ruff format failed for $f\"; }; } || echo \"Warning: file path processing failed\"",
"statusMessage": "Formatting Python code with ruff..."
},
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read -r f; [[ \"$f\" == *.py ]] && { ruff check --fix . || echo \"Warning: ruff check --fix failed for $f\"; }; } || echo \"Warning: file path processing failed\"",
"statusMessage": "Fixing Python linting issues with ruff..."
}
]
},
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read -r f; [[ \"$f\" == *.py ]] && { ruff format . || echo \"Warning: ruff format failed for $f\"; }; } || echo \"Warning: file path processing failed\"",
"statusMessage": "Formatting Python code with ruff..."
},
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read -r f; [[ \"$f\" == *.py ]] && { ruff check --fix . || echo \"Warning: ruff check --fix failed for $f\"; }; } || echo \"Warning: file path processing failed\"",
"statusMessage": "Fixing Python linting issues with ruff..."
}
]
}
]
}
}
1 change: 1 addition & 0 deletions .github/steps/prepare_minimal_ubuntu_image/action.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: "Prepare FORGE minimal ubuntu image"
description: "Install minimal Python dependencies required for FORGE repository operations"

runs:
using: "composite" # <-- this is the important part
Expand Down
22 changes: 21 additions & 1 deletion .github/workflows/check_consistency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,31 @@ jobs:
PYTHONPATH: ${{ github.workspace }}

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false

- uses: ./.github/steps/prepare_minimal_ubuntu_image

- name: Check that no symlink is broken
run: bin/run_ansible_toolbox.py repo validate_no_broken_link

- name: Check that all source files end with EOL
run: |
# Find all source files and check they end with newline
files_without_eol=()

while IFS= read -r -d '' file; do
if [[ -s "$file" ]] && [[ -n "$(tail -c1 "$file")" ]]; then
files_without_eol+=("$file")
fi
done < <(find . -path './.git' -prune -o \( -name "*.py" -o -name "*.yml" -o -name "*.yaml" -o -name "*.json" -o -name "*.md" \) -type f -print0)

if [[ ${#files_without_eol[@]} -gt 0 ]]; then
echo "❌ Files missing final newline:"
printf '%s\n' "${files_without_eol[@]}"
echo "Fix with: echo >> filename"
exit 1
fi
echo "✅ All source files end with newline"
3 changes: 2 additions & 1 deletion .github/workflows/check_python_syntax.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ jobs:
max-parallel: 4
steps:
- name: Use checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false

- name: Check that all the files can be compiled
run: |
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/image-push.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ jobs:
image-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
persist-credentials: false

- name: Remove GitHub credentials from git config
run: |
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/ruff.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ jobs:

steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
persist-credentials: false

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/test_toolbox_dsl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ jobs:
PYTHONPATH: ${{ github.workspace }}

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
persist-credentials: false

- uses: actions/setup-python@v5
with:
Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.8
rev: v0.16.0
hooks:
- id: ruff
args: [--fix]
Expand Down
89 changes: 89 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# FORGE CI Framework — Agent Instructions

## Project Overview

FORGE is a CI/CD testing framework that orchestrates Kubernetes workloads on OpenShift clusters.
It uses a Python DSL to define tasks, apply manifests, and collect artifacts for debugging.

Key paths:
- `projects/` — individual project test harnesses
- `projects/NAME/orchestration` — upper layer of the test harness (config, prepare, test, cleanup)
- `projects/NAME/toolbox` — lower layer of the test harness (toolbox of scripts altering the state of the cluster, using the DSL language)
- `projects/NAME/test` — unit testing of the test harness
- `projects/core/dsl/` — shared DSL (task execution, k8s utilities, shell helpers)
- `fournos/gitops/` — Tekton pipelines and GitOps base workflows
- `docs/` — project documentation

## Security: Secret Handling (CRITICAL)

**NEVER write secrets or sensitive data to artifact directories, logs, or files.**

### Rules

1. **Never persist secrets to `ARTIFACT_DIR`.**
The `oc_apply(path, manifest)` helper writes the manifest YAML to disk before applying it.
If the manifest contains sensitive data (passwords, tokens, pull-secrets, certificates, API keys),
it MUST NOT be written to any path under `env.ARTIFACT_DIR`.

2. **Use `oc("apply", "-f", "-", input_text=..., handled_secretly=True)` for secrets.**
Apply secrets via stdin or a dedicated helper that does not persist the payload.
Never use the standard `oc_apply()` for Secret-kind manifests.

3. **Never log secret values.**
Do not print, log, or include in error messages: passwords, tokens, bearer credentials,
TLS keys, pull-secret `.dockerconfigjson`, or any `data:`/`stringData:` field from a Secret.

4. **Check the `kind:` field.**
Before calling `oc_apply(artifact_path, manifest)`, verify that `manifest.get("kind") != "Secret"`.
If it is a Secret, use a non-persisting apply path.

5. **Artifact directories are public.**
Treat everything under `ARTIFACT_DIR` as if it will be published on the internet.
Only write non-sensitive operational data (CRs, logs, pod descriptions, events).
Pod/Deployment and other resources are safe to store, as they must not contain secrets. See point 9.
Kubernetes Secret objects should never be stored in the artifacts. Kubernetes Secret descriptions can be safely stored.

7. **Use the vault module.**
Use the project `projects.core.library.vault` module to access the secrets, stored in files. Consider all the content of these files as secret.

8. **Never pass secrets via environment variables**
For transparency and post-mortem troubleshooting, the environment variables are saved to disk at multiple locations. Do not use environment variables to pass a secret between two components. There might be few exceptions to this rule (MLFlow, AWS), but they must be handled with care.

9. **Never pass secrets via Pod environment variables**
The Pod definition will be stored in public artifacts. Do no use plain text Pod environment variables to pass secrets to the Pod. Instead, use Secret resources and Pod environment variables that reference this secret.

### Safe Patterns

```python
# GOOD: Apply a Secret without persisting to disk
def apply_secret(manifest: dict) -> None:
"""Apply a Secret manifest via stdin — nothing written to disk."""
import yaml
from projects.core.dsl.utils.k8s import oc

oc("apply", "-f", "-", input_text=yaml.safe_dump(manifest, sort_keys=False))


# GOOD: Guard before using oc_apply
def safe_oc_apply(artifact_path, manifest):
if manifest.get("kind") == "Secret":
raise ValueError(
f"Refusing to write Secret '{manifest['metadata']['name']}' to artifacts. "
"Use apply_secret() instead."
)
oc_apply(artifact_path, manifest)
```

### Forbidden Patterns

```python
# BAD: Writing a pull-secret to artifacts
src_dir = env.ARTIFACT_DIR / "src"
oc_apply(src_dir / "image-pull-secret.yaml", secret_manifest) # LEAKS CREDENTIALS

# BAD: Logging secret content
logger.info(f"Applying secret: {manifest}") # LEAKS if manifest has sensitive data

# BAD: Including tokens in error messages
raise RuntimeError(f"Failed to auth with token {token}") # LEAKS TOKEN
```
2 changes: 2 additions & 0 deletions OWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ approvers:
- sjmonson
- ashtarkb
- MML-coder
- Harshith-umesh
reviewers:
- ashishkamra
- albertoperdomo2
- tosokin
- sjmonson
- ashtarkb
- MML-coder
- Harshith-umesh
130 changes: 130 additions & 0 deletions docs/caliper/test-labels-format.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Test Labels Format (`__test_labels__.yaml`)

## Purpose

The `__test_labels__.yaml` file marks directories as Caliper test bases and provides metadata for test identification, grouping, and status tracking.

## File Format

```yaml
version: "1"
labels:
# Test distinguishing characteristics
key1: value1
key2: value2
kpi_labels:
# System/environment context for KPI labeling
platform: "CKS"
gpu_type: "H100"
test_harness: "guidellm"
completion:
# Test execution status (added at completion)
success: true|false
message: "Status description"
```

### Required Fields
- **`version`**: Schema version (currently `"1"`)
- **`labels`**: Key-value pairs describing test characteristics

### Optional Fields
- **`kpi_labels`**: System/environment context labels for KPI records
- **`platform`**: Platform name (e.g., `"CKS"`, `"RHOAI"`)
- **`gpu_type`**: GPU type (e.g., `"H100"`, `"A100"`)
- **`test_harness`**: Test framework (e.g., `"guidellm"`, `"vllm"`)
- **`completion`**: Test execution status
- **`success`**: `true` if succeeded, `false` if failed
- **`message`**: Human-readable status description

## Labels vs KPI Labels

### Labels (Test Configuration)
- **Purpose**: Distinguish different test configurations and variations
- **Usage**: Used for test filtering, grouping, and analysis
- **Examples**: `model_name`, `deployment_profile`, `guidellm_loadshape`
- **Scope**: Specific to the test configuration

### KPI Labels (System Context)
- **Purpose**: Provide system/environment context for KPI records
- **Usage**: Applied to all KPI metrics from the test, enables cross-environment analysis
- **Examples**: `platform`, `gpu_type`, `test_harness`
- **Scope**: Describes the execution environment

## Common Labels

- **`model_name`**: AI/ML model name (e.g., `"llama-3.1-8b"`)
- **`deployment_profile`**: Deployment variant (e.g., `"simple-tp2-x4"`)
- **`guidellm_loadshape`**: Benchmark load pattern (e.g., `"heavy-heterogeneous"`)
- **`benchmark_type`**: Benchmark type (e.g., `"throughput"`, `"latency"`)

## Common KPI Labels

- **`platform`**: Target platform (e.g., `"CKS"`, `"RHOAI"`)
- **`gpu_type`**: GPU hardware type (e.g., `"H100"`, `"A100"`)
- **`test_harness`**: Testing framework (e.g., `"guidellm"`, `"vllm"`)

## Examples

### Basic Test
```yaml
version: "1"
labels:
model_name: "llama-3.1-8b"
deployment_profile: "simple"
guidellm_loadshape: "default"
kpi_labels:
platform: "CKS"
gpu_type: "H100"
test_harness: "guidellm"
```

### Completed Test
```yaml
version: "1"
labels:
model_name: "llama-3.1-8b"
deployment_profile: "simple-tp2-x4"
guidellm_loadshape: "heavy-heterogeneous"
kpi_labels:
platform: "CKS"
gpu_type: "H100"
test_harness: "guidellm"
completion:
success: true
message: "Test completed successfully"
```

### Failed Test
```yaml
version: "1"
labels:
model_name: "gpt-4o"
deployment_profile: "distributed"
kpi_labels:
platform: "RHOAI"
gpu_type: "A100"
test_harness: "vllm"
completion:
success: false
message: "Connection timeout to inference service"
```

## Usage

- **Test Discovery**: Caliper scans for `__test_labels__.yaml` files to find test results
- **Test Analysis**: Labels enable filtering and comparative analysis of test configurations
- **KPI Labeling**: KPI labels are automatically applied to all generated KPI metrics
- **Cross-Environment Analysis**: KPI labels enable performance comparisons across different platforms/hardware
- **Report Generation**: Both labels and KPI labels provide context for charts and report organization
- **Status Tracking**: Completion field tracks test execution outcome

## Best Practices

- **Labels**: Use for test-specific configuration and distinguishing characteristics
- **KPI Labels**: Use for system/environment context that applies to all KPIs
- Generate both label sets early, add completion status at test end
- Use consistent, descriptive keys across related tests
- Use lowercase with underscores (e.g., `model_name`, `gpu_type`)
- Keep label schemas stable within projects
- Populate KPI labels from configuration to ensure consistency (e.g., from `cpt.kpi.labels.*`)
- Missing KPI labels should be handled gracefully with fallback values
Loading
Loading