Bhavya U
90d · built 2026-08-09
90-day totals
- Commits
- 78
- Grow
- 9.2
- Maintenance
- 8.5
- Fixes
- 6.6
- Total ETV
- 24.3
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 48 %
- By Growth share
- Top 20 %
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).
↑+4.8 %
vs 21 prior
↓-25.5 pp
recent vs prior
↑+26.5 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.
- 2.9ETVAdd E2E prompt snapshot tests for Copilot agent host (#328158) * Add E2E prompt snapshot tests for Copilot agent host Pins the prompt the bundled Copilot CLI assembles for each model: the system prompt, the tool definitions, and the turn messages with the context the CLI injects around them. Read off a replayed turn, so the tests are deterministic and need no token or network. Baselines keep as much real prompt text as possible. Only values that differ between two correct runs are elided - the session id, the clock, and the environment probe - each keeping its surrounding label so a change to the shape of those lines still fails. The repository instructions the CLI injects from .github/copilot-instructions.md and AGENTS.md are captured verbatim, so editing either file requires refreshing these baselines. POSIX-only: the Windows prompt carries PowerShell-specific sections rather than being a renaming of this one. See KNOWN_ISSUES.md. * Address review of the Copilot prompt snapshot tests Fail the turn on chat/error instead of treating it as completion, so a broken turn cannot be snapshotted as a good prompt. Require a committed baseline. assertSnapshot creates a missing one and passes, which would let a newly added model go green against a file nobody wrote or reviewed. Only accept a baseline from the replay-scoped update flag. The update-all flag also puts the harness in live-record mode, and the header comment already says a recording run must not be snapshotted because the live catalog and experiment assignment move the prompt. Skip the assertion entirely while recording rather than comparing a live prompt against a replay-derived baseline. Refresh the README, which still described the earlier one-model-per- dialect set and claimed the no-selection case was not pinned. * Make pinning a model opt-in by eliding the CLI's model catalog The CLI inlines the whole /models list into the Task tool's schema, as a count and a per-model listing, so adding one entry to capiStubs.ts rewrote all thirteen baselines - including those of models nobody snapshots. A new model release would have landed as a thirteen-file diff on an unrelated PR. Elide both, keeping their labels so the catalog changing shape or vanishing from the prompt still fails. Adding a model to the stub catalog is now inert; a model is pinned only once someone also adds it to SNAPSHOT_MODELS and commits its fixture and baseline. * Refuse to build a prompt baseline out of an empty request The system prompt and tools are read through dialect-specific field names, and a shape the formatter does not recognize yields empty rather than throwing. That is how the first version of these tests pinned a 12-character system prompt and no tools at all for a whole model family, green. Assert both are non-empty before formatting, so a renamed wire field fails loudly instead of silently rewriting the baseline to nothing. * Pin only explicitly selected models Sending no selection let the CLI rank the stub catalog itself, so the baseline recorded a property of this suite's fixture rather than the prompt, and would move whenever a higher-ranked model was added to or removed from the catalog. * Condense the prompt snapshot comments The same points were restated across the file header, the constants, and each function's doc block. Keep the reasoning that the code cannot show - why recording never produces a baseline, why an unrecognized wire shape must fail loudly, what is elided and why - and drop the rest. * Restart the shared host after a failed prompt snapshot test A failed test can leave a mid-turn session that wedges the shared Copilot process, cascading into the next model. Pass `failed` to `release` so it restarts, dump the runtime logs first, and move temp-directory cleanup into a `finally` so a throwing `release` cannot skip it - matching `agentHostE2ESuites.ts`. * Stabilize Copilot prompt snapshot tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Expand Copilot prompt snapshot coverage Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 75f2fe1c · 2026-08-03
- 2.1ETVCache explorer: conversation-level hit rate, exclude utility models, agent-type filter (#320902) Fixes #320765github.com-microsoft-vscode · aefd1103 · 2026-06-11
- 1.5ETVAdd tool search to Copilot agent host (#326213) * Add tool search to Copilot agent host * Address review: alias-aware tool-search gating, drop transient candidates, cover prompt branch - Compute the tool-search capability decision from the family-aliased model in both the launcher and CopilotAgentSession so an aliased preview model is no longer rejected and the two stay in agreement. - Strip the transient tool-search candidate corpus from the completed tool call's _meta so repeated searches don't bloat synchronized session state or persist across reconnects. - Add active/inactive + composition tests for the tool-search prompt line at both the unit and prompt-registry layers, plus a model-family alias regression test for tool-search gating. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove obsolete tool-search start barrier * Address tool-search review feedback * Use the extension's existing tool-embedding cache for Agent Host search * Address review: keep server tools eager, harden tool-search candidate corpus - Force server-provided SDK tools to defer:'never' so they stay eager and are not deferred behind tool_search. - Default missing candidate descriptions to '' when building the tool-search corpus, so the all-or-nothing metadata reader never drops a valid corpus. - Drop the unused inputSchema field from the tool-search candidate corpus (name + description are all the embeddings ranker consumes). - Use the client-facing tool name in the custom-tool auto-approve membership check so a deferred tool_search runtime name resolves correctly. - Remove a redundant conjunct in _clientToolName already implied by _isToolSearchActive(). * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Temporarily disable GPT tool search --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>github.com-microsoft-vscode · c6b3beee · 2026-07-23
- 1.1ETVCache Explorer: agent filter, per-chunk breakdown, stable rail selection (#320469) * Cache Explorer: agent filter, per-chunk breakdown, stable rail selection - Agent filter dropdown in the rail (defaults to panel/editAgent) - Collapsible per-chunk breakdown table for the prompt signature - Clicking/arrowing rail turns updates selection in place instead of rebuilding the rail, fixing focus loss and scroll jump; adds Up/Down nav * Cache Explorer: preserve rail selection for turns without an id Agent-filter selection was stored as the turn's optional id, so turns without an id skipped the restore path and could still jump to an unrelated turn. Store the turn object instead and match in two passes: precise id/reference identity first, then a composite fallback for id-less turns so an earlier look-alike can't win over the exact turn. * Cache Explorer: address review a11y/perf comments - Rail rows use role=button, so swap aria-selected -> aria-current (kept in sync in selectTurn and on initial render). - Agent filter trigger: aria-haspopup=menu instead of generic true. - Mark decorative chevrons (filter + chunk-breakdown toggle) and the chunk role swatch aria-hidden. - Chunk breakdown gets table semantics: role table/row/columnheader/cell on header, data, and totals rows. - moveSelection: drop the per-keypress sort; railRowsByIndex Map iteration already yields rows in visual order.github.com-microsoft-vscode · fb811e18 · 2026-06-08
- 1.0ETVCopilot CLI agent-host: experimentation overrides + config split (#324099) * Copilot CLI agent-host: experimentation overrides + config split Ports reasoningEffortOverride and modelCapabilityOverrides from the Copilot Chat extension to the Copilot CLI agent-host provider, and splits Copilot-CLI-specific root-config keys into a dedicated schema. - New settings chat.agentHost.reasoningEffortOverride and chat.agentHost.modelCapabilityOverrides (experimental/advanced), forwarded into the local agent host root config. - New copilotCliConfig module owns CLI-only keys; opus48Prompt, enableCustomTerminalTool, rubberDuck moved out of the shared schema (wire strings unchanged, so persisted config stays valid). - Reasoning-effort override applied at session create and mid-session model change; family alias applied for prompt routing only (wire model id untouched). - Shared AgentHostRootConfigForwarder de-duplicates the settings->root-config forwarding (schema gate, hydration retry, cross-window loop guard). * agentHost: consolidate CLI setting IDs, extract sandbox forwarder, trim comments - Move the chat.agentHost.* Copilot-CLI setting IDs into copilotCliConfig.ts beside their root-config keys; rename the prompt contribution to AgentHostCopilotCliSettingsContribution. - Extract the sandbox settings forwarding into AgentHostSandboxForwarder. - Trim verbose doc/inline comments across the changed agent-host files. * agentHost: revert comment-only changes in agentHostSandboxForwarder (keep import change only) * agentHost: clarify reasoning-effort override wording (recognized level vs model-supported)github.com-microsoft-vscode · 4919fddd · 2026-07-06
- 1.0ETVSurface Agent Host (Copilot CLI) sessions in the Chat Debug Logs panel (#321809) Adds a core-side IChatDebugLogProvider that reads each Agent Host Copilot CLI session's on-disk events.jsonl and converts the records into debug-panel events, reconstructing the user -> model-turn -> tool-call trajectory tree. Local and remote (remote-<authority>-copilotcli) agent-host sessions are made debug-eligible, historical local sessions are discovered for the home list, and the currently-viewed session's events.jsonl is watched for live refresh. Usage reporting: - Session-cumulative input/cache tokens and Copilot AIU are back-filled from the session.shutdown summary onto model-turn events so the Summary tiles sum exactly; in-progress sessions fall back to live AHP session-state usage. Lifecycle: - Add IChatDebugService.onDidEndSession so the provider can dispose its live file watcher when the session it follows is closed.github.com-microsoft-vscode · 532673ae · 2026-06-17
- 0.9ETVAdd per-model system-prompt registry for Copilot agent-host sessions (#321864) * Add per-model system-prompt registry for Copilot agent-host sessions Introduces a prompt registry (mirroring the Copilot extension's PromptRegistry/IAgentPrompt) so Copilot CLI agent-host sessions resolve their SDK system message per model instead of a single hardcoded constant. First contributor: a Claude Opus 4.8 resolver applying customize-mode section overrides, opt-in via the new chat.agentHost.opus48Prompt.enabled setting (forwarded into the local agent host root config). Forwarding is registered for the VS Code workbench only, not the Agents window. * Address PR review: empty section overrides fall back to default; strongly type test schema helper - promptRegistry: treat an empty resolveSectionOverrides() result as 'no override' so the default identity customization is preserved instead of emitting customize-mode with empty sections. - agentHostCopilotPromptContribution.test: import ConfigPropertySchema and type makeRootStateWithSchema, removing the unsafe Record<string, never> cast. - agentHostPromptRegistry.test: add regression test for the empty-overrides fallback. - anthropicPrompt: lead the Opus 4.8 tone append with a newline so it doesn't run on from the SDK foundation tone.github.com-microsoft-vscode · 17e40350 · 2026-06-20
- 0.6ETVAdd setting to keep shorter context option for free long-context models (#324650) Gates the collapse-to-long-context-only behavior behind the new github.copilot.chat.preferLongContext.enabled setting (default off), so models with a free long context window (e.g. Claude) show both the default and long context options again. Covers the main chat picker, CLI picker, and the Agents window. Fixes #323936 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · b664e8ae · 2026-07-08
- 0.6ETVRevert custom trajectory compaction model, fix compaction bugs (#327548) Reverts the effects of #316114, which routed conversation-history compaction to a dedicated `trajectory-compaction` CAPI model behind `chat.conversationCompaction.usePrismCompaction`. A plain `git revert` conflicted and would have clobbered fixes that landed on top (#322255, #321980, #325905), so the prism branches are removed surgically and the production paths are left as they were. `backgroundSummarizer.ts` and the `endpointProviderImpl` family resolution are intentionally kept: both were extracted by #316114 but are now used by the production path and by later commits. Also fixes three compaction bugs: - Foreground `/compact` stored the model's raw response, including the `<analysis>` scratchpad the summarization prompt asks for, as the summary. It now unwraps via `extractSummary` like the background path, falling back to the raw text when the model omits the tags. Fixes #321200. - Compaction requests left `ignoreStatefulMarker` unset, which resolves to true on `ChatEndpoint` but false on `OpenAIEndpoint`, so BYOK Responses endpoints sent `previous_response_id` and had history sliced against a continuation the compaction prompt is not part of. Now set explicitly. Fixes #323554. - "Compact Conversation" discarded the user's unsent draft and attachments. Adds an opt-in `preserveInput` submit option meaning "the input box is not the source of this request": the draft is kept and its attachments are omitted from the request. Applied to both the agent-host action and the non-agent-host `github.copilot.chat.compact` path, which went through `chat.open` and overwrote the draft via `setInput` before submitting. Fixes #314664. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 6447f849 · 2026-07-26
- 0.6ETVExternal ingest: harden finalize against 412 phase mismatch (#322254) * External ingest: harden finalize against 412 phase mismatch Fixes the "Build Codebase Semantic Index" failure for non-GitHub repos where `/external/code/ingest/finalize` returns HTTP 412 ("request sent for phase which was not the current phase"). The server only advances to the finalize phase once it has received every expected document, so a finalize can fail when the server is still missing documents. - Retry finalize with backoff (bounded) after a 412, re-polling `/batch` for documents the server still reports as missing and re-uploading them. - Stop swallowing per-document upload failures: collect them and fail the pass with a descriptive error (status + requestId) before finalize, so the real cause is surfaced instead of a misleading finalize 412. Failed uploads are no longer counted as uploaded. - Make a `/document` 404 ("ingest is gone") abort the pass deterministically rather than relying on a rejection an intermediate `Promise.all` can swallow. - When finalize keeps returning 412 but the server reports no missing documents, surface a distinct "likely server-side" error after retries. Adds an ExternalIngestClient test suite driving the real client through the ingest HTTP protocol (retry-then-success, re-upload still-missing, exhaustion, server-side-no-missing-docs, persistent upload failure, and 404 abort). Refs microsoft/vscode#320915 * Use fake timers for finalize-retry tests; count unique uploaded docShas - Test suite uses fake timers so finalize-retry backoff doesn't add real wall-clock time - Record unmapped docSha as a deterministic upload failure instead of throwing (rejection was swallowed by Promise.all) - updatedFileCount counts unique uploaded docShas across passes instead of summing per-pass attempts - Add test for the unmapped-docSha failure path * Fix externalIngest tests failing in CI without a GitHub token createPlatformServices() wires a static auth service backed by createStaticGitHubTokenProvider(), which throws when no GITHUB_PAT/GITHUB_OAUTH_TOKEN is set (CI). Override IAuthenticationService with a static token so getAuthToken() resolves deterministically. Verified by running the suite with the token env vars unset.github.com-microsoft-vscode · 49d32125 · 2026-06-22
- 0.6ETVWire up universal tool_instructions for agent host prompts (#322507) * Wire up universal tool_instructions for agent host prompts * Address review follow-ups for universal tool_instructionsgithub.com-microsoft-vscode · e4fa1d34 · 2026-06-23
- 0.6ETVFix stale background compaction across model switches and /compact (#317163) The `_backgroundSummarizers` map on `AgentIntent` is keyed only by sessionId, so a summary kicked off against one model's prefix could be applied unconditionally on the next render — even after the user switched to a model with a larger context window or ran `/compact`. The user saw a 'Compacted conversation' notice on a turn with plenty of headroom, with content summarized against the old model's history. * `BackgroundSummarizer` now records the `endpointModel` it was built for. * `AgentIntent.getOrCreateBackgroundSummarizer` cancels and recreates the summarizer if the endpoint identity changed since last call. * `handleSummarizeCommand` (`/compact`) cancels any pending background summarizer once we commit to foreground compaction. * Pre-render apply now gates on `contextRatio >= applyMinRatio` (0.65) as defense-in-depth — covers context-size overrides and any path that slips past the endpoint check. Stale completed results are consumed-and-discarded so a fresh kick-off can replace them.github.com-microsoft-vscode · 15bd7994 · 2026-05-23
- 0.6ETVFix Anthropic 400 on empty-text thinking blocks (#320196) Track redacted-ness with an explicit flag instead of inferring it from missing text. A regular thinking block with an empty text field but a valid signature (display: "omitted" or pruned) was misclassified as redacted_thinking and shipped the signature in the data field, which Anthropic rejects with "Invalid 'data' in 'redacted_thinking' block".github.com-microsoft-vscode · e50398f8 · 2026-06-06
- 0.6ETVReject path traversal in Create Workspace file tree (#318057) - fileTreeParser: reject node names that are empty, '.', '..', or contain '/' or '\\'; throw on unsafe project root names. Filters unsafe child node names from the parsed tree. - newWorkspaceFollowup: replace the platform-aware path.relative destination computation (which resolved a relative projectRoot against process.cwd() on Windows) with a posix prefix-strip helper, resolveProjectFileUri. Add a runtime isUriContained guard before writeFile so any traversal that slips past the parser cannot escape the generated workspace folder. - Tests: cover unsafe node names, the PoC tree, isUriContained edge cases (prefix collision, scheme/authority, trailing slash), and resolveProjectFileUri for both copilot and GitHub repo-template path shapes.github.com-microsoft-vscode · 3027c82e · 2026-05-22
- 0.5ETVImprove Agent Host large-output guidance (#329778) Improve large tool output guidance Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 97f9937a · 2026-08-08
- 0.5ETVWarn when changing model/options mid-session breaks the prompt cache (#323594) chat: warn when changing model/options mid-session breaks the prompt cache The model and options pickers surface a cache-break cost hint when the chat session's prompt cache is warm — switching the model or changing options mid-session resets that warm cache and may increase cost. The hint includes a "Learn more" link (rendered via the shared Link widget through a new optional headerLink on the action list header banner) pointing at the Copilot docs on optimizing AI usage. Warmth is derived directly from the session's request history at the picker rather than tracked in a parallel in-memory map: getRequests() length for the default chat, and session status leaving Untitled for agent-host sessions. Both warm as soon as the first request is sent, so the signal is drift-free and consistent across surfaces — it covers reloaded/restored sessions, every request path, and the agents window. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · d9c7d78c · 2026-07-01
- 0.5ETVfeat: add per-model capability overrides for advanced configuration (#317237)github.com-microsoft-vscode · d8e88906 · 2026-05-19
- 0.4ETVFix cache break hint when models are unavailable (#325444)github.com-microsoft-vscode · d40305ca · 2026-07-11
- 0.4ETVAdd Claude Opus 5 system prompt (#327410) * Add Claude Opus 5 system prompt Adds a minimal Opus 5 prompt behind `chat.claudeOpus5Prompt.enabled`, following Anthropic's guidance for the Claude 5 generation: describe the environment as facts rather than rules, put the behavioral weight into scope and correction guidance, and drop the rule lists the model now handles with its own judgement. Off by default, falling back to the Claude 4.6 Opus prompt. Also: - Remove the Opus 4.8 and Sonnet 5 prompts and their settings. Both models now use the Claude 4.6 prompts. - Add comment-etiquette guidance to the shared optimized reminder, so it reaches every Claude 4.6+ family rather than a single prompt. - Enable tool search for claude-opus-5. * Reword Opus 5 prompt to remove borrowed phrasing The prompt had picked up wording from a reference system prompt during drafting. Rewrites every affected passage in original wording, keeping the guidance intact. Verified no shared word sequence of five or more remains between the branch's added lines and that reference.github.com-microsoft-vscode · a7fa33e7 · 2026-07-24
- 0.4ETVRegression: Fix execution subagent model setting being ignored (#320231) (#320479) * Fix execution subagent model setting being ignored (#320231) getChatEndpoint(string) regressed in the copilot-utility rename (ef061ccb0fc): the string branch only resolved the two utility families and threw 'Unrecognized chat endpoint family' for anything else. The execution and search subagents pass their *.model override (e.g. gemini-3-flash) straight to getChatEndpoint(), so the throw was caught and they silently fell back to the parent model. Restore arbitrary CAPI family resolution via a new _resolveFamily() that routes utility families to their dedicated resolvers and any other family through getChatModelFromCapiFamily(). Adds a regression test. * Widen getChatEndpoint to accept CAPI family strings; drop casts Addresses PR review: the public IEndpointProvider.getChatEndpoint only typed its family parameter as ChatEndpointFamily (the two utility aliases), so valid CAPI families like gemini-3-flash required unsafe casts and the contract was misleading. Introduce ChatModelFamily (utility aliases | any CAPI family string, preserving literal autocomplete) and use it for the public API, removing the casts in the execution/search subagents and the regression test. * Guard search subagent against non-tool-calling configured models Council review found the search subagent resolved its configured chat.searchSubagent.model and used it directly, without the supportsToolCalls guard the execution subagent already has. Since this PR makes arbitrary CAPI families resolve (instead of throwing and falling back), a resolvable-but-non-tool-calling search model would run the search subagent with its tools stripped by interceptBody. Mirror the execution subagent: fall back to the parent endpoint when the resolved model can't call tools.github.com-microsoft-vscode · be3152e6 · 2026-06-08