-
5b9560531e
fix(ui): remove PN brand mark from mobile topbar; balance title with spacer
main
Matt
2026-06-19 10:55:18 +02:00
-
f55be14813
test(berths): CM-2 — drop unused var in price-reconcile test
Matt
2026-06-19 10:53:24 +02:00
-
6bc81270b9
feat(interests): CM-2 Part B — deal-price override route + UI on linked berths
Matt
2026-06-19 10:48:38 +02:00
-
38e392e38b
feat(interests): CM-2 Part B — EOI/doc generation honours berth price override
Matt
2026-06-19 10:41:42 +02:00
-
039ef25fe5
feat(interests): CM-2 Part B — interest_berths price override (data + resolver)
Matt
2026-06-19 10:40:17 +02:00
-
b3753b96a1
feat(berths): CM-2 — bulk price-reconcile admin page
Matt
2026-06-19 10:38:08 +02:00
-
9147f2857e
feat(berths): CM-2 — price-reconcile API (list + bulk apply)
Matt
2026-06-19 10:35:09 +02:00
-
47778796ad
feat(berths): CM-2 — bulk price-reconcile service (parse + apply)
Matt
2026-06-19 10:33:40 +02:00
-
f7425d1231
fix(berths): CM-2 — robust purchase-price extraction (clean-token + magnitude floor)
Matt
2026-06-19 10:30:12 +02:00
-
df8c26d1b3
feat(proxies): CM-9 UI — ProxyCard on client, interest, and yacht detail pages
Matt
2026-06-19 00:01:08 +02:00
-
91703bdb00
feat(proxies): CM-9 backend — polymorphic point-of-contact + resolver
Matt
2026-06-18 23:54:47 +02:00
-
3165ec651f
feat(client-groups): CM-1 API routes + UI (list, member viewer, copy-emails)
Matt
2026-06-18 22:49:29 +02:00
-
661187cc79
feat(client-groups): CM-1 data layer — groups entity, membership, service, Mailchimp scaffold
Matt
2026-06-18 22:28:20 +02:00
-
4dc0bdd8c4
feat(crm): client-meeting batch — contact-pill cleanup, assignment toggle, receipt manual mode
Matt
2026-06-18 21:42:36 +02:00
-
7f04c765f4
fix(crm): inquiry detail polish, EOI preview mime, EOI next-step, documenso v1 banner
Matt
2026-06-18 17:36:35 +02:00
-
4d018be800
feat(inquiries): one-off NocoDB historical contact-form import (idempotent, dry-run default)
Matt
2026-06-17 18:28:01 +02:00
-
95d7776bb6
test(inquiries): drop unused import
Matt
2026-06-17 18:25:13 +02:00
-
0cc05f302f
feat(inquiries): top-level Inquiries page (list + detail + convert), nav entries; retire admin inbox
Matt
2026-06-17 18:23:13 +02:00
-
54554a0928
feat(inquiries): list/get/triage/convert service + API routes (find-or-create client)
Matt
2026-06-17 18:09:59 +02:00
-
9879b82e5f
feat(inquiries): website_submissions tracking + display columns; capture populates contact name/email
Matt
2026-06-17 18:03:47 +02:00
-
08adb4aeea
feat(permissions): add inquiries resource (view/manage) + idempotent role backfill
Matt
2026-06-17 17:59:32 +02:00
-
6c4490f653
feat(alerts): always-visible dismiss/ack actions + Dismiss all (service, endpoint, UI)
Matt
2026-06-17 17:53:12 +02:00
-
13efe177a5
feat(alerts): split interest.stale into worked-then-quiet + new-untouched (interest.no_activity)
Matt
2026-06-17 17:49:22 +02:00
-
7591231c47
test(e2e): add Initiative 4 end-to-end + integration specs
Matt
2026-06-04 14:10:35 +02:00
-
2e8c4b43bf
fix(backup): install pg_dump (postgresql16-client) in app + worker images
Matt
2026-06-04 11:58:14 +02:00
-
fe863a588e
feat(backup): full DR bundle export + admin-configurable offsite destinations
Matt
2026-06-04 11:23:42 +02:00
-
05950ae0b6
feat(uat): file preview/download fix, clients-by-country page, residential column picker
Matt
2026-06-03 22:34:47 +02:00
-
eff57af571
fix(storage): make S3 server-side-encryption optional (default off)
Matt
2026-06-03 22:08:41 +02:00
-
1750e265e7
feat(berths): inline spec-PDF preview, manual-pin badge, maintenance module toggle, under-offer popover
Matt
2026-06-03 19:15:04 +02:00
-
2a7f922a01
fix(uat): dashboard snapshots current-state, pulse-chip gate, phone display, chip width
Matt
2026-06-03 18:27:56 +02:00
-
39c19b2340
feat(berths): click-to-change status from the list (chip → reason modal)
Matt
2026-06-03 16:01:40 +02:00
-
d1f6d6a427
feat(eoi): signed-EOI hero + send-signed-copy; fix search dropdown z-order
Matt
2026-06-03 15:55:28 +02:00
-
3b227fe9b2
feat(files): in-app .docx preview + allow office/text mimes
Matt
2026-06-03 15:45:11 +02:00
-
95724c8e3a
fix(uat): prod UAT batch — reports, sidebar, search, berths, breakpoint
Matt
2026-06-03 15:41:31 +02:00
-
93c6554c95
fix(ui+alerts+email): prod walkthrough batch
Matt
2026-06-03 14:09:16 +02:00
-
72028a7f32
fix(proxy): trust forwarded Host header for CSRF origin check
Matt
2026-06-03 04:10:57 +02:00
-
d485695357
fix: CSRF host-compare behind proxy + default port = creation order
Matt
2026-06-03 03:38:12 +02:00
-
23a5811342
fix(proxy): accept the __Secure- prefixed session cookie in production
Matt
2026-06-03 03:13:22 +02:00
-
102ee493f8
fix(ports): list ports in creation order so the primary port leads
Matt
2026-06-03 00:51:12 +02:00
-
c70eb1f945
fix(docker): merge prod deps into standalone node_modules (not replace)
Matt
2026-06-03 00:31:33 +02:00
-
42baaf7bfc
fix(docker): complete prod node_modules for the custom server
Matt
2026-06-03 00:03:11 +02:00
-
319fd7fd1a
fix(server): resolve socket.io deps via NODE_PATH + polyfill AsyncLocalStorage
Matt
2026-06-02 23:34:28 +02:00
-
2315b58764
fix(docker): bundle socket.io transitive deps into crm-app runner
Matt
2026-06-02 23:03:57 +02:00
-
15a139e86f
feat(berths): website auto-promote toggle + manual-override soft-pin priority
Matt
2026-06-02 20:10:04 +02:00
-
04ddd59662
chore(repo): untrack internal docs + CLAUDE.md (keep local-only)
Matt
2026-06-02 18:02:45 +02:00
-
2a4dadd5a7
docs(launch): execute-ready initial-deployment runbook
Matt
2026-06-02 17:50:42 +02:00
-
44b004fa8f
feat(intake): recipient picker UI (users/roles/everyone/emails)
Matt
2026-06-02 17:36:24 +02:00
-
5ea0c75fff
feat(intake): structured notification-recipient resolver (emails/users/roles/everyone)
Matt
2026-06-02 17:28:48 +02:00
-
0416dc8d39
docs(launch): website-integration env vars + cutover sequence
Matt
2026-06-02 17:22:12 +02:00
-
990b566eff
feat(intake): CRM-owned website inquiry emails + in-app notifications
Matt
2026-06-02 17:22:08 +02:00
-
f699533224
Merge feat/residential-toggle-and-reports-comparison into main
Matt
2026-06-02 15:08:31 +02:00
-
-
79b6ab2ae0
fix(build): split custom-report registry into client-safe metadata + server query module
Matt
2026-06-02 14:28:51 +02:00
-
cd82958307
docs(launch): Initiative 2 (codebase + security audit) COMPLETE — 85 findings remediated
feat/residential-toggle-and-reports-comparison
Matt
2026-06-02 13:32:04 +02:00
-
478aba1866
docs(audit): remediation complete — 84/85 fixed, L21 false-positive; M23/M25 DB migrations deferred
Matt
2026-06-02 13:31:34 +02:00
-
8c4c9b967e
fix(audit): UI — L18 (decorative emoji -> Lucide icons), L19 (gated NotesList timer + create-from-url ref-in-effect)
Matt
2026-06-02 13:30:25 +02:00
-
e7fdf75a6c
fix(audit): residential/tenancies — M28 (unified stage validation), M29 (explicit-disable wins), L31 (active-tenancy warning), L32 (socket event + saveStages tx)
Matt
2026-06-02 13:18:28 +02:00
-
7b74e2314b
fix(audit): M24 — reserve 'branding'/'avatar' file categories from the upload/update API
Matt
2026-06-02 13:18:24 +02:00
-
fd69a75980
fix(audit): bounce/email — M8 (Message-ID port-safe bounce match), L16 (recipient validation, CRLF, header trust note)
Matt
2026-06-02 13:18:20 +02:00
-
cc5c053a79
fix(audit): reports workers — M9 (no duplicate scheduled emails), L5 (idempotent render artefacts), L6 (atomic schedule claim), L7 (per-port notification From)
Matt
2026-06-02 13:07:30 +02:00
-
64c73a5d77
fix(audit): rate-limit/DoS — M13 (bulk limiter on 6 routes), M14 (api limiter default in withAuth, fail-open), M15 (export-pdf payload bounds); L21 verified not-a-bug
Matt
2026-06-02 13:07:25 +02:00
-
ebe5fe6ed8
fix(audit): GDPR/merge — M6 (drop false merge-reversibility claims), M7 (GDPR export adds 4 PII tables), L14 (docstring), L15 (hard-delete breadcrumb note)
Matt
2026-06-02 13:07:21 +02:00
-
aedbcfd58d
fix(audit): AI — L8 (single recordAiUsage), L9 (budget-off warning), L10 (sanitize notes/subjects into prompt)
Matt
2026-06-02 12:59:16 +02:00
-
70bf26aea1
fix(audit): berth rules/recommender — M4 (bundle-wide status), M5 (berth_unlinked target), M20/L27 (interest_berths invariant + cross-port guard), L3 (recommender stage-scale), L4 (dead branch)
Matt
2026-06-02 12:59:12 +02:00
-
4084029962
fix(audit): documenso — M2 (reservation EOI-milestone pollution), L11 (v2 numericId GET fallback), L12 (API URL normalize/validate), L13 (event dedup)
Matt
2026-06-02 12:59:07 +02:00
-
37ffb2c3b4
fix(audit): financial — M19 (group-by-currency accumulation, full-precision rates), M23 (invoice money rounding + 0% discount), L25 (no silent unconverted/stale FX), L26 (companyNotes updatedAt)
Matt
2026-06-02 12:52:28 +02:00
-
49f5c3165b
fix(audit): interests/pipeline — M1 (outcome terminal guard), M3 (single-UPDATE + milestone gating), L1 (dead 'completed'), L2 (nurturing edge), L24 (deposit re-lock on refund)
Matt
2026-06-02 12:52:24 +02:00
-
0ed4323826
fix(audit): socket cluster — M10 (isActive gate), M11 (permission-scoped entity rooms), L20 (join:entity validation)
Matt
2026-06-02 12:52:20 +02:00
-
25988dbfad
fix(audit): import cluster — M27 (commit idempotency), M25 (in-file dedup preview), M26 (undo destructive-update reporting), L33 (mapping/mooring), L35 (port-auth doc)
Matt
2026-06-02 12:41:00 +02:00
-
9305c030de
fix(audit): storage cluster — M16 (presign doc/contract), M17 (per-port byte cap), M18 (replay-after-stat), L17 (mime allow-list, fingerprint hash), L22 (brochure portSlug)
Matt
2026-06-02 12:40:56 +02:00
-
65ed90b603
fix(audit): webhook cluster — M21 (test-send isActive), M22 (cross-tenant dead-letter), L28 (ipv6 SSRF), L29 (rebind doc), L30 (replay event-time)
Matt
2026-06-02 12:40:41 +02:00
-
29fb882478
fix(audit): H15 (saved-view sort) + H14 (back/forward URL resync) in usePaginatedQuery
Matt
2026-06-02 12:26:10 +02:00
-
808e80744b
fix(audit): H12 — consistent refund sign so refunds never inflate revenue
Matt
2026-06-02 12:24:51 +02:00
-
77829485a7
fix(audit): H5 — keep yacht ownership-history ledger consistent on archive/restore
Matt
2026-06-02 12:24:46 +02:00
-
1882bcb2e4
fix(audit): H11 — gate cross-port coverBrandPortId in report runs
Matt
2026-06-02 12:18:11 +02:00
-
a335dbc117
fix(audit): H10 — neutralize CSV formula injection in expense + audit exports
Matt
2026-06-02 12:18:07 +02:00
-
4489ad2431
fix(audit): H9 — rate-limit AI routes + budget-gate email-draft token spend
Matt
2026-06-02 12:18:03 +02:00
-
b51d6d3030
fix(audit): H4 (reservation signing berth rule) + H13 (manual EOI-sign stage parity)
Matt
2026-06-02 12:12:02 +02:00
-
865ae5c072
fix(audit): H2/H3 — client merge re-points payments, memberships, yacht & invoice ownership
Matt
2026-06-02 12:09:49 +02:00
-
7a7fd76081
fix(audit): H8 (residentialAccess caller-superset) + M12 (self-target guard) in updateUser
Matt
2026-06-02 12:06:06 +02:00
-
f4fb7aae84
fix(audit): H1 (webhook redirect SSRF), H6 (berth-status case), H7 (residential notes URL)
Matt
2026-06-02 12:03:35 +02:00
-
3c9310f81c
fix(audit): critical C3 — enforce residential module gate on all v1 API routes
Matt
2026-06-02 11:59:52 +02:00
-
7aa639f195
fix(audit): criticals C1 (currency-scoped deposit gate), C2 (outcome-aware berth rule), C4 (/q/ allowlist)
Matt
2026-06-02 11:54:36 +02:00
-
30f6723fef
docs(audit): complete unified master — all 17 lanes, 85 findings (4 CRIT/17 HIGH/29 MED/35 LOW)
Matt
2026-06-02 11:38:44 +02:00
-
3337a20091
docs(audit): consolidated master findings — passes 1+2 (6/17 lanes, 3 CRIT/6 HIGH); 11 lanes pending re-run
Matt
2026-06-02 11:07:35 +02:00
-
366b0d79fd
docs(launch): reports polish shipped — empty states + Operational Area filter
Matt
2026-06-02 10:25:07 +02:00
-
0ee3cd6073
feat(reports): operational Area filter (FilterBar + query + template scope)
Matt
2026-06-02 10:21:57 +02:00
-
91d8ee226b
feat(reports): financial report-level empty state
Matt
2026-06-02 10:19:57 +02:00
-
24e88ae32e
feat(reports): sales report-level empty state
Matt
2026-06-02 10:17:56 +02:00
-
7cf364e03a
feat(reports): shared ReportEmptyState component
Matt
2026-06-02 10:17:05 +02:00
-
58203ca8ea
feat(reports): financial hasData existence flag (service + route)
Matt
2026-06-02 10:13:42 +02:00
-
8b7099c4c1
feat(reports): sales hasData existence flag (service + route)
Matt
2026-06-02 10:12:54 +02:00
-
68da165b37
feat(reports): operational route — Area filter + areaOptions + hasData
Matt
2026-06-02 10:11:26 +02:00
-
10b3b68851
feat(reports): thread Area filter + add area-options/hasData helpers (operational service)
Matt
2026-06-02 10:10:33 +02:00
-
3d9084c94b
feat(reports): parseOperationalFilters pure parser (Area scope)
Matt
2026-06-02 10:08:16 +02:00
-
93e96da43b
docs(reports): implementation plan for beta-finish polish
Matt
2026-06-02 10:05:13 +02:00
-
244fb14ce5
docs(reports): design spec for beta-finish polish (empty states + Operational area filter)
Matt
2026-06-02 09:57:12 +02:00
-
41c64dc126
feat(reports): gate unbuilt Marketing report to 404 for beta
Matt
2026-06-02 09:34:55 +02:00
-
0f7da79a64
docs(launch): Financial report SHIPPED (Phase 4) — payments-model reframe
Matt
2026-06-02 00:44:27 +02:00
-
b690fb8d56
feat(reports): Financial report (Initiative 1 Phase 4)
Matt
2026-06-02 00:43:36 +02:00
-
75fdb9fab4
docs(launch): reconcile tracker — mark shipped rep/source filters + 3 stale-deferred items
Matt
2026-06-02 00:25:34 +02:00