Skip to content

Release v1.10.0#309

Merged
erikdarlingdata merged 21 commits intomainfrom
dev
May 4, 2026
Merged

Release v1.10.0#309
erikdarlingdata merged 21 commits intomainfrom
dev

Conversation

@erikdarlingdata
Copy link
Copy Markdown
Owner

Summary

Release v1.10.0. Merging this PR triggers release.yml, which auto-tags v1.10.0 and publishes Windows / Linux / macOS (x64 + arm64) builds plus a Velopack delta.

Highlights since v1.9.0

Features

UX changes

Fixes

Internal / chore

Insight cards UI was tried (#294) and reverted (#295) — not in this release.

Why minor and not patch

A new connection feature (ApplicationIntent ReadOnly) plus a noticeable default-behavior change in the grid is more than a patch.

Test plan

  • check-version-bump passes (1.9.0 → 1.10.0)
  • CI green
  • On merge, release.yml creates the v1.10.0 GitHub release and uploads:
    • PerformanceStudio-win-x64.zip
    • PerformanceStudio-linux-x64.zip
    • PerformanceStudio-osx-x64.zip (.app bundle)
    • PerformanceStudio-osx-arm64.zip (.app bundle)
    • SHA256SUMS.txt
    • Velopack win channel delta
  • Smoke-test the Windows build (signed via SignPath if SIGNPATH_API_TOKEN is configured)

🤖 Generated with Claude Code

erikdarlingdata and others added 21 commits April 28, 2026 08:44
Replace per-section tinted backgrounds (brown/green/blue/purple) with a
single InsightCard style — lifted #1E2228 surface, 1px #353942 border,
8px corner radius, subtle box-shadow. Per-section identity now lives
only in the accent-colored header text. Headers move to a shared
InsightHeader class (14pt SemiBold).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Insights panel: unify section borders into card style
Adds src/PlanViewer.Core/Resources/WaitStats.json as the single source
of truth for wait stat handling, populated only with attributes 1-5
(name, isPreemptive, isExternal, isImplemented, isEnabled). Attributes
6-12 (calc model, applicable operators, descriptions, URLs, internal
comment) are intentionally null pending domain-expert review.

52 entries: 46 currently implemented (matched explicitly or via prefix
in BenefitScorer / PlanViewerControl / WaitStatsKnowledge), 6 common
waits that today fall to the 'Other' bucket (THREADPOOL, BACKUPIO,
BACKUPBUFFER, HADR_SYNC_COMMIT, DBMIRROR_DBM_EVENT, SQLTRACE_BUFFER_FLUSH).

No code is wired to this file yet — that's part 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Match the visual rhythm of the surrounding rows in the dialog
(Margin 0,0,0,12 / inter-control Spacing 16). Follow-up nit from
review of #298.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…cing

Connection dialog: bump test-status row spacing 6 -> 8
…g-seed

Seed wait stats config file (#215 part 1)
- Trim WaitStats.json from 52 to 44 entries — drop server-level / instance-
  level waits (THREADPOOL, BACKUPIO, BACKUPBUFFER, HADR_SYNC_COMMIT,
  DBMIRROR_DBM_EVENT, SQLTRACE_BUFFER_FLUSH) and connection-setup waits
  (PREEMPTIVE_OS_AUTHENTICATIONOPS, PREEMPTIVE_OS_LOOKUPACCOUNTSID) that
  don't appear in plan XML's <WaitStats> element.

- Populate attributes 6-8 (showWaitCount, showAverageWaitTime,
  timeCalculationModel) from existing tool behavior. Attributes 9-12
  (applicable operators, descriptions, URLs, internal comment) remain
  null — those need domain expertise.

- Add WaitStatsConfig loader (PlanViewer.Core.Services.WaitStatsConfig)
  that reads the JSON from an embedded resource at first access and
  caches by name (case-insensitive). Resource lookup is suffix-based so
  the file works whether embedded under PlanViewer.Core.* or
  PlanViewer.Web.* manifest prefixes.

- BenefitScorer.IsExternalWait now delegates to WaitStatsConfig.IsExternal.
  Lookup misses fall back to false, preserving prior default for unknown
  waits. EmitWaitStatWarnings drops the WaitStatsKnowledge dependency
  entirely.

- Delete WaitStatsKnowledge.cs — its ShowEffectiveLatency flag was the
  only structural data and is now sourced from
  WaitStatsConfig.ShowAverageWaitTime. Description/HowToFix were
  intentionally empty since #215 D3, so nothing of substance is lost.

- Wire embedded resource into PlanViewer.Core.csproj and link it +
  WaitStatsConfig.cs into PlanViewer.Web.csproj (which links Core
  source files rather than referencing the project).

All 75 Core tests pass; Core, App, and Web all build clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* implements [FEATURE] Allow Read-only intent (for AG listeners and readable replicas - including Query Store on secondary replicas)
Fixes #301

* Add visual info that we are connected to a secondary. #301
- Rename "(Secondary)" indicator to "(Read-only)" — read-only intent
  requests routing to a secondary but doesn't guarantee it (the listener
  may still route to the primary if no readable replica is available).
- Deduplicate SqlConnectionStringBuilder construction by adding a
  GetConnectionString(username, password, db) overload on ServerConnection
  and routing both the dialog test path and the runtime path through it.
- XAML nits: drop redundant Margin and trailing whitespace on the new
  Read-only intent checkbox.

No behavior change.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When the user explicitly sets OPTION (MAXDOP 2) in the query, the DOP cap
is intentional and not the SQL Server Standard Edition batch-mode
limitation, so the warning would be misleading. Suppress in that case
(both the Standard-Edition-confirmed Warning path and the unknown-edition
Info path).

Mirrors the existing Rule 3 (Serial Plan) handling for MAXDOP 1 hints.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…op-2-hint

Rule 38: suppress when query has explicit MAXDOP 2 hint
…g-part2

Wire wait stats config as single source of truth (#215 part 2)
PR #305 dropped the only caller of ExpandRowRecursive in
FetchGroupedPlansAsync. Delete the now-unreachable method (only
its self-recursion remained) plus stale Avalonia/SqlClient usings
in the same file.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a .gitattributes that pins LF in the repo for source/config and
CRLF for Windows-only scripts (.ps1/.cmd/.bat), then runs
`git add --renormalize .` to apply it to existing files.

Eliminates the recurring "phantom uncommitted changes" caused by
editors re-saving files with CRLF when the repo stores LF.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@erikdarlingdata erikdarlingdata merged commit 02120e6 into main May 4, 2026
3 checks passed
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.

3 participants