Add VS Code resource debugging for .NET and Go - #18602
Add VS Code resource debugging for .NET and Go#18602Adam Ratzman (adamint) wants to merge 102 commits into
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 18602Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 18602" |
There was a problem hiding this comment.
Pull request overview
This PR adds the first VS Code extension lane for #18538: a right-click Attach debugger action on running .NET project resources in the Aspire panel. It builds a CoreCLR attach debug configuration that targets the project's process by processName (best-effort resolving <AssemblyName> from the project file), rather than executable.pid, because DCP reports the dotnet run launcher PID rather than the child app process. The action is gated on a running top-level Project resource with a dotnet executable and a .csproj/.fsproj/.vbproj path, and only when the C# extension is installed; it re-resolves the latest resource before attaching so stale/ambiguous/missing resources fail closed with a warning.
Bundled alongside the feature is a broad telemetry overhaul: every event is renamed to its final wire name (aspire/vscode/... and aspire/dashboard/...) and routed through sendDangerousTelemetryEvent/sendDangerousTelemetryErrorEvent to bypass VS Code's automatic <extensionId>/ prefix, with manual opt-in gating (telemetryLevel), manual common properties, and explicit value sanitization.
Changes:
- Add
aspire-vscode.attachDebuggerToResourcecommand, menu contribution (canAttachDebuggercontext value), attachability helpers, and the attach execution flow with latest-resource re-resolution. - Rename all telemetry events to final wire names and route them through the "dangerous" send path with explicit gating/sanitization and manually-added common properties.
- Add localized strings and extensive unit tests for both the attach flow and the telemetry changes.
Show a summary per file
| File | Description |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts |
Core attach logic: attachability helpers, process-name derivation, attachDebuggerToResource, latest-resource resolution; propagates appHostPath through tree items. |
extension/src/extension.ts |
Registers the new attach command; renames the extension/activated telemetry event. |
extension/package.json |
Contributes the command, hidden palette entry, and view/item/context menu item; reorders action groups. |
extension/package.nls.json / extension/src/loc/strings.ts / extension/loc/xlf/aspire-vscode.xlf |
Adds/regenerates localized strings for the attach action. |
extension/src/utils/telemetry.ts |
Switches to dangerous-send path, adds manual gating, common properties, and value sanitization; hard-codes telemetry client version. |
extension/src/utils/telemetryRegistry.ts |
Renames event schema keys to final aspire/vscode/... and aspire/dashboard/... wire names; documents the convention. |
extension/telemetry.json |
Updates classification inventory keys to the new wire names. |
extension/src/dcp/DashboardTelemetryPassthrough.ts / AspireDcpServer.ts / AspireDebugSession.ts / AppHostLaunchService.ts / AppHostsViewTelemetry.ts / meaningfulEngagement.ts / appHostDiscovery.ts / workspace.ts / interactionService.ts |
Update event-name call sites and passthrough comments to the new namespaces. |
extension/src/test/*.test.ts, extension/src/test-e2e/packageSurface.e2e.test.ts |
Extensive tests for the attach flow, telemetry gating/sanitization/naming, and the manifest/surface contributions. |
Review details
- Files reviewed: 29/29 changed files
- Comments generated: 3
- Review effort level: Medium
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
I tried to place these as inline tracking comments, but GitHub rejected new inline comments because there is already a pending review draft for this user on the PR. I kept the tracking here instead while the branch was fixed:
These were fixed before the later Windows punctuation redaction follow-up. This is a top-level tracking comment, so there is no review thread to resolve; final tracking is in #18602 (comment). |
|
Pushed Validation on the live head passed locally: Remaining non-agent gates: live CoreCLR attach/manual readiness pass, plus telemetry/reviewer sign-off for the |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Cross-platform process attachment and security-sensitive metadata handling warrant final human review despite extensive coverage.
Review tier: Balanced
Findings: 1
Pre-existing issues (5)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Issues resolved since last review (2)
| Severity | Finding |
|---|---|
extension/scripts/run-e2e.js — If this new resource-debug dependency is missing, resolveRequiredVsixPath reports that it is… View resolved comment |
|
src/Aspire.Hosting/Dcp/ResourceSnapshotBuilder.cs — These values are copied from EffectiveArgs without consulting the corresponding… View resolved comment |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Tree attachment crosses Restricted Mode’s trust boundary and disabled debugger extensions lack actionable enablement guidance.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced
Findings: 2
New issues introduced by this change (1)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… |
Pre-existing issues (5)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
extension/src/views/AspireAppHostTreeProvider.ts:1565
- This does not handle the disabled-extension case required by the linked completion criteria. A disabled C# or Go extension is reported as missing, but the message only says to install it; reinstalling a disabled extension is a no-op, so the user remains blocked with no Enable/Open Extensions action. Route this outcome through the existing
DebuggerInstallHintServicebehavior (including its disabled-extension fallback) or provide equivalent install/enable actions here.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Target-affecting .NET launch options can break process resolution, and disabled debugger extensions receive incomplete setup guidance.
Review tier: Balanced
Findings: 2
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Suppressed comments (2)
Previously missed (2) — in code that hasn't changed since the last review.
extension/src/views/AspireAppHostTreeProvider.ts:1564
- A debugger extension absent from the VS Code registry may be installed but disabled, yet this path always tells the user to install it and offers no setup action. That does not provide the install-or-enable guidance required by the linked completion criteria. Route this outcome through
DebuggerInstallHintService(which already installs missing extensions and opens Extensions for disabled ones) instead of showing this inert install-only warning.
src/Aspire.Hosting/Dcp/ResourceSnapshotBuilder.cs:301 - This only preserves configuration/framework, but other valid
dotnet runswitches also change the evaluated output identity. For example,--runtime linux-x64(and the--arch/--osaliases or-p:properties) can changeTargetPathandUseAppHost; the resource then launches the RID-specific child, whilegetDotNetAttachTargetInforeevaluates MSBuild without that state and searches for a different executable. Attaching therefore fails for customized launch recipes. Preserve the complete target-affecting identity—preferably the actual launched child PID/path—or publish and pass all target-affecting options during reevaluation.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Cross-platform process identity and debugger lifecycle behavior require final human validation of the pending packaged Linux E2E shard.
Review tier: Balanced
Findings: 2
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Its 82-file, security-sensitive cross-platform process-attachment surface and still-running CI require final human validation.
Review tier: Balanced
Findings: 2
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Tree attachment can evaluate a .NET project while the workspace is in Restricted Mode.
Review tier: Balanced
Findings: 2
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Suppressed comments (1)
extension/src/views/AspireAppHostTreeProvider.ts:1532
- Tree-initiated attach is still available in Restricted Mode, and the shared service has no trust guard. For .NET resources this reaches
dotnet msbuildduring attach-target resolution before VS Code'sstartDebuggingboundary, so clicking the action can evaluate an untrusted project. Block this command before invoking the resource-debug service (with a localized Restricted Mode outcome/message), or enforce trust in the shared service while preserving the language-model tool's safe result contract.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Debugger overrides can retarget a confirmed local attachment through settings such as CoreCLR pipeTransport.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced
Findings: 3
New issues introduced by this change (1)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The override merge can still retarget a confirmed local attach. For example, the CoreCLR provider… |
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Target identity can be reconstructed incorrectly for valid .NET launch options, and PID-based CLI selection lacks direct regression coverage.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced
Findings: 3
New issues introduced by this change (1)
| Severity | Finding |
|---|---|
src/Aspire.Cli/Backchannel/AppHostConnectionResolver.cs — The new PID discriminator is not exercised by a resolver test. The added command tests only… |
Pre-existing issues (7)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The override merge can still retarget a confirmed local attach. For example, the CoreCLR provider… View comment |
|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Suppressed comments (1)
src/Aspire.Hosting/Dcp/ResourceSnapshotBuilder.cs:321
- This marks every recognized
run/watchinvocation attachable after preserving only configuration and framework. Valid options such as--runtime/--arch/--os,--artifacts-path, and MSBuild property overrides can changeTargetPath; redacted configuration/framework values are also silently treated as absent. The extension then reevaluates the default target identity and cannot resolve the actual child. Please fail closed (project.launchCommand = null) whenever target identity depends on an unmodeled or sensitive launcher argument, or serialize and replay every non-sensitive identity input.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
The security-sensitive, cross-platform debugger change spans 80 files and still awaits its required packaged Linux attach shard.
Review tier: Balanced
Findings: 3
Pre-existing issues (8)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The override merge can still retarget a confirmed local attach. For example, the CoreCLR provider… View comment |
|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View comment |
|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
src/Aspire.Cli/Backchannel/AppHostConnectionResolver.cs — The new PID discriminator is not exercised by a resolver test. The added command tests only… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
|
Three current gaps still need cleanup: tree attach must stop at the Restricted Mode boundary, debugger overrides must not retarget a confirmed local attach through remote/transport settings, and same-path AppHost PID selection needs a real resolver regression. I’m fixing all three before the final CI pass. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7c01c030-226e-41c5-81ca-a6483a1856df
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
.NET path matching mishandles Windows UNC paths, preventing reliable attachment from network shares.
Review tier: Balanced
Findings: 1
Pre-existing issues (6)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The selected AppHost PID is lost here: fetchAppHostResourcesOnce accepts only a path and runs… View comment |
|
src/Aspire.Cli/Backchannel/AppHostConnectionResolver.cs — The new PID discriminator is not exercised by a resolver test. The added command tests only… View comment |
|
extension/src/debugger/languages/go.ts — Issue #18538 requires supported non-.NET resources to retain the same debugger user overrides as… View comment |
|
extension/src/test-e2e/resourceDebugTools.e2e.test.ts — This packaged E2E path stops at debuggerExtensionMissing; it never starts a .NET or Go debug… View comment |
|
extension/src/lm/appHostTargetResolverService.ts — startsWith('..') rejects valid in-workspace paths whose first component merely begins with two… View comment |
|
extension/src/debugger/languages/dotnet.ts — This apphost match relies only on ps -o comm=, even though the new Go implementation explicitly… View comment |
Issues resolved since last review (2)
| Severity | Finding |
|---|---|
extension/src/debugger/resourceDebugService.ts — The override merge can still retarget a confirmed local attach. For example, the CoreCLR provider… View resolved comment |
|
extension/src/views/AspireAppHostTreeProvider.ts — Block tree-initiated attach in Restricted Mode before invoking the shared service. The… View resolved comment |
Suppressed comments (2)
Previously missed (1) — in code that hasn't changed since the last review.
extension/src/debugger/languages/dotnet.ts:1172
- UNC executable paths are not classified as Windows paths here. For a target such as
\\server\share\Api.dll, the comparison remains case-sensitive, so a casing difference between the evaluatedTargetPathand the CIM executable path prevents self-contained resource attach even though drive-letter paths already compare case-insensitively. Detect UNC form from the original operands before normalizing.
This issue also appears on line 1237 of the same file.
extension/src/debugger/languages/dotnet.ts:1237
- The framework-dependent matcher has the same UNC gap: after normalization,
\\server\share\Api.dllstarts with//, not a drive letter, so matching is case-sensitive and can reject the exact Windows target when path casing differs. Include raw UNC paths in the Windows-path check.
const isWindowsPath = /^[a-z]:\//i.test(normalizedCommand) || /^[a-z]:\//i.test(normalizedTargetPath);
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |



Summary
Adds resource debugger attachment for running .NET and Go resources from the Aspire view and the
aspire_resource_debugCopilot tool.Fixes #18538.
Fixes #18937.
What changed
dotnet run,dotnet watch, orgo run. Process discovery supports Windows, macOS, and Linux.dotnet runrequires the direct application child, whiledotnet watchandgo runsupport verified descendants.alreadyDebugging.project.launchCommand,project.configuration, andproject.targetFrameworksnapshot metadata. Current snapshots use exactTargetPathidentity; theTargetNamecompatibility fallback is limited to older snapshots that do not contain the new metadata.aspire_resource_debugwith input validation, explicit confirmation, invocation-time re-resolution, linked cancellation, and bounded output.Evidence
Real process-tree validation covers:
dotnet run: the application is a direct child.dotnet watch: the application is a transitive descendant.go run: the application is a descendant.The packaged Linux VSIX E2E shard installs pinned C# and Go debugger extensions plus Delve. It invokes the registered resource-debug tool for both languages, binds a source breakpoint, observes the matching stack frame, detaches, verifies the resource still responds, and tears down the AppHost.
Validation
Checklist
The language-model boundary intentionally excludes process IDs, absolute paths, arguments, environment values, and raw failures. Debug attachment also requires VS Code confirmation before invocation.