mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-12 01:07:46 +00:00
The boards derived their state from LocalCache.filter(kinds = 46xxx / 43xxx), but LocalCache.filter only matches notes whose kind.isRegular() (< 10_000). Every run/lifecycle/job kind is >= 43001, so the filter returned nothing and the boards never displayed a single run/job against live data (verified with a probe: a consumed 46020 matched 0, a 30620 def matched 1). Definitions (30620, addressable) were the only thing that showed. Aggregate straight off subscribeAsFlow, which accumulates the channel's stored + live events (deduped by id) and re-emits the list — the data the aggregators need. This also removes the per-batch whole-cache rescans. - WorkflowRunBoardViewModel: base #h subscription + a nested by-author decisions subscription (rebuilt only when the approver set changes via distinctUntilChanged) so grant/deny now arrive live for every observer, not just once at open. Drop 46004/46011/46012 from the fetch set — the aggregator can't correlate them. - JobBoardViewModel: aggregate jobs + kind-7 upvotes from the one #h subscription. - Real success/failure feedback: trigger/approve/deny/defineWorkflow return a result; snackbar only on confirmed publish; the sheet stays open on a failed trigger; the definition editor shows an error + a Publishing… state instead of hanging open and inviting duplicate 30620s. - Gate write actions on isWriteable(): a read-only login no longer sees a false "Approved" success, and the New-run FAB is hidden. - WorkflowRunAggregator.fold: parse each event's JSON content once. - Empty-state hint in the New-run sheet when no definitions exist yet. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011mApqAbr8vkLC7gUDjavu6