Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
902 commits
Select commit Hold shift + click to select a range
2958812
Describe the current call shape in the watermark pin's doc comment (#…
erikdarlingdata Sep 5, 2026
6c98cf9
Merge pull request #2960 from erikdarlingdata/fix/pin-converge-idempo…
erikdarlingdata Sep 5, 2026
2a762a3
Merge branch 'dev' of https://github.com/erikdarlingdata/PerformanceM…
erikdarlingdata Sep 5, 2026
20811c8
Drop CHANGELOG entry; reported to the coordinator for consolidation
erikdarlingdata Sep 5, 2026
29d90d7
Part of #2874: bound every timeout scan to the site it is pointing at
erikdarlingdata Sep 5, 2026
699daf8
Merge pull request #2962 from erikdarlingdata/fix/2959-pin-doc-comment
erikdarlingdata Sep 5, 2026
21b10d9
Merge remote-tracking branch 'origin/dev' into fix/2874-command-plane…
erikdarlingdata Sep 5, 2026
1c91e45
Merge remote-tracking branch 'origin/dev' into fix/2874-command-plane…
erikdarlingdata Sep 5, 2026
a1a3b0d
Merge branch 'fix/2874-straggler-timeouts' of https://github.com/erik…
erikdarlingdata Sep 5, 2026
fb70f0e
Merge branch 'fix/2874-command-plane-timeouts' of https://github.com/…
erikdarlingdata Sep 5, 2026
99d7e39
Merge pull request #2945 from erikdarlingdata/fix/2874-sweep-census-q…
erikdarlingdata Sep 5, 2026
cce81dc
Merge pull request #2938 from erikdarlingdata/fix/2874-pin-statement-…
erikdarlingdata Sep 5, 2026
0d280c7
Scope the store-connection question to the nearest binding (Part of #…
erikdarlingdata Sep 5, 2026
77f1492
Order the latest-CPU reads on the hypertable's partition column
erikdarlingdata Sep 5, 2026
e748a3e
Merge pull request #2943 from erikdarlingdata/fix/2874-straggler-time…
erikdarlingdata Sep 5, 2026
178af71
Merge remote-tracking branch 'origin/dev' into fix/fleet-cpu-read-shape
erikdarlingdata Sep 5, 2026
4a6aeb9
Reopen the summary element the merge left the command-plane block wit…
erikdarlingdata Sep 5, 2026
56c22f6
Merge remote-tracking branch 'origin/dev' into fix/2874-command-plane…
erikdarlingdata Sep 5, 2026
0dd8541
Guard the shared deadlines file against the merge artifact that reach…
erikdarlingdata Sep 5, 2026
1057986
Update the two pins that asserted the replaced ordering, and route th…
erikdarlingdata Sep 5, 2026
39cce82
Merge pull request #2963 from erikdarlingdata/fix/2874-sweep-receiver…
erikdarlingdata Sep 5, 2026
be5471a
Merge remote-tracking branch 'origin/dev' into fix/2936-widen-startup…
erikdarlingdata Sep 5, 2026
8b16b35
Bring the fleet-wide CPU read onto the same ordering, and widen the g…
erikdarlingdata Sep 5, 2026
24b4446
Merge remote-tracking branch 'origin/dev' into fix/fleet-cpu-read-shape
erikdarlingdata Sep 5, 2026
fd42606
Adopt the shared command-deadline judgement in the collection-sweep p…
erikdarlingdata Sep 5, 2026
036e161
Merge pull request #2940 from erikdarlingdata/fix/2874-command-plane-…
erikdarlingdata Sep 5, 2026
a7f2c31
Merge pull request #2965 from erikdarlingdata/fix/2936-rescope-widene…
erikdarlingdata Sep 5, 2026
19f3389
Merge origin/dev
erikdarlingdata Sep 5, 2026
1964822
Merge pull request #2964 from erikdarlingdata/fix/fleet-cpu-read-shape
erikdarlingdata Sep 5, 2026
85f1985
Report the collector's real state on /api/ping (#2953)
erikdarlingdata Sep 5, 2026
67f4a09
Merge remote-tracking branch 'origin/dev' into fix/2953-store-unreach…
erikdarlingdata Sep 5, 2026
bf01af3
Drop the unqualified CommandTimeout-assignment regex from CommandDead…
erikdarlingdata Sep 5, 2026
6974845
Require every doc run to close the summaries it opens
erikdarlingdata Sep 5, 2026
06769b7
Merge pull request #2966 from erikdarlingdata/fix/2874-sweep-adopt-sh…
erikdarlingdata Sep 5, 2026
75558e7
Route the last two command-timeout pins' bare deadline judgement thro…
erikdarlingdata Sep 5, 2026
2e1419b
Merge remote-tracking branch 'origin/dev' into fix/2953-store-unreach…
erikdarlingdata Sep 5, 2026
6a0f0a4
Merge pull request #2969 from erikdarlingdata/fix/doc-run-summary-tag…
erikdarlingdata Sep 5, 2026
aa6a657
Merge origin/dev
erikdarlingdata Sep 5, 2026
1475fcc
Window the server-local MCP reads in the requested server's own UTC o…
erikdarlingdata Sep 5, 2026
6d1f5d2
Fall back to UTC, not a refusal, when a server has no collected offset
erikdarlingdata Sep 5, 2026
a5574ed
Teach the latest-CPU guard to read raw string literals, not just verb…
erikdarlingdata Sep 5, 2026
afdf087
Merge pull request #2970 from erikdarlingdata/fix/2953-store-unreacha…
erikdarlingdata Sep 5, 2026
50c4cee
Assert the shared scanner's adopter set instead of stating a count in…
erikdarlingdata Sep 5, 2026
b371a47
Merge origin/dev
erikdarlingdata Sep 5, 2026
297847b
Merge pull request #2967 from erikdarlingdata/fix/mcp-server-local-of…
erikdarlingdata Sep 5, 2026
e865e1e
Merge pull request #2968 from erikdarlingdata/fix/2874-drop-dead-assi…
erikdarlingdata Sep 5, 2026
3d0295c
Merge pull request #2973 from erikdarlingdata/fix/cpu-read-guard-raw-…
erikdarlingdata Sep 5, 2026
d76c672
Bind store window bounds instead of comparing naive UTC to now()
erikdarlingdata Sep 5, 2026
4542553
Unstack the window doc blocks, cover fragments, exclude sample_time
erikdarlingdata Sep 5, 2026
6dab4e5
Actually add the fragment arm the previous message claimed
erikdarlingdata Sep 5, 2026
040b8f6
Exclude event_time too, by naming the category instead of the instance
erikdarlingdata Sep 5, 2026
5ccbc66
Merge pull request #2972 from erikdarlingdata/fix/2874-adopt-scanner-…
erikdarlingdata Sep 5, 2026
72d127e
Reduce the ping payload's failure detail to one capped line, and pin …
erikdarlingdata Sep 5, 2026
d83db8b
Merge pull request #2971 from erikdarlingdata/fix/naive-utc-vs-now-wi…
erikdarlingdata Sep 5, 2026
2bd7ad2
Part of #2894 (#2975)
erikdarlingdata Sep 5, 2026
b881664
Record the CHANGELOG entries for twenty merged changes (#2980)
erikdarlingdata Sep 5, 2026
63b20f5
Defer the deadline scanner's adopter roster to the pin that asserts i…
erikdarlingdata Sep 5, 2026
7d06cc5
Exclude build output by path segment rather than by Windows substring…
erikdarlingdata Sep 5, 2026
8210012
Record #2975's three entries, and correct a claim its measurements di…
erikdarlingdata Sep 5, 2026
8a17cc4
Make the store-clock scan see the project and the split column it was…
erikdarlingdata Sep 5, 2026
892d526
Take the window offset as a required parameter instead of reading the…
erikdarlingdata Sep 5, 2026
7bff61c
Take the default trace's archival-empty cutoff from the server's cloc…
erikdarlingdata Sep 5, 2026
7a3e9c7
Bound the force-plan bot's decision journal with a retention horizon …
erikdarlingdata Sep 5, 2026
4e00f03
Document the retention horizons Darling actually has (#2988)
erikdarlingdata Sep 5, 2026
04220b4
Name Lite's findings-retention horizon once instead of three times (#…
erikdarlingdata Sep 5, 2026
754d31e
Name Darling's findings-retention horizon at its two cleanup defaults…
erikdarlingdata Sep 5, 2026
8c88da4
Warn when a PR description names no symbol its own diff touches (Part…
erikdarlingdata Sep 5, 2026
064a016
De-skew query_stats.creation_time before comparing it to the analysis…
erikdarlingdata Sep 5, 2026
cca82c1
Pin the PARAMETER_SENSITIVITY firing signature across both stores (#2…
erikdarlingdata Sep 5, 2026
0b6899d
Cross-check Lite's QUERY_HIGH_DOP against the server's current MAXDOP…
erikdarlingdata Sep 5, 2026
4459a3a
Screen rdsadmin out of PostgreSQL per-database enumeration (#3000)
erikdarlingdata Sep 5, 2026
ae85c14
Name the branch an absent AWS response collection came from (#2996) (…
erikdarlingdata Sep 5, 2026
3f47ce4
Refuse deadlock reports from a non-UTC PostgreSQL log (#2993) (#3001)
erikdarlingdata Sep 5, 2026
406d644
Derive the viewer's interactive read deadline from its fan-out width …
erikdarlingdata Sep 5, 2026
0abd879
Commit the RDS resume marker after the write, not inside the fetch (#…
erikdarlingdata Sep 5, 2026
7a25aab
Bound pg_index_bloat by bytes and classify the deadline it dies on (#…
erikdarlingdata Sep 5, 2026
86f11d5
Keep the identifier guard's comment to what maintaining it requires (…
erikdarlingdata Sep 5, 2026
b4c5a68
Use the repo's <host> placeholder for a measurement location in four …
erikdarlingdata Sep 5, 2026
ecdea81
Escape the angle-bracket placeholders introduced into two XML doc com…
erikdarlingdata Sep 5, 2026
93b7b7e
Date the last_error slot so a retired fault stops reading as a live o…
erikdarlingdata Sep 5, 2026
114e8cb
Record real elapsed time on the six classified fault arms, in the slo…
erikdarlingdata Sep 5, 2026
9bb6dfc
Run Darling's whole-tree guards where the area filters do not reach (…
erikdarlingdata Sep 5, 2026
fc7e3f0
Fixes #3017 (items 1 and 2) (#3027)
erikdarlingdata Sep 5, 2026
ba78352
Census viewer fan-outs by shape rather than by their join (#3019) (#3…
erikdarlingdata Sep 5, 2026
007bde9
Decide the live-cleanup ratchet on code, not on prose (#3014) (#3032)
erikdarlingdata Sep 5, 2026
2a2ad43
Narrow the hourly refresh window and phase the refresh family across …
erikdarlingdata Sep 5, 2026
ac0d4c7
Say which transport recovers a truncated deadlock report, and pin wha…
erikdarlingdata Sep 5, 2026
6a21d08
Fixes #3017 (#3033)
erikdarlingdata Sep 5, 2026
7b615f5
Price the viewer's read deadline against the pool the seat has, and b…
erikdarlingdata Sep 5, 2026
3923132
Read the log prefix a managed PostgreSQL target renders, and test bot…
erikdarlingdata Sep 5, 2026
c6928a1
Tie each fleet rollup tile's number to its label and coverage sub-lin…
erikdarlingdata Sep 5, 2026
82782e9
Pin the compression policies to a phase grid clear of the refresh slo…
erikdarlingdata Sep 5, 2026
021a19c
Recurse the live-cleanup ratchet, narrow its process-kill exclusion, …
erikdarlingdata Sep 5, 2026
473a806
Fixes #3029 (#3042)
erikdarlingdata Sep 5, 2026
7a1126a
Fixes #3013 (#3040)
erikdarlingdata Sep 5, 2026
613fc31
Use the placeholder convention for the host named in AlertEngine's po…
erikdarlingdata Sep 5, 2026
fc797a9
State the tail-overlap condition where the recovery claim is made, an…
erikdarlingdata Sep 5, 2026
036c29f
Fixes #3048 (#3051)
erikdarlingdata Sep 6, 2026
0330cac
Collect the store's own PostgreSQL log as a self-monitoring census (#…
erikdarlingdata Sep 6, 2026
38616fc
Tie the AG rollup's numbers to their labels, from a shared id helper …
erikdarlingdata Sep 6, 2026
bbacf4c
Fixes #3049 (#3056)
erikdarlingdata Sep 6, 2026
fcb88af
Fixes #3044 (#3055)
erikdarlingdata Sep 6, 2026
33ec6c7
Fixes #3053 (#3058)
erikdarlingdata Sep 6, 2026
13061c4
Fixes #3052 (#3059)
erikdarlingdata Sep 6, 2026
8524ee2
Fixes #3062 (#3064)
erikdarlingdata Sep 6, 2026
da97bee
Fixes #3060 (#3066)
erikdarlingdata Sep 6, 2026
ac748b4
Fixes #3061 (#3068)
erikdarlingdata Sep 6, 2026
ff9d4ad
Fixes #3063 (#3065)
erikdarlingdata Sep 6, 2026
f69b963
Fixes #3070 (#3071)
erikdarlingdata Sep 6, 2026
987c005
Fixes #3072 (#3073)
erikdarlingdata Sep 6, 2026
0f888e9
Widen the cross-app anchor to a SKU's test tree, and exempt what the …
erikdarlingdata Sep 6, 2026
f9c3949
Fixes #2880 (#3078)
erikdarlingdata Sep 6, 2026
d7ad4b1
Fixes #3076 (#3079)
erikdarlingdata Sep 6, 2026
bc5d434
Fixes #3069 (#3077)
erikdarlingdata Sep 6, 2026
d54ad00
Fixes #3074 (#3080)
erikdarlingdata Sep 6, 2026
f4891e9
Settle the cross-app C# matcher's boundary as a decision, and census …
erikdarlingdata Sep 6, 2026
c05d029
Fixes #3081 (#3085)
erikdarlingdata Sep 6, 2026
6ade645
Fixes #3083 (#3086)
erikdarlingdata Sep 6, 2026
6b336da
Fixes #3087 (#3092)
erikdarlingdata Sep 6, 2026
0d45936
Fixes #3090 (#3091)
erikdarlingdata Sep 6, 2026
75ba818
Fixes #3088 (#3089)
erikdarlingdata Sep 6, 2026
2b77888
Fixes #3094 (#3097)
erikdarlingdata Sep 6, 2026
87d7010
Move per-cycle collector timing telemetry to Debug (#3103)
erikdarlingdata Sep 6, 2026
77970ee
Fixes #3101 (#3105)
erikdarlingdata Sep 6, 2026
e2b3ab6
Fixes #3098 (#3106)
erikdarlingdata Sep 6, 2026
2f62b88
Fixes #3095 (#3110)
erikdarlingdata Sep 7, 2026
57b9cb9
Part of #3099 (#3108)
erikdarlingdata Sep 7, 2026
7f5481a
Fixes #3107 (#3113)
erikdarlingdata Sep 7, 2026
376b904
Fixes #3111 (#3117)
erikdarlingdata Sep 7, 2026
d4fd765
Bound pg_index_bloat by what pgstatindex is applied to, not by a join…
erikdarlingdata Sep 7, 2026
ec33c47
Normalise pgstatindex NaN on the way out of the index-bloat read (#3126)
erikdarlingdata Sep 7, 2026
2a163f0
One runtime log level gates Lite, so lowering the timing line actuall…
erikdarlingdata Sep 7, 2026
01fdeae
Read a PostgreSQL cancel's origin from the message text rather than S…
erikdarlingdata Sep 7, 2026
641c4db
Share one path gate between the two Darling CI jobs and report its de…
erikdarlingdata Sep 7, 2026
2d63138
Assert collection size with Assert.Single and Assert.Empty in the sou…
erikdarlingdata Sep 7, 2026
e6e174c
Count a qualified receiver in the repo-file reader census (#3135)
erikdarlingdata Sep 7, 2026
4779874
Describe the refresh routine band by its constant instead of by a cen…
erikdarlingdata Sep 7, 2026
20fbe30
Let the host declare LocalDataService's write-lock budget instead of …
erikdarlingdata Sep 7, 2026
2c9943a
State the refresh envelope against a measured maximum, and say a dail…
erikdarlingdata Sep 7, 2026
35df573
Bound the store COPY's start phase with a call-site deadline instead …
erikdarlingdata Sep 7, 2026
3373c1e
Name the tempdb space alert for what it measures: reserved, not used …
erikdarlingdata Sep 7, 2026
0bd41e8
Parse the crude second opinion's XML instead of guessing its quote de…
erikdarlingdata Sep 7, 2026
068f259
Label a monitored server's version by its engine, not by a SQL Server…
erikdarlingdata Sep 7, 2026
5d5b77c
Make every locked-mode restore CI runs able to fail its step, and rea…
erikdarlingdata Sep 7, 2026
11a5e53
Record the CHANGELOG entries for sixty-five merged changes (#3150)
erikdarlingdata Sep 7, 2026
148e916
Stamp updated_by with the requesting seat's principal, so a web edit …
erikdarlingdata Sep 7, 2026
5342eac
Collect the checkpointer and bgwriter counters on Aurora, which the W…
erikdarlingdata Sep 7, 2026
78863d5
Name which cause produced a pg_column_stats zero, rather than listing…
erikdarlingdata Sep 7, 2026
feba2de
Bump the nuget-patch-and-minor group with 2 updates (#3130)
dependabot[bot] Sep 7, 2026
15e3951
Bump BlackwellSystems.Gcf from 0.2.1 to 1.0.0 (#3131)
dependabot[bot] Sep 7, 2026
60bc58d
Record how long every alerting-side store read ran before it failed (…
erikdarlingdata Sep 7, 2026
e6c2503
Let a zero-output collector's own notes answer for its zero, instead …
erikdarlingdata Sep 8, 2026
3dfc4c3
Rotate which indexes pg_index_bloat measures, so its deferral claim i…
erikdarlingdata Sep 8, 2026
a01c7d2
Give pg_index_bloat its rows in the runbook's cadence and tool tables…
erikdarlingdata Sep 8, 2026
d4603af
Let a collector definition record what it measured on its own collect…
erikdarlingdata Sep 8, 2026
09e7979
Make an alert-history row state its channel, so alert_sent is only ev…
erikdarlingdata Sep 8, 2026
af3d026
Size pg_index_bloat's ceiling and cycle budget against the measured b…
erikdarlingdata Sep 8, 2026
0034254
Give timescaledb.enable_job_execution_logging its own conf marker, so…
erikdarlingdata Sep 8, 2026
b8ae88a
Add the remediation credential seam, the journal's actor and the evic…
erikdarlingdata Sep 8, 2026
517ac16
Re-derive the refresh grid so contention cannot depend on list positi…
erikdarlingdata Sep 8, 2026
a203363
State what the refresh-slot routine-band case establishes, in the pre…
erikdarlingdata Sep 8, 2026
6faf666
Watch a compression run against the clearance its own minute has, and…
erikdarlingdata Sep 8, 2026
11d6103
Report a recorded refresh ceiling that a live run has falsified, sepa…
erikdarlingdata Sep 8, 2026
ec68e39
Separate the light refreshes whose runs are long enough to overlap, i…
erikdarlingdata Sep 8, 2026
723ae0c
Document the PostgreSQL grant and extensions that decide whether a co…
erikdarlingdata Sep 9, 2026
df7542c
Declare each collector's PostgreSQL extension dependency and pin the …
erikdarlingdata Sep 9, 2026
cba4f4b
Attribute the store probe inside query_store's sql_duration_ms instea…
erikdarlingdata Sep 9, 2026
4afcca0
Declare the compression guard's width, and settle the ceiling estimat…
erikdarlingdata Sep 9, 2026
e63a367
Require a population large enough for a maximum to bound anything (#3…
erikdarlingdata Sep 9, 2026
3334d28
Read the store's recorded size for the disk-pressure alert instead of…
erikdarlingdata Sep 9, 2026
8b26dff
Record and classify Entra MFA broker failures instead of showing one …
erikdarlingdata Sep 9, 2026
9cd4ca2
De-skew default_trace_events.event_time to UTC at every Darling read …
erikdarlingdata Sep 9, 2026
cb208f6
Bound the light census count by the tail above its own stated percent…
erikdarlingdata Sep 9, 2026
b01e2a3
Say that the recorded-size read's cheapness is incidental, and on whi…
erikdarlingdata Sep 9, 2026
900f09d
Record the CHANGELOG entries for thirty-three changes across twenty-s…
erikdarlingdata Sep 9, 2026
ab70c41
Single-source the Query Store liveness touch guard and derive its wid…
erikdarlingdata Sep 9, 2026
878d091
Add a broker-free Entra sign-in path: ActiveDirectoryDefault returns …
erikdarlingdata Sep 9, 2026
91c0a91
Guard a server-local column reaching a UTC-assuming consumer, with th…
erikdarlingdata Sep 9, 2026
783a856
Weld concatenated literals before scanning store SQL, and make the Po…
erikdarlingdata Sep 9, 2026
b965451
Record which credential DefaultAzureCredential selected, on an event-…
erikdarlingdata Sep 9, 2026
f8927d0
Declare the product version once, and pin every reader to it (#3222) …
erikdarlingdata Sep 9, 2026
849ea2e
De-skew the sixteen server-local timestamps MCP reads return, in both…
erikdarlingdata Sep 9, 2026
c9f04f3
Five instruments that assert something other than what they check (#3…
erikdarlingdata Sep 9, 2026
7083eac
Pair every desktop clock render with its column's frame, in both SKUs…
erikdarlingdata Sep 9, 2026
5b6ad87
Scope the de-skew's accuracy claim where the column outlives a DST tr…
erikdarlingdata Sep 9, 2026
e459539
Report the member ranges that stop short of their own content (#3230)
erikdarlingdata Sep 9, 2026
db4d971
Record the CHANGELOG entries for eighteen changes across eleven merge…
erikdarlingdata Sep 9, 2026
75daead
Stop the truncation doc asserting counts no test holds (#3233)
erikdarlingdata Sep 9, 2026
84e27fe
Estimate PostgreSQL index bloat from statistics instead of walking ev…
erikdarlingdata Sep 10, 2026
f28452c
Prepare 3.7.0: version bump, changelog cut, README tool counts
erikdarlingdata Sep 10, 2026
422e764
State the '(fleet)' maintenance row in upgrade-darling.ps1's verifica…
erikdarlingdata Sep 10, 2026
19bb01e
Report the Agent surface as not applicable in the Azure SQL DB probe …
erikdarlingdata Sep 10, 2026
82fd985
Merge pull request #3246 from erikdarlingdata/fix/3238-upgrade-verify…
erikdarlingdata Sep 10, 2026
2105462
Publish list_servers' engine label under engine-neutral keys, keep sq…
erikdarlingdata Sep 10, 2026
e7cfa20
Name the pg_read_file grant pair on the self-hosted log readers' PERM…
erikdarlingdata Sep 10, 2026
2c2f053
Derive the regression row's last-execution expectation through the di…
erikdarlingdata Sep 10, 2026
2c2b82e
Merge remote-tracking branch 'origin/dev' into fix/3245-list-servers-…
erikdarlingdata Sep 10, 2026
41601b9
Persist NULL rather than 0 for a PostgreSQL target's SQL Server major…
erikdarlingdata Sep 10, 2026
33fe2a6
Merge remote-tracking branch 'origin/dev' into fix/3237-azure-msdb-pr…
erikdarlingdata Sep 10, 2026
574a44a
Name the engine on the test-connect request and pin the probe reply's…
erikdarlingdata Sep 10, 2026
e816d9f
Clean all 56 Rebuild warnings so the zero-warning release gate passes…
erikdarlingdata Sep 10, 2026
c9e344d
Pin the Query Store execution stamps' value wiring, machine-independe…
erikdarlingdata Sep 10, 2026
be09df1
Merge pull request #3249 from erikdarlingdata/fix/3237-azure-msdb-pro…
erikdarlingdata Sep 10, 2026
6ff22b9
Re-derive the PostgreSQL first-target runbook from the shipped produc…
erikdarlingdata Sep 10, 2026
71f698a
Merge origin/dev into fix/3241-test-warning-cleanup: re-splice CHANGE…
erikdarlingdata Sep 10, 2026
5df19e9
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
7be089d
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
e3b5108
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
9e6756c
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
1d11302
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
9206d75
Drop the CHANGELOG splice from this PR (wave protocol: consolidated s…
erikdarlingdata Sep 10, 2026
a9d371f
Drop the CHANGELOG splice; entries land in one post-wave consolidation
erikdarlingdata Sep 10, 2026
df3ac42
Classify an absent declared extension as EXTENSION_MISSING, not PERMI…
erikdarlingdata Sep 10, 2026
4f07ba2
Take CHANGELOG.md out of this PR per the wave-wide changelog protocol
erikdarlingdata Sep 10, 2026
b1a00ea
Merge pull request #3258 from erikdarlingdata/fix/3241-test-warning-c…
erikdarlingdata Sep 10, 2026
3d64981
Merge pull request #3260 from erikdarlingdata/fix/3247-runbook-staleness
erikdarlingdata Sep 10, 2026
8e06b82
Merge origin/dev into fix/3240-extension-precondition: re-resolve on …
erikdarlingdata Sep 10, 2026
984d36e
Merge pull request #3259 from erikdarlingdata/fix/3253-querystore-val…
erikdarlingdata Sep 10, 2026
f60b245
Merge pull request #3256 from erikdarlingdata/fix/3244-testconnect-en…
erikdarlingdata Sep 10, 2026
eb2c1cd
Merge pull request #3254 from erikdarlingdata/fix/3243-pg-major-null
erikdarlingdata Sep 10, 2026
61abdba
Merge pull request #3250 from erikdarlingdata/fix/3245-list-servers-v…
erikdarlingdata Sep 10, 2026
b1e37bb
Merge pull request #3251 from erikdarlingdata/fix/3239-pg-read-file-g…
erikdarlingdata Sep 10, 2026
3126fc8
Merge pull request #3252 from erikdarlingdata/fix/3248-tz-dependent-pin
erikdarlingdata Sep 10, 2026
1d4dbca
Complete the Darling README's PostgreSQL collector inventory and reti…
erikdarlingdata Sep 10, 2026
2c66ebd
Merge origin/dev (3126fc87) into fix/3240-extension-precondition: re-…
erikdarlingdata Sep 10, 2026
d6601ff
Read the Azure sibling rows the size collector deliberately emits (#3…
erikdarlingdata Sep 10, 2026
f387892
Retire the README classification paragraph's claim that a missing pg_…
erikdarlingdata Sep 10, 2026
6810cc6
Account for get_pg_top_queries' description naming aurora_stat_statem…
erikdarlingdata Sep 10, 2026
4c8b159
Merge pull request #3263 from erikdarlingdata/fix/3240-extension-prec…
erikdarlingdata Sep 10, 2026
af38b5f
Merge pull request #3265 from erikdarlingdata/fix/3262-sibling-row-db…
erikdarlingdata Sep 10, 2026
0c7704a
Merge pull request #3264 from erikdarlingdata/fix/3261-readme-pg-drift
erikdarlingdata Sep 10, 2026
d63cfea
Add the release wave's CHANGELOG entries in one splice (#3239, #3240,…
erikdarlingdata Sep 10, 2026
8736017
Merge pull request #3266 from erikdarlingdata/chore/wave-changelog-sp…
erikdarlingdata Sep 10, 2026
68192d3
Make the server stale band honor each collector's own cadence (#3236)
erikdarlingdata Sep 10, 2026
ff7411f
Merge pull request #3268 from erikdarlingdata/fix/3236-fleet-stale-ca…
erikdarlingdata Sep 10, 2026
addca40
Add the release wave's CHANGELOG entries in one splice (#3236)
erikdarlingdata Sep 10, 2026
616091a
Merge pull request #3269 from erikdarlingdata/chore/wave-changelog-sp…
erikdarlingdata Sep 10, 2026
565b89d
Merge origin/dev into release/v3.7.0: re-split the changelog after th…
erikdarlingdata Sep 10, 2026
b9d88ef
Revert the cadence-aware fleet staleness change (#3268, #3236)
erikdarlingdata Sep 10, 2026
778a355
Merge pull request #3270 from erikdarlingdata/revert/3236-fleet-stale…
erikdarlingdata Sep 10, 2026
e65c8cd
Fleet cards read a PostgreSQL target's instance CPU (#3267)
erikdarlingdata Sep 10, 2026
2227c18
Live-store round trip for the fleet PostgreSQL CPU read (#3267)
erikdarlingdata Sep 10, 2026
7f4494e
Say Aurora, not Aurora/RDS, for the Performance Insights CPU arm
erikdarlingdata Sep 10, 2026
5c30ec8
A card stops claiming Healthy for a metric nothing measured (#3272)
erikdarlingdata Sep 10, 2026
f2b9768
Merge pull request #3271 from erikdarlingdata/fix/3267-pg-fleet-cpu
erikdarlingdata Sep 10, 2026
aa05ee1
Record the two CHANGELOG entries for #3271
Sep 10, 2026
19ea5de
Merge pull request #3275 from erikdarlingdata/chore/changelog-3271
erikdarlingdata Sep 10, 2026
1e1c66b
Merge origin/dev into release/v3.7.0: sync #3236 revert + #3267 fleet…
erikdarlingdata Sep 10, 2026
bc676e2
Add the v3.6.0 migration-ladder fixture; point the guard at the last …
erikdarlingdata Sep 10, 2026
3de8902
Merge pull request #3242 from erikdarlingdata/release/v3.7.0
erikdarlingdata Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
40 changes: 40 additions & 0 deletions .claude/skills/build/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
name: build
description: Build and locate the PerformanceMonitor executables
argument-hint: [lite|darling|viewer|dashboard|installer]
disable-model-invocation: false
---

# Build PerformanceMonitor

Build a component of PerformanceMonitor and report the result. All paths are relative to the repository root.

## Arguments

`$ARGUMENTS` specifies which component to build:

| Argument | Project | Output TFM |
|---|---|---|
| `lite` | `Lite/PerformanceMonitorLite.csproj` | `net10.0-windows` |
| `darling` or `service` | `Darling/PerformanceMonitor.Darling.Service/PerformanceMonitor.Darling.Service.csproj` | `net10.0` |
| `viewer` | `Darling/PerformanceMonitor.Darling.Viewer/PerformanceMonitor.Darling.Viewer.csproj` | `net10.0-windows` |
| `dashboard` or `full` | `deprecated/Dashboard/Dashboard.csproj` | DEPRECATED since v3.3.0 |
| `installer` | `deprecated/Installer/PerformanceMonitorInstaller.csproj` | DEPRECATED since v3.3.0 |
| (empty) | build whatever is in the current working directory, or ask | |

Lite, the Darling service, and the Darling Viewer are the shipping artifacts. The full Dashboard and the CLI Installer moved to `deprecated/` in v3.3.0. They still build and their tests still run in CI, but they ship no release artifacts and get bug-fix support only.

## Steps

1. Map `$ARGUMENTS` to the project path above.
2. Run `dotnet build <path>`, Debug configuration by default.
3. Report the result:
- **success**: show the output path (e.g. `Lite/bin/Debug/net10.0-windows/`) and the executable name
- **failure**: show the error messages clearly and suggest fixes
4. Do NOT automatically launch the executable. Just say where it is.

## Notes

- Use `dotnet build` with paths relative to the repository root. Do NOT `cd` into directories.
- If the build fails because the exe is locked by a running instance, kill it (`taskkill /F /PID <pid>`) and rebuild.
- If a project path cannot be determined, run `git ls-files "*.csproj"` to list the real projects. Stale `bin/` and `obj/` folders are left behind at the old top-level `Dashboard/` and `Installer/` paths and are not projects.
81 changes: 81 additions & 0 deletions .claude/skills/duckdb/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
name: duckdb
description: Query the Lite app's DuckDB database safely while the collector is running
argument-hint: [SQL query or description of what to look up]
disable-model-invocation: false
---

# Query Lite's DuckDB Database

Safely query the PerformanceMonitor Lite DuckDB database using Python. This skill exists because DuckDB only allows one read-write connection at a time. When Lite is running (collecting data), it holds the write connection. External readers MUST connect in read-only mode.

## Database Location

Since the #1832 fix (data moved OUT of Velopack's install root, which Setup.exe deletes), the store lives at:
```
%LOCALAPPDATA%\PerformanceMonitorLite-Data\monitor.duckdb
```
Builds from BEFORE that fix (3.3.0 and earlier) keep it at the old path, and the file only moves when a fixed build first runs:
```
%LOCALAPPDATA%\PerformanceMonitorLite\monitor.duckdb
```
**Check the -Data path first; fall back to the old path if it does not exist.**

## How to Query (ALWAYS use this pattern)

Use Python with the `duckdb` module. **ALWAYS connect in read-only mode.**

```python
python -c "
import duckdb, os
la = os.environ['LOCALAPPDATA']
p = la + '/PerformanceMonitorLite-Data/monitor.duckdb'
if not os.path.exists(p):
p = la + '/PerformanceMonitorLite/monitor.duckdb'
con = duckdb.connect(p, read_only=True)
result = con.execute('YOUR SQL HERE').fetchall()
for row in result:
print(row)
con.close()
"
```

## CRITICAL RULES

1. **ALWAYS use `read_only=True`** -- without this, the connection will be blocked by Lite's write lock and hang or fail
2. **NEVER use `duckdb.connect()` without `read_only=True`** -- the default is read-write which WILL conflict with the running app
3. **Use forward slashes** in the path (Python on Windows handles this fine)
4. **Close the connection** when done -- don't leave read locks dangling
5. **Use Python** -- duckdb 1.4.4 is installed

## Common Queries

List all tables:
```sql
SELECT table_name FROM information_schema.tables WHERE table_schema = 'main' ORDER BY table_name;
```

List columns for a table:
```sql
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'TABLE_NAME' ORDER BY ordinal_position;
```

List all views:
```sql
SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW' ORDER BY table_name;
```

Row counts:
```sql
SELECT table_name, estimated_size FROM duckdb_tables() ORDER BY estimated_size DESC;
```

## DuckDB vs SQL Server Syntax Notes

- String concatenation: `||` (not `+`)
- ILIKE for case-insensitive LIKE
- `EPOCH_MS(timestamp_col)` to convert to epoch
- `strftime('%Y-%m-%d %H:%M:%S', ts)` for formatting
- No `TOP N` -- use `LIMIT N` instead
- `EXCLUDE` clause: `SELECT * EXCLUDE (col1, col2) FROM table`

74 changes: 74 additions & 0 deletions .claude/skills/maintenance/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
name: maintenance
description: Quarterly maintenance pass (every 1-3 months) β€” dependency/security audit, build health, and repo hygiene for PerformanceMonitor and PerformanceStudio
argument-hint: [optional: deps | build | all]
disable-model-invocation: false
---

# Routine Maintenance Pass

A repeatable every-1-3-months health check for the .NET desktop + SQL-monitoring repos
(PerformanceMonitor = WPF, PerformanceStudio = Avalonia; same dependency/build/release shape).
`$ARGUMENTS` optionally scopes it (`deps`, `build`, or `all` β€” default `all`).

Work top to bottom. Do read-only scans first and report findings; make fixes on a feature
branch/worktree (branch protection: never commit to `dev`/`main`), build + test, then PR to `dev`.
Low-risk patch/minor bumps can go in one PR; majors and anything release-critical get their own.

## A. Dependencies & Security

> **Scope β€” scan every project, not just the solution.** A repo's `.sln` may not list every project. PerformanceStudio's `PlanViewer.sln` omits `server/PlanShare.csproj` and the SSMS VSIX (`PlanViewer.Ssms`, `PlanViewer.Ssms.Installer`), so the `dotnet list <Solution>.sln …` scans and the solution build all silently skip them. Run the checks against those projects too. The net472 VSIX is old-style, so `dotnet list` is unreliable on it β€” read its `<PackageReference>`s by hand (its `Microsoft.VSSDK.BuildTools` is intentionally held on the 17.x line; 18.x is un-restorable from nuget.org and targets VS 18, not VS 2022). Where the `.sln` covers all projects, the solution is enough.

1. **Outdated packages.** `dotnet list <Solution>.sln package --outdated`
- Take low-risk **patch/minor** bumps (Microsoft.Extensions.*, Test.Sdk, etc.).
- **Majors get their own effort** β€” especially the update framework (Velopack: bump the library AND the `vpk` CLI pin in the release workflow β€” `.github/workflows/release.yml` for PerformanceStudio β€” together; validate the in-app + Setup.exe update path) and anything release-critical.
- **Engine-wrapped bindings** (e.g. DuckDB.NET) trail the native engine β€” bump when the binding catches up, and validate behavior (for DuckDB run `tools/CompactionRepro` re: the parquet-COPY memory-limit floor before changing the version).
- After version edits, **if the repo uses lock files** (`packages.lock.json` β€” PerformanceMonitor does; PerformanceStudio does not), regenerate them: `dotnet restore <Solution>.sln --force-evaluate` (CI restores `--locked-mode`).

2. **Vulnerable packages (security).** `dotnet list <Solution>.sln package --vulnerable --include-transitive`
- Must be **zero**. Any hit (incl. transitive) is urgent β€” bump or pin to a fixed version. This catches CVEs the `--outdated` check does not.
- **Code-level pass, not just packages:** run the `security-review` skill/agent on the diff since the last maintenance pass. These apps have real attack surface beyond their dependencies β€” PerformanceStudio's MCP server opens a local network listener, both store DB credentials (Windows Credential Manager), and both parse untrusted input (e.g. execution-plan XML). Triage anything it flags.
- **Calibrate severity to the deployment.** PerformanceStudio runs on a single-user personal laptop, and its MCP tools are strictly read-only (no arbitrary SQL, no writes/config changes). So loopback-bound / opt-in / local-IPC findings β€” the MCP listener, the named-pipe single-instance server β€” are **Low/informational here, not High**: there's no other local user or attacker to exploit them, and read-only tools can at most leak data they already return. Reserve High for *remotely reachable* vectors (e.g. a missing `Host`/`Origin` check that allows DNS rebinding) or credential disclosure. This calibration would change only if Studio shipped the MCP server enabled-by-default or ran on a shared/multi-user host. Don't re-raise the same local-IPC findings at High each pass.

3. **Deprecated packages.** `dotnet list <Solution>.sln package --deprecated` β€” replace anything abandoned.

4. **Framework / runtime currency.** Confirm the TFM is on a **supported, released** .NET (do NOT move to a preview). Take the latest servicing patch of the current major. WPF/Avalonia track the runtime/their own NuGet β€” check both.

5. **CI tool & action pins.** In `.github/workflows/*.yml`: confirm `uses:` actions are on current majors, and that any `dotnet tool install` is **version-pinned to match its library** (e.g. `vpk --version` must equal the Velopack PackageReference). Bump GitHub Actions that are behind / deprecated.

6. **Dependabot (optional β€” not a finding).** Two separate features: *security alerts* (passive CVE notifications that close the gap between manual `--vulnerable` passes β€” mild value) and *version-update PRs* (automated bump PRs β€” redundant and noisy once you do periodic manual sweeps). For PerformanceStudio, Erik relies on the manual passes; treat Dependabot as **optional and do not report it as a finding**. If alerts are ever wanted they're a one-toggle enable (repo Settings β†’ Code security, no config file); the version-update PRs aren't wanted.

## B. Code & Build Health

7. **Zero-warning build.** Build the whole solution and capture warnings β€” the standard is **0**:
```
dotnet build <Solution>.sln -c Debug --nologo 2>&1 | Select-String ": warning "
```
- Kill the running app(s) first OR build in a worktree β€” a running Dashboard/Lite/Studio locks its `bin` DLLs (MSB3021). Note: an incremental no-op build emits no warnings; force a clean compile of any project you're checking.
- Fix each warning honestly (don't add to `NoWarn` to silence). Remove dead code (e.g. an unused test seam β†’ CS0649).

8. **NoWarn review.** Scan each csproj `<NoWarn>`: every suppressed rule should have a reason (these repos keep inline comments). Remove suppressions that no longer fire; don't let the list grow silently. Most existing CA suppressions are intentional high-count ones β€” leave those.

9. **Stale markers.** `grep -rE "\b(TODO|FIXME|HACK|XXX)\b" --include=*.cs` β€” resolve or file an issue; a `// TODO: restore to X` next to a non-X value may mean the comment is the leftover (ask before flipping).

10. **Git repo hygiene.**
- **Line endings / `.gitattributes`.** If the repo has no `.gitattributes`, line endings drift (CRLF/LF mixed, `core.autocrlf=false`) and bulk edits balloon diffs. Add one and run a **dedicated** `git add --renormalize .` commit (its own PR, when no other work is in flight β€” it touches nearly every file).
- **Stale branches & worktrees.** `git worktree list` β€” remove leftover worktrees (anything under `.claude/worktrees/` or other agent/isolation worktrees) with `git worktree remove`. Then `git fetch --prune` to drop stale remote-tracking refs, and audit: `git branch --merged origin/dev` (local branches already in dev β€” safe to delete) and `git branch -r` (remote branches from closed/merged PRs). Delete merged/dead branches; **keep intentionally-parked ones** (note which and why β€” e.g. a blocked-upgrade branch like `upgrade/avalonia-12`). For branches *you didn't create*, surface and confirm before deleting rather than assuming abandoned. Confirm open PRs are still wanted.

## C. App data & runtime hygiene (lighter)

11. **Retention / archive end-to-end.** Confirm the app's data retention/purge and (Lite) parquet archiving actually prune old data, and logs rotate. A new time-series table must be registered for retention/archive or it grows forever.

12. **Perf regression spot-check.** Re-run the UI-latency-under-load harness if available; watch known hot spots (e.g. the Lite Blocking tab render hitch). Quick collector-health pass.

## D. Release & platform currency (lighter)

13. **Release infra freshness.** Test servers online/patched; signing cert (SignPath) not near expiry; cloud creds (`az`/`aws`) valid; the `release-checklist` skill still accurate.
- **Cross-platform publish smoke.** `dotnet publish` the desktop app for the non-Windows runtimes it ships (PerformanceStudio: `linux-x64`, `osx-arm64`/`osx-x64`) and confirm each still produces a runnable app. The Avalonia/SkiaSharp native pins are fragile β€” the Linux `SkiaSharp.NativeAssets.Linux` pin exists to guard GitHub issue #139 β€” and a Windows-only build won't catch a broken Linux/macOS runtime.

14. **SQL Server / cloud drift + bundled tools.** New SQL Server CU/version, new DMVs/columns, Azure SQL DB / RDS changes (cloud collector paths have a bug history); refresh bundled community procs (sp_WhoIsActive, sp_BlitzLock, sp_HealthParser, sp_HumanEventsBlockViewer).

## Output

Report per section: βœ… clean / ⚠️ findings (with the fix made or recommended). Group merged PRs and
"parked" items (e.g. a major bump deferred) so the next pass knows where things stand.
Loading
Loading