Skip to content

refactor(experiments): Rename all child resources of ExperimentGroup entity to "Experiment" - #938

Merged
shanaiabuggy merged 13 commits into
mainfrom
sbuggy/ase-550
Jul 29, 2026
Merged

refactor(experiments): Rename all child resources of ExperimentGroup entity to "Experiment"#938
shanaiabuggy merged 13 commits into
mainfrom
sbuggy/ase-550

Conversation

@shanaiabuggy

@shanaiabuggy shanaiabuggy commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

ASE-550: Rename parent resource ExperimentGroupExperiment (non-breaking)

Completes the Experiment→Evaluation rename pair: the child rename shipped earlier, and this renames the parent API resource from ExperimentGroup to Experiment across intake, Studio, the Python SDK, and the CLI. The API now reads Experiment → Evaluation. Stored entity types are unchanged.

Non-breaking at the API layer: legacy /experiment-groups routes remain as hidden aliases and the deprecated experiment_group_id field is still accepted and returned, so existing callers keep working.

Also in this PR:

  • Removes three already-deprecated Evaluation fields left over from the earlier child rename (parent_experiment_id, experiment_context, experiment_name).
  • Migrates the two in-repo consumers (nemo-experimentalist, nemo-evaluator) to the new SDK surface (client.experiments, experiment_ids).

Summary by CodeRabbit

  • New Features

    • Added full Experiments create, list, view, update, and delete support through the API and CLI.
    • Updated Studio pages, charts, navigation, and forms to use experiment terminology and routes.
    • Added experiment-focused filtering, evaluation association, and authorization support.
  • Breaking Changes

    • Canonical evaluation membership now uses experiment_ids.
    • Deprecated experiment-context and trace alias fields and options were removed.
  • Documentation

    • Added CLI reference coverage and updated experiment upload guidance and troubleshooting instructions.
  • Compatibility

    • Legacy experiment-group URLs remain available as hidden aliases.

shanaiabuggy and others added 3 commits July 27, 2026 17:41
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
…aking) [ASE-550]

Rename the parent resource user-facing from ExperimentGroup to Experiment across
the intake API and RBAC. The stored entity stays experiment_group; the API layer
maps at the boundary. Non-breaking: old URLs and response shapes keep working.

* Routes: /experiment-groups -> /experiments (canonical). The old paths are kept
  as hidden deprecated aliases (include_in_schema=False) pointing at the same
  handlers, so existing callers keep working until they migrate.
* Schemas: ExperimentGroup{Request,Response,Filter} -> Experiment{...} (identical
  JSON shape). Tag "Experiment Groups" -> "Experiments". Entity class untouched.
* RBAC: intake.experiment-groups.* -> intake.experiments.*; the new /experiments
  path is authorized and the hidden /experiment-groups aliases are mapped via
  x-not-in-openapi (mirrors the #612 pattern). OPA tests pass (236/236).
* Regenerated OpenAPI; updated tests + seed scripts to the canonical path; added
  a back-compat test proving the legacy /experiment-groups alias still works.

Studio FE follows in a subsequent commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Point Studio at the renamed /experiments API and rename the internal
ExperimentGroup* components, routes, hooks, types, route param, and user-facing
copy to Experiment*. No behavior change; the parent resource is consistently
"Experiment" now.

* SDK refs: ExperimentGroupResponse -> ExperimentResponse, useGetExperimentGroup
  -> useGetExperiment, etc. (regenerated from the renamed spec).
* Components/routes/files: ExperimentGroupDataView -> ExperimentDataView,
  ExperimentGroupDetailRoute -> ExperimentDetailRoute, {Create,Edit}Modal,
  ParetoChart, Metrics, Card, InsightExperiments, useExperimentEvaluations.
* Route param experimentGroupName -> experimentName (URL structure unchanged),
  route key experimentGroupDetail -> experimentDetail.
* User-facing copy "Experiment Group(s)" -> "Experiment(s)"; camelCase
  experimentGroupId -> experimentId; localStorage keys and the CSS scoping class.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
@shanaiabuggy
shanaiabuggy requested review from a team as code owners July 28, 2026 01:42
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Changes

Experiment API and contract migration

Layer / File(s) Summary
Experiment API and schema contract
openapi/*, services/intake/src/nmp/intake/api/v2/experiments/*, services/core/auth/.../static-authz.yaml
Experiment CRUD routes and schemas use /experiments, while evaluation membership uses experiment_ids and deprecated aliases are reduced.
Ingestion, traces, and integrations
services/intake/src/nmp/intake/spans/*, plugins/*, services/intake/scripts/*
Canonical evaluation_context and experiment endpoints replace deprecated context, filter, and group-path aliases.
CLI and guidance
packages/nemo_platform_ext/src/nemo_platform_ext/cli/*, docs/*, packages/nemo_platform_ext/src/.../skills/*
Experiments CLI commands and upload documentation use the new API and identifier contract.
Studio experiment views and routing
web/packages/studio/src/components/*, web/packages/studio/src/routes/*
Experiment listing, editing, evaluation views, charts, optimizer links, and session routes use experiment-specific APIs, types, and route parameters.

Possibly related PRs

Suggested reviewers: briannewsom, htolentino-nvidia

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 26.19% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the PR’s main change: renaming ExperimentGroup-facing resources to Experiment.
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
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sbuggy/ase-550

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

@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.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
web/packages/studio/src/components/ExperimentEditModal/index.tsx (1)

69-97: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Finish the visible terminology migration.

  • web/packages/studio/src/components/ExperimentEditModal/index.tsx#L69-L97: change the toast, modal title, and instruction to “experiment”.
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx#L23-L26: change the load-error message to “experiment”.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/packages/studio/src/components/ExperimentEditModal/index.tsx` around
lines 69 - 97, Finish the visible terminology migration by updating the error
toast, modal title, and instruction in ExperimentEditModal to use “experiment”
terminology instead of “group”; update the load-error message in
ExperimentDetailRoute likewise. Apply the requested wording changes at
web/packages/studio/src/components/ExperimentEditModal/index.tsx lines 69-97 and
web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx lines 23-26.
openapi/ga/openapi.yaml (1)

3639-3647: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stale "ExperimentGroup"/"group" wording in Patch Evaluation docs.

The PR's objective is renaming ExperimentGroup children to Experiment, but this endpoint's description ("curating an evaluation into another ExperimentGroup", "any new group must exist... belongs to >=1 group") and its 400 response ("A referenced ExperimentGroup does not exist") still use the old terminology, contradicting the rest of this same file (e.g. EvaluationPatchRequest docstring at Line 10607-10612 already says "experiment").

🔧 Suggested fix
       description: "Partially update an evaluation: only fields present in the request\
-        \ are changed.\n\nThe common case is curating an evaluation into another ExperimentGroup\
-        \ \u2014 PATCH with the merged\n``experiment_ids``. Membership is replaced\
-        \ (not appended), so send the full desired set; any new\ngroup must exist\
-        \ and the set must be non-empty (an evaluation always belongs to >=1 group).\
+        \ are changed.\n\nThe common case is curating an evaluation into another Experiment\
+        \ \u2014 PATCH with the merged\n``experiment_ids``. Membership is replaced\
+        \ (not appended), so send the full desired set; any new\nexperiment must exist\
+        \ and the set must be non-empty (an evaluation always belongs to >=1 experiment).\
         \ Omitted\nfields are left untouched (unlike the full-body PUT, which overwrites\
         \ them)."
...
         '400':
-          description: A referenced ExperimentGroup does not exist, or experiment_ids
+          description: A referenced Experiment does not exist, or experiment_ids
             is empty

Also applies to: 3674-3677

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

In `@openapi/ga/openapi.yaml` around lines 3639 - 3647, Update the Patch
Evaluation documentation in the operation description and its 400 response to
consistently use “Experiment” terminology instead of “ExperimentGroup” and
“group,” including membership and referenced-resource wording. Preserve the
existing PATCH behavior and replace only the stale terminology.
🧹 Nitpick comments (2)
web/packages/studio/src/components/IntakeDetail/README.md (1)

90-90: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Split this into Diataxis pages.

Keep architecture here; move route syntax to REFERENCE and “Adding a kind” to a HOW-TO. Add prerequisites and Next Steps.

As per coding guidelines, each documentation page must fit one Diataxis quadrant, list prerequisites at the top, and include a Next Steps section.

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

In `@web/packages/studio/src/components/IntakeDetail/README.md` at line 90, Split
the Intake detail documentation into Diataxis-aligned pages: keep the
architecture overview in the current README, move route syntax into a REFERENCE
page, and move “Adding a kind” into a HOW-TO page. Add a prerequisites section
at the top and a Next Steps section to every resulting page, ensuring each page
remains focused on one Diataxis quadrant.

Source: Coding guidelines

openapi/openapi.yaml (1)

11193-11217: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

ExperimentFilter lacks created_at/updated_at filters present on sibling filter schemas.

EvaluationFilter, ModelEntityFilter, FilesetFilter, etc. all expose DatetimeFilter-based created_at/updated_at. ExperimentFilter only has name, insight_id, is_deleted, metadata. Consider adding for parity if the backend model supports it.

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

In `@openapi/openapi.yaml` around lines 11193 - 11217, The ExperimentFilter schema
is missing created_at and updated_at fields. Add both properties to
ExperimentFilter using the same DatetimeFilter-based definitions and
descriptions as the sibling filter schemas, preserving the existing name,
insight_id, is_deleted, and metadata properties.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@openapi/ga/openapi.yaml`:
- Around line 10498-10501: Update the EvaluationFilter schema entry for
experiment_group_id to mark it deprecated, and add the experiment_ids filter
alongside it when supported by this endpoint, preserving the existing type and
descriptions for unaffected fields.

In
`@web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts`:
- Around line 25-26: Update isSameSort to compare the complete SortingState
arrays, including every sort entry’s id and desc direction rather than only
index 0. Preserve equality for identical multi-sort states and inequality when
any primary or secondary sort differs, and add a test covering recovery from a
failed secondary sort.

---

Outside diff comments:
In `@openapi/ga/openapi.yaml`:
- Around line 3639-3647: Update the Patch Evaluation documentation in the
operation description and its 400 response to consistently use “Experiment”
terminology instead of “ExperimentGroup” and “group,” including membership and
referenced-resource wording. Preserve the existing PATCH behavior and replace
only the stale terminology.

In `@web/packages/studio/src/components/ExperimentEditModal/index.tsx`:
- Around line 69-97: Finish the visible terminology migration by updating the
error toast, modal title, and instruction in ExperimentEditModal to use
“experiment” terminology instead of “group”; update the load-error message in
ExperimentDetailRoute likewise. Apply the requested wording changes at
web/packages/studio/src/components/ExperimentEditModal/index.tsx lines 69-97 and
web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx lines 23-26.

---

Nitpick comments:
In `@openapi/openapi.yaml`:
- Around line 11193-11217: The ExperimentFilter schema is missing created_at and
updated_at fields. Add both properties to ExperimentFilter using the same
DatetimeFilter-based definitions and descriptions as the sibling filter schemas,
preserving the existing name, insight_id, is_deleted, and metadata properties.

In `@web/packages/studio/src/components/IntakeDetail/README.md`:
- Line 90: Split the Intake detail documentation into Diataxis-aligned pages:
keep the architecture overview in the current README, move route syntax into a
REFERENCE page, and move “Adding a kind” into a HOW-TO page. Add a prerequisites
section at the top and a Next Steps section to every resulting page, ensuring
each page remains focused on one Diataxis quadrant.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 84aea33a-2dcb-480e-b5e5-39a3361acca2

📥 Commits

Reviewing files that changed from the base of the PR and between 0505b36 and 621576c.

📒 Files selected for processing (76)
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • services/intake/scripts/spans/seed_experiment_rollup_data.py
  • services/intake/scripts/spans/seed_experiments_demo.py
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • services/intake/src/nmp/intake/api/v2/experiments/schemas.py
  • services/intake/src/nmp/intake/service.py
  • services/intake/src/nmp/intake/spans/api/traces.py
  • services/intake/src/nmp/intake/spans/api/traces_schemas.py
  • services/intake/src/nmp/intake/spans/ingest/evaluation_context.py
  • services/intake/tests/integration/spans/test_atif_ingest.py
  • services/intake/tests/integration/spans/test_chat_completions_ingest.py
  • services/intake/tests/integration/spans/test_experiment_metric_sort.py
  • services/intake/tests/integration/spans/test_experiment_rollups.py
  • services/intake/tests/integration/spans/test_experiment_sessions.py
  • services/intake/tests/integration/spans/test_traces_read.py
  • services/intake/tests/integration/test_experiments_crud.py
  • services/intake/tests/test_atif_v17.py
  • services/intake/tests/test_experiment_default_sort.py
  • services/intake/tests/test_experiment_metric_filter.py
  • services/intake/tests/test_experiment_optimization_fields.py
  • services/intake/tests/test_experiment_sort_endpoint.py
  • services/intake/tests/test_spans_schemas.py
  • services/intake/tests/test_traces_api.py
  • web/packages/studio/src/components/ExperimentCreateModal/constants.ts
  • web/packages/studio/src/components/ExperimentCreateModal/index.tsx
  • web/packages/studio/src/components/ExperimentEditModal/index.test.tsx
  • web/packages/studio/src/components/ExperimentEditModal/index.tsx
  • web/packages/studio/src/components/IntakeDetail/README.md
  • web/packages/studio/src/components/charts/ExperimentParetoChart/MetricSelect.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/ParetoTooltip.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/index.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/useParetoEvaluations.ts
  • web/packages/studio/src/components/charts/ExperimentParetoChart/utils.test.ts
  • web/packages/studio/src/components/charts/ExperimentParetoChart/utils.ts
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/Empty.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.test.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/AddToGroupModal.test.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/AddToGroupModal.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/Empty.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/ExperimentDataView.css
  • web/packages/studio/src/components/dataViews/ExperimentDataView/MeanValueTooltipCell.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useExperimentEvaluations.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useExperimentEvaluations.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/util.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/util.ts
  • web/packages/studio/src/constants/routes.ts
  • web/packages/studio/src/mocks/handlers.ts
  • web/packages/studio/src/mocks/intake/experiments.ts
  • web/packages/studio/src/mocks/intake/telemetry.ts
  • web/packages/studio/src/routes/EvaluationDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/EvaluationDetailRoute/index.tsx
  • web/packages/studio/src/routes/EvaluationDetailRoute/optimizerDisabled.test.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/TestCaseCompare.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/index.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/useSessionCompareRuns.ts
  • web/packages/studio/src/routes/ExperimentDetailRoute/ExperimentMetrics.tsx
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx
  • web/packages/studio/src/routes/ExperimentRoute/ExperimentCard.tsx
  • web/packages/studio/src/routes/ExperimentRoute/index.tsx
  • web/packages/studio/src/routes/agents/ClaudeCodeChatRoute/artifacts.ts
  • web/packages/studio/src/routes/groups/experimentRoutes.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/InsightExperiments.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.test.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerRoute/index.test.tsx
  • web/packages/studio/src/routes/utils.ts
  • web/packages/studio/src/tests/title-change.test.tsx
💤 Files with no reviewable changes (3)
  • web/packages/studio/src/mocks/intake/telemetry.ts
  • services/intake/tests/integration/spans/test_traces_read.py
  • services/intake/tests/test_spans_schemas.py

Comment thread openapi/ga/openapi.yaml

@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.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
web/packages/studio/src/components/ExperimentEditModal/index.tsx (1)

69-97: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Finish the visible terminology migration.

  • web/packages/studio/src/components/ExperimentEditModal/index.tsx#L69-L97: change the toast, modal title, and instruction to “experiment”.
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx#L23-L26: change the load-error message to “experiment”.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/packages/studio/src/components/ExperimentEditModal/index.tsx` around
lines 69 - 97, Finish the visible terminology migration by updating the error
toast, modal title, and instruction in ExperimentEditModal to use “experiment”
terminology instead of “group”; update the load-error message in
ExperimentDetailRoute likewise. Apply the requested wording changes at
web/packages/studio/src/components/ExperimentEditModal/index.tsx lines 69-97 and
web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx lines 23-26.
openapi/ga/openapi.yaml (1)

3639-3647: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stale "ExperimentGroup"/"group" wording in Patch Evaluation docs.

The PR's objective is renaming ExperimentGroup children to Experiment, but this endpoint's description ("curating an evaluation into another ExperimentGroup", "any new group must exist... belongs to >=1 group") and its 400 response ("A referenced ExperimentGroup does not exist") still use the old terminology, contradicting the rest of this same file (e.g. EvaluationPatchRequest docstring at Line 10607-10612 already says "experiment").

🔧 Suggested fix
       description: "Partially update an evaluation: only fields present in the request\
-        \ are changed.\n\nThe common case is curating an evaluation into another ExperimentGroup\
-        \ \u2014 PATCH with the merged\n``experiment_ids``. Membership is replaced\
-        \ (not appended), so send the full desired set; any new\ngroup must exist\
-        \ and the set must be non-empty (an evaluation always belongs to >=1 group).\
+        \ are changed.\n\nThe common case is curating an evaluation into another Experiment\
+        \ \u2014 PATCH with the merged\n``experiment_ids``. Membership is replaced\
+        \ (not appended), so send the full desired set; any new\nexperiment must exist\
+        \ and the set must be non-empty (an evaluation always belongs to >=1 experiment).\
         \ Omitted\nfields are left untouched (unlike the full-body PUT, which overwrites\
         \ them)."
...
         '400':
-          description: A referenced ExperimentGroup does not exist, or experiment_ids
+          description: A referenced Experiment does not exist, or experiment_ids
             is empty

Also applies to: 3674-3677

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

In `@openapi/ga/openapi.yaml` around lines 3639 - 3647, Update the Patch
Evaluation documentation in the operation description and its 400 response to
consistently use “Experiment” terminology instead of “ExperimentGroup” and
“group,” including membership and referenced-resource wording. Preserve the
existing PATCH behavior and replace only the stale terminology.
🧹 Nitpick comments (2)
web/packages/studio/src/components/IntakeDetail/README.md (1)

90-90: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Split this into Diataxis pages.

Keep architecture here; move route syntax to REFERENCE and “Adding a kind” to a HOW-TO. Add prerequisites and Next Steps.

As per coding guidelines, each documentation page must fit one Diataxis quadrant, list prerequisites at the top, and include a Next Steps section.

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

In `@web/packages/studio/src/components/IntakeDetail/README.md` at line 90, Split
the Intake detail documentation into Diataxis-aligned pages: keep the
architecture overview in the current README, move route syntax into a REFERENCE
page, and move “Adding a kind” into a HOW-TO page. Add a prerequisites section
at the top and a Next Steps section to every resulting page, ensuring each page
remains focused on one Diataxis quadrant.

Source: Coding guidelines

openapi/openapi.yaml (1)

11193-11217: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

ExperimentFilter lacks created_at/updated_at filters present on sibling filter schemas.

EvaluationFilter, ModelEntityFilter, FilesetFilter, etc. all expose DatetimeFilter-based created_at/updated_at. ExperimentFilter only has name, insight_id, is_deleted, metadata. Consider adding for parity if the backend model supports it.

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

In `@openapi/openapi.yaml` around lines 11193 - 11217, The ExperimentFilter schema
is missing created_at and updated_at fields. Add both properties to
ExperimentFilter using the same DatetimeFilter-based definitions and
descriptions as the sibling filter schemas, preserving the existing name,
insight_id, is_deleted, and metadata properties.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@openapi/ga/openapi.yaml`:
- Around line 10498-10501: Update the EvaluationFilter schema entry for
experiment_group_id to mark it deprecated, and add the experiment_ids filter
alongside it when supported by this endpoint, preserving the existing type and
descriptions for unaffected fields.

In
`@web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts`:
- Around line 25-26: Update isSameSort to compare the complete SortingState
arrays, including every sort entry’s id and desc direction rather than only
index 0. Preserve equality for identical multi-sort states and inequality when
any primary or secondary sort differs, and add a test covering recovery from a
failed secondary sort.

---

Outside diff comments:
In `@openapi/ga/openapi.yaml`:
- Around line 3639-3647: Update the Patch Evaluation documentation in the
operation description and its 400 response to consistently use “Experiment”
terminology instead of “ExperimentGroup” and “group,” including membership and
referenced-resource wording. Preserve the existing PATCH behavior and replace
only the stale terminology.

In `@web/packages/studio/src/components/ExperimentEditModal/index.tsx`:
- Around line 69-97: Finish the visible terminology migration by updating the
error toast, modal title, and instruction in ExperimentEditModal to use
“experiment” terminology instead of “group”; update the load-error message in
ExperimentDetailRoute likewise. Apply the requested wording changes at
web/packages/studio/src/components/ExperimentEditModal/index.tsx lines 69-97 and
web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx lines 23-26.

---

Nitpick comments:
In `@openapi/openapi.yaml`:
- Around line 11193-11217: The ExperimentFilter schema is missing created_at and
updated_at fields. Add both properties to ExperimentFilter using the same
DatetimeFilter-based definitions and descriptions as the sibling filter schemas,
preserving the existing name, insight_id, is_deleted, and metadata properties.

In `@web/packages/studio/src/components/IntakeDetail/README.md`:
- Line 90: Split the Intake detail documentation into Diataxis-aligned pages:
keep the architecture overview in the current README, move route syntax into a
REFERENCE page, and move “Adding a kind” into a HOW-TO page. Add a prerequisites
section at the top and a Next Steps section to every resulting page, ensuring
each page remains focused on one Diataxis quadrant.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 84aea33a-2dcb-480e-b5e5-39a3361acca2

📥 Commits

Reviewing files that changed from the base of the PR and between 0505b36 and 621576c.

📒 Files selected for processing (76)
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • services/intake/scripts/spans/seed_experiment_rollup_data.py
  • services/intake/scripts/spans/seed_experiments_demo.py
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • services/intake/src/nmp/intake/api/v2/experiments/schemas.py
  • services/intake/src/nmp/intake/service.py
  • services/intake/src/nmp/intake/spans/api/traces.py
  • services/intake/src/nmp/intake/spans/api/traces_schemas.py
  • services/intake/src/nmp/intake/spans/ingest/evaluation_context.py
  • services/intake/tests/integration/spans/test_atif_ingest.py
  • services/intake/tests/integration/spans/test_chat_completions_ingest.py
  • services/intake/tests/integration/spans/test_experiment_metric_sort.py
  • services/intake/tests/integration/spans/test_experiment_rollups.py
  • services/intake/tests/integration/spans/test_experiment_sessions.py
  • services/intake/tests/integration/spans/test_traces_read.py
  • services/intake/tests/integration/test_experiments_crud.py
  • services/intake/tests/test_atif_v17.py
  • services/intake/tests/test_experiment_default_sort.py
  • services/intake/tests/test_experiment_metric_filter.py
  • services/intake/tests/test_experiment_optimization_fields.py
  • services/intake/tests/test_experiment_sort_endpoint.py
  • services/intake/tests/test_spans_schemas.py
  • services/intake/tests/test_traces_api.py
  • web/packages/studio/src/components/ExperimentCreateModal/constants.ts
  • web/packages/studio/src/components/ExperimentCreateModal/index.tsx
  • web/packages/studio/src/components/ExperimentEditModal/index.test.tsx
  • web/packages/studio/src/components/ExperimentEditModal/index.tsx
  • web/packages/studio/src/components/IntakeDetail/README.md
  • web/packages/studio/src/components/charts/ExperimentParetoChart/MetricSelect.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/ParetoTooltip.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/index.tsx
  • web/packages/studio/src/components/charts/ExperimentParetoChart/useParetoEvaluations.ts
  • web/packages/studio/src/components/charts/ExperimentParetoChart/utils.test.ts
  • web/packages/studio/src/components/charts/ExperimentParetoChart/utils.ts
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/Empty.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.test.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/AddToGroupModal.test.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/AddToGroupModal.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/Empty.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/ExperimentDataView.css
  • web/packages/studio/src/components/dataViews/ExperimentDataView/MeanValueTooltipCell.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useExperimentEvaluations.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useExperimentEvaluations.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/util.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentDataView/util.ts
  • web/packages/studio/src/constants/routes.ts
  • web/packages/studio/src/mocks/handlers.ts
  • web/packages/studio/src/mocks/intake/experiments.ts
  • web/packages/studio/src/mocks/intake/telemetry.ts
  • web/packages/studio/src/routes/EvaluationDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/EvaluationDetailRoute/index.tsx
  • web/packages/studio/src/routes/EvaluationDetailRoute/optimizerDisabled.test.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/TestCaseCompare.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/index.tsx
  • web/packages/studio/src/routes/EvaluationSessionDetailRoute/useSessionCompareRuns.ts
  • web/packages/studio/src/routes/ExperimentDetailRoute/ExperimentMetrics.tsx
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.test.tsx
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx
  • web/packages/studio/src/routes/ExperimentRoute/ExperimentCard.tsx
  • web/packages/studio/src/routes/ExperimentRoute/index.tsx
  • web/packages/studio/src/routes/agents/ClaudeCodeChatRoute/artifacts.ts
  • web/packages/studio/src/routes/groups/experimentRoutes.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/InsightExperiments.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.test.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsx
  • web/packages/studio/src/routes/optimizer/OptimizerRoute/index.test.tsx
  • web/packages/studio/src/routes/utils.ts
  • web/packages/studio/src/tests/title-change.test.tsx
💤 Files with no reviewable changes (3)
  • web/packages/studio/src/mocks/intake/telemetry.ts
  • services/intake/tests/integration/spans/test_traces_read.py
  • services/intake/tests/test_spans_schemas.py
🛑 Comments failed to post (1)
web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts (1)

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

Compare the complete multi-sort state.

ExperimentDataView enables multiSort, but this compares only index 0. A failed secondary sort skips recovery and replaces the table with the full error state. Compare all entries and add a secondary-sort failure test.

Proposed fix
 const isSameSort = (a: SortingState, b: SortingState): boolean =>
-  a[0]?.id === b[0]?.id && (a[0]?.desc ?? false) === (b[0]?.desc ?? false);
+  a.length === b.length &&
+  a.every(
+    (sort, index) =>
+      sort.id === b[index]?.id &&
+      (sort.desc ?? false) === (b[index]?.desc ?? false)
+  );
📝 Committable suggestion

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

const isSameSort = (a: SortingState, b: SortingState): boolean =>
  a.length === b.length &&
  a.every(
    (sort, index) =>
      sort.id === b[index]?.id &&
      (sort.desc ?? false) === (b[index]?.desc ?? false)
  );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@web/packages/studio/src/components/dataViews/ExperimentDataView/useSortErrorRecovery.ts`
around lines 25 - 26, Update isSameSort to compare the complete SortingState
arrays, including every sort entry’s id and desc direction rather than only
index 0. Preserve equality for identical multi-sort states and inequality when
any primary or secondary sort differs, and add a test covering recovery from a
failed secondary sort.

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 27599/35351 78.1% 62.5%
Integration Tests 16113/34069 47.3% 19.8%

shanaiabuggy and others added 3 commits July 27, 2026 20:00
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Update nemo-experimentalist and nemo-evaluator to the regenerated SDK:
client.experiment_groups -> client.experiments, and the deprecated
evaluation write experiment_group_id -> experiment_ids. No behavior
change; the intake API keeps the legacy surface for other callers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
…ASE-550]

Update the nemo-experiments-upload skill to the renamed parent resource:
Experiment Group -> Experiment, /experiment-groups -> /experiments, and the
deprecated experiment_group_id write -> experiment_ids. Fix the stale gotcha
that called /experiments a deprecated evaluations alias (it is now the parent
resource; /experiment-groups is the hidden alias). Sync the vendored SDK copy.

Also apply Prettier formatting to the renamed Studio components.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Comment thread services/intake/src/nmp/intake/spans/ingest/evaluation_context.py Outdated
Comment thread web/packages/studio/src/mocks/intake/experiments.ts Outdated
Comment thread services/intake/tests/integration/spans/test_experiment_metric_sort.py Outdated
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com>
@shanaiabuggy
shanaiabuggy added this pull request to the merge queue Jul 29, 2026
Merged via the queue into main with commit 3df96dd Jul 29, 2026
56 checks passed
@shanaiabuggy
shanaiabuggy deleted the sbuggy/ase-550 branch July 29, 2026 04:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants