Skip to content

feat(apollo-react): shared support for the classifier guardrail [AL-644] - #1410

Merged
andreizdrali-uipath merged 12 commits into
mainfrom
feat/apollo-react-guardrail-classifier
Oct 19, 2026
Merged

andreizdrali-uipath merged 12 commits into
mainfrom
feat/apollo-react-guardrail-classifier

Conversation

@andreizdrali-uipath

@andreizdrali-uipath andreizdrali-uipath commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

What

Shared support for the Agents classifier guardrail (Jev Classifier, UiPath/Agents#6449). Read generically, its definition renders unusably: a raw multi-select of 26 question names, a bare text list, a threshold row per question and a free-text vendor box. This ports the behaviour of Agents frontend-sw's ClassifierQuestionPicker, ClassifierCustomQuestionsEditor, ClassifierThresholdSlider, api/hooks/classifier-questions.ts and the classifier branches of ApolloToolGuardrailPolicyBuilder's renderParameter into the family, on apollo-wind and Tailwind (no MUI, Emotion or Ap*), so frontend-sw can delete its MUI copies and Flow gets the same screen.

Wire contract unchanged, no new $parameterType.

Commits

  1. Curated copy (130cc547): classifier in definitions-copy.ts with Agents' English verbatim (single-host rule, like sentiment's 51f559e5), plus the 7 category headings as a new optional GuardrailValidatorCopy.categoryLabels (guardrails.definitions.classifier.category.<id>). Agents baseline, SINGLE_HOST_VALIDATORS.classifier, id pattern and parity flatten extended, CLASSIFIER_WIRE from OutOfTheBoxGuardrailDefinitions.cs.
  2. Builder fix (a8f2cfb3): GuardrailBuilder saved 0 for every untuned classifier question. On save, syncMapEnumParameters fills keys missing from a map-enum with the per-key default, then min. The classifier's map defaults to {} with min 0, and stores only tuned questions (a missing key runs at the backend's 0.5). So "pick two questions, tune one, save" saved the other at 0 and flagged every payload; reopening such a guardrail did the same. Agents' flag-on path has this today. A map listed in overrideParameterIds is now pruned but not filled (new leaveUnsetIds option); a probed override keeps the old fill.
  3. Question catalog (80fdeb6b): useClassifierQuestions(ctx | null, { questions, enabled, copy }) over GET /api/execution/guardrails/classifier-questions. Same context and three host shapes as useGuardrailDefinitions, never throws, private zod, hand-written wire type. The two hooks now share one private request core, moved out of useGuardrailDefinitions unchanged (its suite passes as it was).
  4. Editors (9a54ae8b): ClassifierQuestionPicker (grouped, searchable, collapsible, select-all with counts, Strictness slider for yes/no, severity-tier select for score, one onChange(selected, thresholds)) and ClassifierCustomQuestionsEditor, about 30 guardrails.classifier.* ids with labels overrides, and the pure sidecar helpers plus hasClassifierQuestions.
  5. Builder seam (b912d8d7): useClassifierGuardrailParameters claims selectedQuestions, questionThresholds, questions and modelVendor, leaves model to the host, and returns a validateParameters save gate for "no questions". README section and a Classifier builder story.
  6. Empty parameter rows (d6c81c12): a parameter that renders nothing (an override returning null, such as questionThresholds and modelVendor, or a threshold map with no key selected) kept its grid row, doubling the gap around it. GuardrailValidatorForm now hides an empty field cell. Found in Storybook: the model field sat 32px below the custom questions instead of 16px.

Review-stage commits

  1. Trim (df5506ef): +4363 down to +2979 lines.
    • The catalog parser joins definitions-parse.ts (zod stays in one file); the wire type joins definitions-wire.ts; enrichment folds into the hook.
    • Both editors take the parameter's definition and reuse ParameterLabel.
    • The level, tier and sanitize helpers and the pure parse and enrich functions are no longer exported.
    • The catalog fixture keeps 10 of the 26 questions; tests keep one case per behaviour; stories and the README section are about half as long.
  2. Severity display (6fe47dcf, Copilot): a stored threshold between two levels shows the first level that reaches it, not the nearest.
  3. Threshold-map errors (8f20762e, Copilot): questionThresholds shows its own error (for example a saved value above 1). GuardrailValidatorForm now clears the error of every defined parameter an override rewrites, so a corrected host error stops holding Save.
  4. Custom-question errors (23b0e23d, Copilot): each question is described by the editor's error.
  5. abc5c16c: a test matcher in commit 9 had lost its d.
  6. Narrow panels (1d7b9b29, from Flow at 260 to 420px): the slider track shrinks and its Strictness label and percentage sit above it; Strict, Balanced and Lenient mark the start, middle and end; the severity select wraps under its label; both rows start at the checkbox edge; each custom question is a card with a "Question {position}" title and the delete button in its header. Checked in Storybook at 280px and 400px: no horizontal overflow, the delete button stays visible, and the legend labels keep at least 32px between them.

Host adoption (both products)

const { categories } = useClassifierQuestions(ctx, { enabled: isClassifier });
const classifier = useClassifierGuardrailParameters({ definition, categories });

<GuardrailBuilder
  renderParameter={(c) => classifier.renderParameter(c) ?? renderModelPicker(c)}
  overrideParameterIds={[...classifier.overrideParameterIds, 'model']}
  onSave={(value) => classifier.validateParameters(value.validatorParameters) && persist(value)}
/>

The host's model picker keeps writing modelVendor with model. Declare overrideParameterIds: that is what turns on the threshold fix. Agents passes none today, so it relies on the probe and would keep zero-filling.

Behaviour notes for review

  • Chrome English is Agents' verbatim, em dashes included ("Counts as yes (flags) — optional"), so frontend-sw's screens read the same after the swap. The no-em-dash rule applies to story copy, which has none.
  • The picker's rows highlight with accent, which in the future themes equals the checkbox border, so an unchecked box vanished under the pointer; a hovered row's checkbox takes muted-foreground.
  • Deviations from the MUI originals, all deliberate:
    • A question's checkbox is named by its visible question text, not "Select question pii_contact_information".
    • Each category has one toggle button instead of a clickable heading plus an icon button.
    • The slider shows its percentage next to the track rather than on hover.
  • English only. The l10n sync fills the other 12 catalogs.

Test plan

  • Full apollo-react on the pushed branch: 4063 passed, 33 failed. 31 are the known environment failures in 8 files (Node localStorage, JsonTree.import timeout, the chat suites), the same as on a clean tree; the other 2 were commit 9's tests with a broken matcher, fixed in abc5c16c (the seam suite is 6/6 after it, and fails without commit 9's GuardrailValidatorForm change).
  • tsc 0, biome clean (only the builder's pre-existing hostErrors warnings), rslib build clean with no zod in the folder's .d.ts (before the trim; the trim moves zod back into one file).
  • Storybook (future dark): the Classifier builder story end to end; parameter spacing even; checkboxes stay visible on row hover.
  • CI, visual regression (new stories).
  • Hosts: Agents and Flow adoption PRs (see Host adoption).

🤖 Generated with Claude Code

andreizdrali-uipath and others added 3 commits October 19, 2026 15:12
Adds the classifier to the canonical definitions copy: its name and
description, labels for selectedQuestions, questions and model, and
tooltips for the first two. The wording is Agents' own from
the merged UiPath/Agents#6449, so its legacy screens and the shared
ones read the same. Flow has no classifier yet, so it joins sentiment
as a single-host validator in the parity suite.

The question catalog groups its questions by category, and those seven
headings are copy too. They ride on the validator's entry as a new
optional categoryLabels map, ids guardrails.definitions.classifier.
category.<groupId>; enrichment ignores them, since no parameter carries
them. English only; the l10n sync fills the other catalogs.

CLASSIFIER_WIRE is the definition the backend sends, and the parser
keeps it whole.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… unset [AL-644]

At save time GuardrailBuilder prunes every map-enum to the keys its
keySource selects and fills the keys it lacks (stored value, per-key
default, then min), so the saved map matches MapEnumField's rows.

The classifier renders its threshold map itself and stores a threshold
only for a question the user tuned; a question with no entry runs at
the backend's 0.5. Its map defaults to {} with min 0, so picking two
questions, tuning one and saving stored 0 for the other, which flags
every payload. Reopening a guardrail saved that way did the same.

A map listed in overrideParameterIds is now pruned but not filled,
through a new leaveUnsetIds option on syncMapEnumParameters. A probed
override is still filled: only the form knows which ids the probe
claimed, which is one more reason to declare them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
useClassifierQuestions(ctx | null, { questions, enabled, copy }) reads
GET /api/execution/guardrails/classifier-questions, the predefined
questions grouped by category as the validator runs them, and returns
the categories with their headings resolved from the curated copy.

It takes the same context and the same three host shapes as
useGuardrailDefinitions: a context to fetch, null plus a catalog the
host already holds, null alone to stay idle. Both hooks now share one
private request core, moved out of useGuardrailDefinitions unchanged;
that hook's suite passes as it was and pins the shared behaviour.

The parser never throws. zod stays private to it, the wire types are
hand-written and pinned to the schema both ways, and a malformed
question is dropped and reported while its siblings stay.
parseClassifierQuestions and enrichClassifierQuestions are exported
for callers outside React.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 19, 2026 12:39
@andreizdrali-uipath andreizdrali-uipath added the dev-packages Adds dev package publishing on pushes to this PR label Oct 19, 2026
@github-actions github-actions Bot added size:XXL 1,000+ changed lines. pkg:apollo-react and removed size:XXL 1,000+ changed lines. labels Oct 19, 2026
@github-actions
github-actions Bot temporarily deployed to preview/apollo-vertex October 19, 2026 12:39 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-docs October 19, 2026 12:39 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-landing October 19, 2026 12:40 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-design October 19, 2026 12:40 Destroyed
@github-actions

Copy link
Copy Markdown
Contributor

Dependency License Review

  • ✅ 1947 package(s) scanned
  • ✅ No license issues found
  • ⚠️ 2 package(s) excluded (see details below)
License distribution
License Packages
MIT 1713
ISC 91
Apache-2.0 56
BSD-3-Clause 28
BSD-2-Clause 23
BlueOak-1.0.0 8
MPL-2.0 4
MIT-0 3
CC0-1.0 3
MIT OR Apache-2.0 2
(MIT OR Apache-2.0) 2
Unlicense 2
LGPL-3.0-or-later 1
Python-2.0 1
CC-BY-4.0 1
(MPL-2.0 OR Apache-2.0) 1
Unknown 1
Artistic-2.0 1
(WTFPL OR MIT) 1
(BSD-2-Clause OR MIT OR Apache-2.0) 1
CC-BY-3.0 1
0BSD 1
(MIT OR CC0-1.0) 1
MIT AND ISC 1
Excluded packages
Package Version License Reason
@img/sharp-libvips-linux-x64 1.3.4 LGPL-3.0-or-later LGPL pre-built binary, not linked
khroma 2.1.0 Unknown MIT per GitHub repo, missing license field in package.json

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

📦 Dev Packages

🧹 Dev packages cleaned up after PR close.

Last updated: 2026-10-19 07:47:25 PT

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Persisted thresholds can display misleading severity cutoffs, and threshold validation errors are hidden.

2 open issues
What changed in this PR

Adds shared classifier guardrail support to Apollo React so Agents and Flow can use the same editors without changing the wire contract.

Changes:

  • Adds question catalog loading, validation, localized copy, and editors.
  • Integrates classifier parameters with the builder and preserves unset thresholds.
  • Adds tests, fixtures, documentation, and Storybook examples.

Paths below are relative to packages/apollo-react/src/canvas/.

File Description
locales/​en.json Adds classifier English strings.
components/​Guardrails/​utils.ts Supports leaving threshold keys unset.
components/​Guardrails/​utils.test.ts Tests sparse threshold synchronization.
components/​Guardrails/​use-guardrails-request.ts Extracts shared request handling.
components/​Guardrails/​use-guardrail-definitions.ts Uses shared request handling.
components/​Guardrails/​use-classifier-questions.ts Loads and enriches the catalog.
components/​Guardrails/​use-classifier-questions.test.tsx Tests catalog loading.
components/​Guardrails/​use-classifier-guardrail-parameters.tsx Integrates classifier editors and validation.
components/​Guardrails/​use-classifier-guardrail-parameters.test.tsx Tests builder integration.
components/​Guardrails/​README.md Documents classifier adoption.
components/​Guardrails/​index.ts Exports classifier APIs.
components/​Guardrails/​i18n.ts Adds localized editor labels.
components/​Guardrails/​i18n.test.ts Checks label and catalog parity.
components/​Guardrails/​guardrail-builder.tsx Preserves unset overridden thresholds.
components/​Guardrails/​guardrail-builder.test.tsx Tests overridden map persistence.
components/​Guardrails/​guardrail-builder.stories.tsx Demonstrates classifier integration.
components/​Guardrails/​definitions-parse.test.ts Covers classifier definitions and parser boundaries.
components/​Guardrails/​definitions-parity.test.ts Extends host-copy parity checks.
components/​Guardrails/​definitions-enrich.test.ts Tests classifier definition enrichment.
components/​Guardrails/​definitions-copy.ts Adds classifier copy and category headings.
components/​Guardrails/​definitions-copy.test.ts Checks classifier copy coverage.
components/​Guardrails/​components/​classifier-threshold-slider.tsx Adds the strictness slider.
components/​Guardrails/​classifier-utils.ts Adds sidecar and severity helpers.
components/​Guardrails/​classifier-utils.test.ts Tests parameter and severity helpers.
components/​Guardrails/​classifier-questions-wire.ts Defines public catalog types.
components/​Guardrails/​classifier-questions-parse.ts Validates catalog payloads.
components/​Guardrails/​classifier-questions-parse.test.ts Tests catalog validation.
components/​Guardrails/​classifier-questions-enrich.ts Resolves category headings.
components/​Guardrails/​classifier-questions-enrich.test.ts Tests catalog enrichment.
components/​Guardrails/​classifier-question-picker.tsx Adds grouped question selection.
components/​Guardrails/​classifier-question-picker.test.tsx Tests picker behavior and accessibility.
components/​Guardrails/​classifier-question-picker.stories.tsx Demonstrates picker states.
components/​Guardrails/​classifier-custom-questions-editor.tsx Adds custom question editing.
components/​Guardrails/​classifier-custom-questions-editor.test.tsx Tests editing and persistence.
components/​Guardrails/​classifier-custom-questions-editor.stories.tsx Demonstrates custom question editing.
components/​Guardrails/​__fixtures__/​host-copy-baselines.ts Adds Agents classifier copy baseline.
components/​Guardrails/​__fixtures__/​definitions-wire.fixtures.ts Adds classifier definition fixtures.
components/​Guardrails/​__fixtures__/​classifier-questions.fixtures.ts Adds the question catalog fixture.

Review effort: Balanced

Comment thread packages/apollo-react/src/canvas/components/Guardrails/classifier-utils.ts Outdated
andreizdrali-uipath and others added 3 commits October 19, 2026 15:50
…ditor [AL-644]

ClassifierQuestionPicker renders the classifier's predefined questions
grouped by category: searchable by question text, each category
collapsible with a selected count and a select-all. A selected yes/no
question takes a Strictness slider (0..1, step 0.1, Strict, Balanced
and Lenient marks); a selected score question takes the severity tier
it flags from, stored as level / (levels - 1). A question the user
never tunes stores nothing and runs at the backend's 0.5. Both values
come back in one onChange(selected, thresholds), so a question leaving
the selection takes its threshold with it.

ClassifierCustomQuestionsEditor edits the author's own questions, each
with its Strictness and optional "counts as yes" / "counts as no"
definitions. Rows live in local state so a blank row can be typed
into, and only rows with a question persist.

Both are apollo-wind and Tailwind only, resolve nothing, and take their
chrome from lingui guardrails.classifier.* ids with labels overrides,
in Agents' English from UiPath/Agents#6449. The pure helpers ship with
them: read, write and sanitize for the position-keyed sidecars,
hasClassifierQuestions for the save gate, and the level mapping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… builder [AL-644]

useClassifierGuardrailParameters({ definition, categories }) is the one
seam both hosts compose into GuardrailBuilder. It claims
selectedQuestions, questionThresholds, questions and modelVendor, and
returns undefined for the rest, so model falls through to the host's
own discovery picker:

- selectedQuestions renders ClassifierQuestionPicker, which writes both
  lists in one onParametersChange; questionThresholds renders nothing
- questions renders ClassifierCustomQuestionsEditor, which writes the
  list and its position-keyed sidecars together
- modelVendor renders nothing until the builder flags it with a model
  chosen, then asks for the model again
- validateParameters is the save gate for the rule the builder cannot
  know, at least one question across both lists, with its message on
  the picker until either editor changes

Nothing is claimed for another validator or a bring-your-own one. The
editors mount through the existing renderParameter seam, so this adds
no renderer next to MetadataForm. Documented in the README, with a
Classifier builder story composing the seam the way the hosts will.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nothing [AL-644]

Every parameter owns a cell in GuardrailValidatorForm's grid, and a
field that renders nothing kept its row: an override returning null,
such as the classifier's questionThresholds and modelVendor, or a
threshold map with no key selected. Each empty row added a second gap,
so the classifier's model field sat twice as far from its neighbours.
An empty field cell is now hidden, which removes its row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 19, 2026 12:50
@andreizdrali-uipath
andreizdrali-uipath force-pushed the feat/apollo-react-guardrail-classifier branch from c113f56 to d6c81c1 Compare October 19, 2026 12:50
@github-actions
github-actions Bot temporarily deployed to preview/apollo-landing October 19, 2026 12:51 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-docs October 19, 2026 12:51 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-design October 19, 2026 12:51 Destroyed
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

📊 Coverage + size by package

Per-package coverage and bundle size on this PR. New-line coverage = of the source lines this PR adds or changes, the % hit by tests.

Package Coverage New-line coverage Packed (gzip) Unpacked vs main
@uipath/apollo-core — — 42.02 MB 50.17 MB ±0
@uipath/apollo-react 51.7% 87.4% (285/326) 8.01 MB 31.60 MB +22.6 KB
@uipath/apollo-ui-icons — — 2.86 MB 6.97 MB ±0
@uipath/apollo-vertex — — — — —
@uipath/apollo-wind — — 785.2 KB 4.55 MB −9 B
@uipath/ap-chat 85.8% — 40.37 MB 45.58 MB +1.2 KB

"Coverage" is each package's own coverage.include scope (e.g. apollo-core instruments only scripts/). "Packed"/"Unpacked" come from npm pack --dry-run and only cover built packages — "—" means not measured this run (package not affected / not built). "vs main" is the packed (gzipped) delta against the last successful main build (the package-sizes artifact from the Release workflow); "—" there means no main baseline was available this run. The baseline is main's latest build, not this PR's exact merge-base, so it includes any drift since the branch diverged. Packages with no vitest config are omitted.

@github-actions
github-actions Bot temporarily deployed to preview/apollo-vertex October 19, 2026 12:51 Destroyed
@github-actions github-actions Bot added the size:XXL 1,000+ changed lines. label Oct 19, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Threshold validation errors can silently block saving after correction, and custom-question errors lack an accessible association.

4 open issues

Review effort: Balanced

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Storybook visual diff

⏭️ Skipped: the apollo-design preview deployment did not succeed, so no comparison ran. Logs

Updated (PT): Oct 19, 2026, 07:17:29 AM

Copilot AI balanced review requested due to automatic review settings October 19, 2026 13:15
@github-actions
github-actions Bot temporarily deployed to preview/apollo-docs October 19, 2026 13:15 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-design October 19, 2026 13:15 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-landing October 19, 2026 13:15 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-vertex October 19, 2026 13:15 Destroyed
…tests [AL-644]

The two tests added with the threshold-error fix looked for the
Intellectual property toggle with a pattern that had lost its \d, so
they failed before reaching the code under test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Stored zero thresholds can misrepresent the effective policy, and validation messages can persist across builder sessions.

3 open issues
3 resolved since last review

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings October 19, 2026 13:20
@github-actions
github-actions Bot temporarily deployed to preview/apollo-landing October 19, 2026 13:20 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-docs October 19, 2026 13:20 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-vertex October 19, 2026 13:21 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-design October 19, 2026 13:21 Destroyed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Custom thresholds bypass range validation, and vendor errors can lose their actionable messages.

2 open issues
2 previously missed issues

In code that hasn't changed since last review

Medium severity Nonempty vendor errors are incorrectly replaced

packages/​apollo-react/​src/​canvas/​components/​Guardrails/​use-classifier-guardrail-parameters.tsx:135

When a host supplies a modelVendor error for a nonempty vendor, this replaces its actionable message with “This model has no vendor.” A disallowed-vendor error, for example, becomes a misleading missing-value error while still blocking Save. Use the specialized message only when the vendor is blank; otherwise preserve ctx.error.

Medium severity Custom thresholds bypass range validation

packages/​apollo-react/​src/​canvas/​components/​Guardrails/​use-classifier-guardrail-parameters.tsx:147

Custom thresholds use questionThreshold.{i} sidecars, which are absent from the definitions checked by the builder's range validation. A saved questionThreshold.0 of 1.4 therefore passes this gate and is saved unchanged, even after editing the question text. The equivalent predefined-question threshold blocks Save. Validate custom thresholds as finite numbers within 0..1 and show an editor error before allowing Save. Add a regression test for reopening and saving an invalid custom threshold.

1 resolved since last review

Review effort: Balanced

…AL-644]

Flow's builder panel runs about 260 to 420px wide, and three things
broke there; Agents hits them too.

- The threshold slider's track had a 220px minimum and pushed the row
  past the panel. The track now shrinks, and the Strictness label and
  percentage sit above it, so the track and its legend get the full
  row: beside them, a 280px panel left 89px of track for 125px of
  labels.
- Strict, Balanced and Lenient sat at 0.3, 0.5 and 0.8 and collided on
  a short track. They now mark its start, middle and end.
- The severity row kept a 160px select beside a label that would not
  shrink. It wraps the select under the label when there is no room,
  and both the severity and strictness rows start at the checkbox edge.
- Consecutive custom questions ran together. Each is now a card like a
  custom guardrail's rule card: a "Question {position}" title (a new
  id, English only) and the delete button in its header, the question
  full width below, no indent on its refinements.

The same fixes as flow-workbench b8af0a65f and a0e5bfe43 make to Flow's
legacy copies, plus the stacked slider label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 19, 2026 14:08
@github-actions
github-actions Bot temporarily deployed to preview/apollo-design October 19, 2026 14:09 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-vertex October 19, 2026 14:09 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-docs October 19, 2026 14:09 Destroyed
@github-actions
github-actions Bot temporarily deployed to preview/apollo-landing October 19, 2026 14:09 Destroyed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Stored zero score thresholds still display a positive cutoff while retaining flag-all behavior.

2 open issues

Review effort: Balanced

@andreizdrali-uipath
andreizdrali-uipath marked this pull request as ready for review October 19, 2026 14:41
@andreizdrali-uipath
andreizdrali-uipath merged commit adfa2f0 into main Oct 19, 2026
42 of 46 checks passed
andreizdrali-uipath added a commit that referenced this pull request Oct 19, 2026
…ually flags [AL-644]

The severity select rounded a stored threshold to the nearest level, so
a value between two levels could show a lower tier than the one that
flags. On a four-level ladder 0.75 showed High, which scores 2/3; only
Critical reaches 0.75. It now shows the first level that reaches the
threshold. Values the picker writes sit on a level and read the same.

Raised by Copilot on #1410.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
andreizdrali-uipath added a commit that referenced this pull request Oct 19, 2026
…rs [AL-644]

The classifier's questionThresholds slot rendered nothing, so an error
on it held Save with no visible reason: a saved threshold above 1, or
an error the host reported. It now shows the error, named by the
parameter's label, where the map's field sits.

A host error on the map also outlived its correction. The picker writes
the map together with selectedQuestions through onParametersChange,
and GuardrailValidatorForm cleared only the error of the parameter
that rendered the override. It now clears every defined parameter the
replacement changes, which also covers any other override that writes
more than one parameter.

Raised by Copilot on #1410.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
andreizdrali-uipath added a commit that referenced this pull request Oct 19, 2026
…AL-644]

The custom-questions editor marked each question aria-invalid but never
pointed it at the message, so a screen reader landing on a question
later heard that it was invalid but not why. Each question is now
described by the editor's error, as the predefined-question picker's
group already is.

Raised by Copilot on #1410.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@andreizdrali-uipath
andreizdrali-uipath deleted the feat/apollo-react-guardrail-classifier branch October 19, 2026 14:44

This branch was successfully deployed

No deployments
preview/apollo-landing — 1d7b9b29 Deployed Oct 19, 2026 by github-actions[bot]
preview/apollo-docs — 1d7b9b29 Deployed Oct 19, 2026 by github-actions[bot]
preview/apollo-vertex — 1d7b9b29 Deployed Oct 19, 2026 by github-actions[bot]
preview/apollo-design — 1d7b9b29 Deployed Oct 19, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dev-packages Adds dev package publishing on pushes to this PR pkg:apollo-react size:XXL 1,000+ changed lines.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants