Skip to content

Optimize pr-docs-check agentic workflow to cut token usage#18119

Open
IEvangelist wants to merge 6 commits into
mainfrom
ievangelist/potential-pancake
Open

Optimize pr-docs-check agentic workflow to cut token usage#18119
IEvangelist wants to merge 6 commits into
mainfrom
ievangelist/potential-pancake

Conversation

@IEvangelist

@IEvangelist IEvangelist commented Jun 11, 2026

Copy link
Copy Markdown
Member

Problem

The PR Documentation Check workflow (.github/workflows/pr-docs-check.md → compiled pr-docs-check.lock.yml) runs the Copilot CLI engine (claude-sonnet-4.6) inside the AWF firewall/proxy. The proxy enforces two caps from its apiProxy config and refuses inference when either trips:

  • maxRuns (per-run inference-request cap) — defaulted to 500
  • maxEffectiveTokens25,000,000 (25M) hard cap

Over the last 7 days, 18 of 19 failed runs died at the Execute GitHub Copilot CLI step with the same error: CAPIError: 429 Maximum effective tokens exceeded, landing just over the 25M rail (observed 25.0M–25.8M), logged as AWF effective-token hard rail hit — not retrying or continuing. (The 19th failure was an unrelated transient curl 504 while installing the CLI — infra flake.) The 500-turn cap was never reached.

Root cause: a deterministic retry loop

A create_pull_request safe-output failure spirals into a retry loop. In failed run 27322389644 the safe output returned {"result":"error","error":"No changes to commit - no commits found"} 7 times while create_pull_request was referenced 80× — the agent kept re-emitting it instead of stopping, accumulating effective tokens each turn until it crossed 25M.

Calibration from AWF audit data (gh aw audit)

Run profile inference reqs raw tokens
Healthy skip runs (typical) 4–5 ~190–265k
Heavy-but-successful skip run (27246693222) 35 2.43M
Runaway failure (27322389644) 34 2.50M → 25M effective

Healthy runs use only ~4–5 requests; the runaway used ~34 to reach the rail.

Changes

  1. max-runs: 12 (compiles to AWF proxy maxRuns). A hard backstop that sits well above a legitimate run (the doc-writing path needs a few more requests than a skip to read the skill, browse docs, write files, and open the PR) yet far below the ~34-request runaway — so any loop is stopped long before the 25M token rail. (Replaces the default of 500, which never fired.)

  2. Generic anti-loop guard in Step 10 — emit create_pull_request exactly once, only after writing doc changes, and never re-emit after a failure. The guard treats any deterministic create_pull_request failure as non-retryable (no commits / no diff / empty or invalid patch / base-branch or validation error / protected-file rejection), not just the literal No changes to commit string. On such a failure, bail to a single notify_source_pr (skipped) instead of looping. This removes the loop at its behavioral source.

  3. Defer expensive comment-thread reads to the doc-drafting path only — the cheap skip path (the common case) no longer fetches the PR issue/review comment threads; they are fetched only once Step 5 confirms docs are required.

  4. Condense the prompt body (the body is re-sent every turn, so this compounds): collapse Step 4's six verbose signal-catalog tables into a compact grouped reference (the catalog is already defined in compute_signals.py and surfaced in signals.json at runtime), trim Step 3's target.json table to the fields actually used, and de-duplicate repeated justification prose. Nothing the agent reads at decision time was removed — the gate remains signals.json's recommendation/triggered_signals/evidence.

  5. Cap Step 8 "browse existing documentation" breadth to the affected feature area instead of broad exploration.

  6. Offload repeatable, deterministic flow tasks to pre-agent scripts (extending the existing compute_signals.py pattern). These steps were previously executed inside the agent loop as GitHub tool calls plus reasoning — work that is fully deterministic and whose verbose API responses were re-sent on every subsequent turn. Moving them into the pre-agent-steps: shell step (which already fetches the PR + files payloads) means the agent now just reads a small result file:

    • compute_pr_context.py writes .pr-docs-check/pr.json — the curated PR metadata (number, title, body, author, base ref, milestone, labels, assignees, linked issues, and changed-file list). Diff patches are deliberately excluded and fetched on demand only on the drafting path. Step 1 now reads this file instead of issuing several get PR / list files / linked-issue tool calls.
    • resolve_sme.py writes .pr-docs-check/sme.json — the subject-matter expert resolved deterministically from assignees + reviews (a faithful port of Step 2's selection algorithm). Step 2 now reads sme_login/sme_source; only the genuinely fuzzy CODEOWNERS hint stays in the agent, signalled via needs_codeowners_fallback.
    • Reviews are now fetched once in the pre-agent step (replacing an in-loop tool round-trip). Both scripts are validated with end-to-end smoke tests (see Validation).

    This change set also removes the earlier pr-docs-check-verify.yml CI workflow and build.py helper: those were compile/lock-parity meta-tooling around the workflow, not the "scripts for repeatable bits within the flow" that were intended.

Backstop sanity-check (does max-runs: 12 trip below 25M?)

Yes, with large margin. Anchoring on the only run we have that actually hit the rail — 27322389644, which reached 25.2M effective tokens in 34 requests — the linear average is ≈ 740k effective tokens/request. At max-runs: 12 the worst case is therefore ≈ 12 × 740k ≈ 8.9M effective tokens, about 36% of the 25M cap. And because per-turn cost grows as conversation context accumulates (the full transcript is re-sent each turn), the first 12 turns are individually cheaper than that run's average turn, so the true worst case is strictly below 8.9M. The trimmed prompt and the in-flow offloads lower it further still.

This is also why 12 was chosen over the originally-suggested 25: at max-runs: 25 the worst case is ≈ 25/34 of the rail-hitting run, and since later turns cost more than the average, the cumulative could climb toward ~20M+ — under the cap but with a thin margin. max-runs: 12 guarantees the backstop is a floor well under the cap, not merely "a few × the norm," while still leaving the legitimate doc-writing path room to complete.

Expected token impact

  • Eliminates the 25M overruns: the max-runs: 12 backstop plus the generic anti-loop guard stop the retry loop after a handful of requests rather than ~34, keeping any pathological run an order of magnitude below the 25M rail (≤ ~8.9M effective worst case, see sanity-check above).
  • Lower per-turn cost on every run: a smaller prompt body re-sent each turn, plus deferring comment-thread fetches off the common skip path, reduces input tokens across the board.
  • Fewer in-loop tool calls and smaller re-sent context: offloading Step 1 (PR context) and Step 2 (SME) to pre-agent scripts removes several GitHub tool round-trips and their verbose responses from the agent transcript, which compounds every turn.

Validation

  • gh aw compile pr-docs-check (gh-aw v0.77.5, matching .github/aw/actions-lock.json): 0 errors, 0 warnings. The committed pr-docs-check.lock.yml is byte-identical to a fresh recompile (parity verified), and recompiling the unchanged source twice is idempotent.
  • Unit tests: 30/30 pass in test_compute_signals.py (20 catalog scenarios + 10 backport cases) — via python -m unittest discover -s .github/workflows/pr-docs-check -v. compute_pr_context.py and resolve_sme.py carry no unit tests: those orphaned test files were removed (nothing in the flow runs them) and both helpers are covered by the end-to-end smoke test below.
  • The two new scripts were smoke-tested end-to-end (compute_pr_context.pypr.jsonresolve_sme.pysme.json).

Update: exclude backport PRs

The workflow triggers on pull_request: closed for both main and
release/* (see the on: block), so a merged backport reaches the agent
and could draft a redundant aspire.dev docs PR. A backport is documented
against its original (forward) PR on the default branch, so re-documenting it
is pure duplicate noise.

Backport detection is now deterministic in compute_signals.py
(detect_backport()), matching the /backport bot shape
(.github/workflows/backport.yml) and explicit/manual backports via any
of: base branch release/*, head branch backport/*, title prefixed
[release/...], a Backport of #N body marker, or a backport label.

signals.json now carries excluded + exclusion_reasons and a non-gating
is_backport signal; when excluded is true the recommendation is forced
to docs_optional. The agent prompt gains a Step 5 exclusion branch
(checked first, overrides recommendation and the ambiguity rule) so an
excluded PR is definitively skipped with an excluded → <reason>
notify_source_pr summary — it never drafts. Excluding release-base PRs is
safe for the release-targeting feature, which operates on main-base PRs via
the milestone resolver.

Tests: +10 backport cases added to test_compute_signals.py (each
marker, multi-reason, excluded-overrides-gating, negative main PR,
default-safe when base/head/title absent); 30/30 pass. Lock regenerated (body_hash only; recompile parity verified).

Notes

  • pr-docs-check.lock.yml is generated — regenerated here via gh aw compile, never hand-edited.
  • max-runs is the correct top-level field in gh-aw v0.77.5 (the compiler rejects max-turns); it is engine-agnostic (enforced by the AWF proxy).
  • The pre-agent scripts follow the established target.json / signals.json pattern: deterministic work runs once before the agent and is read from a file, keeping the token-expensive agent loop focused on judgment (deciding whether docs are needed and authoring them).

🤖 Generated with GitHub Copilot CLI

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

The PR Documentation Check agentic workflow repeatedly hit the AWF 25M effective-token hard cap (18 of 19 recent failures over 7 days). A deterministic create_pull_request failure (\No changes to commit\) drove a retry loop (~34 inference requests in failed run 27322389644) that accumulated effective tokens until the run hard-failed. Healthy runs use only ~4-5 requests.

Changes:

- Add \max-runs: 12\ (AWF proxy maxRuns) as a hard backstop. Skip runs use ~4-5 requests, the runaway used ~34; 12 stops any loop far below the 25M rail while leaving headroom for the doc-writing path.

- Add an anti-loop guard to Step 10: emit create_pull_request exactly once, never re-emit after a deterministic failure; on 'No changes' bail to a single notify_source_pr (skipped) instead of looping.

- Defer expensive PR/review comment-thread fetches to the doc-drafting path only; the cheap skip path no longer fetches them.

- Condense the prompt body ~16%: collapse Step 4's six signal tables into a compact grouped reference, trim Step 3's target.json table, de-duplicate repeated justification prose.

- Cap Step 8 'browse existing documentation' breadth to the affected feature area.

- Add a repeatable build.ps1 helper (gh aw compile + compute_signals tests) and regenerate pr-docs-check.lock.yml.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 11, 2026 16:08
@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 18119

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 18119"

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.

Pull request overview

This PR addresses a recurring failure in the pr-docs-check agentic workflow where a deterministic create_pull_request retry loop caused 18 of 19 recent failures by exceeding the 25M effective-token cap. The fix applies multiple layers of defense: a hard iteration cap, anti-loop prompt guidance, deferred expensive operations, and prompt size reduction.

Changes:

  • Adds max-runs: 12 to cap agent iterations (compiled to maxRuns in the AWF proxy config), preventing runaway loops from reaching the 25M token rail.
  • Restructures the prompt to defer expensive comment-thread reads to the docs-drafting path only, condenses the signal catalog (~16% smaller), caps Step 8 doc browsing breadth, and adds an explicit anti-loop guard in Step 10 that prevents re-emitting create_pull_request after an error.
  • Adds a repeatable build.ps1 helper for recompiling the workflow and running unit tests.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
.github/workflows/pr-docs-check/build.ps1 New PowerShell helper script to compile the workflow via gh aw compile and run compute_signals unit tests.
.github/workflows/pr-docs-check.md Prompt source changes: max-runs: 12, deferred comment reads, condensed signal catalog, anti-loop guard in Step 10, and Step 8 browsing cap.
.github/workflows/pr-docs-check.lock.yml Regenerated lock file reflecting the .md changes — hash/heredoc label churn plus maxRuns: 500 → 12 for the main agent job.

Comment thread .github/workflows/pr-docs-check/build.ps1 Outdated
IEvangelist and others added 2 commits June 11, 2026 11:21
- build.ps1: prefer python3 (matching the CI pre-agent step) with a probed fallback to python/py, rejecting the Windows Store stub and Python 2. Resolves the Copilot review comment about bare \python\ being absent or Python 2 on Linux/macOS.

- build.ps1: add a gh aw version check against the pin in actions-lock.json, and a -VerifyParity guard that asserts the recompiled lock matches the committed lock byte-for-byte (catches hand-edits, missing recompiles, or a wrong gh aw version).

- Make the Step 10 anti-loop guard generic: treat ANY deterministic create_pull_request failure (no commits, no diff, invalid patch, base/validation error, protected-file rejection) as non-retryable, not just the literal 'No changes to commit' string.

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

The PowerShell helper was not idiomatic for this repo (no other .ps1 under .github/workflows; CI is Linux and uses run steps + actions/github-script) and only checked lock parity locally. Replace it with:

- .github/workflows/pr-docs-check-verify.yml: a hand-authored GitHub Actions workflow that, on PRs touching the pr-docs-check sources, installs the pinned gh-aw (version single-sourced from actions-lock.json), recompiles pr-docs-check, fails if the committed lock drifted, and runs the compute_signals tests. Closes the gap where nothing enforced lock parity in CI.

- .github/workflows/pr-docs-check/build.py: a cross-platform local helper (matches the sibling compute_signals.py; no pwsh dependency) mirroring the same gh-aw version check, compile, optional --verify-parity, and tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 11, 2026 16:32

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.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

IEvangelist and others added 2 commits June 11, 2026 11:59
Per review feedback, "scripts for repeatable bits" means offloading
deterministic work inside the agentic flow (the compute_signals.py
pattern), not adding compile/CI meta-tooling. This reverts the verify
workflow + build.py and instead moves two deterministic agent steps to
tested pre-agent scripts so the agent reads a result file instead of
making GitHub tool calls and reasoning inside the token-expensive loop.

- Remove pr-docs-check-verify.yml and build.py (the meta-tooling).
- Add compute_pr_context.py (+ tests): reuse the PR + files payloads the
  signals step already fetches to write .pr-docs-check/pr.json, the
  curated metadata the agent reads in Step 1 (no diff patches; those are
  fetched on demand only on the drafting path).
- Add resolve_sme.py (+ tests): port the deterministic SME-selection
  algorithm (Step 2) to a pre-agent step writing .pr-docs-check/sme.json
  from assignees + reviews; only the fuzzy CODEOWNERS hint stays in the
  agent, signalled via needs_codeowners_fallback.
- Rewrite agent Step 1 and Step 2 to read pr.json / sme.json.
- Fetch reviews once in the signals step; regenerate the lock.

Tests: 46 pass (20 compute_signals + 8 compute_pr_context + 18 resolve_sme).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
A backport PR ports an already-merged change onto a release/* branch and
is documented against its original forward PR on the default branch, so
it must never spawn its own aspire.dev docs PR. Because the workflow runs
on release/* merges as well as main, merged backports currently reach the
agent and could draft a redundant docs PR.

Add deterministic backport detection to compute_signals.py via a new
detect_backport() helper that matches any of: base branch release/*,
head branch backport/*, title prefixed [release/...], a "Backport of #N"
body marker, or a backport label. signals.json now carries excluded +
exclusion_reasons and a non-gating is_backport signal; when excluded, the
recommendation is forced to docs_optional. The agent prompt gains a Step 5
exclusion branch (checked first, overrides the ambiguity rule) so an
excluded PR is definitively skipped with an "excluded -> <reason>"
notify_source_pr summary.

- compute_signals.py: detect_backport(), is_backport (non-gating),
  excluded/exclusion_reasons output, recommendation override.
- test_compute_signals.py: +10 backport tests (each marker, multi-reason,
  excluded-overrides-gating, negative main PR, default-safe missing keys).
- pr-docs-check.md: Step 4 fields table + short-circuit note, Step 5
  exclusion branch, ambiguity-rule carve-out, Step 6 summary branch.
- Regenerated pr-docs-check.lock.yml (body_hash only; recompile parity OK).

All 56 compute_signals/compute_pr_context/resolve_sme tests pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 11, 2026 17:10
The pr-docs-check agentic flow only runs the three pre-agent scripts that
produce data the agent reads (compute_signals.py -> signals.json,
compute_pr_context.py -> pr.json, resolve_sme.py -> sme.json). The
test_*.py files were never part of the flow; the only thing that ran them
was the pr-docs-check-verify.yml CI check, which was removed earlier in
this PR as meta-tooling around the flow rather than scripts within it.
That left test_compute_pr_context.py and test_resolve_sme.py orphaned.

Remove the two test files introduced in this PR and drop the now-stale
"Running the tests" section from those scripts' docstrings.

test_compute_signals.py is kept: it predates this PR (shipped on main with
compute_signals.py) and guards the highest-risk piece — the regex signal
catalog plus the new backport detection. Its 30 tests (20 original + 10
backport) still pass. The compiled lock is unaffected (recompile parity).

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

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.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.

Comment on lines +393 to +397
_NON_GATING_SIGNALS = frozenset({"only_test_or_build_changes", "is_backport"})




@IEvangelist IEvangelist marked this pull request as ready for review June 11, 2026 17:42
Copilot AI review requested due to automatic review settings June 11, 2026 17:42

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.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Comment on lines +393 to +397
_NON_GATING_SIGNALS = frozenset({"only_test_or_build_changes", "is_backport"})




Comment on lines +105 to +163
def resolve_sme(pr: dict, reviews: list[dict]) -> dict:
"""Resolve the SME from curated PR context + raw reviews.

Returns a dict with:
* sme_login the chosen login (no '@'), or "" if undecided
* sme_source how it was chosen (for transparency / logs)
* needs_codeowners_fallback True only when the agent should consult
CODEOWNERS as a last-resort hint
* candidates eligible reviewers (login + latest state)
"""
author = pr.get("author") or {}
author_login = (author.get("login") or "").lower()
assignees = [a for a in (pr.get("assignees") or []) if a]
latest_reviews = _latest_review_by_reviewer(reviews)

# --- Step 2a: Copilot-authored PRs --------------------------------------
if is_copilot_authored(author):
human_assignees = [a for a in assignees if not is_bot(a)]
if len(human_assignees) == 1:
return _add_candidates(_result(human_assignees[0], "copilot_originator"), latest_reviews, author_login)
if len(human_assignees) > 1:
# Prefer the assignee whose latest review is APPROVED; if still
# ambiguous, the one appearing earliest in assignees[].
approved = [a for a in human_assignees if latest_reviews.get(a, {}).get("state") == "APPROVED"]
if approved:
return _add_candidates(_result(approved[0], "copilot_originator_approved"), latest_reviews, author_login)
return _add_candidates(_result(human_assignees[0], "copilot_originator"), latest_reviews, author_login)
# No human assignees (unusual) — fall through to the reviewer logic.

# --- Step 2b: human-authored PRs (or 2a fallthrough) --------------------
eligible = {
login: info
for login, info in latest_reviews.items()
if login.lower() != author_login and not is_bot(login)
}

# Prefer APPROVED reviewers; among them the most recent.
approved = {login: info for login, info in eligible.items() if info["state"] == "APPROVED"}
if approved:
chosen = max(approved.items(), key=lambda kv: kv[1]["submitted_at"])[0]
return _add_candidates(_result(chosen, "approved_reviewer"), latest_reviews, author_login)

# Fallback A: a reviewer whose latest state is substantive but not a bare
# COMMENTED (e.g. CHANGES_REQUESTED), most recent first.
substantive = {login: info for login, info in eligible.items() if info["state"] not in ("", "COMMENTED")}
if substantive:
chosen = max(substantive.items(), key=lambda kv: kv[1]["submitted_at"])[0]
return _add_candidates(_result(chosen, "substantive_reviewer"), latest_reviews, author_login)

# Fallback B: no usable reviewer signal at all — let the agent consult
# CODEOWNERS as a hint. (Glob matching against changed files is fuzzy, so
# it intentionally stays in the agent rather than here.)
if not eligible:
return _add_candidates(_result("", "none", needs_codeowners_fallback=True), latest_reviews, author_login)

# Reviewers exist but only ever COMMENTED: per Step 2b this is not a strong
# enough signal to pick one, and CODEOWNERS is only for "no reviews at all".
# Leave the SME empty; the workflow drafts without an explicit reviewer.
return _add_candidates(_result("", "none"), latest_reviews, author_login)
@github-actions

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 114 passed, 0 failed, 2 unknown (commit e32ec6a)

View all recordings
- Test Detail
AddPackageInteractiveWhileAppHostRunningDetached Recording · Job · CLI logs
AddPackageWhileAppHostRunningDetached Recording · Job · CLI logs
AgentCommands_AllHelpOutputs_AreCorrect Recording · Job · CLI logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording · Job · CLI logs
AgentInitCommand_MigratesDeprecatedConfig Recording · Job · CLI logs
AgentInit_NonInteractive_BundleOnlySkillsNotInCatalog Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording · Job · CLI logs
AllPublishMethodsBuildDockerImages Recording · Job · CLI logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording · Job · CLI logs
AspireAddPackageVersionToDirectoryPackagesProps Recording · Job · CLI logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording · Job · CLI logs
AspireInit_ExistingAppHostDir_RecreatesNuGetConfigKeepsFiles Recording · Job · CLI logs
AspireInit_SolutionFile_BuildsAgainstChannelHive Recording · Job · CLI logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording · Job · CLI logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording · Job · CLI logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording · Job · CLI logs
Banner_DisplayedOnFirstRun Recording · Job · CLI logs
Banner_DisplayedWithExplicitFlag Recording · Job · CLI logs
Banner_NotDisplayedWithNoLogoFlag Recording · Job · CLI logs
CertificatesClean_RemovesCertificates Recording · Job · CLI logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording · Job · CLI logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording · Job · CLI logs
ConfigSetGet_CreatesNestedJsonFormat Recording · Job · CLI logs
CreateAndRunAspireStarterProject Recording · Job · CLI logs
CreateAndRunAspireStarterProjectWithBundle Recording · Job · CLI logs
CreateAndRunEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJavaEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJsReactProject Recording · Job · CLI logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording · Job · CLI logs
CreateAndRunPythonReactProject Recording · Job · CLI logs
CreateAndRunTypeScriptEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunTypeScriptStarterProject Recording · Job · CLI logs
CreateJavaAppHostWithViteApp Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DeployK8sBasicApiService Recording · Job · CLI logs
DeployK8sWithExternalHelmChart Recording · Job · CLI logs
DeployK8sWithGarnet Recording · Job · CLI logs
DeployK8sWithMongoDB Recording · Job · CLI logs
DeployK8sWithMySql Recording · Job · CLI logs
DeployK8sWithPostgres Recording · Job · CLI logs
DeployK8sWithRabbitMQ Recording · Job · CLI logs
DeployK8sWithRedis Recording · Job · CLI logs
DeployK8sWithSqlServer Recording · Job · CLI logs
DeployK8sWithValkey Recording · Job · CLI logs
DeployTypeScriptAppToKubernetes Recording · Job · CLI logs
DescribeCommandResolvesReplicaNames Recording · Job · CLI logs
DescribeCommandShowsRunningResources Recording · Job · CLI logs
DetachFormatJsonProducesValidJson Recording · Job · CLI logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording · Job · CLI logs
DoPublishAndDeployListStepsWork Recording · Job · CLI logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording · Job · CLI logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording · Job · CLI logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording · Job · CLI logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording · Job · CLI logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording · Job · CLI logs
DotNetRunFileBasedAppHostUsesAspireCliBundle Recording · Job · CLI logs
DotNetRunProjectAppHostUsesAspireCliBundle Recording · Job · CLI logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording · Job · CLI logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording · Job · CLI logs
GlobalMigration_HandlesMalformedLegacyJson Recording · Job · CLI logs
GlobalMigration_PreservesAllValueTypes Recording · Job · CLI logs
GlobalMigration_SkipsWhenNewConfigExists Recording · Job · CLI logs
GlobalSettings_MigratedFromLegacyFormat Recording · Job · CLI logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording · Job · CLI logs
InteractiveCSharpInitCreatesExpectedFiles Recording · Job · CLI logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording · Job · CLI logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording · Job · CLI logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording · Job · CLI logs
LogsCommandShowsResourceLogs Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording · Job · CLI logs
ProcessCommandCallbackReceivesCliArguments Recording · Job · CLI logs
PsCommandListsRunningAppHost Recording · Job · CLI logs
PsFormatJsonOutputsOnlyJsonToStdout Recording · Job · CLI logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording · Job · CLI logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording · Job · CLI logs
PublishWithDockerComposeServiceCallbackSucceeds Recording · Job · CLI logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording · Job · CLI logs
ResourceCommand_FailedExec_ShowsLogPathAndLogHasEntries Recording · Job · CLI logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording · Job · CLI logs
RestoreGeneratesSdkFiles Recording · Job · CLI logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording · Job · CLI logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording · Job · CLI logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording · Job · CLI logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
SecretCrudOnDotNetAppHost Recording · Job · CLI logs
SecretCrudOnTypeScriptAppHost Recording · Job · CLI logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording · Job · CLI logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording · Job · CLI logs
StartReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
StopAllAppHostsFromAppHostDirectory Recording · Job · CLI logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopNonInteractiveSingleAppHost Recording · Job · CLI logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopWithNoRunningAppHostExitsSuccessfully Recording · Job · CLI logs
TerminalAttachFrontend_ShowsViteHelpAndDetaches Recording · Job · CLI logs
TypeScriptAppHostRunDoesNotDeadlockWhenLazyOptionsInvokeAsyncCallback Recording · Job · CLI logs
TypeScriptAppHostWithVite_AllowsDifferentGuestPkgManager Recording · Job · CLI logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording · Job · CLI logs
UpdateToStable_CSharpEmptyAppHost_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_CSharpSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScriptSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScript_PreviewsStablePkgsAndKeepsChannel Recording · Job · CLI logs

📹 Recordings uploaded automatically from CI run #27364557363

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.

2 participants