Skip to content

[Agents Extension] Add test scenarios using interactive test tool - #9342

Draft
trangevi wants to merge 39 commits into
mainfrom
trangevi/test-scenarios
Draft

[Agents Extension] Add test scenarios using interactive test tool#9342
trangevi wants to merge 39 commits into
mainfrom
trangevi/test-scenarios

Conversation

@trangevi

Copy link
Copy Markdown
Member

No description provided.

trangevi and others added 30 commits June 2, 2026 11:15
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
…ll add back later

Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Signed-off-by: trangevi <trangevi@microsoft.com>
Adds a workflow skill under .github/skills/agent-scenario-tests/ that resolves the current branch's PR, maps changed files to impacted cli-interactive-tester scenario tags, drives the matching scenarios through the tester MCP server, and posts a results comment on the PR. Cost-aware: Tier 2 runs only after explicit user confirmation.

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

Add 9 cli-interactive-tester scenarios closing the coverage gaps found in the
PR #8524 review:

- eval (cmd:eval): 00-eval-context-required (offline endpoint-required) and
  28-eval-lifecycle (Tier 2 init/run/list/show against the shared agent).
- optimize (cmd:optimize): 00-optimize-apply-requires-candidate (offline
  required-flag) and 29-optimize-submit-and-cancel (Tier 2, capped iteration).
- invoke: 00-invoke-validate-protocol (offline unsupported-protocol) and
  23-invoke-protocol-invocations (Tier 2 invocations memory semantics).
- init: 00-init-validate-deploy-mode (offline value/required-flag validation)
  and 10-init-deploy-mode-container (Tier 1 container scaffold).
- doctor: 00-doctor-partial-failure (mixed PASS+FAIL, exit 1).

Add cmd:eval and cmd:optimize to the tag taxonomy, update the scenarios README
tier tables, and update the agent-scenario-tests skill impact-mapping (eval and
optimize are now covered Tier 2 commands, no longer listed as gaps).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
A local scenario run revealed that 00-init-validate-deploy-mode never exercised
the --deploy-mode validation: in an empty directory with --no-prompt, init fails
earlier with 'template selection requires interactive mode' because
validateCodeDeployInput is only reached after an init method resolves.

Reclassify Tier 0 -> Tier 1, rename to 10-init-validate-deploy-mode.yaml, and
seed the from-code fixture so the from-code method resolves and the bogus
--deploy-mode value is actually rejected ('--deploy-mode must be container or
code'). Reaching the check scaffolds a starter template (network), hence Tier 1.
Note the late-validation UX (template scaffolded before the flag is validated)
as a report_finding. Update the README tier tables accordingly.

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

A full Tier 0+1+2 cli-interactive-tester run against a freshly deployed shared
agent surfaced two scenario-accuracy issues (the CLI itself behaved correctly):

- 28-eval-lifecycle: 'eval init --no-wait' is ASYNC — it submits dataset
  (datagen-*) and evaluator (evaluatorgen-*) generation jobs and writes
  eval.yaml, but does NOT create an eval 'run'. So 'eval list' legitimately
  shows 0 rows right after init and 'eval show' (no id) errors cleanly. Refined
  the header + goals to describe the async semantics and treat an empty list /
  eval-id-required message as expected rather than a failure.

- 29-optimize-submit-and-cancel: the optimize command group is preview-gated per
  subscription. On a non-enrolled subscription both 'optimize' and 'optimize
  list' return a clean 400 SubscriptionNotRegistered (signup: aka.ms/ao/quickstart),
  so the submit->status->cancel lifecycle can't run. Documented the Agent
  Optimizer enrollment prerequisite and added a gating check that accepts the
  clean SubscriptionNotRegistered error as a valid outcome when enrollment is
  absent.

Add cspell words: datagen, evaluatorgen, signup. All Tier 0 (13) and Tier 1 (2)
scenarios and the Tier 2 setup/invoke/teardown passed; resources were fully torn
down with azd down --force --purge.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add 6 new cli-interactive-tester scenarios covering three recently merged commands:

Tier 0 (offline help validation):
- 00-delete-help.yaml: validates azd ai agent delete --help output
- 00-endpoint-show-help.yaml: validates azd ai agent endpoint show --help output
- 00-code-download-help.yaml: validates azd ai agent code download --help output

Tier 2 (cloud E2E, run between 2A-doctor and 2Z-teardown):
- 2B-endpoint-show.yaml: shows endpoint config (table + JSON output)
- 2C-code-download.yaml: negative-path test (container agent returns AgentNotCodeBased)
- 2D-delete.yaml: deletes agent with --force, confirms removal via show

All scenarios tested locally: 6/6 PASS.

Co-authored-by: Jian Wu <wujia@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The 4 Tier 1 scenarios that copy fixtures used a hardcoded /mnt/c/Repos/...
fallback path (Travis's machine). Replace with bash :? expansion so that
missing AZD_AGENTS_FIXTURES fails immediately with a clear message instead
of a cryptic 'No such file or directory'.

Co-authored-by: Jian Wu <wujia@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds a setup script that cross-compiles azd core and the azure.ai.agents
extension as native Linux/amd64 binaries and installs them in WSL. This
eliminates git safe.directory, TTY detection, and file-locking errors
caused by running Windows azd.exe via WSL interop.

Also updates:
- Scenarios README: documents the WSL setup workflow
- Skill prerequisites: adds native binary check for Windows hosts
- Skill running-scenarios: adds timestamp postfix to session_ids for
  collision avoidance across parallel agent sessions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Failed scenarios must not be retried unless the scenario's goals
explicitly instruct it. Retrying masks flaky behavior and undermines
the test suite's value as a regression signal.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Use subshell cd into module directory before go build (fixes 'outside
  main module' error when script is run from the scenarios directory)
- Use full 40-char commit hash (git rev-parse HEAD) instead of --short,
  matching the required version format '<semver> (commit <full-hash>)'

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
# Conflicts:
#	cli/azd/extensions/azure.ai.agents/cspell.yaml
The skill workflow now includes Step 1b which executes setup-wsl.sh
via the tester at the start of every run. This guarantees WSL always
has the latest local code compiled as native Linux binaries, eliminating
stale binary issues when code changes between runs.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The scenario goals are the contract — a scenario PASSES only when the
product's actual behavior matches what the goals describe. The driving
agent must verify goals were met, not rationalize why they weren't.
Added 'never adapt around broken goals' rule: if goals reference a
command/flag that doesn't exist or expect output that doesn't appear,
fail the scenario instead of working around it.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The shared_agent_name derivation now includes a compact timestamp
(MMDDHHmm) so concurrent runs on the same machine get unique Azure
resource names and working directories, preventing deployment conflicts.

Format: {prefix}-{shared_agent_suffix}-{ts}
Example: alice-basic-responses-07141038

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Picker navigation: update goals to test wrapping behavior (intentional)
  instead of expecting bounded clamping
- fixtures_dir: replace AZD_AGENTS_FIXTURES env var with {fixtures_dir}
  session_var auto-derived by the orchestrator (4 scenarios updated)
- Container deploy: clarify that startup command prompt is expected;
  only entry-point/runtime prompts are code-deploy-only
- Make fixtures_dir derivation platform-neutral (not WSL-specific)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- eval init -> eval generate, --max-iterations -> --max-candidates (stale flags)
- Remove agent.yaml references; agent definition now inline in azure.yaml
- Rename 10-init-from-manifest-url -> 10-init-from-azure-yaml-url with correct URL
- Update deploy-mode scenarios: code deploy auto-selected for Python templates
- Flip 2C-code-download from negative to positive path (code deploy is default)
- Rewrite 26-endpoint-update pre-hook to inject agentCard into azure.yaml
- Fix 2B-endpoint-show goals (command shows protocols/version/auth, not URL)
- Update 10-init-flags-agent-name-model with correct azure.yaml URL

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
trangevi and others added 9 commits July 17, 2026 08:54
- 10-init-template-python: fix scaffold verification goal (no 'instructions'
  or literal 'model' in schema; model is via env var). Remove stale Container
  deploy goal (auto-selects code for templates).
- 10-init-template-dotnet: same Container deploy fix (.NET also auto-selects code)
- 26-endpoint-update: rewrite pre-hook with sed (embedded Python broke YAML parser)
- 00-sample-list-text: relax goal for terminal buffer overflow (JSON scenario
  covers full data verification)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Location select: use 'search for and select' wording (8 scenarios)
  to guide text-based matching instead of fragile positional indexing
- endpoint-update: replace sed with awk for reliable multi-line
  agentCard injection into azure.yaml
- optimize: add --evaluator coherence flag (required by validate)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- sample-list-json-filters: assert --type agent returns non-empty results
- optimize-submit-and-cancel: broaden gating check to any clean HTTP 400

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Other HTTP 400 errors (e.g. train_dataset.version required) are
unexpected API errors and should be reported as bugs, not observations.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- profile.yaml: fix stale gpt-4.1-mini comment (value is gpt-5.4-mini)
- README: fix model default in profile table, soften tier 0 'offline' claim
  (sample-list needs network), extend tier 2 range to 2D, add 2B/2C/2D
  rows, add cmd:code and cmd:delete to tag taxonomy, fix eval description
- impact-mapping: add code/delete command mappings, add agent_endpoint.go
- workflow.md: remove stale eval/optimize coverage gap refs, extend range
- running-scenarios.md: extend serial range to 2D
- reporting.md: update sample report (eval has scenarios now)

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

Previously the script manually copied the extension binary without registering
it in azd's config, which meant azd could silently fall back to the published
registry version instead of the dev build.

Now the script uses the official azd extension tooling:
1. Builds azd core with sudo install to /usr/local/bin
2. Ensures microsoft.azd.extensions is available (auto-installs if needed)
3. azd x build → azd x pack --bundle → azd extension install <bundle.zip>
4. Strict version verification that fails the script if dev build isn't active

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Remove continue_on_error from agentCard injection hook (if injection
  fails, the scenario cannot succeed — let it fail fast)
- Add pre-update version capture goal so the driving agent records the
  version BEFORE running endpoint update, enabling a concrete comparison

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Update mutually-exclusive validation scenario to use azure.yaml
- Remove legacy agent.manifest.yaml mention from init-from-url comment

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

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
21 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@github-actions github-actions Bot added the ext-agents azure.ai.agents extension label Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ext-agents azure.ai.agents extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants