Skip to content

Add Scenario catalog and launch - #2373

Draft
Roman Lutz (romanlutz) wants to merge 1 commit into
copilot/romanlutz-scenario-pr-01-progress-upstreamfrom
copilot/romanlutz-scenario-pr-02-catalog-upstream
Draft

Add Scenario catalog and launch#2373
Roman Lutz (romanlutz) wants to merge 1 commit into
copilot/romanlutz-scenario-pr-01-progress-upstreamfrom
copilot/romanlutz-scenario-pr-02-catalog-upstream

Conversation

@romanlutz

@romanlutz Roman Lutz (romanlutz) commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds registered Scenario discovery, target and technique configuration, dataset and baseline selection, authoritative launch previews, and run creation. The post-launch handoff remains intentionally small because live monitoring arrives in the next layer.

What this layer adds

  • Searchable registered Scenario catalog and details.
  • Target, technique, dataset, baseline, and Scenario-parameter configuration.
  • Backend-authoritative launch preview and validation.
  • Run creation and navigation into the Scenario workflow.

Preview

Scenario catalog and configuration entry points

Stack

This is 2 of 7 in native GitHub Stack #2390 and depends on #2372.

Layer Scope Pull request
1 Progress foundation #2372
2 Catalog and launch (this PR) #2373
3 Live progress #2374
4 Run history #2375
5 FIFO scheduling #2376
6 Configuration sizing #2377
7 Result details #2378

See the full implementation, screenshots, walkthrough, validation, and operational notes.

Validation

  • Backend: 15,212 passed, 120 skipped.
  • Frontend: 68/68 suites, 1,286/1,286 tests; lint, TypeScript, and production build passed.
  • Mock E2E, retries disabled: 91 passed, 0 failed, 0 skipped.
  • Seeded E2E, retries disabled: 62 passed, 0 failed, 0 skipped.
  • All configured pre-commit hooks passed; distinguished-engineer review approved the final stack.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5d02c2d5-b499-4f78-a04d-03bffa750817
@romanlutz
Roman Lutz (romanlutz) force-pushed the copilot/romanlutz-scenario-pr-02-catalog-upstream branch from e33b175 to 467504c Compare August 25, 2026 06:24
<div className={styles.header}>
<div className={styles.headerText}>
<Text id="scenario-catalog-title" as="h1" size={600} weight="semibold">
Scenarios

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.

Can we name this "Scanner"? Also wonder if it'd be useful to link to our docs

labels,
}: BuildRunRequestInput): BuildRunRequestResult {
if (!targetName) {
return { ok: false, error: 'Select a target.' }

@rlundeen2 Richard Lundeen (rlundeen2) Aug 26, 2026

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 Generated): This target validation also blocks the estimate request. For example, airt.leakage can calculate its run size from the selected techniques and datasets without a target, and the backend makes ScenarioRunSizeEstimateRequest.target_name optional. Please separate estimate validation from launch validation so a target is required only when the user launches the run. A selected target can still be included for scenarios whose estimates depend on target capabilities.


return (
<Text size={200} weight="semibold">
{datasets

@rlundeen2 Richard Lundeen (rlundeen2) Aug 26, 2026

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 Generated): Please rename this column to Default datasets and use the same two-line summary for every scenario. The first line should show the total selected default count across all datasets (for example, 18 objectives). The second line should list only the dataset names. This will make multi-dataset rows such as adaptive.text_adaptive look like airt.cyber instead of repeating a count beside every dataset.

|| estimate.minimum != null
|| estimate.maximum != null
return hasPlannedAttackBound
? `${attemptSummary} · ${formatProgressUnitSummary(estimate)}`

@rlundeen2 Richard Lundeen (rlundeen2) Aug 26, 2026

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 Generated): Please keep the Default run size column uniform across scenarios. When the estimate is uncertain, show only the minimum-to-maximum attack range, such as 12-20 attacks. Do not expose adaptive implementation terms such as attack attempts and progress units in this catalog summary. Those details can remain in the scenario detail view.

const estimate: ScenarioRunEstimate = {
version: response.version,
scope,
total: response.total_attack_count,

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 Generated): This does not match the backend response contract and crashes the whole catalog after a clean start. The live /api/scenarios/catalog response contains estimated_attack_count and does not contain status, version, total_attack_count, or retries_included. As a result, total becomes undefined; because undefined !== null, the summary calls undefined.toLocaleString() and the page shows the error boundary. Please align the frontend type and adapter with ScenarioRunSizeEstimate, or change the backend response model and serialization in the same stack.

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