Stop flashing the external-images prompt at members who allow them
Opening a message showed the "display external images" banner for a moment and then withdrew it, for anyone who had already chosen to allow images everywhere. ...
Stop storing which side a message is on
The mirrored rule was right; what was wrong is that the answer was computed once, when a message arrived, and kept. Placement needs three things — the sender, t...
Keep the session document name as the consent card's fallback heading
Extracting FieldLayer dropped detailTitleFor, and with it the fallback to session.documents[0].name — a document with a null fileName would have headed its cons...
Render the document the wizard was measuring into a node that did not exist
The execution wizard showed a blank surface for every signable document — no pages, no field overlays, no PDF request, and nothing in any log. DocumentStep mea...
Record all three IMAP flags, and say why the index cannot serve a list yet
The migration has run, so is_answered exists and SearchIndexService now writes it alongside is_read and is_starred. The index has recorded two of the three flag...
Do not read or write is_answered before its column exists
Follows the shared-library change unmapping the field. Nothing in the deployed path now touches a column that KamoInitializer has not yet created. The index-ba...
Unmap is_answered until its migration has run
Mapping the column ahead of the migration that creates it is armed, and I armed it. SearchIndexEntity is hydrated from fullTextSearch, which is a native SELECT ...
Only the requestor is asked how the support went
Closing a ticket put "How was your experience?" in front of every agent in the conversation — the people who did the work, invited to score themselves. Since a ...
A read clears the indicators immediately, not on the next reload
Reading a conversation updated the server and then waited for the news to come back: PUT /read commits, MediaService broadcasts a fresh count over core NATS, th...
Stop listing every visitor twice
Performance (web vitals) events were saved with no hostname — the collector's performance branch never passed one, unlike the pageview branch. All 803 stored pe...
Resolve a native PDF's source bytes instead of demanding a rendition
**************** required dat.convertedDat to be non-null. ConversionService only mints a second ImgDat when it actually converts something -- a document that a...
The ticket list survives a broken indicator
The unread read threw and took the whole ticket list with it — the page came back empty, which is a far worse outcome than a page with no markers on it. It is g...
Bind the system-event pattern — a brace in native SQL never reaches the database
Hibernate scans native SQL text for its legacy {alias.path} placeholders, so the inlined '{"systemEvent"%' raised QueryException: Unmatched braces for alias pat...
Connect DocsService to NATS so the badge lights without a refresh
LegalPendingCountPublisher takes its NATS Connection as required=false and returns quietly when it is null. The shared NatsConfig is **************** and this C...
Remove the payroll registration fields nothing reads
Six fields on the payroll cards were never consumed by anything. A registration field nobody loads is worse than a missing one: an operator fills it in, believe...
ADP takes per-org credentials, not a platform registration
ADP shipped classified PLATFORM_OAUTH on the strength of ADP publishing a Marketplace ISV model, where Kamo would hold one partner client id, secret and certifi...
The needs-attention mark stops lying when you open a ticket
Clicking a row cleared its amber dot while the badge beside it stayed put, and a refresh brought the dot back. The badge was right and the dot was wrong. A tic...
Mark the items the navtop badge is actually counting
The badge read "5 support items need attention" and the list marked none of them. Both numbers were right about their own question and neither was the question ...
The ticket list marks the same items the badge counts
countForMember sized a set it built privately, so the list had no way to ask which tickets were in it and approximated instead — it flagged unread chat messages...
Side a message by which side sent it, not by who is reading
A support conversation has exactly two sides, and they are not "me" and "everyone else". One side is the person who asked for help — always exactly one member. ...
A ticket can never be answered by the member who raised it
A support conversation has two sides — someone asking and someone answering — and nothing enforced that they were different people. A member holding ACCEPT_SUPP...
Send an outbound attachment to the endpoint its type belongs to
Every social attachment went out through the adapter's sendImage, which on Telegram is /sendPhoto. A PDF or a zip posted there is rejected by the provider, and ...
Department speed dial hung on Loading forever
The loader effect listed departmentsState in its deps and set it to 'loading' on entry, so React tore that effect instance down immediately, the cleanup flipped...
Make Delete actually delete, and select exactly one pill
Delete did nothing. The handler was hung off the pill's focus, and the pill never had focus: preventDefault() in the pointerdown handler — which is there to sto...
Size the org logo to 80% of the join column
The join screen capped the branding logo at 40px tall with objectFit contain, so it rendered letterboxed inside the 300px column and looked undersized no matter...
Repair the kamouniverse backup, broken since the Yugabyte cutover
Renaming the dead CockroachBackupMissing alert in the previous commit made it fire immediately: no universe backup had succeeded since the 2026-08-09 migration....
Point at YugabyteDB, and stop `mvn test` migrating production
The datasource still named port 26257. That is the retired CockroachDB, which is still running and still answering, so a run against it succeeds completely and ...
Start again, and stop the billing migration deleting its own index
KamoInitializer could not start at all. Hibernate detects CockroachDialect, whose supportsInsertReturning() and **************** are both false, so an @Id carry...
Open at the newest message, and scroll up for the rest
Opening a long conversation showed the oldest loaded message first and then travelled down to the present while the member waited. Both chat surfaces scrolled t...
Quote the feed queries' aliases, and stop counting your own support messages against you
Two independent defects in the Chats feed, both invisible from the Java side. The native chat/support/social queries aliased columns in camelCase without quoti...
Make the option strip yield the room instead of the clusters colliding
The left cluster carried minWidth: 0 while its contents (correctly) refuse to shrink or wrap, so a crowded bar shrank the box below its own content and the cont...
Skeleton tracks the shared grid helpers; test jsonBody's 204 guard
The loading skeleton in app/hr/overview/page.tsx still hand-wrote the 1800px breakpoint that OverviewPillars and friends extracted into primitives.tsx (WIDE_BRE...
Follow the approval figure into currentPeriod, and stop null reading as zero
SecurityService 7c55054 moved awaitingApproval inside currentPeriod, where the window it describes actually is, and omits it entirely when there is no open peri...
Two-up figure rows so no card label wraps
The figure labels are Operator Labels — uppercase, 11px, 0.12em tracking — which puts "Execution incomplete" at 158px, "Blocking exceptions" at 150px and "Await...
Stop the fixed chrome labels breaking across two lines
A flex item's automatic minimum size is its min-content width, which for wrapping text is its widest word — so a crowded bar squeezed these controls narrow enou...
One snapshot per block, and figures that say what they measure
Both summarize methods are @Transactional(readOnly = true). Each issues six or seven reads whose figures are cross-checked ACROSS query boundaries: countOverdue...
An unreadable close-readiness body is unknown, and the approval count moves into its window
The wrong-path bug is fixed and the response shape is verified, but the CLASS of failure it belonged to was still open: if TimecardService renames `blocking`, d...
One glow on the clock icon, not two around the button
The rule carried BOTH a radial-gradient and a box-shadow. The gradient filled its own box while the box-shadow painted a separate ring outside it — two concentr...
Locale-correct structured data, and a robots.txt rule that matched nothing
Every BreadcrumbJsonLd and ItemList URL was hardcoded to /en, so the structured data on /fr/terms told crawlers its breadcrumb parent was the English page — 19 ...
Line the card figures up on a shared baseline
Every figure on the masthead and the four pillar cards was its own stacked box — Operator Label above, value below. Operator Labels are uppercase with 0.12em tr...
Withheld approval state renders as not-tracked, not clear
attendanceState() marked every member 'clear' whenever blockingExceptions was 0 and timecardState wasn't 'SUBMITTED' — true for every member under a caller lack...
A failed close-readiness relay leaves awaitingApproval unknown, not a confident zero
With FINALIZE_PAY_PERIODS held, a 5xx/404/unparseable close-readiness response left awaitingApproval sitting at its initial 0 — the WARN log fired but the HR Ov...
AwaitingApproval is nullable, and null is not zero
SecurityService now withholds the approval half of the summary from a caller without FINALIZE_PAY_PERIODS — resolveRole never admitted MANAGE_TIMECARDS to appro...
Gate the approval half of hr-summary on FINALIZE_PAY_PERIODS
Pointing the composer at close-readiness widened privilege. That relay's own mapping guards with FINALIZE_PAY_PERIODS, and resolveRole does not admit MANAGE_TIM...
Honest compliance figure, per-section failed states, right gating
The masthead percentage mixed units and could only flatter. `complete` summed org-wide ASSIGNMENT counts while `open` counted MEMBER-DOMAINS off memberRows, cap...
Fill the per-member overdue rollup instead of sending zero
Both summary services built members[] with .overdue(0). The Overview's matrix branches on that field, so legal and training could only ever render amber or gree...
The attendance summary called a path that does not exist
summarize() asked TimecardService for **************** That is the name of the SecurityService MAPPING, not of any downstream route. TimecardService has no such...
Derive overview pillar deep links from sub-tab id maps; kill dead textSecondary in activity rail
OverviewPillars.tsx hard-coded **************** instead of deriving them from **************** the way AttentionLedger.tsx already does — same name-indexed patt...
Bound the Resources block to count/sum/recent queries
**************** was loading the org's entire non-hidden HR_RESOURCE Img collection into memory to filter trashed, sum bytes and take 5 recent rows in Java — un...
Je, unaona nini kuhusu usafiri?
Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.