Market on the engagement, job numbers, dispatch, customer accounts, market-scoped lists
Service work orders: - createJob stores the chosen market on Engagement.market (it only picked the engagement type before) and the customer account on Engagem...
Every rental has a renter; cancel, re-date, check out, check in and end; booked dates beside the date picker
- New Rental Request: the Renter (customer account) is required and pre-filled from ?accountId; ?marketId is sent so the rental is filed under the market. Onc...
Market-filtered lists, line items, approve/reject/withdraw, send/receive/close/cancel, and a real Vendors list
- Procurement tab: Purchase Requests / Vendor Orders / Vendors; lists ask the server for the selected market (plus rows with none), show a Market column, and ...
ProcurementController — market-filtered lists, change/reject/withdraw a request, send/receive/close/cancel a vendor order, records returned from every change
- purchase requests and vendor orders move out of POSController into ProcurementController (MANAGE_PROCUREMENT to buy and run orders, APPROVE_PURCHASE_REQUEST...
Market, lines, approval decisions, and the vendor order lifecycle (send, receive, close, cancel)
ProcurementService owns purchase requests and vendor orders: - the engagement carries the market (chosen Procurement market, else the vendor's); lists filter by...
Turn Antivirus scanning on in kbservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for...
Markets and Lines of Business replace "Commerce"
"Commerce" is retired in the product. The 23 published articles that said it now say Markets (the nav option, the page, the pipeline) or Lines of Business (the ...
Turn Antivirus scanning on in docsservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for...
Turn Antivirus scanning on in mediaservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for...
Turn Antivirus scanning on in conversionservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for...
Assignment rows say what the member still owes
Adds signableOutstandingCount (signable documents not yet signed) and uploadsOwedCount (required requests with no live file) to each assignment row, so the memb...
KBService checks knowledge-base resources and looks up the verdict before signing
- Resource upload writes the raw kb bucket, so it goes through AntivirusUploadGuard (KB) before anything touches storage: 422 ANTIVIRUS_BLOCKED (nothing store...
Commerce_request_rental names the renter's account
SecurityService now refuses a rental request without a customer account (every rental has a renter), so the tool takes a required accountUid and passes it on. T...
Keep ThemeBackgroundController's CRLF line endings (completes 73e6499c)
Tick the weekly Protection Report (hourly, org-local Monday 08:00) and the outbreak watch (15 min)
The Antivirus API, platform controls and scheduled endpoints; gate SecurityService's own file paths
/api/antivirus/** (and the /api/security/antivirus twin the console proxy tries first): overview, detections, settings (audited ANTIVIRUS_POLICY_CHANGE), false ...
Route /api/antivirus/** to SecurityService and seal its internal subtree
KamoAntivirus mail filter first on inbound smtpd (port 25), tempfail when unreachable
smtpd_milters = { **************** default_action=tempfail }, then rspamd unchanged. Harmful attachments are replaced by a small placeholder part and the messag...
The member's package button names what is actually owed
A Quick Request that only asks for uploads showed "Continue Signing" with nothing to sign. memberActionFor now labels from the row's new signableOutstandingCoun...
Antivirus for mail — read gate on every mailbox, milter placeholders, send screening, detections
- Read: every attachment/inline part from any mailbox (Kamo Mail, IMAP providers, Graph; personal and shared routes) is hashed in memory (temp file past 8 MiB...
Rental steps, market-filtered lists, and a renter that can move but never be cleared
- GET /rental-requests and /bookings take ?marketId (the caller's own market) and filter by the engagement's market. - POST /rental-requests/{id}/cancel, PUT ...
Orders tab filters by the organization's own markets
Chips and row labels were per line of business, named after its first market, so two Retail markets collapsed into one. Each row now shows its own market (from ...
DocsService refuses locked documents everywhere and checks editor saves
- WOPI PutFile writes raw MinIO, so the save goes through AntivirusUploadGuard first: a harmful save writes nothing, keeps the document's last good content an...
Each Orders row names its own market
Rows carry marketId / marketTitle from their engagement (one query by engagement uid), so an organization with two Retail markets sees which one an order came f...
Antivirus alerts (scanner down, signatures stale, mirror gate failing, p95, detection spike, hold backlog)
Applied by hand (monitoring/ is not a CI target).
A rental needs a renter; market on the engagement; cancel, re-date, check out, return and cancel a booking
- createRentalRequest refuses a missing or foreign customer account, records the market (the asset's, else the chosen one) on the engagement, and validates da...
Version History authors use the shared member hover card (photo and who they are)
BLAKE3-256 that is 32 bytes on every BouncyCastle on the classpath
new Blake3Digest(256) is 256 BITS on bcprov 1.78 but 256 BYTES on bcprov-jdk15on 1.70, which this library brings and which loads FIRST in services that also dec...
Certificates name people by name and email, never by member id
The Executed Package Certificate and the Review Certificate printed raw member ids ("Sam Supervisor (1200096283021512387)"). They now show the name plus a human...
Markets — the organization's own markets, by their own names
"Commerce" is gone. A market is what members define (title + description); its Line of Business is only its kind. - The nav option is Markets. With one market ...
MediaService checks attachments with Antivirus and refuses locked files on every read
- Chat attachments (member CHAT, web-chat visitor PUBLIC), system-bug files, Growth Hub images are checked inside storeContentAddressed with their context (me...
ACCESS_COMMERCE reads "Access Markets"
The owner retired "Commerce" in the UI; the nav option is Markets.
A 40001 while preparing completion notices no longer rolls the signature back
The first press of Finish failed with a 500 and the retry succeeded. Completion notices were composed INSIDE the signing transaction under a catch-all: their re...
ConversionService checks uploads with Antivirus, completes held files, re-checks on new signatures
Replaces the in-service clamd client (malware/ package, UploadScanGuard, QuarantineStore, retro-scan) with the shared-library Antivirus: - /upload, /replace, /...
An engagement belongs to a member-defined market
commerce_engagements.market_id (applied by hand, FK to commerce_markets, indexed with org_id). Retail orders, service jobs, rental and procurement records have ...
The Antivirus UI — protection seals everywhere a file appears, the Antivirus Center, the platform tab, alerts and help
Design kit (app/components/antivirus): ProtectionSeal with five animated faces (Checking, Protected, Caution, Blocked, Couldn't Check; brand + --av-* tokens, re...
Svc_antivirus login + ANTIVIRUS stream; conversion/email may consume antivirus.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, publish antivirus.> and rt.org.>, subscribe antivirus.> and _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS....
Shared-library half of Antivirus — gate, client, tables, rights, kinds, templates, report
- Entities/repos for the six hand-applied tables (content_scan_verdicts, antivirus_detections, antivirus_false_alarm_reports, antivirus_allowlist, antivirus_o...
Safety & Oversight and Brains & Tools, premium — live cards, Spend Pace, Approval Rules, Connected Tools rooms with test before saving (SIS9)
Safety & Oversight - Spending: the default budgets on the kit save bar, explained with the job description's budgets and each role's daily caps (live values, ...
Record the six Antivirus tables (hand-applied 2026-11-07)
content_scan_verdicts, antivirus_detections, antivirus_false_alarm_reports, antivirus_allowlist, antivirus_org_settings, antivirus_daily_stats - the exact IF NO...
An approved package is filed, not left EXECUTION_INCOMPLETE
**************** called imgDatRepository.save on the ImgDat that uploadDocument returned from its own transaction. The entity is detached, so save() merges it a...
Each SI's own rooms — Workbench, Job Description, Voice & Calls, Access & Tools, Hiring (SIS10)
One SI's setup was split between the SI room, the Identity room and the Permissions tab. Its profile now lists its own rooms first, by name in the URL *********...
An SI's budget alert opens its Workbench room (SIS10)
The deep link was the bare profile; it now names the SI's Workbench room, where its budget is.
Reviewer notices skip the platform System User
The System User is an administrator of every organization, so it holds REVIEW_LEGAL_SUBMISSIONS everywhere and every submission in every org mailed hr.package_n...
Daily Work tips take a help article path; briefing numbers typed field by field (SIS8)
The SI pre-check card settles when a package has a No Review item
The pre-check reads SUBMITTED submissions only, and an item whose review is off is sealed ACCEPTED at finish, so its files were never read. The review workspace...
Legal, careers and training emails present EmailService's own secret
DocsService sent X-Internal-Auth from internal.auth.secret, which is ESigService's secret (***). EmailService's InternalAuthFilter compares against mlos-interna...
Real rental and procurement screens, filed under a customer account
The Rental and Procurement pipeline screens were mock data and their New pages were Coming Soon placeholders. They now read and write SecurityService: - Rental...
Test a connected tool server before saving it (SIS9)
- POST /api/ai/mcp/test (MANAGE_AI_SETTINGS): the save's body (transport, url, headers, removedHeaders) plus a saved server's id, so a header left as the mask...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
