Ulugbek Abdullaev
90d · built 2026-09-08
Performance
What Ulugbek Abdullaev shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+239.4engineers
delivers like 240.4 (240.4x pre-AI)
Output (ETV)
72.1ETV
+769.8% vs 8.3 prior
Features share
32.0%
−2.7 pp vs prior window
Fixes share
19.3%
+0.8 pp vs prior window
Work mix
32% Features5.9% Maintenance41.1% Tests1.7% Docs19.3% Fixes
124 commits over 90 days, ending 2026-09-08.
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 56 %
- By Features share
- Top 46 %
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 10 by ETV in the last 90 days.
- 8.4ETVautomations: feat: migrate execution to Agent Host Protocol (#331796) * automations: feat: migrate execution to Agent Host Protocol Move Automation definitions, scheduling, run lifecycle, and persistence into the Agent Host while safely migrating legacy VS Code data and retaining older-host fallback behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 142bb750-abf2-4b29-91b8-1e9ab2444635 * automations: guard Agent Host migration cutover Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * automations: optimize sparse cron evaluation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * automations: gate initial Run advertisement on enabled state Match the canRun composite used by handleConfigurationChanged so a create that arrives while chat.automations.enabled is false does not advertise Run. * automations/ahp: gate SessionWorkingDirectoryReplaced action Bring Replaced to parity with Set/Removed at the working-directory gate: extend the action union, canonicalize both URIs in the resolver, enforce editor-only client and provider capability at _dispatchActionNow, and include Replaced in the customization-enablement listener. Also honors the Removed contract for primaryReplacement: rejects index-0 removal when the agent advertises primaryReplacement. * automations/ahp: enforce single-run invariant in schedule claim loop Break out of the trigger loop once a schedule trigger has been claimed for an Automation, after advancing that trigger's cursor. Prevents two simultaneously-due schedule triggers on one Automation from both starting sessions and violating the one-non-terminal-run-per-Automation invariant. Deferred triggers keep their cursors untouched so their firings are re-evaluated on the next tick rather than dropped. * automations/ahp: coalesce simultaneously-due schedule triggers into one run Two schedule triggers on one Automation whose past-due cursors land in the same claim tick now coalesce into a single run. Catch-up is idempotent: one run at now, regardless of how many missed firings a sibling trigger also carries. The claim block skips when another trigger has already claimed for this Automation this tick, but the deferred cursor still rolls forward to its next cron occurrence so it does not re-fire on the next tick. Replaces the earlier break-after-claim approach from e2c2657, which serialized the deferred firing back-to-back. * automations/ahp: gate Run authority on legacy import until source is durably removed The migration path published imported snapshots with Run granted before the legacy source row was CAS-removed, creating a double-authority window where both schedulers could dispatch the same occurrence. If the removal failed, the window became permanent. Stage imports with a pending meta flag, centralize the Run/Remove permission check in the host, restore Remove when the flag clears, gate scheduling ownership on the flag, and add an acknowledge hook so cross-provider retargets clear the pending state after the source is durably gone. Recovery drains stranded pending rows on reconnect. * automations: finish Agent Host merge integration Co-authored-by: benvillalobos <4691428+benvillalobos@users.noreply.github.com> * test: mirror host automation migration authority Co-authored-by: benvillalobos <4691428+benvillalobos@users.noreply.github.com> * agentHost: restore main's reject of SessionWorkingDirectoryReplaced The merge collapsed main's two-block structure for working-directory actions back into one, dropping the explicit reject for `session/workingDirectoryReplaced`. No provider advertises `primaryReplacement` and the host has no backend side effect for the action, so the reducer would apply an unvalidated mutation. Restore the standalone reject before the EditorWindow-gated block for Set / Removed. * signing commit * signing commit * automations: use family guards for dispatch, matching existing pattern Recreate the pre-existing dispatch-guard convention rather than switching this hot path to isClientDispatchable. The generic check pulled in synced protocol code and widened the scope of this change. Automation and automation-run actions now flow through family guards, consistent with how session, chat, terminal, changeset, and annotations actions are already handled. The family-vs-permission gap this restores is pre-existing and tracked for maintainer follow-up. * automations: drop reducer-helpers sync patch, no longer needed The dispatch guard no longer uses isClientDispatchable, so nothing imports the synced reducer-helpers.ts. Its generated-source compatibility patch only existed to widen that helper's signature for the guard, so remove it and let the file sync verbatim. The state.ts dead-import patch stays until the synced AHP revision picks up the upstream fix. * agentHost: separate subscription resources and channels Keep URI-based subscription APIs narrow while preserving exact AHP catalogue channels. Mark failed reconnect restorations by channel and cover the exact-channel path with regressions. * automations: give the catalogue channel a round-trippable authority The catalogue channel constant was `ahp-automations://`, which is not a round-trippable URI. `URI.parse('ahp-automations://').toString()` drops the empty authority and yields `ahp-automations:`, so a channel serialized on the client no longer matched the catalogue check on the host. Append a `catalog` authority so the URI survives a parse/toString round-trip. Comparing catalogue channels as URIs everywhere (ResourceMap/isEqual) remains the intended followup. * automations: key the catalogue channel like every other channel Now that the catalogue channel URI round-trips through parse/toString, its subscription key no longer needs to preserve the raw channel string. Drop the `_subscriptionChannel` helper and its automation-catalogue special case, and key every channel through `_subscriptionResource` by its parsed URI. Comparing channels as URIs everywhere (ResourceMap/isEqual) remains the intended followup. * automations: use shared action family routing Use dedicated automation channels for subscription relevance and reuse the canonical action-family guards in state management. This avoids silent drift when the protocol adds actions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8c6d543f-7777-4e8b-9371-3e39a0842293 * automations: inject the automation service as a collaborator AgentService received the automation service through a post-construction setAutomationService setter, leaving a definite-assignment field and a one-off wiring step. It depends on AgentService only through the lazy callback adapter, so it can be built first and passed in the collaborators bag like every other dependency. Its constructor installs durable state without firing emitters, so the earlier ordering is safe. * automations: key subscriptions by URI through ResourceMap The subscription map had been changed from a ResourceMap to a Map<string> keyed by a synthetic getComparisonKey string, purely to hold the lossy catalogue channel under a raw key. With the catalogue channel now round-trippable and the special-case keying gone, every entry keys by a real URI again. Restores the ResourceMap that main uses and drops the synthetic key from the entry type, the resource helper, and all fifteen call sites. * automations: revert subscribe callbacks to URI The subscription manager threaded raw channel strings through _subscribe/_unsubscribe to dodge a lossy round-trip on the catalogue channel. Now that the catalogue URI round-trips, revert those callbacks to (resource: URI) to match main. The wire boundary keeps its .toString() serialization in the protocol client. * automations: migrate legacy definitions to native AHP state Translate legacy automations at the client boundary instead of persisting editor projection metadata. Derive the compatibility view from host state and canonicalize supported round trips. * automations: stabilize legacy target serialization for AHP migration Serialize folderUri as explicit URI components instead of URI.toJSON(). toJSON() only emits the lazily cached fsPath and formatted fields once they have been accessed, so two URIs for the same folder could serialize differently. That made the snapshot equality check during Agent Host migration fail with "kept changing while migrating" for every folder-target automation, blocking migration indefinitely. Reads already go through URI.revive, so existing ledger data stays compatible in both directions. * automations: ignore rejected chat actions when finalizing runs _handleEnvelope finalized an automation run on ChatTurnComplete, ChatTurnCancelled, or ChatError but did not check rejectionReason. A rejected action never reached authoritative host state, so applying it marked a still-live run terminal and orphaned its session. Guard against rejected envelopes before finalizing, matching the sessions provider's action handler. * automations: salvage valid legacy ledger entries Keep valid automations writable when individual persisted rows are malformed. Update migration coverage and compare round-tripped URI resources without relying on cache state. * automations: recover corrupt legacy run archives Salvage valid archived runs and repair unreadable current-version archives during import. Preserve fail-closed handling for unsupported newer versions. * automations: wait for provider migration before wakeup Refresh pending automations only after initial provider migration succeeds. Apply the same ordering when a failed provider migration is retried. * automations: reject inactive catalog subscriptions Apply the standard subscription cancellation guard before adding an automation catalogue subscriber. * automations: surface pending import drain failures * automations: acknowledge migrated snapshots * signing commit --------- Co-authored-by: Ben Villalobos <4691428+benvillalobos@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Ben Villalobos <bevillal@microsoft.com> Copilot-Session: 142bb750-abf2-4b29-91b8-1e9ab2444635 Copilot-Session: 8c6d543f-7777-4e8b-9371-3e39a0842293github.com-microsoft-vscode · 33e6a5d6 · 2026-08-27
- 6.3ETVautomations: refactor: make provider session templates canonical (#334521) * automations: fix: preserve legacy Autopilot mode mapping Translate legacy Autopilot permission selections into separate Agent Host Mode and Assisted approvals, preserving explicit Plan mode. Do not forward generic workbench chat modes into Agent Host session configuration. Keep the Automation projection and its regressions separate from runtime approval-policy enforcement. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * agentHost: fix: revalidate Copilot approvals against policy Resolve supplied elevated approval preferences against the current root policy before validating Copilot session configuration. Restrict approvals to default without changing the independently selected execution mode. Cover a policy change between configuration resolutions so a stored Assisted preference cannot bypass a newly applied restriction. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: harden legacy Autopilot migration Preserve provider-owned configuration across compatibility edits, repair existing and provider-less Copilot Automation definitions, and reset incompatible state on retargeting. Enforce managed auto-approval policy at both SDK and host decision points while keeping saved preferences intact. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: preserve provider session templates Add a versioned provider-neutral session template projection for model, agent, and opaque configuration. Keep legacy flat writers functional during migration, preserve unknown AHP state on edits and transfers, and clear incompatible configuration on retarget. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: restore provider draft configuration Let Automation drafts restore and capture provider-owned model, agent, and resolved configuration through the Sessions provider contract. Keep normal New Session defaults isolated, reject replaced draft snapshots, and exclude transient or target-owned values. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: reuse provider session controls Drive Automation configuration through a scoped session draft and the same provider-owned pickers as New Session. Capture complete provider state for Agent Host and legacy Copilot paths while preserving unavailable, opaque, removed, and policy-clamped preferences. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: unify fallback session configuration Pass the complete provider-owned Automation configuration during older-host draft creation so browser fallback and AHP execution use the same template semantics. Keep workspace isolation and branch configuration target-owned. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: expose canonical provider configuration Round-trip complete provider session templates through Automation tools and stop new dialog and AHP projections from writing flattened aliases. Keep legacy rows and inputs compatible while enforcing template-first execution, duplication, telemetry, and rollback semantics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: test: validate config after host restart Specify canonical Automation template and draft ownership across Sessions and Agent Host. Add recorded AHP coverage proving independent Mode and Approvals survive host restart into the created run session, and document the remaining Claude/Codex coverage gap. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: harden provider configuration handling Keep canonical provider templates opaque and authoritative while limiting legacy Autopilot repair to load/import boundaries. Bound dialog capture and preserve per-target configuration across failures and retargeting, retain legacy duplicate/worktree settings, and improve loading accessibility. Add regression coverage for #333723 compatibility, canonical reloads, capture races, and tool configuration limits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: make configuration saving failure-safe Keep the Automation dialog open when provider configuration cannot be captured, expose cancellable saving progress, and serialize draft retargeting. Unify canonical-template authority across stores, require providers to advertise restoration support, preserve definition-owned state, retain scoped picker models across toolbar rebuilds, and keep legacy fallback configuration available. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: normalize provider handoff and saving focus Send providers one canonical Automation configuration object instead of overlapping template channels. Keep keyboard focus on the cancellable action while form content is inert, and make saving and error live regions visible before their announcements change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: test: assert settled restart configuration Refresh the created run session inside the completion retry so the restart E2E validates Mode and Approvals on the settled session rather than an earlier catalog snapshot. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: skip disabled actions in dialog focus Exclude aria-disabled controls from the Automation dialog's custom focus ring so Saving keeps keyboard focus on the cancellable action instead of moving onto the disabled primary button. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: refactor: keep async dialog lifecycle local Avoid extending the widely shared Dialog widget for the Automation editor's provider capture flow. Keep Save failure handling, cancellation, and completion in the Automation dialog while reusing the standard button styles and platform order. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: address canonical template review feedback Filter reserved session state at both Agent Host projection and fallback restoration, preserve configuration for unavailable targets, honor explicit template reset semantics, and keep the Automation prompt menu owned by Sessions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: reject unresolved configuration capture Wait for tracked configuration operations before capturing Automation state. Retry failed host resolution strictly with the attempted values so a transient failure cannot erase explicitly changed preferences. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: scope fallback agent pickers to their session Reuse the existing scope-owned Mode picker cache for both provider families. Automation controls now discover and display their own agents rather than the active session, with regression coverage for scope isolation, toolbar rebuilds, retargeting, and disposal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: restore fallback agents before sending Restore canonical custom-agent URIs and capture the current selection instead of copying the initial agent. Refresh custom-mode discovery before the first Automation request, including cached selections, and fail explicitly if the agent is unavailable. Cancel discovery when the draft is discarded and reject unsupported cloud agent templates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: bound fallback custom-agent discovery Limit custom-agent resolution to one 30-second deadline across selection changes. Dispose each discovery scope and cancel its wait on timeout or draft/provider disposal, rather than retaining hung discovery during recurring Automation runs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: preserve model-specific run configuration Live verification showed Codex running at Medium despite a saved Low thinking selection. Capture model preferences in provider-owned drafts and preserve them through tools, persistence, AHP projection, and fallback requests without rewriting shared defaults on restore. Carry the full model onto the first Automation message so completed runs restore their actual configuration. Refresh same-model configuration badges when switching draft targets, and cover capture, isolation, reset, validation, and restoration with regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 * automations: fix: use dot notation in template parsing The PR merge build enables the bracket-notation lint rule added on main after this branch was based. Replace the four literal property accesses flagged by CI without changing parsing behavior. Validated the exact rule with zero warnings and all 34 Automation tool tests against fresh output. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 09e55c0c-bf80-42ea-b8e2-fad38a12d986github.com-microsoft-vscode · 19b53d23 · 2026-09-06
- 3.0ETVautomations: add agent tools to manage automations (#327110) * Agents: add automation management tools Expose reviewed list, configure, and delete automation tools in the Agents window, with explicit destructive confirmation and cross-window atomic persistence. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Address automation tool review feedback Require the explicit delete confirmation, share the browser storage database and fallback, use single-key reads, and prevent automation dialogs from mutating workspace recents. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Strengthen automation storage review coverage Document IndexedDB CAS semantics and cover key isolation across application, shared, profile, and workspace storage scopes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Preserve browser storage encapsulation Expose narrow application-storage read and CAS operations instead of the IndexedDB backing interface. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Honor automation tool approval settings Use the resolved tool approval decision to apply auto-approved automation changes directly while retaining interactive review and cancellation paths. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Document automation service contracts Clarify guarded update conflicts, mutation semantics, and the resolved tool approval reason exposed to implementations. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Refine agent automation workflow Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Honor Allow all for client tools Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f --------- Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95fgithub.com-microsoft-vscode · 7cfa613a · 2026-07-24
- 3.0ETVAgents: Fix automation branch picker (#325777) * Sessions: Make repository setters asynchronous Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f5aa3878-217b-45dc-9b52-0b5091ddf707 * Agents: Fix automation branch picker Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f5aa3878-217b-45dc-9b52-0b5091ddf707github.com-microsoft-vscode · c7f9ddca · 2026-07-15
- 2.8ETVautomations: feat: add starter templates and clarify target selection (#334836) Offer editable starter templates without silently inheriting a recent workspace. Explain workspace-specific agent choices while preserving saved provider-owned session configuration. Distinguish catalogue loading, readiness, unavailability, and errors across providers, storage, tools, and accessible UI. Keep usable local automation targets available when a remote host is offline, and preserve focus without stealing it after delayed updates. Include regression tests and visual fixtures for catalogue lifecycle, migration readability, target selection, and focus behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 13c4c742-2729-4be4-819c-2adf8243f733github.com-microsoft-vscode · b6d68fbe · 2026-09-07
- 2.3ETVAgents: Support workspace-less automations (#326315) Add workspace-less Automation targets, unify workspace selection, reuse headless quick-chat creation, and model persisted targets as discriminated unions. Copilot-Session: 7600152c-d485-4547-bd86-dd21ad05debd Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · e8bf36ec · 2026-07-18
- 2.0ETVautomations: feat: unify AHP lifecycle telemetry Use one authoritative Agent Host event family for Automation definitions and durable run claims, linked sessions, and terminal outcomes. Retain native run/session identifiers, safe saved configuration, and typed GDPR metadata while removing overlapping browser emitters. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 04a82bd8 · 2026-09-07
- 1.9ETVnes-datagen: add cursor-jump (NCLP) sample task (#320113) * nes-datagen: add cursor-jump (NCLP) task Extend nes-datagen with a next-cursor-line prediction task alongside the existing xtab path. Detects the user's next intentional cursor move after the request bookmark and emits a training sample with the production cursor-prediction prompt + the observed jump as the expected response. Three sub-modes via --sample-task: - cursor-same-file: a jump farther than N lines from cursor at request time - cursor-cross-file: focus/selection on a different file - cursor-both: either of the above Reuses the production cursor-prediction prompt by capturing it via the telemetry builder and a no-op fetcher; the cross-file target line is resolved from a request-time content snapshot + post-request replay so previously-opened targets get a correct line number instead of being silently labelled :0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: replace SAMPLE_TASK_VALUES tuple with a string enum Convert the string-union + as-const tuple to a proper NesDatagenSampleTask string enum. CLI surface is string-enum members keep theunchanged kebab-case wire values ('xtab', 'cursor-same-file', ...). All consumers (dispatch, fixtures, response metadata typing) updated to reference enum members instead of string literals. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: lower default --same-file-jump-min-above to 2 Upward cursor jumps (back to a definition, an import, etc.) are typically tighter than downward jumps after the user has been writing. Lower the default threshold to match. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: rename NCLP to cursor-jump throughout Drop the NCLP abbreviation in favor of the more descriptive 'cursor-jump' name already used in the production xtab provider. cursorJumpPromptStep, cursorJumpResponseStep), the capture request ids, and all surrounding doc comments / test descriptions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: build documentIndexMapping from whole recording path map from only the pre-request slice and then re-walked the post-request slice to backfill any documentEncountered entries that arrived later. Pass the whole recording into documentIndexMapping instead so the helper sees every document the user touched in a single pass; the backfill loop is gone. splitRecordingAtRequestTime now also returns the full entries array so both callers can reuse it without re-deriving it from altAction. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: use shared Result type in cursor-jump detectors Drop the bespoke { ok, value | reason } discriminated union in detectJump.ts and reuse the existing Result<T, E> from src/util/common/result. JumpDetectionResult<T> is now just an alias for Result<T, string>. .isOk(), .err) and the spec file accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: strip raw cursor-jump prompt from emitted telemetry cursorJumpRawMessages and cursorJumpKeptRange were added to IStatelessNextEditTelemetry so in-process debug / datagen tooling could read them back via getStatelessNextEditTelemetry(). However LlmNESTelemetryBuilder.build() spreads ...this._statelessNextEditTelemetry into the emitted payload, so those two fields would leak to telemetry cursorJumpRawMessages can contain full prompt content (sourcesinks code), which must never leave the process. Destructure them out before spreading into the build() payload. They remain readable via getStatelessNextEditTelemetry() for tooling. Documented the privacy contract on the IStatelessNextEditTelemetry field declarations so future edits don't forget. Addresses copilot-pull-request-reviewer feedback on PR #320113. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: fail cross-file detection when no selection lands on target detectCrossFileJump previously returned Result.ok with toLine undefined when only a focused event was seen for the target doc (no selectionChanged). That left generateCrossFileResponse to drop the sample later while the detector still reported a successful jump. Treat focused-without-selectionChanged as a failed detection ('crossFileTargetNoSelection') so callers can skip early, and tighten ICrossFileJump.toLine to non-undefined now that ok results always have a usable line number. Removes the dead error path in generateCrossFileResponse. Adds a regression test that focused-only triggers the new error. Addresses copilot-pull-request-reviewer feedback on PR #320113. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: capture cursor-jump prompt via logContext, not telemetry The datagen pipeline previously stashed the raw cursor-jump prompt and keptRange on IStatelessNextEditTelemetry so cursorJumpPromptStep.ts could read them back via LlmNESTelemetryBuilder.getStatelessNextEditTelemetry(). That leaked raw prompts into the telemetry payload (worked around by a destructure-strip hack in LlmNESTelemetryBuilder.build()) and was asymmetric with the xtab path, which captures via InlineEditRequestLogContext.rawMessages. Move the cursor-jump capture vehicle onto InlineEditRequestLogContext to match xtab: - Add cursorJumpRawMessages / cursorJumpKeptRange fields and setCursorJumpPrompt(messages, keptRange) to InlineEditRequestLogContext. - XtabNextCursorPredictor.predictNextCursorPosition now takes a logContext parameter and writes to it directly. The xtabProvider callsite passes the same logContext it already had in scope. - cursorJumpPromptStep reads from logContext instead of the telemetry builder. - Remove cursorJumpRawMessages / cursorJumpKeptRange from IStatelessNextEditTelemetry, plus the corresponding setter/getter on StatelessNextEditTelemetryBuilder and the getter on LlmNESTelemetryBuilder. - Revert the destructure-strip hack in LlmNESTelemetryBuilder.build(). The pre-existing cursorJumpPrompt telemetry field (JSON-stringified, fed by setCursorJumpPrompt(messages)) is intentional and unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: cursor-jump ground truth is first user EDIT, not cursor landing Selection-based detection treated peek, navigation, IDE auto-scroll, and recursive cursor settling as if they were the user's next intended edit location. The model's job is to predict where the user will EDIT next, so key off the first 'changed' event after the request bookmark instead. Same-file detector: - Walks for the first 'changed' on the active doc; uses the first edit's start offset to compute toLine; applies the linesAbove/linesBelow threshold. Bails with editsAnotherFileFirst when a non-active doc is edited first (lets the cross-file detector claim the sample in cursor-both mode). 'selectionChanged' is no longer consulted, so the settle-after-edit filter is gone it was a workaround for thetoo selection-based approach. Cross-file detector: - Walks for the first 'changed' on a non-active doc; uses the first edit's start offset, resolved against the target doc's snapshot just-before applying the event. Drops focused / selectionChanged heuristics and the crossFileTargetNoSelection error path (a focused event without an edit no longer counts; background peek can't pollute the dataset). buildLineResolver: tightened i <= entryIndex to i < entryIndex so the resolver returns the pre-edit line when entryIndex is itself a 'changed' event. The bound is equivalent for the old selectionChanged caller. Spec: switched ground-truth events from selChanged to changed; added coverage for first-edit-of-multi-edit, editsAnotherFileFirst, and active-doc-then-other-doc ordering. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * xtab: predictNextCursorPosition takes RequestTracingContext Every other helper in xtabProvider takes RequestTracingContext (the { tracer, logContext, telemetry } bundle). The cursor predictor was the odd one out, taking the three pieces as separate positional params with the latter two that asymmetry made the new logContext-captureoptional plumbing look more invasive than it is and forced an awkward ?.setCursorJumpPrompt chain at the use site. Switch the predictor to take RequestTracingContext directly: - Export RequestTracingContext from xtabProvider so the predictor can type-import it (TS-erased to avoid the runtime circular import). - predictNextCursorPosition signature collapses from 5 params to 3. - Drop the optional chains; tracing.telemetry / tracing.logContext are always present in production and the spec constructs a real bundle. - Spec adds a createTestTracingContext helper using the cheap InlineEditRequestLogContext / StatelessNextEditTelemetryBuilder constructors already used by other inlineEdits specs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: rename splitRecording 'entries' field to 'wholeRecording' Review feedback: the field on the splitRecordingAtRequestTime return shape was named 'entries' but in context it carries the whole unsplit recording (i.e. before slicing into prior/after parts). 'wholeRecording' matches the comment at the consumer (documentIndexMapping callsite). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: inline JumpDetectionResult<T> as Result<T, string> Review feedback: the one-line alias was used in exactly two places in the same file and gave nothing over the underlying Result type. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: discriminated union for sample task + jump metadata Review feedback: ISampleMetadata had 'task' + an optional 'jump' field with toFilePath also optional. That let xtab samples accidentally carry a jump and let cursor-cross-file samples omit toFilePath. Replace with a discriminated union on task: - xtab: no jump - cursorSameFile: jump with fromLine/toLine/distance - cursorCrossFile: jump with required toFilePath assembleSample now takes a single SampleClassification arg, removing the parallel task/jump parameters that callers had to keep in sync. cursorJumpResponseStep is split into ISameFileGeneratedResponse and ICrossFileGeneratedResponse so the generator return types map cleanly to the union variants without a non-null assertion at the assembly site. DetectedJump no longer needs an assistantTask hint: the pipeline constructs the classification directly from the response shape. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix dup import * nes-datagen: address round-4 review feedback on pipeline.ts Five review threads on pipeline. all addressed in-place.ts - modelResponse: cursor samples were emitting an empty string for the expected response. Populate it with the assistant content (which IS the expected output) so downstream tooling has the gold label. - Promise.all unbounded throws: wrap the limiter callback body in try/catch so an unexpected exception from generateCursorPromptFromRecording becomes a recorded per-row error instead of aborting the whole batch via Promise.all's first-rejection semantics. - Inline import for OffsetRange: replace the inline import('...').OffsetRange type expression with a regular top-of-file import. - Duplicated config-override block: both pipelines applied the same applyConfigFile + four setConfig debounce/cache disables. Extract into applyBatchModeConfig(configService, configs) and call from both. - runInputPipeline parallelism + memory: add a doc comment clarifying that this is the single-process entry point, that cursor-jump tasks also benefit from runInputPipelineParallel (--sample-task is propagated to workers), and that loadAndParseInput is in-memory by design (sized per worker; use --parallelism > 1 for large inputs). Full architectural unification of the parallel and non-parallel paths is intentionally left as a follow- the surface area isup large and out of scope for this PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: add e2e tests for cursor-jump pipeline Mirrors the existing xtab pipeline.e2e.spec.ts: drives two fixture rows (a same-file jump and a cross-file jump) through the full `runInputPipeline` for each `sampleTask` mode (cursor-same-file, cursor-cross-file, cursor-both) and asserts on the JSONL output. Coverage: - only the matching row is emitted per mode; both rows are emitted in cursor-both - emitted samples carry strategy=next-cursor-line-prediction and the correct discriminated `task` field (cursor-same-file / cursor-cross-file) - assistant message targets the jumped-to line / file - metadata.modelResponse mirrors the assistant content (the round-4 fix) - --row-offset is reflected in metadata.rowIndex Test fixtures are constructed in `fixtures/cursorJumpFixtureData.ts` with synthesized recordings: an explicit no-op edit + selectionChanged before the bookmark so the cursor-prediction path's recent-edit gating is satisfied, then a single post-request `changed` event the detector picks up. The cursor pipeline needs a prompting strategy whose response handler tolerates an empty stream — use `xtabUnifiedModel` in a dedicated `cursorJumpConfig.json` (the existing patchBased02 config crashes on empty output, which is acceptable in production but breaks the prompt-only capture path). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Strengthen cursor-jump e2e assertions Replace fuzzy matchers (toMatch(/25/), arrayContaining for tasks) with exact assertions on assistant content, metadata.task, and metadata.jump. In cursor-both, locate samples by filePath so a row→classification swap would now be caught instead of passing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make cursor-jump e2e helper accept partial nesDatagen overrides Helper previously took Partial<RunPipelineOptions>; if a caller passed `nesDatagen`, the spread fully replaced the default block and the configured path. Now the helper accepts a partial nesDatagen overlay and merges field-by-field, so the row-offset test only specifies the two fields it actually changes and there are no non-null assertions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add within-threshold cursor-jump negative fixture Scenario C: cursor on line 10, post-request edit on line 12 (only 2 lines below). Default threshold is ±5 lines, so neither the same-file nor the cross-file generator should emit a sample for this row. Asserted in cursor-both via a dedicated 'does not emit a sample for the within-threshold row' test, and implicitly in cursor-same-file / cursor-cross-file (their existing count==1 assertions would fail if the threshold guard regressed). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Ulugbek Abdullaev <ulugbekna@github.com>github.com-microsoft-vscode · a3e359ab · 2026-06-12
- 1.7ETVnes-datagen: generate training data from continuous recordings (#323855) * utils: document binarySearch * nes-datagen: generate training data from continuous recordings Continuous enhanced telemetry now ships sliding-window recordings that, unlike per-request alternative-action recordings, carry no requestTime. The datagen pipeline needs a point to split each recording into edit history before/after, so this adds a pluggable pivot strategy (starting with Random, selectable via --pivot-strategy) and a new continuous/ pipeline module that replays a recording at the chosen pivot to produce a processed row. Along the way this consolidates the pipeline's error and index handling: a shared WithRowIndex<T> replaces the ad-hoc { originalRowIndex, ... } pairs, per-record processing returns Result<IProcessedRow, Error> instead of field-presence unions, and failures surface as original Error objects (no string round-tripping). The telemetry sender's continuous payload is now the documented IContinuousRecording type. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes-datagen: label alt-action replay errors by originalRowIndex Address PR review: the alternative-action path mislabeled diagnostics when earlier records failed to parse. - processAllRows: push replay errors with the row's true `originalRowIndex` instead of its position in the filtered `rows` array (parse failures make `rows` sparse, so the two diverge). - loadAndProduceProcessedRows: resolve `languageForRow` via an `originalRowIndex`-keyed Map rather than positional `rows[i]`, matching how callers pass `e.originalRowIndex`. - Clarify the `recordCount` doc: it counts successfully-parsed records (parse failures are counted separately in `parseErrors`). - Add a regression spec asserting replay errors carry the row index, not the array position. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 6bd7400f · 2026-07-01
- 1.5ETVnes: generate samples from workspace recordings (#328095) * nes: feat: generate samples from workspace recordings Parse stateful local workspace recordings, select deterministic user-edit and cursor pivots, materialize privacy-safe replay slices, and support bounded parallel datagen without splitting raw timelines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 * nes: fix: include cursor boundaries in sample deduplication Hash the complete post-pivot label so identical prompts with different cursor destinations are rejected as conflicting samples. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 * nes: fix: consolidate workspace recording imports Use inline type specifiers so the Copilot extension lint job accepts the new workspace-recording modules. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 --------- Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7github.com-microsoft-vscode · 1516e1ad · 2026-07-29