Skip to content

ADR 0095: Three Health levels — Workspace, Solution, IDE (channel taxonomy)

Status: Accepted (partial: WorkspaceHealth MFD + channels; full three-level taxonomy — per ADR)
Date: 2026-04-24
Updated: 2026-04-25 — IDE Health TOML keys: ide_health_*. Details — § History.

ADR Role
0089 product name IDE Health and IdeHealth* types; does not remove signal mixing by meaning
0097 CCU: where input collapse to channel DTO happens while keeping stratum
0102 DAL: where external data is acquired before CCU
0021 channel vs presentation slot; glossary
0036 channel → CDS → compositor → surface
0023 environment readiness channel (glance) — separate from IDE Health
0022 lexicon and name evolution
0019 Git as cross-cutting contour
0062 GitMap — file/git geometry separate from solution code
0052 MCP snapshots — on level split need explicit sections or schema version

Summary

  • Three Health levels: Workspace · Solution · IDE; stratum field.
  • Strangler from monolithic “workspace health”; TOML ide_health_* (0010).

Outside ADR

Document Role
environment-readiness-glance-v1.md environment readiness channel — already closer to IDE level
workspace-health-implementation-map-v1.md current IDE Health strip map

Context

After 0089 the channel is product-named IDE Health, but by meaning one user image (strip, cockpit, agent snapshot) still mixes signals of different nature:

  1. File and VCS plane — open workspace root, git status/branch/remoteness, submodules, tree “dirt”; part of this persists when switching solution inside same directory and is not compiler diagnostics.
  2. Solution / project lifeMSBuild result, test counters/status, compile errors, Roslyn diagnostics bound to open solution; changes with .sln / configuration / target framework.
  3. IDE process and environment — LSP (C#, Markdown, …), MCP transports, selected AI mode, dotnet/tool availability from 0023; stays true if solution closed but IDE not reinstalled.

Mixing levels hurts:

  • agent and MCP — one JSON easily mistaken for “folder state” vs “build state” or vice versa;
  • CDS and future channels — one “health” without level tag scales poorly (0036);
  • UX — operator needs different attention contexts (0021): “what’s on disk”, “what’s with build”, “what’s with IDE host”.

This ADR introduces normative taxonomy of three levels and direction to split channels / data sections; it does not require rewriting all IdeHealth* in one commit (UiModes wire keys for contour — ide_health_*, 0010).


Decision: three levels (semantics)

Fix three meaning axes for Health and similar observability channels:

Level Working name Question “what is it about?” Typical signals (examples, not exhaustive)
A Workspace Workspace directory(ies) on disk and VCS around them root path, git branch/ahead/behind, working tree cleanliness, submodules (0062), merge conflicts
B Solution (Solution / project) Open solution and build/test artifacts build status/text, tests (pass/fail), compile errors, target TFM/configuration, startup project if needed
C IDE IDE process, hosts, environment, not source tree LSP alive, MCP connections, AI mode, PATH/EXE checks from 0023, internal services

Invariant: any new “health” or observability channel declares level A/B/C; forbidden to silently mix levels in one DTO without explicit structure or discriminator.

Machine contract field name (JSON, MCP, CDS): recommend stratum with values workspace | solution | ide plus signal source discriminator (e.g. diagnostic_source for Roslyn branch). Do not use level in contracts — often read as priority, stack depth, or severity.

Presentation (UI): three levels do not automatically mean three separate strips. Allowed: one composite strip with internal grouping; several instruments in one anchor (0063); separate MFD pages. Norm is data semantics, not v1 layout.


Implementation direction (strangler)

  1. CDS / snapshots: when cockpit contract evolves (cds-contract-v0.md) — sections or subchannels with stratum or separate explicit channel names; detailed JSON not fixed by this ADR.
  2. MCP / get_ide_state: on response extension — do not add fields “into one pile”; new blocks must carry stratum (and source if needed) or separate tools if mixing keeps confusion (0089, 0052).
  3. Current IDE Health code: gradually split input snapshot build (workspace-health-implementation-map-v1.md) into A/B/C providers with one UI composition point; UiModes wire keys — ide_health_* (0010). Architectural “collapse” role — 0097.

Example: separate computers per stratum (not God-object)

One God-object pulling Git, MSBuild, and LSP in one method is not target. Normative direction — several cockpit compute units (CCU) with narrow in/out contracts and one composition point for channel/UI. Below — working engineering short names (discussion, review, comments); not requirement to name C# types so in next commit.

Level Working name (EN) Short Typical collapse meaning
A Workspace Status Computation Unit WSCU workspace dirs, VCS, submodules, tree dirt
B Solution Status Computation Unit SSCU open solution, build, tests, TFM/config
C IDE Status Computation Unit ISCU IDE process, LSP, MCP, environment (0023)

ISCU — level C and IDE host status; do not confuse with IDS (0079Ide Display System, overlays). When writing “ISCU in same sentence as IDS”, spell ISCU fully or disambiguate abbreviations.


Boundaries and open questions

Boundaries (not goals of this ADR):

  • Concrete type names (IWorkspaceHealthChannel vs three interfaces), further DTO schema evolution, immediate AXAML split into three controls.
  • Debug as separate product contour (0002) — orthogonal; B/C link (solution session vs IDE process) refined when modeling, without replacing full debug ADR.

Open questions:

  • Git spans A (branch, ahead/behind) and may reflect build in mixed scenarios — need UI priority and duplicate rules.
  • Roslyn: part diagnostics — solution (B), part — analyzers/environment (C); see clarification below.
  • Multiple disk roots — how to map level A when one window is not one “folder on disk” meaning; see below.

Clarification: Roslyn — B vs C and unified UI

Unified UI for user (one strip, one diagnostic list) does not contradict “Presentation (UI)” in level table: A/B/C are data semantics, not obligation for three visual strips.

For implementation B/C split by Roslyn is often extractable from model (compiler vs analyzer id, project, rules) but not always semantically obvious: same UI error may reflect code and environment (package restore, TFM, SDK); solution-package analyzers are formally B but feel like “policy/setup”; analyzer load failure is clearly C.

For user boundary is cognitively often unclear: everything merges into “IDE complains”, risk of wrong attribution (fix code vs environment). So snapshots for CDS/MCP/agent should keep stratum and source (e.g. diagnostic_source), even if UI is merged; optional light UI markers (environment vs code group) or “details” expand.

Clarification: “umbrella” solution and true multi-root

One .sln / .slnx entry point listing projects with relative paths outside solution file directory is normal for level B: build/test graph is defined by solution manifest whole, regardless of where sources sit on disk.

For level A same scenario does not replace window multi-root: question reduces to git geometry — one repo covering all paths (then one A: one worktree and one dirt picture), or several nested/sibling repos (then multiple A sources and explicit policy: session primary root, secondaries, aggregate without silent merge into one field).

Multi-root window meaning “several independent roots without single solution file as entry” — different product mode; open for UX and which directory is sole “root” for A snapshot, but not mixed in this ADR with umbrella solution above.


Rejected alternatives

  • Keep one “IDE Health” channel without internal taxonomy — rejected as tech debt for CDS, MCP, new channels.
  • Rename levels to “Workspace Health / Solution Health / IDE Health” as three products — rejected: word workspace in user name again confuses with directory (0089); product strings prefer “folder and Git”, “build and tests”, “IDE environment” while keeping A/B/C as internal ids and contract keys.

Consequences

  • New features and ADRs touching observability reference this ADR and state level A/B/C (or conscious violation with rationale).
  • IdeHealth* refactor becomes planned with per-level tracking, not cosmetic rename only.

Change history

Date Change
2026-04-25 TOML refs: IDE Health keys in UiModeside_health_* (0010); migration wording for workspace_health_* aligned with repo.