Drop the Notes settings page and section
The Notes settings page was only a ComingSoonTab placeholder, so it gave members a nav entry and a landing card that led nowhere. Remove the route along with ev...
Personal Email Notifications card replaces the Notifications tab
Both switches move onto My Profile in the same shape as the password card: one card, an icon tile and help text per row, and a tinted inset that appears only wh...
Accounting & Finance permission group and finance-right access to account settings
The Access Security and Administration groups existed only in SecurityRoleManager as inline name lists, so JobTitleManager, DepartmentManager and RolesPermissio...
Re-point the doc manager tab at editedDocs
f98c5edc rebuilt its tree from a pre-8cb0a485 index and carried the old line back with it. `modifiedDocs` no longer exists in the dictionary, so main was callin...
Fold MFA into the password card and drop the Sign-in Security tab
Two places asked one question — how do I get into this account — so the second factor now lives beside the password on My Profile, in a card retitled "Password ...
The second doc manager tab reads Edited Docs
Points at the renamed key `docManager.tabs.editedDocs`; `modifiedDocs` is gone from the dictionary, so this has to move with it.
Suggest the org's own mailboxes, aliases and shared mailboxes
The recipient autocomplete only knew contacts and addresses scraped out of the Sent folder, so the organisation's own addresses — everything managed on ********...
One mailbox view, and a column that is all list
The Conversational/Classic toggle is gone and every member gets the classic list. Conversation view carried its own list, its own thread pane and its own API su...
Consolidate the member surface onto ?tab=legal-compliance
The standalone **************** route rendered the same component as the settings tab behind a second URL. Delete it and keep the tab: one surface, one entrance...
Email a member straight from their row
The row's action dock could chat, meet, dial and open a profile — the one thing it could not do was start an email, so reaching a colleague by mail meant leavin...
Extract the HR Legal & Compliance rendered key set
A literal t('…') scan misses 8 of the module's 81 keys: assignmentStatusKey and statusStateKey return key strings as DATA, and hrTabs.ts holds labelKey and desc...
React to ASSIGNED and stop trusting a channel that cannot replay
Three ways the support badge went stale, all of them silent. ASSIGNED was published on /topic/support/agent/{memberId} and this handler only branched on PENDIN...
Stop the badge costing portal members a request a minute
Three things, all of them about who the count is for. THE PROVIDER GATES ON THE SAME CONDITION AS THE BUTTON. It mounts in the root layout for every authentica...
Signature button with a live legal-package badge
Hand-written into the fixed left cluster between My Profile and Log out. NAV_REGISTRY cannot express a position between two fixed controls and its badgeKey fiel...
Live pending-package count over the EXISTING chat socket
LegalPackageCountContext consumes **************** rather than opening a fourteenth STOMP connection for one integer, and subscribes to **************** — the d...
Proxy the member's pending-package count
A static segment sibling to [uid] so App Router matches it first. PATH ONLY — forwardToApi owns the query string — and one upstream call, because the OTK is sin...
Show a sent attachment without waiting for a reload
MediaService announced a new chat message twice — once when the row was saved, before any attachment existed, and once after the attachment rows committed. The ...
Lay the profile header's wallpaper chrome out in a row
The Source / Console / Tone pod was the Stage's stacked one, and stacked it is taller than the 100px avatar it sits beside — so it, not the identity block, set ...
Give the executed-package repair an actual button
POST **************** existed upstream and was tested, but nothing in the product could reach it: no proxy route, no helper, no button. Every failure branch in ...
Restore the profile header wallpaper and wire its controls to the editor
The band behind the avatar on **************** had gone flat gradient. Not the wallpaper feature — ae85a8ae routed the header's photos through next/image + safe...
Sit the head tabs on the header's bottom edge and flatten the identity row
The tab strip was vertically centred in a row whose height was set by the action cluster beside it — a default-size More icon button (40px) plus the cluster's o...
Download the executed package from the grid and the member's own page
Both surfaces go through the LEGAL endpoints, keyed on the assignment, not /api/imaging/download/{imgId}: that path additionally needs organization.isDocs and V...
Draw non-image attachments with the document manager's file-type icons
A staged .docx or .xlsx was a grey MUI outline with the extension lettered underneath — a shape invented for the tray, and one that says less than the icon the ...
Say what is too big, instead of "Failed to send email"
A draft that outgrew the send endpoint's limits produced one flat line of red text after the whole payload had been uploaded — or, when the body itself was the ...
Gate each Human Resources tab on its own right
Overview needs VIEW_OVERVIEW, Attendance MANAGE_TIMECARDS, Legal & Compliance MANAGE_LEGAL_AND_COMPLIANCE, Training MANAGE_TRAINING and Resources MANAGE_RESOURC...
Measure a draft against the send limits before uploading it
A body carrying inline base64 — HTML pasted from a web page, a forward's quoted content, a signature's images — can pass the per-part ceiling on its own. The se...
Add the legal package execution plan
Phase 5: the member self-service page, the execution wizard ported from kamo-signer, and WORM package attestation capture.
Let a member actually finish a package, and reach the page at all
canFinish required every document row to already be SIGNED/ACKNOWLEDGED, but **************** is the ONLY writer of those statuses — the delivery worker writes ...
Drop the outer padding around the member Docs tab
DocManager brings its own toolbar and grid chrome, so the p:4 inset just shrank the grid and left a visible gap the /hr/resources page does not have. Matches th...
Member legal-compliance page and the package execution wizard
**************** is gated on identity (memberID === getMemberIdString(), compared as STRINGS because getMemberId() is lossy past MAX_SAFE_INTEGER) and includes ...
Member execution proxy routes and the pure wizard model
Eight 1:1 routes: /api/docs/legal/member/** through forwardToApi (PATH ONLY — forwardToApi owns the query string) and /api/esig/member/** direct to ESIG_SERVICE...
Port the kamo-signer signing core into kamo-internal
Every @kamo/* package is private:true with exports:"./src/index.ts" and no build step, so there is no publishable artifact — the files are copied and rewired on...
Add the legal package delivery plan
Phase 4: Deliver / Redeliver / Void fan-out, assignment creation with e-sign envelopes, and the Assigned Packages sub-tab.
Cap the legal audience roster, and refresh after Deliver
The Assigned Packages grid filled its team-member filter column by asking audience-preview for allTeamMembers:true on mount -- a name and an email address for e...
Assigned Packages sub-tab and deliver/redeliver/void actions
AG Grid Community over a MUI-paginated fetch — Community has no server-side row model, so the server pages and the grid renders exactly what it was handed. The ...
Legal package deliver/redeliver/void proxies and assignment client
Thin 1:1 forwardToApi routes — one upstream request each, because OTKAuthFilter does getAndDelete and a per-member loop in a Next route would need one OTK per m...
Add the legal package CRUD plan
Phase 3 of the HR Legal & Compliance series: DocsService package CRUD, the content fingerprint, publish freezing a byte-pinned version, audience preview, and th...
Wire publish and audience preview, and stop rendering a broken label
publishPackage, previewAudience and getPackage shipped with no caller. The templates grid now has a Publish row action — disabled when the package has no binder...
Package Templates sub-tab for Legal & Compliance
Replaces the HrTabPlaceholder body only — the route, the tab entry and the gate already exist in hrTabs.ts. AG Grid Community list plus a create/edit dialog wit...
Legal package proxy routes, client api and pure helpers
Thin 1:1 forwardToApi routes under /api/docs/legal — one upstream request each, because OTKAuthFilter does getAndDelete and a fan-out loop in a Next route would...
Restore external images in email bodies
External images stopped rendering when the page-level image policy shipped. The middleware sets `img-src 'self' data: blob: https://theme.<apex> https://*.<apex...
Add the signing-correctness plan
Phase 2 of the HR Legal & Compliance series, shippable on its own: signer-slot binding, server-side required-field enforcement, invite suppression, and recipien...
Cap the send dialog's recipients at the template's declared slots
The Send for signature dialog seeds one recipient row and offers an unbounded "Add recipient", but it never fetched the template's signer slots. ESigService rej...
Drive the remaining polled screens from NATS/WebSocket
Fifteen network polls across the app, replaced with the events that were already happening or with events added to the services that own the state. Mail — the ...
Add the legal package entities plan
Phase 1 of the HR Legal & Compliance series: the com.kamo.z.shared.hr.legal entity set and its schema migration.
Drive the mail badge from pushed unread counts, not a 30s poll
MailButton ran setInterval(fetchUnreadCount, 30_000) in every open tab, and each tick called /api/email/folders — an endpoint that opens every folder in the mai...
Add the Legal & Compliance design and the binder-scoping plan
The design is the full cross-repo analysis of the HR Legal & Compliance module (package templates, delivery, execution wizard, navtop badge, notification email)...
Guard loadBinders by request identity, not scope value
sameBinderScope alone can't tell two in-flight requests for the SAME scope apart (A -> B -> A), so a slower older request could still overwrite a newer one. Tra...
Show only the binders belonging to the open collection
OrganizerTab already received assocType/assocObjectId and passed them to the editor's document picker, but loaded the binder LIST unscoped — so every DocManager...
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.
