Benjamin Christopher Simmonds
90d · built 2026-07-24
90-day totals
- Commits
- 181
- Grow
- 33.6
- Maintenance
- 16.3
- Fixes
- 6.2
- Total ETV
- 56.1
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 27 %
- By Growth share
- Top 7 %
30-day trajectory
Last 30 days vs. the 30 days before. Up arrows on Growth and ETV mean improvement; up arrow on Fixes share means more time on fixes (worse).
↑+71.7 %
vs 60 prior
↓-5.1 pp
recent vs prior
↑+0.4 pp
recent vs prior
Daily performance
Daily ETV, stacked by Growth, Maintenance and Fixes.
Work-mix over time
Share of Growth / Maintenance / Fixes over a rolling 7-day window. Reads as 'where is effort flowing right now'.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 20 by ETV in the 90-day window.
- 3.2ETVUnify worktree isolation across agents (#324246) * agentHost: unify worktree isolation across Copilot, Codex, and Claude Extract Copilot's git-worktree session isolation into a shared WorktreeIsolation controller (schema contribution, branch completions, worktree creation on materialize, metadata persistence, archive/unarchive cleanup, first-turn announcement live + restore) and wire it into the Codex and Claude agents so all three providers get the same folder/worktree isolation picker and base-branch picker. - Refactor CopilotAgent to delegate to the shared controller. - Wire isolation into CodexAgent (materialize-time worktree resolution, prewarm skip for worktree sessions, worktree sequencer, archive cleanup). - Wire isolation into ClaudeAgent (worktree before SDK cwd lock, watcher + project re-anchor, session-sequencer archive cleanup). - Move the branch-name generator into node/shared as the provider-neutral IAgentBranchNameGenerator / AGENT_BRANCH_PREFIX. - Add WorktreeIsolation unit tests and Codex isolation config coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Merge branch 'main' into agents/provider-isolation-picker-unification # Conflicts: # src/vs/platform/agentHost/test/node/copilotAgent.test.ts * fix merge * set project * move a layer up * cleanup * Enhance agent communication by adding working directory support in sendMessage methods and related interfaces * move back to be pull based * Revert "move back to be pull based" This reverts commit 5182107ecaf91120d6c5c1dc7ce3100681972467. * move branch generator into isolation picker * enable tests * also test the terminal tool * make working directory non optional * :lipstick: * Fix agent host worktree E2E replay * :lipstick: * Increase TSEC compile heap * Revert "Increase TSEC compile heap" This reverts commit 9f1c4d16c767e3ad993118e2466231a301025b24. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 7c3cb26c · 2026-07-13
- 3.0ETVAdd annotations support for agent feedback (#321133) * commit phase 1 * phase 2 * phase 3 * phase 4 * phase 5 * :lipstick: * fixes * fix cycle * auto approve tool * attachment fixesgithub.com-microsoft-vscode · b36d3a4c · 2026-06-12
- 2.2ETVSurface sessions requiring input in the agents titlebar (#324203) * sessions requiring input * Dismiss blocked-sessions dropdown + context-specific requires-input messages - Close the dropdown on Escape or an outside click (contextView onDOMEvent) - Show a specific titlebar message when all blocked sessions share one reason (terminal approval, failing CI, question, unresolved comments); fall back to the generic 'N sessions require input' for a mix - Animate the first requires-input appearance (preserve the blink class across redundant re-renders)github.com-microsoft-vscode · d769f0de · 2026-07-03
- 2.0ETVAdd onboarding spotlight tour for the Agents window (#322468) * Add onboarding spotlight tour for the Agents window Introduce a presentation-agnostic onboarding scenario engine (vs/workbench/contrib/onboarding) with a reusable spotlight presentation (dim overlay, masked highlight, anchored callout) and a first Agents-window tour that highlights running sessions in parallel, the isolation picker and the workspace picker. The new-session tour triggers via an observable for new users after they send a request and the session stays visible, with an onboarding.developerMode setting to bypass usage gating for testing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix leaked onAbort listener in onboarding shutdown test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review: dedupe in-flight runScenario, fix focus trap and keyboard advance - runScenario joins an in-flight run instead of scheduling a second one - focus trap handles focus not being on a tracked element (no -1 wrap-around) - advanceOnTargetClick keeps the spotlighted target keyboard-reachable: it joins the focus trap, receives Tab/Esc handling, and gets initial focus so keyboard users can activate it to advance Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix CI: register onboarding i18n namespaces and make focus-trap test deterministic - Add vs/workbench/contrib/onboarding and vs/sessions/contrib/onboardingTours to build/lib/i18n.resources.json (code-translation-remind eslint rule failed CI) - Set keyCode on the synthetic Tab event via Object.defineProperty so StandardKeyboardEvent recognizes it (init-dict keyCode is not honored), fixing the flaky markdown focus-trap assertion Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix CI: use KeyMod.Shift for Shift+Tab in spotlight focus trap The focus trap matched 'KeyCode.Shift | KeyCode.Tab', a meaningless OR of two key codes, so Shift+Tab was never recognized and focus wasn't trapped. Use KeyMod.Shift | KeyCode.Tab. This fixes the failing focus-trap unit test and makes reverse focus navigation work for real keyboard users. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 0862d26f · 2026-06-23
- 1.8ETVPills layout and formatting updates (#325983) * pills changes * format * Update component fixture screenshot hashes * Fix chat input persistent content layout Keep the persistent content wrapper from adding a flex gap to editable chat inputs and restore the unaffected component fixture baselines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · f4ed321c · 2026-07-15
- 1.5ETVsessions: add Session Files section to the Changes view (#323725) * sessions: add Session Files section to the Changes view Add a collapsible/resizable 'Session Files' section to the agents Changes view, modeled on the CI Checks section, listing files created/edited/deleted outside the session workspace folders during the session (these are not committed). Data is parsed from the agent-host chat-state turns (response parts -> tool calls -> FileEdit results/pending edits) and exposed via a new optional 'externalChanges' observable on ISession. Parsing is incremental: completed turns are memoized by id and only the active turn is re-parsed per streamed delta, with equality functions to suppress redundant downstream work. Computation is gated on the active, non-archived session. Click opens created/deleted files normally and edited files as a diff. Adds component-explorer fixtures and unit tests covering delta-only recomputation and reduce semantics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: register ResourceLabels services in Session Files fixture The Session Files widget fixture failed to render because ResourceLabels depends on IWorkspaceContextService, IDecorationsService, ITextFileService and INotebookDocumentService, which the base fixture services don't provide. Register mock instances the same way the multiDiffEditor fixture does. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address Session Files review feedback - Add a Changes-view accessibility help dialog (SessionsChangesAccessibilityHelp) with a new verbosity setting, documenting the file tree and the Session Files / Checks sections and how to operate them (collapse/expand, open file vs diff). - Handle touch in the Session Files header via Gesture.addTarget + TouchEventType.Tap so the collapse/expand toggle works on touch platforms. - Use getComparisonKey(uri) instead of uri.toString() for Map keys and sorting in reduceSessionFiles, for safe cross-platform URI identity. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: register IListService in Session Files fixture SessionFilesWidget creates a WorkbenchList, which depends on IListService. Register it in the fixture (as the aiCustomizationListWidget fixture does) so the widget can be instantiated under the component explorer. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 63790479 · 2026-06-30
- 1.5ETVAdd session grouping support to the sessions list (#322554) * Add session grouping support to the sessions list Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix hygiene CSS indentation and address PR review feedback - Use single-line CSS comments to fix bad whitespace indentation - Keep all selected sessions (incl. pinned/Done) when creating a group - Remove unused SessionAddToGroupSubmenuId menu id - Clarify createGroup doc comment (name is required) - Report groupsChanged accurately when empty-group eviction deletes groups Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 20b17526 · 2026-06-23
- 1.4ETVchat: add turn status pills for agent sessions (#324413) * chat: add turn status pills for agent sessions Adds 'changes' and 'preview' pills that surface a turn's file changes and previewable Markdown/HTML files. They float above the chat input while a turn streams and move into the completed response. Agent-host sessions only, gated by the new 'chat.turnStatusPills' object setting (both pills off by default). * fix component fixture typecheck: use invokeFunction to access config service * chat: vertically center the preview pill resource labelgithub.com-microsoft-vscode · e6ab937a · 2026-07-05
- 1.4ETVchat: add viewUnreviewedComments agent-host tool with confirmation UI (#321804) * chat: add viewUnreviewedComments agent-host tool with confirmation UI The `listComments` server tool now appends a note when there are pull request or code review comments the user has not accepted yet (still in the `created` state), pointing the agent at a new `viewUnreviewedComments` tool. The note is omitted when there are no such comments. `viewUnreviewedComments` is a confirmation-gated server tool (excluded from auto-approve for both Claude and Copilot). Its custom confirmation renders each unreviewed comment with a checkbox (reveal to the agent or not), the feedback kind badge and file, an action to open the file and reveal the comment, and an action to delete the comment. Accepting moves the checked comments to the Accepted state (revealed to the model and shown in the UI); unchecked comments stay Created. The tool then returns exactly the revealed comments. The chat layer stays decoupled from the sessions feedback model via commands registered by the agent feedback feature. Adds a component explorer fixture for the confirmation UI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: address PR review feedback for viewUnreviewedComments - Make the tool result precise: the confirmation now flags exactly the comments the user chose to reveal (pendingAgentReveal on the shared annotations meta, set via acceptFeedback({ revealToAgent: true })), and the server tool returns only those and clears the flag so later invocations don't re-return previously revealed/accepted comments. - Match requiresConfirmation(toolName) signature in the test fakes. - void the floating _populate() promise in the confirmation sub-part. - createContentElement returns an empty string instead of throwing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · c4125b9e · 2026-06-17
- 1.2ETVFix agents window layout and functionality (#318934) * agents window fixes * fix copied file * Reuse session views by position instead of recreating per session (#318938) * Reuse session views by position instead of recreating per session * focus fixes * performance fix * fixes * . --------- Co-authored-by: Sandeep Somavarapu <sasomava@microsoft.com>github.com-microsoft-vscode · 486e5036 · 2026-05-29
- 1.0ETVsessions: attach agent feedback as annotations and resolve PR threads on resolve/delete (#321913) * sessions: attach agent feedback as annotations and resolve PR threads When submitting agent feedback for an agent-host session, attach the just-submitted comments to the chat request so the agent receives them. Each submitted comment is sent as its own MessageAnnotationsAttachment referencing the session's annotations channel + annotation id, so the agent reads content via the listComments tool and acts on exactly those comments (with a simple-attachment fallback when no channel is known). Also resolve the originating GitHub pull request review thread when a PR-review feedback comment is resolved or deleted - whether by the user or by the agent's resolveComments/deleteComments tools - via a single observer on onDidChangeFeedback, reusing ICodeReviewService. The act-on-feedback skill now instructs the agent to act on only the attached comments when any are attached, otherwise all listed comments or whatever the user specified. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: update agent-host attachment tests for feedback attachment behavior Two pre-existing tests asserted that agent feedback variables were dropped from agent-host requests (the old 'feedback lives in the annotations channel' behavior). Now that submitted feedback is attached to the request, update both to expect the simple-attachment fallback that is produced when no annotations channel resource is known. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 98d56618 · 2026-06-18
- 1.0ETVsessions: add Fix CI row to blocked-sessions list items (#325593) * sessions: add Fix CI row to blocked-sessions list items Blocked sessions whose pull request has failing CI checks now show a per-session Fix CI row in the blocked-sessions dropdown, styled after the chat input's orange CI banner. The row shows 'N checks failed, X pending' and a prominent orange Fix CI button that opens the session and submits the fix-ci prompt. The row is only supplied to the blocked-sessions list, so it never appears in other session lists. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: send Fix CI in the background and hide the session on click Clicking Fix CI in the blocked-sessions list no longer opens the session. It now loads the session's chat model in the background (IChatService.acquireOrLoadSession) and submits the fix-ci prompt via sendRequest, routed with agentIdSilent. The session is optimistically removed from the blocked list for the duration of the submit; by the time it resolves the session is in progress and so is no longer blocked. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: thread ciFixModel test seam through titlebar widget The blocked-sessions indicator now creates a BlockedSessionsCIFixModel (which depends on IGitHubService/IChatService). The sessionsTitleBarWidget component fixture doesn't register those services, so it failed with 'depends on UNKNOWN service sessionsGitHubService'. Add a ciFixModel test seam to the widget (mirroring approvalModel/blockedSessions) and supply a no-op mock in the fixture. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix Fix CI row content clipped by inherited list-row line-height The blocked-sessions list row sets line-height to the full row height (e.g. 86px) inline. The .session-ci-row and its label did not override it, so the single-line label's line box grew to ~86px, inflating the row and pushing the label and Fix CI button below the row's overflow:hidden clip, leaving an empty orange box. Set an explicit line-height on .session-ci-row so its content lays out at the intended 32px height. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 3fb3e1b9 · 2026-07-13
- 0.9ETVsessions: add CI failures and created-comments banners above the chat input (#322578) * sessions: add CI failures and created-comments banners above the chat input Add two dismissible banners that render directly above the active session's chat input in the Agents window: - A CI failures banner (orange accent) shown when the active session has at least one failed CI check. It reads "X of N checks failed" (ellipsized) with a floating right-aligned button bar: Fix Checks (same as the Changes view fix-ci action) and Reveal Checks (opens the Changes view and expands + focuses the CI checks section). - A created-comments banner (neutral accent) shown when the active session has reviewable (PR/Agent review) comments still in the Created state. It reads "N comments" with Address Comments (sends /act-on-feedback) and Reveal Comments (opens the first comment in the editor). Each banner has its own dismiss (x) that permanently hides it for that session, persisted across reloads via the storage service. The presentational card is a self-contained SessionInputBannerWidget so it can be rendered in a Component Explorer fixture; the reactive SessionInputBanners host composes it and the chat view mounts it above the input via the public IChatWidget.inputPart.element API. Also adds CIStatusWidget.expand()/focus(), ChangesViewPane.revealChecks(), and a Reveal Checks command, plus Component Explorer fixtures for the banners. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: register sessionInputBanners in i18n.resources.json Fixes the Compile & Hygiene CI failure: the new contrib uses localize() so its folder must be listed for translation extraction. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address PR feedback on input banner widget - Use the shared Button widget for banner action buttons so theming, focus, keyboard/touch, and accessibility stay consistent (primary = button colors, secondary = ghost), mirroring the chat input notification widget. - Make the ThemeIcon import type-only. - Use the --vscode-strokeThickness token for the 1px border and focus outlines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: make the Fix Checks button orange to match the CI banner accent Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: give secondary banner buttons a visible border Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: label comments banner by kind (PR / agent / mixed) Show 'N PR comments' when all counted comments are PR reviews, 'N agent comments' when all are agent reviews, and 'N comments' for a mix. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 9a2c9f33 · 2026-06-23
- 0.9ETVsessions: fix listener leak in copilot chat session grouping (#325597) * sessions: fix listener leak in copilot chat session grouping Each cached session built its group-chats observable with observableFromEvent over a per-session Event.filter of the shared _onDidGroupMembershipChange emitter, adding one listener per session. Since sessions are cached for the provider's lifetime, listeners grew unbounded and tripped the listener-leak detector. Subscribe to the emitter once via observableSignalFromEvent and have each session's derived read that shared signal, with an equalsFn to keep unaffected sessions from propagating downstream. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address review — per-group signals, uri comparer, regression test - Fan the single membership-emitter listener out to per-group signals keyed by sessionId, so a membership change recomputes only the affected group (targeted invalidation) while the emitter keeps a constant listener count. - Compare chat resources with uriIdentityService.extUri.isEqual instead of toString(). - Add provider coverage that observes many grouped sessions, changes one group's membership, and asserts a single membership listener plus recomputation of only the affected group. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · ab9ec62c · 2026-07-13
- 0.9ETVsessions: drag-and-drop reordering in the sessions list (#322423) Allow reordering sessions in the Agents window sessions list via drag and drop. A synthetic per-sort-mode sort key (midpoint of the surrounding sessions) is stored in ISessionsListModelService and used only for sorting; the provider's real createdAt/updatedAt are never modified. - Drop above the first session uses the current time; dropping a session back to where its natural timestamp already sorts it clears the stored override ("drops the fake value"). - Grouping by date allows moving across date buckets; grouping by workspace restricts reordering to within the same workspace group. - Only regular sessions reorder (pinned/Done and section/show-more rows are rejected). Multi-selection moves as a contiguous block, preserving relative order. - Dragging multiple sessions into the sessions grid opens all of them. The insertion line reuses the base list widget's drop-target-before/after feedback, whose anti-flicker logic renders the same DOM line whether hovering the bottom half of the upper row or the top half of the lower row, so it does not shift. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 6d2d1671 · 2026-06-22
- 0.8ETVAdd feedback feature for Claude integration (#321254) * commit phase 1 * phase 2 * phase 3 * phase 4 * phase 5 * :lipstick: * fixes * fix cycle * auto approve tool * attachment fixes * server side tools * server side tools * fixesgithub.com-microsoft-vscode · a5ee44ba · 2026-06-14
- 0.8ETVsessions: keep PR icon visible for inactive sessions and limit PR polling (#321631) Render the sessions list pull request icon from a persistent last-seen PR state cache instead of a live, active-only model reference, so the icon no longer disappears when a session becomes inactive. Poll only the visible and 5 most recently updated sessions, fetch once when a PR number resolves, and persist up to 100 PR states (oldest evicted) in global storage for instant render on reload. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 507c2387 · 2026-06-16
- 0.8ETVsessions: add terminals pill to session header meta row (#323701) * sessions: add terminals pill to session header meta row Surface a "{n} terminals" pill in the session header meta row (next to workspace / changes / pull request). The label counts the session's terminals that have had at least one command sent in them; the hover reports how many of those are currently running something (active), e.g. a watch task or an in-progress npm install. Clicking reveals the terminal view for the session. The pill is gated on the new per-view SessionHasTerminalsContext key. Counts are exposed via the new ISessionTerminalsService, backed by SessionsTerminalContribution which tracks per-session terminals, records "has had a command" stickily (executed text / command detection / started child process) and recomputes the active subset live from hasChildProcesses. Newly created terminals are associated with the active session so the counts update as terminals are opened. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address PR feedback on terminals pill - Enforce single terminals provider: throw on a second registration so a leaked/overwritten provider listener can't accumulate - Fix SessionHasTerminalsContext description to match its semantics (set from total terminals with a command, not active terminals) - Include the total count and an action description in the pill aria label so screen reader users get the same information as sighted users Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: remove unused test variable (fix CI) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 35f6ba07 · 2026-06-30
- 0.8ETVsessions: Add first-time Agents window open telemetry (#327140) * sessions: Add first-time Agents window open telemetry Track entry source and initial setup state for users who have not yet sent an Agents window message, and report close duration for up to three minutes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: Preserve Agents window tip exclusion Route title bar variants through the tracked base command while retaining their telemetry source. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 21d989b1 · 2026-07-23
- 0.7ETVonboarding: gate experiment assignment-context id until would-show (#322777) * onboarding: gate experiment assignment-context id until would-show Onboarding experiments previously leaked their assignment-context identifier into telemetry from application startup — before the user had reached (or been eligible to reach) the onboarding experience — polluting the A/B scorecard with pre-onboarding activity. Scenarios can now declare an experiment with two treatment flags: a boolean `behaviorFlag` (treatment shows the tour, control does not) and a string `assignmentContextIdFlag` (the id the scorecard keys on, which must use the reserved `onb-` prefix). An eagerly-registered telemetry filter blocks any `onb-`-prefixed id from the very first event. When the user reaches the would-show moment the gate opens for that id (persisted APPLICATION/MACHINE so it survives reload/relaunch) and it flows on every event thereafter in both arms. The experiment is only active when both flags resolve and the id carries the prefix; a missing prefix is rejected and reported so a misconfiguration can never leak ungated. Also emits `onboarding.scenarioOutcome` telemetry when a tour is shown (outcome, dismiss reason, furthest step, step count, duration, experimentActive) and threads dismiss reason / furthest step through the spotlight presentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * onboarding: only emit outcome telemetry when a tour is actually shown; clarify experiment docs Addresses PR review feedback: - Add IOnboardingRunResult.shown so the engine skips onboarding.scenarioOutcome telemetry for degenerate runs that render nothing (no steps / all steps skipped). - Clarify the IOnboardingExperiment doc: an inactive experiment means the scenario does not run automatically (manual runScenario still works, bypassing gating). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · cd1261d2 · 2026-06-24