Fix stale plugin dependencies in incremental build
Details
The --with-plugins incremental skip check only looked at plugin source
files (.cs, .csproj, .axaml) to decide if a rebuild was needed. When
PrivStack.Sdk or PrivStack.UI.Adaptive changed without any plugin source
change, the stale dependency DLLs persisted in plugins/ output, causing
MissingMethodExceptions at runtime.
Now also checks if PrivStack.Sdk.dll or PrivStack.UI.Adaptive.dll build
output is newer than the plugin DLL, triggering a republish when shared
dependencies change.
Fix Tasks settings button not responding to clicks
Details
The settings cog button showed a tooltip on hover but clicking did nothing.
Root cause: AsyncRelayCommand's CanExecute returns false while a previous
execution is in-flight. If the RuleService SDK call during initialization
hung or took too long, OpenSettingsCommand would be permanently stuck in
"executing" state, silently rejecting all subsequent Execute calls.
Fix: Replace the Command binding with a Click handler in code-behind that
directly sets Settings.IsOpen and calls LoadSettingsDataAsync(), bypassing
the AsyncRelayCommand concurrency guard entirely. Also cleaned up debug
logging from previous investigation attempts.
Replace terse action catalog with concrete examples
Details
Models follow copy-pasteable examples far better than compact schema
listings. Replace the DatasetActionReference with three concrete [ACTION]
examples (create note with chart, update note, generate insights) that
the model can directly adapt. This fixes Duncan describing actions
instead of emitting [ACTION] blocks.
~318 tokens (was 188 terse, but 188 wasn't working). Total dataset
context injection is ~1,169 tokens — still under the original draft.
Fix Tasks settings button permanently unclickable after first click
Details
Root cause: OpenSettingsAsync() awaited Settings.OpenCommand
.ExecuteAsync(), which is an AsyncRelayCommand with
AllowConcurrentExecutions=false (the default). Inside that command,
LoadAllAsync() calls RuleService.GetRulesAsync() → sdk.SendAsync().
If the SDK call hangs (never resolves), the command stays in
"executing" state forever. AsyncRelayCommand.CanExecute returns false
while executing, so the Button becomes permanently disabled — clicks
are silently ignored, but tooltip still works on hover.
Fix:
- Show the overlay immediately (IsOpen = true) before loading data
- Call LoadSettingsDataAsync() directly from the parent ViewModel
instead of going through Settings.OpenCommand, bypassing the
AsyncRelayCommand concurrency guard entirely
- Rename LoadAllAsync → LoadSettingsDataAsync (internal) so the parent
VM can call it directly
Inject compact action catalog when embedded datasets are present
Details
When a note has embedded dataset tables, always inject the
ActionFormatHeader + a compact DatasetActionReference (~188 tokens)
listing notes.create_note, notes.update_note, and data.generate_insights
with chart block syntax. This ensures Duncan knows how to use [ACTION]
blocks for note operations without relying on RAG index freshness.
Collapsed the reference from ~481 tokens to ~188 by removing duplicated
format rules (ActionFormatHeader already covers those).
Get notified about new releases