Skip to content

[llm_d] Work on P/D CPT#126

Open
kpouget wants to merge 19 commits into
openshift-psap:mainfrom
kpouget:llmd
Open

[llm_d] Work on P/D CPT#126
kpouget wants to merge 19 commits into
openshift-psap:mainfrom
kpouget:llmd

Conversation

@kpouget

@kpouget kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Added Prefill/Decode (P/D) deployment profiles, a dedicated scheduler manifest, and presets with matrix expansion across models and benchmarks.
    • Added repeatable preset selection and preset-based configuration overrides; P/D-aware manifest rendering and benchmark-isolated runs.
    • Improved smoke/deploy debugging capture and dry-run mode that generates manifests without running tests or cleanup.
  • Bug Fixes
    • Improved CI error summary robustness and consolidated post-processing behavior during interrupts.
    • Enhanced Kubernetes artifact capture by writing command output directly to destinations and adding better fallback error logging.
  • Documentation
    • Added P/D testing and benchmark isolation documentation.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@kpouget, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 29 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dc1f4710-9984-47a8-abe9-297d76f622aa

📥 Commits

Reviewing files that changed from the base of the PR and between 4c2b148 and 9b6c0f2.

📒 Files selected for processing (27)
  • projects/core/library/ci.py
  • projects/core/library/config.py
  • projects/core/library/postprocess.py
  • projects/guidellm/toolbox/run_smoke_request/main.py
  • projects/kserve/toolbox/deploy_llmisvc/main.py
  • projects/llm_d/CHANGELOG-orchestration.md
  • projects/llm_d/PD_TESTING.md
  • projects/llm_d/docs/benchmark-isolation.md
  • projects/llm_d/orchestration/ci.py
  • projects/llm_d/orchestration/cleanup_phase.py
  • projects/llm_d/orchestration/config.d/deployments.yaml
  • projects/llm_d/orchestration/config.d/platform.yaml
  • projects/llm_d/orchestration/config.d/runtime.yaml
  • projects/llm_d/orchestration/config.d/workloads.yaml
  • projects/llm_d/orchestration/config.yaml
  • projects/llm_d/orchestration/manifests/deployments/pd-scheduler.yaml
  • projects/llm_d/orchestration/presets.d/presets.yaml
  • projects/llm_d/orchestration/render_inference_service.py
  • projects/llm_d/orchestration/runtime_config.py
  • projects/llm_d/orchestration/test_phase.py
  • projects/llm_d/tests/reference_deployments/deployment-intelligentrouting-tp4-x4/llmisvc.yaml
  • projects/llm_d/tests/reference_deployments/deployment-pd-x2-ptp4-px1-dtp4/llmisvc.yaml
  • projects/llm_d/tests/reference_deployments/deployment-simple-tp4-x4/llmisvc.yaml
  • projects/llm_d/tests/test_deployment_profiles.py
  • projects/llm_d/tests/test_pd_integration.py
  • projects/llm_d/tests/test_profiles.py
  • projects/rhoai/library/deploy.py
📝 Walkthrough

Walkthrough

The PR adds direct stdout artifact capture, completion timing, interrupt-aware postprocessing, smoke diagnostics, KServe dry-run deployment, and llm-d benchmark/P/D orchestration with new presets, manifests, tests, and documentation.

Changes

Core runtime behavior

Layer / File(s) Summary
Completion timing and postprocessing
projects/core/dsl/*, projects/core/library/postprocess.py
Completion banners include elapsed durations, interrupted runs bypass Caliper processing, and postprocessing failure handling is centralized.
CI reporting and preset overrides
projects/core/library/ci.py, projects/core/library/config.py, projects/core/CHANGELOG-config.md
CI summary persistence and YAML preset override writing now handle missing, empty, and invalid state more defensively.

Artifact capture

Layer / File(s) Summary
Stdout destination API and pod logs
projects/core/dsl/utils/k8s.py
oc can stream stdout to files, with pod-log capture writing fallback error details when command output is unavailable.
Toolbox artifact capture migration
projects/**/toolbox/*/main.py
Kubernetes capture workflows now use stdout_dest instead of manually persisting returned stdout.

Smoke and KServe workflows

Layer / File(s) Summary
Smoke pod diagnostics and cleanup
projects/guidellm/toolbox/run_smoke_request/main.py
Smoke execution updates the client image and retry count, always captures pod diagnostics, and safely handles cleanup without pod context.
KServe dry-run task pipeline
projects/kserve/toolbox/deploy_llmisvc/main.py
KServe deployment uses task context for service identity, supports dry-run manifest return, and skips runtime-only diagnostic tasks in dry-run mode.

llm-d benchmark and P/D orchestration

Layer / File(s) Summary
Deployment profiles, workloads, and presets
projects/llm_d/orchestration/config.d/*, manifests/deployments/*, presets.d/*
P/D profiles, scheduler configuration, benchmark workloads, routing flavors, and reusable presets define expanded deployment combinations.
Runtime benchmark matrix and P/D accessors
projects/llm_d/orchestration/runtime_config.py
Run-spec generation includes benchmark combinations and slugs, active benchmark accessors, deep merging, and P/D configuration helpers.
Preset CLI and test lifecycle
projects/llm_d/orchestration/{ci.py,test_phase.py,cleanup_phase.py}
CI accepts repeatable presets, runs activated specs in separate artifact directories, and supports dry-run deployment with single-active-benchmark capture and cleanup.
Deployment rendering and validation
projects/llm_d/orchestration/render_inference_service.py, projects/llm_d/tests/*
Standard and P/D manifests use separate rendering paths, with reference-manifest and integration tests validating generated configurations.
P/D validation and documentation
projects/llm_d/{PD_TESTING.md,docs/*,CHANGELOG-orchestration.md}, projects/llm_d/tests/test_profiles.py
Documentation and tests cover P/D profiles, benchmark matrix expansion, deployment overrides, and isolated workloads.

Developer and catalog tooling

Layer / File(s) Summary
Python formatting hooks
.claude/settings.json
Claude Write and Edit hooks conditionally run Ruff formatting and autofix commands for Python files.
RHOAI artifact naming
projects/rhoai/library/deploy.py
Custom catalog deployment uses the rhoai artifact directory suffix.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested reviewers: albertoperdomo2

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.77% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title mentions llm_d and P/D work, but "Work on P/D CPT" is too vague to convey the main change. Rename it to a specific summary, e.g. "[llm_d] Add P/D deployment, runtime, and test support".
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster forge-smoke-testing
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@psap-forge-bot

Copy link
Copy Markdown

🛑 Execution of llm_d smoke 🛑
🛑 JOB ABORTED - spec.shutdown=Stop

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides:
    platform.operators.rhods-operator.channel: beta
    platform.rhoai.custom_catalog.enabled: true
    platform.rhoai.custom_catalog.image: quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310
  project: llm_d

Artifact Links

Test Logs

001 Prepare 2 minutes, 39 seconds

002 Test

Test Description

This test validates the llm_d project by executing a smoke benchmark on the Qwen/Qwen3-0.6B model configured with the approximate-prefix-cache deployment profile, utilizing a short workload with small token sizes and low concurrency rates to verify basic inference functionality.

🔄 003 Export-Artifacts

@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@psap-forge-bot

Copy link
Copy Markdown

🔴 Execution of llm_d smoke 🔴

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides:
    platform.operators.rhods-operator.channel: beta
    platform.rhoai.custom_catalog.enabled: true
    platform.rhoai.custom_catalog.image: quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310
  project: llm_d

Artifact Links

Test Logs

001 Prepare 21 minutes, 51 seconds

Failure Review 013 Cluster Deploy Operator Rhods-Operator

013__cluster_deploy_operator__rhods-operator

The wait_for_csv_ready task failed because the rhods-operator.3.5.0-ea.2 ClusterServiceVersion (CSV) entered a Failed state after repeatedly cycling between Installing and InstallReady for approximately 11 minutes. The root cause is an OLM Operator Deployment Reconciliation Failure where the operator Deployment could not reach a ready state despite the InstallPlan being successfully applied and approved, causing OLM to abort the installation cycle.

🔄 003 Export-Artifacts

@psap-forge-bot

Copy link
Copy Markdown
🔴 Submission of llm_d smoke failed after 23 minutes, 29 seconds 🔴

Error: FournosJobFailureError: FOURNOS Job 'forge-llm-d-20260715-122856' failed: Tasks Completed: 2 (Failed: 1, Cancelled 0), Skipped: 1

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@psap-forge-bot

Copy link
Copy Markdown

🔴 Execution of llm_d smoke 🔴

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides:
    platform.operators.rhods-operator.channel: beta
    platform.rhoai.custom_catalog.enabled: true
    platform.rhoai.custom_catalog.image: quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310
  project: llm_d

Artifact Links

Test Logs

001 Prepare 16 minutes, 3 seconds

Failure Review 013 Cluster Deploy Operator Rhods-Operator

013__cluster_deploy_operator__rhods-operator

The wait_for_csv_ready task failed, aborting the deployment of rhods-operator.3.5.0-ea.2, because the ClusterServiceVersion transitioned to a terminal Failed state after OLM could not complete resource reconciliation within the timeout window. Analysis confirms the CSV remained stuck in the Installing phase for approximately 10.5 minutes with intermittent retry cycles, causing OLM to explicitly mark the installation as failed.

🔄 003 Export-Artifacts

@psap-forge-bot

Copy link
Copy Markdown
🔴 Submission of llm_d smoke failed after 19 minutes, 10 seconds 🔴

Error: FournosJobFailureError: FOURNOS Job 'forge-llm-d-20260715-130528' failed: Tasks Completed: 2 (Failed: 1, Cancelled 0), Skipped: 1

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@psap-forge-bot

Copy link
Copy Markdown

🔴 Execution of llm_d smoke 🔴

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides:
    platform.operators.rhods-operator.channel: beta
    platform.rhoai.custom_catalog.enabled: true
    platform.rhoai.custom_catalog.image: quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310
  project: llm_d

Artifact Links

Test Logs

001 Prepare 22 minutes, 47 seconds

002 Test 16 minutes, 34 seconds

Test Description

This test evaluates the llm_d project by deploying the Qwen/Qwen3-0.6B model using the approximate prefix caching profile and executing a quick smoke test alongside a short concurrent benchmark (256 prompt/128 output tokens at rates 1–8). It specifically validates inference functionality and performance under the approximate-prefix-cache deployment configuration.

Failure Review 003 Run Smoke Request

001__llmd_test/003__run_smoke_request

The wait_smoke_pod_running task failed after 60 retries because the llm-d-smoke pod remained stuck in the Pending phase, completely blocking the smoke test workflow. The definitive root cause is a Kubernetes scheduler blockage where the pod was admitted to the API server but could not be assigned to any available node; analysis of src/smoke-pod.yaml confirms the manifest lacks explicit resource requests or node selectors, indicating the failure is caused by namespace-level constraints such as ResourceQuota exhaustion, LimitRange defaults, or a mismatch between the pod's scheduling requirements and available cluster node labels or taints.

🔄 003 Export-Artifacts

Post-processing Status

@psap-forge-bot

Copy link
Copy Markdown
🔴 Submission of llm_d smoke failed after 42 minutes, 20 seconds 🔴

Error: FournosJobFailureError: FOURNOS Job 'forge-llm-d-20260715-141441' failed: Tasks Completed: 3 (Failed: 1, Cancelled 0), Skipped: 0

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-prepare-test
/rhoai.rc-image quay.io/rhoai/rhoai-fbc-fragment@sha256:e213152dc5bdaaf5724d269484914f3e1d7b4a4959d4405cb3eca9dd6297b310

@kpouget
kpouget force-pushed the llmd branch 2 times, most recently from a94115b to e503280 Compare July 15, 2026 15:41
@kpouget

kpouget commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only

@psap-forge-bot

Copy link
Copy Markdown

🟢 Execution of llm_d smoke 🟢

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides: {}
  project: llm_d

Artifact Links

Test Logs

00 Preflight 2 seconds

01 Test 11 minutes, 10 seconds

Test Description

This test performs a smoke validation for the llm_d project by deploying the Qwen/Qwen3-0.6B model using the approximate-prefix-cache deployment profile and running a short concurrent benchmark (1–8 requests/sec) to verify basic inference functionality and gateway connectivity.

🔄 02 Export-Artifacts

Post-processing Status

@psap-forge-bot

Copy link
Copy Markdown
🟢 Submission of llm_d smoke succeeded after 12 minutes, 56 seconds 🟢
/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only

@openshift-ci

openshift-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign tosokin for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kpouget

kpouget commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only
/var runtime.kserve_dry_run: true
/fournos wip

@kpouget

kpouget commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only
/var runtime.kserve_dry_run: true
/fournos wip

@psap-forge-bot

Copy link
Copy Markdown
🔴 Submission of llm_d smoke failed after 2 minutes, 17 seconds 🔴

Error: FournosJobFailureError: FOURNOS Job 'forge-llm-d-20260716-124030' failed: Job not found - may have been deleted or never created

/test fournos llm_d smoke
/var runtime.kserve_dry_run: true
/cluster kpouget-llmd
/pipeline forge-test-only

@kpouget

kpouget commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only
/var runtime.kserve_dry_run: true
/var fournos.namespace: psap-automation-wip

@psap-forge-bot

Copy link
Copy Markdown
🔴 Submission of llm_d smoke failed after 5 seconds 🔴

Error: FournosJobFailureError: FOURNOS Job 'forge-llm-d-20260716-124342' failed: Failed to fetch Pipeline 'forge-test-only': Not Found

/test fournos llm_d smoke
/var runtime.kserve_dry_run: true
/var fournos.namespace: psap-automation-wip
/cluster kpouget-llmd
/pipeline forge-test-only

@kpouget
kpouget force-pushed the llmd branch 2 times, most recently from 76f89ea to 94d503b Compare July 16, 2026 13:43
@kpouget

kpouget commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d smoke
/cluster kpouget-llmd
/pipeline forge-test-only
/var runtime.kserve_dry_run: true
/fournos wip

@psap-forge-bot

Copy link
Copy Markdown

🟢 Execution of llm_d smoke 🟢

Execution Engine Configuration

forge:
  args:
  - smoke
  configOverrides:
    runtime.kserve_dry_run: true
  project: llm_d

Artifact Links

Test Logs

00 Preflight 5 seconds

01 Test 4 seconds

🔄 02 Export-Artifacts

@psap-forge-bot

Copy link
Copy Markdown
🟢 Submission of llm_d smoke succeeded after 3 minutes, 30 seconds 🟢
/test fournos llm_d smoke
/var runtime.kserve_dry_run: true
/cluster kpouget-llmd
/pipeline forge-test-only
/fournos wip

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (3)
.claude/settings.json (1)

9-9: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Scope Ruff to the changed file.

These hooks run ruff ... . after every Python edit, so one change can rewrite unrelated Python files and create noisy or conflicting diffs. Pass "$f" instead, or explicitly document why repository-wide mutation is intended.

Suggested adjustment
- ruff format .
+ ruff format "$f"

- ruff check --fix .
+ ruff check --fix "$f"

Also applies to: 14-14, 24-24, 29-29

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/settings.json at line 9, Update the Python file formatting hooks in
the command entries to run Ruff against the changed file variable "$f" instead
of the repository-wide "." target. Apply this consistently to all corresponding
hooks while preserving the existing Python-file check and error suppression
behavior.
projects/llm_d/orchestration/test_phase.py (2)

214-218: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consolidate log statements.

The empty f-string and the two separate log statements can be consolidated into a single formatted log call for cleaner code.

♻️ Proposed refactor
     if dry_run:
         llmisvc_manifest_path = endpoint_url
-        logger.info(f"Dry-run completed: LLMInferenceService manifest prepared:")
-        logger.info(llmisvc_manifest_path)
+        logger.info("Dry-run completed: LLMInferenceService manifest prepared: %s", llmisvc_manifest_path)
         return llmisvc_manifest_path
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/orchestration/test_phase.py` around lines 214 - 218,
Consolidate the two logger.info calls in the dry_run branch of the orchestration
flow into one formatted log statement that includes the prepared
llmisvc_manifest_path, removing the unnecessary empty f-string while preserving
the existing return value.

137-140: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Prefer consistent logger usage.

This file predominantly relies on a locally imported or configured logger instance (e.g., logger.info, logger.exception), but this line uses the logging module directly. Consider standardizing on logger.warning for consistency.

♻️ Proposed refactor
             if dry_run:
-                logging.warning("Running in dry-run mode, skipping the rest of the test steps")
+                logger.warning("Running in dry-run mode, skipping the rest of the test steps")
                 return 0
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/orchestration/test_phase.py` around lines 137 - 140, In the
dry-run branch of test execution, replace the direct logging-module call with
the file’s configured logger instance by using logger.warning, while preserving
the existing warning message and return behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/settings.json:
- Line 9: Update the command hook around the jq and Ruff pipeline to remove the
unconditional “2>/dev/null || true” suppression, allowing jq or ruff failures
and missing executables to return a non-zero status. If the hook must remain
best-effort, replace silent suppression with a visible warning while preserving
failure visibility.

In `@projects/core/library/config.py`:
- Around line 548-553: Update the override-loading logic in the override_file
branch to retain the parsed YAML only when it is a dictionary; otherwise, assign
an empty dictionary. Ensure this validation covers falsy and truthy
non-dictionary values before subsequent overrides assignments.

In `@projects/kserve/toolbox/deploy_llmisvc/main.py`:
- Around line 179-180: Replace eager context-attribute defaults in
projects/kserve/toolbox/deploy_llmisvc/main.py at lines 179-180, 216-217, 128,
157, 268, 295, and 332 with nested safe getattr lookups; in the flows at 179-180
and 216-217, return “No service name available” when no name is found. At lines
403-405, use service_description when present and otherwise build the fallback
using a safe nested inference_service_name lookup defaulting to “Unknown”.

In `@projects/llm_d/orchestration/ci.py`:
- Around line 84-89: Update the preset normalization logic around presets_list
to split comma-separated values from every --preset argument, preserving their
order alongside non-comma values. Emit the “Setting preset configuration from
CLI” log consistently whenever preset arguments are provided, including single
values without commas, and log the fully expanded list.

In `@projects/rhoai/library/deploy.py`:
- Line 128: Update the artifact_dirname_suffix argument in the deployment
configuration from "_rhoai" to "rhoai", so runtime.py’s suffix formatting
produces a single underscore in the artifact directory name.

---

Nitpick comments:
In @.claude/settings.json:
- Line 9: Update the Python file formatting hooks in the command entries to run
Ruff against the changed file variable "$f" instead of the repository-wide "."
target. Apply this consistently to all corresponding hooks while preserving the
existing Python-file check and error suppression behavior.

In `@projects/llm_d/orchestration/test_phase.py`:
- Around line 214-218: Consolidate the two logger.info calls in the dry_run
branch of the orchestration flow into one formatted log statement that includes
the prepared llmisvc_manifest_path, removing the unnecessary empty f-string
while preserving the existing return value.
- Around line 137-140: In the dry-run branch of test execution, replace the
direct logging-module call with the file’s configured logger instance by using
logger.warning, while preserving the existing warning message and return
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e0268e43-993d-4c64-9c3b-5538b6544ede

📥 Commits

Reviewing files that changed from the base of the PR and between 441ea2d and 94d503b.

📒 Files selected for processing (33)
  • .claude/settings.json
  • projects/agentic_tools/locust/toolbox/generate_prompts/main.py
  • projects/agentic_tools/mcp/toolbox/deploy_mock_servers/main.py
  • projects/core/dsl/log.py
  • projects/core/dsl/runtime.py
  • projects/core/dsl/utils/k8s.py
  • projects/core/library/ci.py
  • projects/core/library/config.py
  • projects/core/library/postprocess.py
  • projects/guidellm/toolbox/run_guidellm_benchmark/main.py
  • projects/guidellm/toolbox/run_smoke_request/main.py
  • projects/kserve/toolbox/deploy_llmisvc/main.py
  • projects/kserve/toolbox/prepare_hf_model_cache/main.py
  • projects/llm_d/CHANGELOG-orchestration.md
  • projects/llm_d/PD_TESTING.md
  • projects/llm_d/docs/benchmark-isolation.md
  • projects/llm_d/orchestration/ci.py
  • projects/llm_d/orchestration/cleanup_phase.py
  • projects/llm_d/orchestration/config.d/deployments.yaml
  • projects/llm_d/orchestration/config.d/platform.yaml
  • projects/llm_d/orchestration/config.d/runtime.yaml
  • projects/llm_d/orchestration/config.d/workloads.yaml
  • projects/llm_d/orchestration/manifests/deployments/pd-scheduler.yaml
  • projects/llm_d/orchestration/presets.d/presets.yaml
  • projects/llm_d/orchestration/runtime_config.py
  • projects/llm_d/orchestration/test_phase.py
  • projects/llm_d/tests/test_pd_integration.py
  • projects/llm_d/tests/test_profiles.py
  • projects/llm_d/toolbox/capture_prepare_state/main.py
  • projects/mcp_gateway/toolbox/apply_infrastructure/main.py
  • projects/mcp_gateway/toolbox/cleanup_platform/main.py
  • projects/mcp_gateway/toolbox/install_platform/main.py
  • projects/rhoai/library/deploy.py

Comment thread .claude/settings.json Outdated
Comment thread projects/core/library/config.py
Comment thread projects/kserve/toolbox/deploy_llmisvc/main.py Outdated
Comment thread projects/llm_d/orchestration/ci.py
Comment thread projects/rhoai/library/deploy.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (2)
projects/llm_d/PD_TESTING.md (1)

86-103: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add language identifiers to fenced code blocks.

Use text for directive, tree, and formula examples (or the most appropriate language) to satisfy Markdown linting and improve rendering.

Proposed fix
-```
+```text

Also applies to: 140-151, 185-189

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/PD_TESTING.md` around lines 86 - 103, Add language identifiers
to the fenced code blocks in the deployment profile examples and the other
referenced sections, using text for directive, tree, and formula snippets or
another appropriate language where applicable. Preserve the example contents and
formatting while ensuring every affected fence has an explicit language tag.

Source: Linters/SAST tools

projects/llm_d/tests/test_pd_integration.py (1)

93-119: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Refactor this test to exercise the orchestration logic.

This test verifies basic Python iteration and multiplication (2 * 3 * 2 == 12) rather than exercising the project's codebase. Consider refactoring it to apply the actual pd-matrix preset and call runtime_config.get_run_specs() (similar to test_3d_matrix_with_multiple_benchmark_keys in test_profiles.py), or remove it if that coverage is already sufficient elsewhere.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/tests/test_pd_integration.py` around lines 93 - 119, Replace
the hand-built calculations in test_matrix_expansion_calculation with an
integration test that loads/applies the actual pd-matrix preset and invokes
runtime_config.get_run_specs(), following the pattern of
test_3d_matrix_with_multiple_benchmark_keys in test_profiles.py. Assert the
generated RunSpecs and relevant model, deployment-profile, and benchmark
combinations, or remove this test if equivalent preset coverage already exists.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@projects/core/library/postprocess.py`:
- Around line 179-192: Update the status handling around
run_postprocess_after_test to tolerate a None result when postprocessing is
disabled, treating it as an unsuccessful or otherwise non-postprocessed status
without calling .get on None. In the result is None branch after
_handle_postprocess_failure, remove the bare raise and fall through so the
original test exception propagates through the outer flow instead of being
caught by the inner except Exception handler or chained as a postprocessing
error.

In `@projects/guidellm/toolbox/run_smoke_request/main.py`:
- Around line 239-264: Update the diagnostic capture flow around the pod YAML
and description oc calls to retain each command result, detect nonzero exit
codes, and write the command’s stderr to the corresponding artifact destination
as a fallback. Only return the successful “Captured debug info” message when
both diagnostics succeed; otherwise report the failed diagnostic commands and
their recorded fallback artifacts.

In `@projects/llm_d/orchestration/config.d/runtime.yaml`:
- Line 8: Update the kserve_dry_run setting in the runtime configuration to
false so committed repository defaults perform actual KServe deployments; retain
true only through explicit local or test overrides.

In `@projects/llm_d/orchestration/presets.d/presets.yaml`:
- Around line 175-178: Remove the empty extends key from the pd-flavors preset
while retaining runtime.selected_preset: pd-flavors; do not leave a
commented-out list item or null-valued extends field.

In `@projects/llm_d/orchestration/render_inference_service.py`:
- Around line 33-34: Update P/D detection in the inference service renderer to
use bool(deployment_profile.get("pd_config")), then make the P/D rendering path
consume the prefill and decode settings from pd_config instead of fixed replica
counts and shared tensor-parallel/VLLM arguments. Preserve non-P/D rendering,
and regenerate the affected golden manifest for the ...ptp4-px1-dtp4 profile.

In `@projects/llm_d/PD_TESTING.md`:
- Around line 13-33: Update the “P/D Deployment Profiles” section in
PD_TESTING.md to document the pd-x2-ptp4-px1-dtp4 profile and its pd_config
settings from deployments.yaml, or explicitly clarify that pd-small, pd-medium,
and pd-large are baseline profiles rather than the complete set.
- Around line 139-151: Update the “Artifact Directory Structure” example to use
the runtime-generated run directory names from runtime_config.get_run_specs():
llmd_run for a single run and llmd_run_<profile>_<model>[_<benchmark>] for
matrix runs. Replace the mismatched llmd_test and
prepare_llmd_run_pd_medium_8b_instruct paths, or explicitly document the
additional directory layer if it is intentional.

---

Nitpick comments:
In `@projects/llm_d/PD_TESTING.md`:
- Around line 86-103: Add language identifiers to the fenced code blocks in the
deployment profile examples and the other referenced sections, using text for
directive, tree, and formula snippets or another appropriate language where
applicable. Preserve the example contents and formatting while ensuring every
affected fence has an explicit language tag.

In `@projects/llm_d/tests/test_pd_integration.py`:
- Around line 93-119: Replace the hand-built calculations in
test_matrix_expansion_calculation with an integration test that loads/applies
the actual pd-matrix preset and invokes runtime_config.get_run_specs(),
following the pattern of test_3d_matrix_with_multiple_benchmark_keys in
test_profiles.py. Assert the generated RunSpecs and relevant model,
deployment-profile, and benchmark combinations, or remove this test if
equivalent preset coverage already exists.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6ceaa5ff-d571-457b-8360-fbf02c167c3f

📥 Commits

Reviewing files that changed from the base of the PR and between 94d503b and 4c2b148.

📒 Files selected for processing (40)
  • .claude/settings.json
  • projects/agentic_tools/locust/toolbox/generate_prompts/main.py
  • projects/agentic_tools/mcp/toolbox/deploy_mock_servers/main.py
  • projects/core/CHANGELOG-config.md
  • projects/core/dsl/log.py
  • projects/core/dsl/runtime.py
  • projects/core/dsl/utils/k8s.py
  • projects/core/library/ci.py
  • projects/core/library/config.py
  • projects/core/library/postprocess.py
  • projects/guidellm/toolbox/run_guidellm_benchmark/main.py
  • projects/guidellm/toolbox/run_smoke_request/main.py
  • projects/kserve/toolbox/deploy_llmisvc/main.py
  • projects/kserve/toolbox/prepare_hf_model_cache/main.py
  • projects/llm_d/CHANGELOG-orchestration.md
  • projects/llm_d/PD_TESTING.md
  • projects/llm_d/docs/benchmark-isolation.md
  • projects/llm_d/orchestration/ci.py
  • projects/llm_d/orchestration/cleanup_phase.py
  • projects/llm_d/orchestration/config.d/deployments.yaml
  • projects/llm_d/orchestration/config.d/platform.yaml
  • projects/llm_d/orchestration/config.d/runtime.yaml
  • projects/llm_d/orchestration/config.d/workloads.yaml
  • projects/llm_d/orchestration/config.yaml
  • projects/llm_d/orchestration/manifests/deployments/pd-scheduler.yaml
  • projects/llm_d/orchestration/presets.d/presets.yaml
  • projects/llm_d/orchestration/render_inference_service.py
  • projects/llm_d/orchestration/runtime_config.py
  • projects/llm_d/orchestration/test_phase.py
  • projects/llm_d/tests/reference_deployments/deployment-intelligentrouting-tp4-x4/llmisvc.yaml
  • projects/llm_d/tests/reference_deployments/deployment-pd-x2-ptp4-px1-dtp4/llmisvc.yaml
  • projects/llm_d/tests/reference_deployments/deployment-simple-tp4-x4/llmisvc.yaml
  • projects/llm_d/tests/test_deployment_profiles.py
  • projects/llm_d/tests/test_pd_integration.py
  • projects/llm_d/tests/test_profiles.py
  • projects/llm_d/toolbox/capture_prepare_state/main.py
  • projects/mcp_gateway/toolbox/apply_infrastructure/main.py
  • projects/mcp_gateway/toolbox/cleanup_platform/main.py
  • projects/mcp_gateway/toolbox/install_platform/main.py
  • projects/rhoai/library/deploy.py
🚧 Files skipped from review as they are similar to previous changes (22)
  • projects/core/dsl/log.py
  • projects/rhoai/library/deploy.py
  • .claude/settings.json
  • projects/llm_d/CHANGELOG-orchestration.md
  • projects/agentic_tools/mcp/toolbox/deploy_mock_servers/main.py
  • projects/llm_d/orchestration/manifests/deployments/pd-scheduler.yaml
  • projects/mcp_gateway/toolbox/install_platform/main.py
  • projects/mcp_gateway/toolbox/cleanup_platform/main.py
  • projects/core/dsl/runtime.py
  • projects/agentic_tools/locust/toolbox/generate_prompts/main.py
  • projects/llm_d/orchestration/cleanup_phase.py
  • projects/llm_d/orchestration/config.d/workloads.yaml
  • projects/llm_d/toolbox/capture_prepare_state/main.py
  • projects/mcp_gateway/toolbox/apply_infrastructure/main.py
  • projects/llm_d/orchestration/config.d/deployments.yaml
  • projects/llm_d/orchestration/ci.py
  • projects/core/library/ci.py
  • projects/kserve/toolbox/prepare_hf_model_cache/main.py
  • projects/llm_d/tests/test_profiles.py
  • projects/core/dsl/utils/k8s.py
  • projects/llm_d/orchestration/test_phase.py
  • projects/llm_d/orchestration/runtime_config.py

Comment thread projects/core/library/postprocess.py
Comment on lines +239 to +264
try:
# Capture pod YAML
oc(
"get",
"pod",
ctx.pod_name,
"-n",
args.namespace,
"-o",
"yaml",
check=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.yaml",
)

# Capture pod description
oc(
"describe",
"pod",
ctx.pod_name,
"-n",
args.namespace,
check=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.description.txt",
)

return f"Captured debug info for pod {ctx.pod_name}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Record failed diagnostic commands instead of reporting successful capture.

Both calls use check=False, so a missing/inaccessible pod returns normally with a nonzero exit code. Line 264 then reports success while the artifact may be empty. Check each result and write its stderr to the destination as a fallback.

Proposed fix
-        oc(
+        yaml_result = oc(
             "get",
             "pod",
             ctx.pod_name,
             "-n",
             args.namespace,
             "-o",
             "yaml",
             check=False,
+            log_stdout=False,
             stdout_dest=artifacts_dir / f"{ctx.pod_name}.yaml",
         )
+        if yaml_result.returncode != 0:
+            write_text(
+                artifacts_dir / f"{ctx.pod_name}.yaml",
+                yaml_result.stderr or "Failed to capture pod YAML",
+            )

-        oc(
+        describe_result = oc(
             "describe",
             "pod",
             ctx.pod_name,
             "-n",
             args.namespace,
             check=False,
+            log_stdout=False,
             stdout_dest=artifacts_dir / f"{ctx.pod_name}.description.txt",
         )
+        if describe_result.returncode != 0:
+            write_text(
+                artifacts_dir / f"{ctx.pod_name}.description.txt",
+                describe_result.stderr or "Failed to describe pod",
+            )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
try:
# Capture pod YAML
oc(
"get",
"pod",
ctx.pod_name,
"-n",
args.namespace,
"-o",
"yaml",
check=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.yaml",
)
# Capture pod description
oc(
"describe",
"pod",
ctx.pod_name,
"-n",
args.namespace,
check=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.description.txt",
)
return f"Captured debug info for pod {ctx.pod_name}"
try:
# Capture pod YAML
yaml_result = oc(
"get",
"pod",
ctx.pod_name,
"-n",
args.namespace,
"-o",
"yaml",
check=False,
log_stdout=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.yaml",
)
if yaml_result.returncode != 0:
write_text(
artifacts_dir / f"{ctx.pod_name}.yaml",
yaml_result.stderr or "Failed to capture pod YAML",
)
# Capture pod description
describe_result = oc(
"describe",
"pod",
ctx.pod_name,
"-n",
args.namespace,
check=False,
log_stdout=False,
stdout_dest=artifacts_dir / f"{ctx.pod_name}.description.txt",
)
if describe_result.returncode != 0:
write_text(
artifacts_dir / f"{ctx.pod_name}.description.txt",
describe_result.stderr or "Failed to describe pod",
)
return f"Captured debug info for pod {ctx.pod_name}"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/guidellm/toolbox/run_smoke_request/main.py` around lines 239 - 264,
Update the diagnostic capture flow around the pod YAML and description oc calls
to retain each command result, detect nonzero exit codes, and write the
command’s stderr to the corresponding artifact destination as a fallback. Only
return the successful “Captured debug info” message when both diagnostics
succeed; otherwise report the failed diagnostic commands and their recorded
fallback artifacts.

benchmark_key: null
job_name: null
namespace_override: null
kserve_dry_run: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Verify if kserve_dry_run: true should be the repository default.

Setting kserve_dry_run: true in the committed configuration makes dry-run mode the default behavior, meaning actual KServe deployments will be skipped unless this is explicitly overridden. If this was just used for local or PR testing (as mentioned in the PR objectives), consider reverting it to false.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/orchestration/config.d/runtime.yaml` at line 8, Update the
kserve_dry_run setting in the runtime configuration to false so committed
repository defaults perform actual KServe deployments; retain true only through
explicit local or test overrides.

Comment on lines +175 to +178
pd-flavors:
extends:
# - gpt-oss
runtime.selected_preset: pd-flavors

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove empty extends key.

Commenting out the only list item under extends leaves the key evaluating to null (None). If the configuration loading logic expects this to be a list and attempts to iterate over it, it will cause a runtime crash (TypeError: 'NoneType' object is not iterable).

🐛 Proposed fix
 pd-flavors:
-  extends:
-  #  - gpt-oss
   runtime.selected_preset: pd-flavors
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pd-flavors:
extends:
# - gpt-oss
runtime.selected_preset: pd-flavors
pd-flavors:
runtime.selected_preset: pd-flavors
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/orchestration/presets.d/presets.yaml` around lines 175 - 178,
Remove the empty extends key from the pd-flavors preset while retaining
runtime.selected_preset: pd-flavors; do not leave a commented-out list item or
null-valued extends field.

Comment on lines +33 to +34
# Check if this is a P/D deployment
is_pd_deployment = "pd_config" in deployment_profile

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Render P/D role settings from pd_config.

Detection differs from runtime_config.is_pd_deployment(), and the P/D renderer never consumes pd_config: both replica counts are fixed at 2, while tensor parallelism and VLLM arguments are shared. Consequently, role-specific profiles render incorrectly—the ...ptp4-px1-dtp4 reference already emits prefill.replicas: 2.

Use bool(deployment_profile.get("pd_config")) and populate each role from its P/D configuration, then update the golden manifest.

Also applies to: 255-265, 281-320

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/orchestration/render_inference_service.py` around lines 33 -
34, Update P/D detection in the inference service renderer to use
bool(deployment_profile.get("pd_config")), then make the P/D rendering path
consume the prefill and decode settings from pd_config instead of fixed replica
counts and shared tensor-parallel/VLLM arguments. Preserve non-P/D rendering,
and regenerate the affected golden manifest for the ...ptp4-px1-dtp4 profile.

Comment thread projects/llm_d/PD_TESTING.md
Comment on lines +139 to +151
### Artifact Directory Structure
```
ARTIFACT_DIR/
├── llmd_test/
│ ├── __test_labels__.yaml
│ ├── artifacts/
│ │ ├── pd-scheduler-config.yaml # P/D scheduler manifest
│ │ ├── llminferenceservice.yaml
│ │ ├── endpoint.url
│ │ └── results/
│ │ └── benchmark_short/
├── prepare_llmd_run_pd_medium_8b_instruct/ # P/D-specific prepare artifacts
└── ...

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the artifact example with runtime-generated names.

runtime_config.get_run_specs() uses llmd_run for a single run and llmd_run_<profile>_<model>[_<benchmark>] for matrices. The llmd_test/ and prepare_llmd_run_pd_medium_8b_instruct/ paths shown here do not match that contract; update the example or explain the additional directory layer.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 140-140: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/llm_d/PD_TESTING.md` around lines 139 - 151, Update the “Artifact
Directory Structure” example to use the runtime-generated run directory names
from runtime_config.get_run_specs(): llmd_run for a single run and
llmd_run_<profile>_<model>[_<benchmark>] for matrix runs. Replace the mismatched
llmd_test and prepare_llmd_run_pd_medium_8b_instruct paths, or explicitly
document the additional directory layer if it is intentional.

@kpouget
kpouget force-pushed the llmd branch 2 times, most recently from 8a1b354 to 188cf4b Compare July 17, 2026 12:54
kpouget and others added 19 commits July 17, 2026 14:56
before the env module is initialized
Signed-off-by: Alberto Perdomo <aperdomo@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants