Skip to content

OX-02: one generic Owen.VisualStudio host — live OWN diagnostics in Visual Studio (GO_OWEN_VISUAL_STUDIO_ALPHA) - #398

Open
PhysShell wants to merge 23 commits into
mainfrom
ccr-d3ed89e2-vnl6fk
Open

PhysShell wants to merge 23 commits into
mainfrom
ccr-d3ed89e2-vnl6fk

Conversation

@PhysShell

Copy link
Copy Markdown
Owner

Что и зачем

Одно generic расширение Owen.VisualStudio показывает OWN-диагностики любого активного Owen-расширения прямо в редакторе, пока правка не сохранена и без dotnet build: сквиггл (IErrorTag) и строка в Error List (ITableDataSource) с навигацией. Typed Builder — первое расширение и acceptance oracle; VSIX ни одно расширение по имени не знает.

Цепочка: несохранённый буфер → снимок Roslyn workspace (открытые документы и сгенерированные документы из памяти) → долгоживущий owen serve из пакета Owen.Build проекта → тот же один экстрактор, запущенный in-process поверх overlay → авторитетное Rust-ядро → его Finding (рендерер SARIF).

Семантика не менялась: OwnIR, H0/H1, state protocol, T0/P-022, смысл диагностик и capabilities OX-01 те же, Rust-ядро не тронуто.

Preregistration (закоммичена до продуктового кода) и Amendment 1: docs/notes/owen-visual-studio-preregistration.md. Отчёт и вердикт: docs/notes/owen-visual-studio-report.md. Evidence из реальной VS: docs/notes/evidence/ox02-visual-studio/.

Вердикт: GO_OWEN_VISUAL_STUDIO_ALPHA. Прогон в Visual Studio Enterprise 2026 18.10 на финальном продуктовом head fbdc978 (CI run 37175674769) прошёл 19/19 проверок:

  • K2. Несохранённая вставка второго draft.Submit(now); даёт сквиггл на WithDraft (место finding) и на вставленной строке (witness-шаг ядра). В Error List появляется OWN002 | … | LiveFixture | Use.cs | 10, двойной клик ведёт в 10:9.
  • P9. CS0029 и OWN002 видны рядом.
  • K3. После удаления строки сквиггл и строка в Error List исчезают через 344 мс.
  • Латентность. От правки до сквиггла p95 349 мс, до исчезновения p95 347 мс (порог 1000). Самый долгий обработчик в UI-потоке — 3,3 мс (порог 50).
  • Ни сохранения, ни сборки. Процесс owen serve не переживает убитый devenv.

Тот же продуктовый код также прошёл 19/19 на 90bd419. Прогон на 7cdf529 провалил одну проверку, K2-navigation: каретка стояла ровно в 10:9, расходилось только сравнение пути в драйвере. Сравнение нормализовал, причина в отчёте отмечена как не до конца установленная. Этот прогон как зелёный не считаю.

Ограничения, зафиксированные заранее:

  • State protocols: diagnostics on protocol tokens use IDisposable wording ("used after it is disposed") #393. OWN002 указывает на вход в регион, а повторное использование токена — его witness-шаг.
  • Колонки. У state-protocol находок нет колонки, работает узкий координатный контракт.
  • Новые файлы. Файл, который ни разу не сохраняли, в набор входов не попадает.
  • Версия VS. Прогон был только на VS 2026; VS 2022 17.14 объявлена в манифесте, но не проверялась.

Тип изменения

  • feat — новая возможность
  • fix — исправление бага
  • docs — документация
  • refactor / chore / test / ci — без изменения поведения

Как проверено

  • python tests/run_tests.py — локально те же две известные local-only контрольные проверки Stage-1, что и на базе; в CI зелёный на 3.11/3.12/3.13
  • ruff check . и mypy — новые скрипты под mypy --strict
  • селфтесты затронутых скриптов (python scripts/<...>.py --selftest)
  • python tests/check_extractor_in_process.py — 198/198 (98 джобов в одном процессе, байт-в-байт с CLI, overlay вместо диска)
  • python scripts/owen_live_gate.py — 27/27 на Linux и Windows: L0, протокол, K1–K8, паритет build/live P10 на пяти исходниках, латентность (тёплый p95 208 мс), память, клиентские тесты (K4/K6/M1/M2)
  • python scripts/owen_live_mutations.py — M1–M6, все пойманы
  • CI job owen-visual-studio (реальная VS 2026) — 19/19
  • Базовые гейты на e889f8b до изменений и весь CI на финальном head зелёные: protocol/heap-effects/typed-builder гейты, owen_extension_gate 55/55 на обеих ОС, Owen.Cli gate A, rust, dogfood

Связанные issue

Refs #393 (место OWN002 не меняется, рендерится как есть).

Чеклист

  • изменение покрыто тестом/селфтестом (или объяснено, почему нет)
  • README/docs обновлены при необходимости — spec/OwenExtension.md §4a, docs/howto-visual-studio.md, docs/notes/owen-visual-studio-snipper-reuse.md
  • коммиты в conventional-commit стиле (feat:, fix:, docs: …) — коммиты в стиле предыдущих slices (OX-02: …), как и в OX-01

🤖 Generated with Claude Code

https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL


Generated by Claude Code

claude added 23 commits October 3, 2026 23:50
Kill-first infrastructure probe (no product code): find VS with vswhere, open a
solution in the Exp hive, edit a buffer through DTE, read the Error List.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
Fixed before product code: base e889f8b, architecture (one extractor run in-process
over an overlay, the build host's contract, the Rust core's Finding via SARIF),
live request from design-time builds, owen-live/1 framing/handshake/versioning,
diagnostic contract and the two coordinate gaps (no protocol columns; #393),
acceptance K1-K8/P9/P10, latency thresholds, Snipper reuse, the real-VS run,
mutation controls M1-M6, out of scope, verdict rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…rlay

InProcessExtractor.Run(args, cwd, overlay) runs the ONE extractor program inside
a long-lived host: same arguments, same facts; its one source read consults an
in-memory overlay first, and stdout/stderr are captured. The two run collectors
that were not reset at entry (GuardedFactsViolations, OrphanedAwaitables.Sites)
now are, a no-op for the CLI.

tests/check_extractor_in_process.py: 98 jobs in one process, forward and
reversed, byte-identical to the command line (E1/E2); overlay == disk changes
nothing (E3); a differing overlay is read instead of the disk (E4, M6): 198/198.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
- OwenHost: the build host's contract (descriptors, input set, refusals) shared by
  build-check (byte-identical output) and the new live service.
- owen serve: owen-live/1 (Content-Length framing, hello, fatal exit 3), one
  analysis at a time, newest-per-project wins (superseded/cancelled); each
  analysis is the build host's over the editor's text, through the in-process
  extractor and the packaged Rust core's SARIF (columns + witness steps).
- Owen.Build writes obj/owen/live.txt (same request lines + the service path) in
  design-time builds too: Visual Studio learns the active extensions with no build.
- Owen.VisualStudio (VSIX, knows no extension): workspace snapshots (unsaved open
  documents + source-generated documents) -> supervised service (job object,
  restart budget, OWENV001) -> version gate -> IErrorTag squiggles (finding and
  witness steps) + ITableDataSource Error List rows; opt-in trace for the real-IDE run.
- Owen.TestProtocol: a synthetic second extension with its own generator (K8, M4).
- scripts/owen_live_gate.py (27 checks on Linux): L0, protocol S*, K1-K8, P10
  build/live parity x5, latency p95 208 ms, memory flat, client tests incl. K4/K6/M1/M2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
- scripts/vs/prepare_vs_fixture.py: packs Owen.Build/Owen.TypedBuilder and creates a
  restored, never-built solution outside the checkout.
- scripts/vs/owen-vs-acceptance.ps1: installs the VSIX into a dedicated root suffix
  with VSIXInstaller, opens the solution, and drives the IDE: unsaved edits via DTE,
  the Error List read with UI Automation, navigation by double-click, Owen's squiggles
  from the opt-in tagger trace; K1/K2/P9/K3, repeated-edit latency, UI-thread max,
  no save, no build. (Shape ADAPTED from Snipper's vs-smoke.ps1, MIT.)
- ci.yml: owen-live (ubuntu+windows) and owen-visual-studio (windows, real VS).
- The probe workflow is retired (runs 37163037704/37163398893/37163671022 recorded).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
- spec/OwenExtension.md §4a: the live request, owen serve, generated-source routing,
  parity, OWENV001.
- docs/howto-visual-studio.md: installing and using Owen.VisualStudio, known limits.
- docs/notes/owen-visual-studio-snipper-reuse.md: the four ADAPTed chunks, origin, licence.
- scripts/owen_live_mutations.py: each mutation edits one product source, its
  registered check must go red, the source is restored.
- prepare_vs_fixture.py: drop an unused noqa (ruff RUF100).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…Snipper's SDK-style project does)

The first Windows CI run built Owen.VisualStudio.dll but no .vsix: an SDK-style project
gets no VSIX packaging from the build tools package alone. The build step now fails
loudly when no .vsix is produced.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…/E4 on a self-contained input

- Program.cs keeps 'if (!File.Exists(path))' and 'text = File.ReadAllText(path);'
  (tests/test_p037_evidence.py anchors and counts them); the overlay is consulted
  first through TryOverlay, which touches no filesystem. CLI behaviour unchanged.
- check_extractor_in_process E3/E4 overlay frontend/roslyn/samples instead of
  OrderBackend, whose extraction refuses on a clean checkout (no bin/, EF types
  unresolved) and so compared no facts with no facts in CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…e's Exp hive

The run on bdeb874 installed the VSIX (VSIXInstaller exit 0) but a fresh root
suffix opened on the modal 'Sign in to Visual Studio' dialog, which rejects every
DTE call (screenshot in that run's evidence). The driver now dismisses first-run
dialogs through UI Automation as a user would, and CI uses the Exp hive the image
already initialised (an ephemeral runner: nothing shared to protect).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on 4790674 opened the solution in 23 s and the design-time build wrote
obj/owen/live.txt (L0 ok in Visual Studio), but Use.cs opened as a background tab
behind 'What's new': no text view, so no tagger and no Owen monitor, and the Error
List window was never opened, so not even CS0029 could be read. The driver now
closes the start page, opens the Error List, activates Use.cs, and records whether
Owen.VisualStudio.dll is loaded into devenv.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on bd0ef66 realized Use.cs, read the Error List through UI Automation
(CS0029 | LiveFixture | Use.cs | 10), but Owen.VisualStudio.dll never loaded into
devenv and the ActivityLog does not mention it. Collect the hive's installed
extensions, the MEF composition's .err files and the VSIXInstaller logs, and stop
early when the extension is not in the process.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…x as evidence

The run on d330abe shows the extension installed and enabled in the Exp hive and the
MEF cache rebuilt, yet no composition error or catalog trace mentions Owen: check
what the packaged manifest declares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on 4289f6a printed a correct manifest (MefComponent Owen.VisualStudio.dll)
and an installed, enabled extension, yet the hive's ComponentModelCache files were
byte-for-byte those of the previous run: the image ships the MEF composition
prebuilt and the install rebuilt only the pkgdef cache, so Owen's parts were never
composed. Drop the cache and run devenv /updateconfiguration before launching.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…ule list

The run on a28c958 (MEF cache rebuilt) shows Owen.VisualStudio composed in the IDE
and working: its trace has 'Owen live analysis loaded', a workspace snapshot with
the unsaved Use.cs and Roslyn's in-memory generated documents, and publication 1 of
the project with no entries (K1). Only the driver's check was wrong: a .NET Framework
assembly is not reliably among Process.Modules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on e71027f reached the core of the acceptance in Visual Studio 2026: the
unsaved second Submit went workspace snapshot -> owen serve (extract 278 ms, core
11 ms) -> OWN002, and the Error List showed 'OWN002 | IDisposable local draft is
used after it is disposed | LiveFixture | Use.cs | 10' with Use.cs still unsaved.
No squiggle was traced because VS reopened its start page over the editor (an
invisible view is never asked for tags).

- The tagger raises TagsChanged on the UI thread and reports any exception to the
  trace and the Owen pane instead of letting the editor switch it off.
- The driver brings Use.cs to the front before every measured edit, and reports a
  navigation failure as a check instead of dying silently.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…udio run

The run on a0c038d passed in Visual Studio 2026: vsix-loaded, L0, K1 (open and
unsaved clean edit), K2 squiggle (10:9 'OrderProtocol.WithDraft(order, draft =>'
and the witness 13:13 'draft.Submit(now);'), K2 unsaved, K2 Error List row, P9
(CS0029 beside OWN002), K3 (gone after 372 ms), disappearance p95 420 ms, UI
thread max 6.5 ms, no build, never saved. Three failures were the driver's:
- navigation: DTE MainWindow.HWnd is null in VS 2026; use the process's window;
- edit->squiggle 0/10 although the trace has every squiggle: Windows PowerShell
  gives a lone PSCustomObject no .Count; always count arrays;
- the orphan probe counted every dotnet.exe; check owen serve processes only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
… IDE required

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on 23d4aeb passed K2 navigation (double-click -> Use.cs 10:9, the core's
location) and no-orphan (owen serve did not outlive a killed devenv: the job
object holds), but the previous fix returned ',@(...)', so @(Own002 $e) became a
one-element array holding the array: 'no OWN002 tag' never held (K3, disappearance
0/10) and 'a witness tag' held at once (the 12-16 ms 'latencies' are void).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…al-IDE run)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
The run on 90bd419 passed every check in Visual Studio 2026 (19/19). The run on
7cdf529 (same product code) failed only K2-navigation with the caret at exactly
10:9 = expected 10:9: the driver compared DTE's FullName to the fixture path with a
case-sensitive -eq. Compare full paths ignoring case, and print both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
…_STUDIO_ALPHA

- docs/notes/evidence/ox02-visual-studio/: the run on fbdc978 (Visual Studio
  Enterprise 2026 18.10), 19/19: acceptance log, results, Owen's trace, and the
  screenshots of the live squiggle/Error List row, navigation, CS+OWN, and
  disappearance. Kept byte-for-byte (-text).
- docs/notes/owen-visual-studio-report.md: what was built, the two coordinate
  facts (no protocol column; #393), the evidence (198/198 in-process, 27/27 live
  gate on two OSes, 6/6 mutations, 19/19 in Visual Studio: edit->squiggle p95
  349 ms, disappearance p95 347 ms, UI thread max 3.3 ms), gates, verdict.
- alpha-readiness and the OX-01 IDE feasibility note point to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ZFvhLx1fM9Gerg4dKsZcL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants