Skip to content

3 - FEAT: Registry Consistency - #3651

Merged
Richard Lundeen (richlundeen) merged 24 commits into
microsoft:mainfrom
richlundeen:richlundeen-converter-registry
Nov 3, 2026
Merged

Richard Lundeen (richlundeen) merged 24 commits into
microsoft:mainfrom
richlundeen:richlundeen-converter-registry

Conversation

@richlundeen

@richlundeen Richard Lundeen (richlundeen) commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Uses the same inline identity JSON view for scorers, techniques, and converters. Keeps converter input/output columns and replaces Remove with a small red corner control.

Changes:

  • Use shared inline identity-JSON rows for Scorers, Techniques, and Converters, with consistent typography and row density.
  • Keep converter input/output columns and add search, type, and output filters.
  • Replace Remove with a small red corner x, keeping confirmation, keyboard access, and touch targets.
  • Expose the registered technique factory's canonical identity through the existing API mapper.

Layer 3/10 | Previous: #3650 | Final: #3648 | Blocked by: #3650

Diff is cumulative until preceding layers merge.

Before (original GUI)

Converter parameters appear in the table, with a separate labeled Remove action.

Converter parameters appear in the table, with a separate labeled Remove action.

After

all three registry tabs use the same inline identity JSON.

all three registry tabs use the same inline identity JSON.

converter identity expands below the row; input/output columns and the red corner x stay visible.

converter identity expands below the row; input/output columns and the red corner x stay visible.

Video

registry-production-interaction.webm

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Move history into feature routes, add stored ID lookup, and retain the current chat draft.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve discard blocking before resetting the composer and use shared encoded continuation and scenario routes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep an explicit not-found page and Home recovery link at unknown URLs. Preserve the last valid chat and dataset views without changing legacy aliases or Registry index behavior.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Prefer the existing retained draft when entering Chat from another view. Keep an already open chat in place so live work is not replaced by an older snapshot. Cover the workflow with the real History table, Chat tabs, composer and reset controls.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use shared readiness and completion watchdogs instead of a short scheduling deadline while preserving the concurrent settings edit assertions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@behnam-o Behnam (behnam-o) 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.

[GHCP]: Verdict: APPROVE.

PR 3/10 - Registry Consistency. Please address and resolve both numbered inline comments in this review: the MEDIUM implementation finding labelled [GHCP]: and the LOW UX-consistency recommendation labelled [Behnam]:. Approval does not waive either comment.

Scope: the PR-3 increment, 9bd986a01e03a868d2594e815afc96ee0f0f4b36 -> 9fc4c51b4c5a34c832092a7c9d1882376e6264d0. Static review only; tests and browser validation were not run.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep result details within the viewport after resizing, preserve editor assertions across modal restoration, and align unit and mock callers with feature-owned new attacks and exact ID forwarding.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@richlundeen

Copy link
Copy Markdown
Contributor Author

Reply to #3651 (review)

Both requested findings are fixed in commit 176ffd4: converter filters now reconcile only after a successful complete catalog load, and targets expose their complete identity JSON through the shared expandable row without coupling it to defaults, visibility, or composite expansion. The focused frontend tests, type-check, and scoped lint pass. The inline threads remain open.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Automated review completed. No blocking concerns remain. This review records source coverage; it does not authorize merge.

@richlundeen
Richard Lundeen (richlundeen) marked this pull request as ready for review November 2, 2026 18:59
Copilot AI balanced review requested due to automatic review settings November 2, 2026 19:00

Copilot AI 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.

🟡 Changes recommended

Conversation-ID search misses scenario runs for pruned or branched conversations in upgraded databases because it omits the JSON-array membership check for pruned_conversation_ids.

1 open issue
What changed in this PR

Standardizes inline identity inspection across PyRIT’s registries. This cumulative diff also includes the preceding navigation and history changes.

Changes:

  • Introduces shared expandable identity rows and exposes canonical technique identities through the API.
  • Adds converter filter/removal styling and retains target configuration controls alongside identity inspection.
  • Consolidates feature history navigation, adds exact-ID scan lookup, and updates preferences, tests, and documentation.
File Description
tests/​unit/​memory/​test_scenario_history.py Tests reference-ID forwarding.
tests/​unit/​memory/​memory_interface/​test_interface_scenario_history.py Tests stored-history ID lookup and pagination.
tests/​unit/​backend/​test_technique_service.py Verifies canonical technique identity responses.
tests/​unit/​backend/​test_scenario_run_service.py Tests ID-bound history cursors.
tests/​unit/​backend/​test_scenario_run_routes.py Tests reference-ID validation and forwarding.
tests/​unit/​backend/​test_finding_export.py Updates exported-link expectations.
pyrit/​memory/​memory_interface.py Threads reference IDs through history APIs.
pyrit/​memory/​_scenario_history.py Adds reference-ID history filtering.
pyrit/​backend/​services/​scenario_run_service.py Binds history queries and cursors to IDs.
pyrit/​backend/​services/​finding_export.py Updates exported chat URLs.
pyrit/​backend/​routes/​scenarios.py Accepts history reference IDs.
pyrit/​backend/​README.md Documents canonical technique identity exposure.
pyrit/​backend/​models/​techniques.py Adds technique identity response field.
pyrit/​backend/​mappers/​technique_mappers.py Maps factory identity into responses.
frontend/​src/​utils/​userPreferences.ts Validates and restores sidebar preferences.
frontend/​src/​utils/​routeParams.ts Updates feature route builders.
frontend/​src/​utils/​routeParams.test.ts Updates route expectations.
frontend/​src/​utils/​chatDraft.ts Recognizes additional retained draft settings.
frontend/​src/​utils/​attackConversationRoute.cases.json Updates shared evidence-link cases.
frontend/​src/​types/​index.ts Extends identity, draft, and preference types.
frontend/​src/​styles/​touchTargets.ts Exports reusable narrow-screen query.
frontend/​src/​services/​api.ts Adds scan-history reference-ID parameter.
frontend/​src/​hooks/​useUserPreferences.test.tsx Tests sidebar preference persistence.
frontend/​src/​hooks/​useTour.ts Updates route examples in comments.
frontend/​src/​hooks/​useTour.test.ts Updates tour anchors and copy expectations.
frontend/​src/​hooks/​useMediaQuery.ts Adds reactive media-query hook.
frontend/​src/​hooks/​useMediaQuery.test.ts Tests media-query subscriptions and cleanup.
frontend/​src/​hooks/​useChatDraftHandoff.tsx Rejects stale draft snapshots.
frontend/​src/​hooks/​useChatDraftHandoff.test.tsx Updates draft-origin routes.
frontend/​src/​components/​Tour/​tourSteps.ts Aligns tour with feature navigation.
frontend/​src/​components/​Sidebar/​Navigation.tsx Adds expandable, labeled navigation.
frontend/​src/​components/​Sidebar/​Navigation.styles.ts Styles expanded navigation and active states.
frontend/​src/​components/​ScenarioSuites/​suiteRoutes.ts Moves suite progress under scanner history.
frontend/​src/​components/​ScenarioSuites/​suiteRoutes.test.ts Tests updated suite routes.
frontend/​src/​components/​ScenarioSuites/​ScenarioSuiteExecutionPage.tsx Updates launch links and heading levels.
frontend/​src/​components/​ScenarioSuites/​ScenarioSuiteExecutionPage.test.tsx Updates suite-page navigation expectations.
frontend/​src/​components/​ScenarioSuites/​LaunchSuiteDialog.test.tsx Updates post-launch destination expectation.
frontend/​src/​components/​Scenarios/​ScenarioRunPage.tsx Updates return destinations and headings.
frontend/​src/​components/​Scenarios/​ScenarioQueue.tsx Uses shared run-route builder.
frontend/​src/​components/​Scenarios/​ScenarioQueue.test.tsx Tests updated, encoded run links.
frontend/​src/​components/​Scenarios/​ScenarioFlow.test.tsx Updates catalog-to-run navigation coverage.
frontend/​src/​components/​Scenarios/​ScenarioDetail.tsx Updates launch links and heading hierarchy.
frontend/​src/​components/​Scenarios/​ScenarioCatalog.tsx Updates launch destinations and introductory copy.
frontend/​src/​components/​Scenarios/​ScenarioCatalog.test.tsx Updates catalog copy and route expectations.
frontend/​src/​components/​ScenarioPresets/​presetRoutes.ts Updates preset launch URLs.
frontend/​src/​components/​ScenarioPresets/​presetRoutes.test.ts Tests updated preset URLs.
frontend/​src/​components/​Registry/​TechniqueRegistry.tsx Replaces detail dialogs with inline identity.
frontend/​src/​components/​Registry/​TechniqueRegistry.test.tsx Tests inline technique identity inspection.
frontend/​src/​components/​Registry/​TechniqueRegistry.styles.ts Removes obsolete dialog styles.
frontend/​src/​components/​Registry/​ScorerRegistry.tsx Uses shared canonical identity rows.
frontend/​src/​components/​Registry/​ScorerRegistry.test.tsx Tests canonical scorer identity display.
frontend/​src/​components/​Registry/​ScorerRegistry.styles.ts Removes superseded identity styles.
frontend/​src/​components/​Registry/​ScenarioPresetRegistry.tsx Updates scanner launch link.
frontend/​src/​components/​Registry/​ScenarioPresetRegistry.test.tsx Updates scanner-link expectation.
frontend/​src/​components/​Registry/​RegistryIdentityRow.tsx Adds reusable expandable JSON row.
frontend/​src/​components/​Registry/​RegistryIdentityRow.test.tsx Tests keyboard interaction and independent expansion.
frontend/​src/​components/​Registry/​RegistryIdentityRow.styles.ts Standardizes identity typography and spacing.
frontend/​src/​components/​Registry/​Registry.styles.ts Removes obsolete converter styles.
frontend/​src/​components/​Registry/​ConverterRegistry.styles.ts Adds filter, column, and removal-control styles.
frontend/​src/​components/​Operations/​OperationDetailPage.tsx Adds separate operation-scoped history links.
frontend/​src/​components/​Operations/​OperationDetailPage.test.tsx Tests both scoped history destinations.
frontend/​src/​components/​Operations/​FindingEvidenceList.test.tsx Updates evidence conversation-link expectation.
frontend/​src/​components/​Layout/​PageNotFound.tsx Adds unmatched-route screen.
frontend/​src/​components/​Layout/​PageNotFound.styles.ts Styles unmatched-route screen.
frontend/​src/​components/​Layout/​MainLayout.tsx Adds responsive sidebar and feature-navigation slot.
frontend/​src/​components/​Layout/​MainLayout.test.tsx Tests sidebar persistence without workspace remount.
frontend/​src/​components/​Layout/​MainLayout.styles.ts Adds drawer sizing and dynamic viewport layout.
frontend/​src/​components/​Layout/​FeatureNavigation.tsx Adds feature tabs and New attack action.
frontend/​src/​components/​Layout/​FeatureNavigation.styles.ts Styles feature navigation.
frontend/​src/​components/​Home/​Home.tsx Adds explicit history-navigation callback.
frontend/​src/​components/​Home/​Home.test.tsx Tests history callback.
frontend/​src/​components/​History/​scenarioHistoryFilters.ts Serializes ID search in URLs.
frontend/​src/​components/​History/​scenarioHistoryFilters.test.ts Tests ID-filter round trips.
frontend/​src/​components/​History/​ScenarioHistory.tsx Adds exact-ID search and cursor reset.
frontend/​src/​components/​History/​ScenarioHistory.test.tsx Tests ID validation, clearing, and pagination.
frontend/​src/​components/​History/​ScenarioHistory.styles.ts Adjusts ID field and history layout.
frontend/​src/​components/​History/​HistoryPage.tsx Removes standalone history wrapper.
frontend/​src/​components/​History/​HistoryPage.test.tsx Removes obsolete wrapper tests.
frontend/​src/​components/​History/​HistoryPage.styles.ts Removes obsolete history-page styles.
frontend/​src/​components/​Configuration/​Configuration.test.tsx Updates scanner navigation fixture.
frontend/​src/​components/​Configuration/​Configuration.reload-guard.test.tsx Updates reload-guard navigation fixture.
frontend/​src/​components/​Config/​TargetTable.tsx Adds independent target identity expansion.
frontend/​src/​components/​Config/​TargetTable.test.tsx Tests identity alongside existing target controls.
frontend/​src/​components/​Chat/​ObjectiveHeader.tsx Keeps result popover within viewport.
frontend/​src/​components/​Chat/​ChatWindow.test.tsx Updates chat navigation and action coverage.
frontend/​src/​components/​Chat/​ChatWindow.styles.ts Reuses shared narrow-screen query.
frontend/​src/​auth/​AuthProvider.tsx Updates safe-path example in comments.
frontend/​src/​auth/​AuthProvider.test.tsx Updates login-return route cases.
frontend/​src/​App.targets.test.tsx Tests retained drafts versus new-attack defaults.
frontend/​src/​App.labels.test.tsx Updates navigation and shared-control expectations.
frontend/​e2e/​touch-targets.spec.ts Updates mobile navigation routes.
frontend/​e2e/​themes.spec.ts Updates themed route coverage.
frontend/​e2e/​sidebar.spec.ts Tests sidebar persistence and mobile drawer.
frontend/​e2e/​scenario-hierarchy.spec.ts Updates saved-chat and scan-return navigation.
frontend/​e2e/​routing.spec.ts Updates routing and preference scenarios.
frontend/​e2e/​registry.spec.ts Tests canonical technique identity with backend.
frontend/​e2e/​operations.spec.ts Updates history navigation and exported links.
frontend/​e2e/​operations-acceptance.spec.ts Updates operation-scoped feature flows.
frontend/​e2e/​onboarding-tour.spec.ts Updates tour route expectations.
frontend/​e2e/​numeric-controls.spec.ts Updates scanner launch destinations.
frontend/​e2e/​history.spec.ts Updates attack-history entry flow.
frontend/​e2e/​flows.spec.ts Updates shared navigation helpers.
frontend/​e2e/​errors.spec.ts Updates navigation selectors.
frontend/​e2e/​converters.spec.ts Updates converter-flow navigation.
frontend/​e2e/​config.spec.ts Tests retained drafts and new defaults.
frontend/​e2e/​compatibility.spec.ts Updates navigation visibility selectors.
frontend/​e2e/​chat.spec.ts Updates chat and New attack selectors.
frontend/​e2e/​chat-scoring.spec.ts Updates scoring-chat destination.
frontend/​e2e/​chat-recovery.spec.ts Updates recovery-flow navigation.
frontend/​e2e/​api.spec.ts Updates responsiveness assertion selector.
frontend/​e2e/​analytics.spec.ts Updates result drill-down routes.
frontend/​e2e/​accessibility.spec.ts Updates navigation and heading assertions.
doc/​gui/​0_gui.md Documents registries, feature history, and sidebar preferences.

Review effort: Balanced

Comment thread pyrit/memory/_scenario_history.py Resolved
Integrate main 0ffa2fc, preserving legacy pruned-conversation history lookup and current chat navigation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@richlundeen

Copy link
Copy Markdown
Contributor Author

The pruned-conversation lookup concern from this review is fixed in merge commit 6a1f5e801b2d7360940f8a6aef510ae3c0c6c04e. The scenario-history query now includes dialect-aware JSON-array membership for legacy pruned conversation IDs; the regression test for upgraded history passes.

@richlundeen
Richard Lundeen (richlundeen) added this pull request to the merge queue Nov 3, 2026
Merged via the queue into microsoft:main with commit 460ab26 Nov 3, 2026
224 of 311 checks passed
@richlundeen
Richard Lundeen (richlundeen) deleted the richlundeen-converter-registry branch November 3, 2026 05:19
Richard Lundeen (richlundeen) added a commit to richlundeen/PyRIT that referenced this pull request Nov 3, 2026
Preserve both integration branches and remove the obsolete App mock binding exposed by merging.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants