Close residual cross-org existence oracles + cap WORM-bound JSON blobs
Adversarial-review findings MLOS-W-01/03/04: - the 404-normalized empty list envelope now echoes the request's identity keys **************** so unknown, fore...
MediaObjTransit.date_created insertable=false so DB default fills it
The builder never set dateCreated; Hibernate bound NULL and violated the NOT NULL constraint, breaking addMembersToSession (and thus the social lead-accept hook...
Atomic claim before lead creation — prevent orphan pooled leads
social.lead.new can be processed concurrently (old + new SecurityService pod both hold a core-NATS subscription during a RollingUpdate → one publish delivered t...
Don't fire the new-lead popup on refresh / when not Available
myStatus from AvailabilityContext defaults to 'AVAILABLE' until two async fetches (/user-info then /members/me/availability) resolve, so on a browser refresh th...
Underwriting review polish (i18n, a11y, contrast, enum humanize)
Apply review findings: localize frozen/yes/no + humanized aria-labels, humanize enum pills, phase title-case parity (shared titleCase), null-safe ausKindId, WCA...
Fail-closed tenant guard on underwriting waivers/validations
Review found the org guard was a no-op on the common empty-list case for the by-id waivers/validations reads (which the MLOS service does not org-filter), leaki...
Add missing /api/security/lead-imports proxy route; default to Import Templates
- The base GET/POST /api/security/lead-imports had NO Next proxy route.ts (only sub-paths did), so Past Imports fetch (and the import POST) 500'd at the Next ...
Gate FFA acceptability on suspension in available-summary + available
available-summary now resolves the member's allotment and skips the product when suspended BEFORE the free-for-all short-circuit, and available() gates creditOk...
Suspension now actually blocks acceptance (alert + accept + FFA)
findApplicableAllotments filtered 'AND la.isActive = true', so getMostSpecificAllotment returned a less-specific ACTIVE fallback (or nothing) when a member's sp...
Implement POST /api/bulktext/send internal transactional SMS
SecurityService's BulkTextSmsClient (password-recovery + account-settings SMS) has always POSTed **************** to /api/bulktext/send, but the controller was ...
Send leadId as string when creating a comment
parseInt() rounded lead ids past JS MAX_SAFE_INTEGER, so the backend looked up a nonexistent lead and returned 404, surfacing as 'Failed to create post' on the ...
Accept leadId as string in createPost to preserve CRDB id precision
Lead IDs are CRDB unique_rowid() values that exceed JS MAX_SAFE_INTEGER. The frontend now sends leadId as a string; parse both String and numeric forms so findB...
Resolve member names on /leads/credits + link to their account
The member column and filter showed raw ids because the name map was built from /api/security/members, whose CockroachDB Long ids serialize as JSON numbers and ...
Make EditableCard onEdit optional so reassignment gating type-checks
The assignment card passes `canReassignManually ? startEditAssignment : undefined` to EditableCard.onEdit, but onEdit was typed `() => void` (required), failing...
Busy state on Start Import + drop debug logs
- disable Start Import / Back and show a spinner + 'Importing…' while the import POST is in flight, preventing duplicate submissions on large files - remove [...
Correctness, scale & PII hardening in LeadImportController
- dedup via scoped LeadRepository query instead of findAll() over all tenants (was an OOM/DoS + cross-tenant exposure risk, re-run per 1000-row batch) - cap i...
Scope import dedup query + org-guard member/vendor-product assignment
- **************** scoped, projection-only duplicate lookup for the manual importer (replaces a per-batch findAll() that hydrated every lead across all tena...
Pin markedForReassignmentBy FK to INT8 (no inherited default)
Without columnDefinition, Hibernate copies members.id (INT8 DEFAULT unique_rowid()), so CockroachDB backfilled existing leads rows with bogus member ids on ALTE...
Stop refresh icon blinking via infinite check loop
Once a domain was SSL-confirmed, checkDns unconditionally built a new domain object even when sslConfirmed was already true. The new object reference re-trigger...
Return 422 (not 500) when member has no mailbox
listFolders and other read endpoints threw IllegalStateException from MailContext.toMailCredentials() when a member had no IMAP credentials provisioned, which t...
Don't fetch org with a precision-truncated id
LabelManager derived orgIdStr from getOrgIdString() (precision-safe) with a fallback to String(organization.id). organization.id is a JS number and silently tru...
Set site region + use node-local MinIO per pod
- Add kamo.minio.region (MINIO_REGION, default us-west-ca-s-1) so SigV4 signatures match the server's enforced site region; fixes background upload and sett...
Sign requests with configurable site region
MinIO now enforces MINIO_SITE_REGION (us-west-ca-s-1) in the SigV4 authorization scope since site replication was enabled. The client was built without a region...
Drop background images that 404 instead of showing a broken frame
Track failed background image loads and filter them out of the Swiper carousel, so an incompletely provisioned theme (e.g. optionone, whose bg/2.webp was never ...
Never return 401 from proxy (was logging users out on enter-as); degrade to empty
Proxy injects X-Member-Id from session (me endpoint 400'd, so trial banner never had data)
Show trial banner on the welcome homepage (app/page.tsx) top-right, not just NavTop
Trial banner shows for any TEAM_MEMBER (system/team/admin), drop god dependency
Gate homepage trial banner to staff (team members/admins/system), hide from plain members
Trial banner signal is org-level (all members of a trialing org), not seat-based
Explicit Apply/Extend Trial buttons on platform Organizations tab (chips weren't discoverable)
Comp provisioning clears trial deadline (comp supersedes trial)
In the existing-subscription update path of provisionCompSubscription, set trialExpiresAt to null so a previously trialling org is cleanly promoted to comp with...
Retry boot-time rights sync on transient DB unavailability to avoid CrashLoopBackOff
Persist background reorder via commit endpoint (no data loss)
Save now stages new uploads to incoming, then commits the full desired order (existing-by-srcIndex or new-by-token) so reordered existing images are re-slotted ...
Stop cross-org background image leak; order-safe reorder + staging bucket
Reordering only re-uploaded new files to their new index, dropping reordered existing images and leaving imageBgCount claiming unpopulated slots; provisioning t...
Return 404 for a missing org instead of 200 with empty body
getOrganizationById returned a bare null, which Spring serialized to HTTP 200 with an empty body; clients calling response.json() then threw 'Unexpected end of ...
Map missing org (404 or empty body) to a null payload
Pairs with the SecurityService change that now returns 404 for a missing org instead of 200-with-empty-body. Callers already null-check the org, so both the pro...
Let the System User resolve any org's applied model
The cross-org gate returned 403 when orgId != session org and the caller had no Member row in the target org. The platform-wide System User operates across ever...
Stop spurious errors flooding the console
- org/[id] proxy: backend returns 200 with an empty body for null orgs; response.json() threw 'Unexpected end of JSON input' -> spurious 500. Parse defensiv...
Resolve org tab title in generateMetadata to stop title flip
Static metadata.title rendered 'Kamo' server-side; Next re-asserted it after hydration, overriding DynamicMetaLoader's client update and flipping the tab back f...
Withhold rows until Myself member id resolves
ag-grid renders rowData beneath the loading overlay, so gating only the loading prop still flashed all leads while getMemberId() was 0. Blank the rows and stay ...
Default filter to Myself on load, hide market bar for single market, relocate toolbar
- Default agentFilter to __MYSELF__ at init + gate grid on userInfo load so it no longer flashes All Leads - Single market: auto-select it and hide the market-t...
URI-encode WOPISrc + trust all api.* WOPI hosts (multi-tenant)
Opening a doc for a non-kamocrm tenant failed with 'unauthorized WOPI host'. Docs's alias_groups only trusted api.kamocrm.com (the Docs-deployment env hardcoded...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.