UnigramDev/Unigram/develop • 5d1c657 • 1 files, +20/-5
Notify the system call of the mute state on the conference path
Both conference constructors called TryNotifyMutedChanged before reserving the
system call, when _coordinator is still null, so the null-conditional swallowed
it and the initial mute state was never handed over. The video chat constructor
called it after, where it works.
Both now go through NotifyMutedChanged after the reservation. That reads the
manager into a local first: it runs after an await, and Dispose clears the field
from whichever thread ends the call.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 196c8df • 1 files, +1/-1
Fix leak on voip coordinator exception
UnigramDev/Unigram/develop • e8922b2 • 1 files, +152/-0
Add crash-triage skill
Encodes the workflow for turning a production crash from the dashboard into a
fix: rank groups by affected users, symbolicate with crashctl, map the
crashing version back to its source, diagnose, and open a PR against develop.
The version mapping is the part worth writing down. Crash line numbers refer
to the released build, so reading them against a working tree silently points
at the wrong code — on the crash checked while writing this, the reported line
2341 lands exactly on the reporting function at the 12.8.1 bump commit, and is
past the end of the file in the current tree. The skill resolves the version
via its tag, falls back to the "Bump version to X" commit when the tag was
never pushed (v12.8.1 is one such case), and then requires verifying that the
reported line actually falls inside the reported function before any code is
read for diagnosis.
Work happens in a local clone, never in the user's working tree. The skill
also records the limits: never close a crash group (only a shipped release
proves a fix), never push to develop/main, and treat crash records as user
data.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • cb35007 • 8 files, +122/-380
Extract the duplicated skeleton placeholder builder
The same shimmer placeholder was written out seven times, in ReactionButton,
InteractionsView, SearchPostsTabPage, ChatView, GiftCraftChoosePopup,
ResoldGiftsPopup and StoryInteractionsPopup. Each built a list of rounded rects,
grouped them into a path geometry, and then repeated an identical gradient,
sprite shapes, clip and sweep animation, differing only in the rectangles.
VisualUtilities.SetSkeleton takes the element, the sweep extent and the shapes.
Two things fell out of merging them: every copy kept separate foreground and
background colours that were always assigned the same value, now one shimmer;
and StoryInteractionsPopup was the only one not consulting the theme for
MenuFlyoutItemBackgroundPointerOver, so it now matches the other six rather than
always using the six percent white fallback.
Shapes are params, since two call sites pass a fixed pair and the rest pass an
array that is forwarded without copying. That makes a zero-shape call
expressible, which is worth guarding anyway: the loop-driven callers already
reach it whenever their row count is zero, and an empty group clips everything
away, attaching a skeleton that renders as nothing.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Post #20511
69
- 🫡 2